From 598ecbbd5a5d34a175b3f6e850202cbc633576fde1d5e1d8534195fb31d580c0 Mon Sep 17 00:00:00 2001
From: Adam Majer <adamm@zombino.com>
Date: Sun, 7 Jul 2024 21:08:41 +0200
Subject: [PATCH] .

---
 bots-common/Makefile                          |    20 +
 bots-common/api.json                          | 25728 +++++++++
 bots-common/cfg.yaml                          |     5 +
 bots-common/consts.go                         |     8 +
 bots-common/conststring_test.go               |   432 +
 bots-common/devtest.sh                        |     8 +
 bots-common/generate.go                       |     5 +
 bots-common/git_utils.go                      |   204 +
 .../client/activitypub/activitypub_client.go  |   171 +
 .../activitypub_person_inbox_parameters.go    |   152 +
 .../activitypub_person_inbox_responses.go     |    88 +
 .../activitypub_person_parameters.go          |   152 +
 .../activitypub_person_responses.go           |   106 +
 .../admin/admin_add_user_badges_parameters.go |   172 +
 .../admin/admin_add_user_badges_responses.go  |   166 +
 .../admin_adopt_repository_parameters.go      |   173 +
 .../admin/admin_adopt_repository_responses.go |   228 +
 .../client/admin/admin_client.go              |  1155 +
 .../admin/admin_create_hook_parameters.go     |   150 +
 .../admin/admin_create_hook_responses.go      |   106 +
 .../admin/admin_create_org_parameters.go      |   172 +
 .../admin/admin_create_org_responses.go       |   262 +
 .../admin_create_public_key_parameters.go     |   172 +
 .../admin_create_public_key_responses.go      |   262 +
 .../admin/admin_create_repo_parameters.go     |   172 +
 .../admin/admin_create_repo_responses.go      |   480 +
 .../admin/admin_create_user_parameters.go     |   150 +
 .../admin/admin_create_user_responses.go      |   340 +
 .../admin/admin_cron_list_parameters.go       |   198 +
 .../client/admin/admin_cron_list_responses.go |   182 +
 .../client/admin/admin_cron_run_parameters.go |   151 +
 .../client/admin/admin_cron_run_responses.go  |   150 +
 .../admin/admin_delete_hook_parameters.go     |   154 +
 .../admin/admin_delete_hook_responses.go      |    88 +
 ..._delete_unadopted_repository_parameters.go |   173 +
 ...n_delete_unadopted_repository_responses.go |   166 +
 .../admin_delete_user_badges_parameters.go    |   172 +
 .../admin_delete_user_badges_responses.go     |   244 +
 .../admin/admin_delete_user_parameters.go     |   186 +
 ...admin_delete_user_public_key_parameters.go |   176 +
 .../admin_delete_user_public_key_responses.go |   228 +
 .../admin/admin_delete_user_responses.go      |   306 +
 .../admin/admin_edit_hook_parameters.go       |   175 +
 .../client/admin/admin_edit_hook_responses.go |   106 +
 .../admin/admin_edit_user_parameters.go       |   172 +
 .../client/admin/admin_edit_user_responses.go |   340 +
 .../admin/admin_get_all_emails_parameters.go  |   198 +
 .../admin/admin_get_all_emails_responses.go   |   182 +
 .../admin/admin_get_all_orgs_parameters.go    |   198 +
 .../admin/admin_get_all_orgs_responses.go     |   182 +
 .../client/admin/admin_get_hook_parameters.go |   154 +
 .../client/admin/admin_get_hook_responses.go  |   106 +
 ...et_runner_registration_token_parameters.go |   128 +
 ...get_runner_registration_token_responses.go |    96 +
 .../admin/admin_list_hooks_parameters.go      |   198 +
 .../admin/admin_list_hooks_responses.go       |   104 +
 .../admin_list_user_badges_parameters.go      |   151 +
 .../admin/admin_list_user_badges_responses.go |   166 +
 .../admin/admin_rename_user_parameters.go     |   172 +
 .../admin/admin_rename_user_responses.go      |   244 +
 .../admin/admin_search_emails_parameters.go   |   232 +
 .../admin/admin_search_emails_responses.go    |   182 +
 .../admin/admin_search_users_parameters.go    |   268 +
 .../admin/admin_search_users_responses.go     |   182 +
 .../admin/admin_unadopted_list_parameters.go  |   232 +
 .../admin/admin_unadopted_list_responses.go   |   180 +
 .../client/gitea_api_client.go                |   157 +
 .../issue/issue_add_label_parameters.go       |   219 +
 .../client/issue/issue_add_label_responses.go |   244 +
 .../issue_add_subscription_parameters.go      |   220 +
 .../issue/issue_add_subscription_responses.go |   274 +
 .../client/issue/issue_add_time_parameters.go |   219 +
 .../client/issue/issue_add_time_responses.go  |   324 +
 .../issue_check_subscription_parameters.go    |   198 +
 .../issue_check_subscription_responses.go     |   168 +
 .../issue/issue_clear_labels_parameters.go    |   198 +
 .../issue/issue_clear_labels_responses.go     |   228 +
 .../client/issue/issue_client.go              |  2868 +
 .../issue/issue_create_comment_parameters.go  |   219 +
 .../issue/issue_create_comment_responses.go   |   324 +
 ...ssue_create_issue_attachment_parameters.go |   253 +
 ...issue_create_issue_attachment_responses.go |   418 +
 .../issue_create_issue_blocking_parameters.go |   216 +
 .../issue_create_issue_blocking_responses.go  |   168 +
 ...ate_issue_comment_attachment_parameters.go |   253 +
 ...eate_issue_comment_attachment_responses.go |   496 +
 ...ue_create_issue_dependencies_parameters.go |   216 +
 ...sue_create_issue_dependencies_responses.go |   246 +
 .../issue/issue_create_issue_parameters.go    |   194 +
 .../issue/issue_create_issue_responses.go     |   480 +
 .../issue/issue_create_label_parameters.go    |   194 +
 .../issue/issue_create_label_responses.go     |   246 +
 .../issue_create_milestone_parameters.go      |   194 +
 .../issue/issue_create_milestone_responses.go |   168 +
 ...ue_delete_comment_deprecated_parameters.go |   220 +
 ...sue_delete_comment_deprecated_responses.go |   228 +
 .../issue/issue_delete_comment_parameters.go  |   198 +
 ...ssue_delete_comment_reaction_parameters.go |   219 +
 ...issue_delete_comment_reaction_responses.go |   228 +
 .../issue/issue_delete_comment_responses.go   |   228 +
 ...ssue_delete_issue_attachment_parameters.go |   222 +
 ...issue_delete_issue_attachment_responses.go |   244 +
 ...ete_issue_comment_attachment_parameters.go |   222 +
 ...lete_issue_comment_attachment_responses.go |   244 +
 .../issue_delete_issue_reaction_parameters.go |   219 +
 .../issue_delete_issue_reaction_responses.go  |   228 +
 .../issue/issue_delete_label_parameters.go    |   198 +
 .../issue/issue_delete_label_responses.go     |   150 +
 .../issue_delete_milestone_parameters.go      |   195 +
 .../issue/issue_delete_milestone_responses.go |   150 +
 .../client/issue/issue_delete_parameters.go   |   198 +
 .../client/issue/issue_delete_responses.go    |   228 +
 .../issue_delete_stop_watch_parameters.go     |   198 +
 .../issue_delete_stop_watch_responses.go      |   274 +
 .../issue_delete_subscription_parameters.go   |   220 +
 .../issue_delete_subscription_responses.go    |   274 +
 .../issue/issue_delete_time_parameters.go     |   222 +
 .../issue/issue_delete_time_responses.go      |   306 +
 ...ssue_edit_comment_deprecated_parameters.go |   241 +
 ...issue_edit_comment_deprecated_responses.go |   308 +
 .../issue/issue_edit_comment_parameters.go    |   219 +
 .../issue/issue_edit_comment_responses.go     |   386 +
 .../issue_edit_issue_attachment_parameters.go |   243 +
 .../issue_edit_issue_attachment_responses.go  |   262 +
 ...dit_issue_comment_attachment_parameters.go |   243 +
 ...edit_issue_comment_attachment_responses.go |   262 +
 .../issue_edit_issue_deadline_parameters.go   |   219 +
 .../issue_edit_issue_deadline_responses.go    |   246 +
 .../issue/issue_edit_issue_parameters.go      |   219 +
 .../issue/issue_edit_issue_responses.go       |   324 +
 .../issue/issue_edit_label_parameters.go      |   219 +
 .../issue/issue_edit_label_responses.go       |   246 +
 .../issue/issue_edit_milestone_parameters.go  |   216 +
 .../issue/issue_edit_milestone_responses.go   |   168 +
 .../issue/issue_get_comment_parameters.go     |   198 +
 .../issue_get_comment_reactions_parameters.go |   198 +
 .../issue_get_comment_reactions_responses.go  |   244 +
 .../issue/issue_get_comment_responses.go      |   308 +
 ...ue_get_comments_and_timeline_parameters.go |   338 +
 ...sue_get_comments_and_timeline_responses.go |   166 +
 .../issue/issue_get_comments_parameters.go    |   270 +
 .../issue/issue_get_comments_responses.go     |   166 +
 .../issue_get_issue_attachment_parameters.go  |   222 +
 .../issue_get_issue_attachment_responses.go   |   184 +
 ...get_issue_comment_attachment_parameters.go |   222 +
 ..._get_issue_comment_attachment_responses.go |   184 +
 .../issue/issue_get_issue_parameters.go       |   198 +
 .../issue_get_issue_reactions_parameters.go   |   266 +
 .../issue_get_issue_reactions_responses.go    |   244 +
 .../client/issue/issue_get_issue_responses.go |   168 +
 .../issue/issue_get_label_parameters.go       |   198 +
 .../client/issue/issue_get_label_responses.go |   168 +
 .../issue/issue_get_labels_parameters.go      |   198 +
 .../issue/issue_get_labels_responses.go       |   166 +
 .../issue/issue_get_milestone_parameters.go   |   195 +
 .../issue/issue_get_milestone_responses.go    |   168 +
 .../issue_get_milestones_list_parameters.go   |   310 +
 .../issue_get_milestones_list_responses.go    |   166 +
 .../issue_get_repo_comments_parameters.go     |   314 +
 .../issue_get_repo_comments_responses.go      |   166 +
 .../issue/issue_list_blocks_parameters.go     |   264 +
 .../issue/issue_list_blocks_responses.go      |   166 +
 ...issue_list_issue_attachments_parameters.go |   198 +
 .../issue_list_issue_attachments_responses.go |   182 +
 ...st_issue_comment_attachments_parameters.go |   198 +
 ...ist_issue_comment_attachments_responses.go |   182 +
 ...ssue_list_issue_dependencies_parameters.go |   264 +
 ...issue_list_issue_dependencies_responses.go |   166 +
 .../issue/issue_list_issues_parameters.go     |   586 +
 .../issue/issue_list_issues_responses.go      |   166 +
 .../issue/issue_list_labels_parameters.go     |   242 +
 .../issue/issue_list_labels_responses.go      |   166 +
 .../issue_post_comment_reaction_parameters.go |   219 +
 .../issue_post_comment_reaction_responses.go  |   322 +
 .../issue_post_issue_reaction_parameters.go   |   219 +
 .../issue_post_issue_reaction_responses.go    |   322 +
 .../issue_remove_issue_blocking_parameters.go |   216 +
 .../issue_remove_issue_blocking_responses.go  |   168 +
 ...ue_remove_issue_dependencies_parameters.go |   216 +
 ...sue_remove_issue_dependencies_responses.go |   246 +
 .../issue/issue_remove_label_parameters.go    |   222 +
 .../issue/issue_remove_label_responses.go     |   306 +
 .../issue/issue_replace_labels_parameters.go  |   219 +
 .../issue/issue_replace_labels_responses.go   |   244 +
 .../issue/issue_reset_time_parameters.go      |   198 +
 .../issue/issue_reset_time_responses.go       |   306 +
 .../issue/issue_search_issues_parameters.go   |   714 +
 .../issue/issue_search_issues_responses.go    |   104 +
 .../issue_start_stop_watch_parameters.go      |   198 +
 .../issue/issue_start_stop_watch_responses.go |   274 +
 .../issue/issue_stop_stop_watch_parameters.go |   198 +
 .../issue/issue_stop_stop_watch_responses.go  |   274 +
 .../issue/issue_subscriptions_parameters.go   |   266 +
 .../issue/issue_subscriptions_responses.go    |   166 +
 .../issue/issue_tracked_times_parameters.go   |   372 +
 .../issue/issue_tracked_times_responses.go    |   166 +
 .../client/issue/move_issue_pin_parameters.go |   222 +
 .../client/issue/move_issue_pin_responses.go  |   228 +
 .../client/issue/pin_issue_parameters.go      |   198 +
 .../client/issue/pin_issue_responses.go       |   228 +
 .../client/issue/unpin_issue_parameters.go    |   198 +
 .../client/issue/unpin_issue_responses.go     |   228 +
 .../get_gitignore_template_info_parameters.go |   151 +
 .../get_gitignore_template_info_responses.go  |   168 +
 .../get_label_template_info_parameters.go     |   151 +
 .../get_label_template_info_responses.go      |   166 +
 .../get_license_template_info_parameters.go   |   151 +
 .../get_license_template_info_responses.go    |   168 +
 .../miscellaneous/get_node_info_parameters.go |   128 +
 .../miscellaneous/get_node_info_responses.go  |   106 +
 .../get_signing_key_parameters.go             |   128 +
 .../get_signing_key_responses.go              |   102 +
 .../miscellaneous/get_version_parameters.go   |   128 +
 .../miscellaneous/get_version_responses.go    |   106 +
 .../list_gitignores_templates_parameters.go   |   128 +
 .../list_gitignores_templates_responses.go    |   102 +
 .../list_label_templates_parameters.go        |   128 +
 .../list_label_templates_responses.go         |   102 +
 .../list_license_templates_parameters.go      |   128 +
 .../list_license_templates_responses.go       |   104 +
 .../miscellaneous/miscellaneous_client.go     |   606 +
 .../render_markdown_parameters.go             |   150 +
 .../render_markdown_raw_parameters.go         |   149 +
 .../render_markdown_raw_responses.go          |   180 +
 .../render_markdown_responses.go              |   180 +
 .../miscellaneous/render_markup_parameters.go |   150 +
 .../miscellaneous/render_markup_responses.go  |   180 +
 .../notification/notification_client.go       |   396 +
 .../notify_get_list_parameters.go             |   394 +
 .../notification/notify_get_list_responses.go |   104 +
 .../notify_get_repo_list_parameters.go        |   438 +
 .../notify_get_repo_list_responses.go         |   104 +
 .../notify_get_thread_parameters.go           |   151 +
 .../notify_get_thread_responses.go            |   246 +
 .../notify_new_available_parameters.go        |   128 +
 .../notify_new_available_responses.go         |   106 +
 .../notify_read_list_parameters.go            |   279 +
 .../notify_read_list_responses.go             |   104 +
 .../notify_read_repo_list_parameters.go       |   323 +
 .../notify_read_repo_list_responses.go        |   104 +
 .../notify_read_thread_parameters.go          |   198 +
 .../notify_read_thread_responses.go           |   246 +
 .../create_org_repo_deprecated_parameters.go  |   172 +
 .../create_org_repo_deprecated_responses.go   |   324 +
 .../create_org_repo_parameters.go             |   172 +
 .../organization/create_org_repo_responses.go |   324 +
 .../create_org_variable_parameters.go         |   194 +
 .../create_org_variable_responses.go          |   290 +
 .../delete_org_secret_parameters.go           |   173 +
 .../delete_org_secret_responses.go            |   228 +
 .../delete_org_variable_parameters.go         |   173 +
 .../delete_org_variable_responses.go          |   370 +
 .../get_org_variable_parameters.go            |   173 +
 .../get_org_variable_responses.go             |   246 +
 .../get_org_variables_list_parameters.go      |   220 +
 .../get_org_variables_list_responses.go       |   244 +
 .../org_add_team_member_parameters.go         |   176 +
 .../org_add_team_member_responses.go          |   228 +
 .../org_add_team_repository_parameters.go     |   198 +
 .../org_add_team_repository_responses.go      |   228 +
 .../org_conceal_member_parameters.go          |   173 +
 .../org_conceal_member_responses.go           |   228 +
 .../org_create_hook_parameters.go             |   172 +
 .../organization/org_create_hook_responses.go |   168 +
 .../org_create_label_parameters.go            |   172 +
 .../org_create_label_responses.go             |   246 +
 .../organization/org_create_parameters.go     |   150 +
 .../organization/org_create_responses.go      |   262 +
 .../org_create_team_parameters.go             |   172 +
 .../organization/org_create_team_responses.go |   246 +
 .../org_delete_avatar_parameters.go           |   151 +
 .../org_delete_avatar_responses.go            |   150 +
 .../org_delete_hook_parameters.go             |   176 +
 .../organization/org_delete_hook_responses.go |   150 +
 .../org_delete_label_parameters.go            |   176 +
 .../org_delete_label_responses.go             |   150 +
 .../org_delete_member_parameters.go           |   173 +
 .../org_delete_member_responses.go            |   150 +
 .../organization/org_delete_parameters.go     |   151 +
 .../organization/org_delete_responses.go      |   150 +
 .../org_delete_team_parameters.go             |   154 +
 .../organization/org_delete_team_responses.go |   150 +
 .../organization/org_edit_hook_parameters.go  |   197 +
 .../organization/org_edit_hook_responses.go   |   168 +
 .../organization/org_edit_label_parameters.go |   197 +
 .../organization/org_edit_label_responses.go  |   246 +
 .../organization/org_edit_parameters.go       |   172 +
 .../client/organization/org_edit_responses.go |   168 +
 .../organization/org_edit_team_parameters.go  |   173 +
 .../organization/org_edit_team_responses.go   |   168 +
 .../organization/org_get_all_parameters.go    |   198 +
 .../organization/org_get_all_responses.go     |   104 +
 .../organization/org_get_hook_parameters.go   |   176 +
 .../organization/org_get_hook_responses.go    |   168 +
 .../organization/org_get_label_parameters.go  |   176 +
 .../organization/org_get_label_responses.go   |   168 +
 .../client/organization/org_get_parameters.go |   151 +
 .../client/organization/org_get_responses.go  |   168 +
 ...et_runner_registration_token_parameters.go |   151 +
 ...get_runner_registration_token_responses.go |    96 +
 .../organization/org_get_team_parameters.go   |   154 +
 .../organization/org_get_team_responses.go    |   168 +
 .../org_get_user_permissions_parameters.go    |   173 +
 .../org_get_user_permissions_responses.go     |   246 +
 .../organization/org_is_member_parameters.go  |   173 +
 .../organization/org_is_member_responses.go   |   212 +
 .../org_is_public_member_parameters.go        |   173 +
 .../org_is_public_member_responses.go         |   150 +
 .../org_list_actions_secrets_parameters.go    |   220 +
 .../org_list_actions_secrets_responses.go     |   166 +
 .../org_list_activity_feeds_parameters.go     |   256 +
 .../org_list_activity_feeds_responses.go      |   166 +
 .../org_list_current_user_orgs_parameters.go  |   198 +
 .../org_list_current_user_orgs_responses.go   |   166 +
 .../organization/org_list_hooks_parameters.go |   220 +
 .../organization/org_list_hooks_responses.go  |   166 +
 .../org_list_labels_parameters.go             |   220 +
 .../organization/org_list_labels_responses.go |   166 +
 .../org_list_members_parameters.go            |   220 +
 .../org_list_members_responses.go             |   166 +
 .../org_list_public_members_parameters.go     |   220 +
 .../org_list_public_members_responses.go      |   166 +
 .../organization/org_list_repos_parameters.go |   220 +
 .../organization/org_list_repos_responses.go  |   166 +
 ...org_list_team_activity_feeds_parameters.go |   258 +
 .../org_list_team_activity_feeds_responses.go |   166 +
 .../org_list_team_member_parameters.go        |   176 +
 .../org_list_team_member_responses.go         |   168 +
 .../org_list_team_members_parameters.go       |   222 +
 .../org_list_team_members_responses.go        |   166 +
 .../org_list_team_repo_parameters.go          |   198 +
 .../org_list_team_repo_responses.go           |   168 +
 .../org_list_team_repos_parameters.go         |   222 +
 .../org_list_team_repos_responses.go          |   166 +
 .../organization/org_list_teams_parameters.go |   220 +
 .../organization/org_list_teams_responses.go  |   166 +
 .../org_list_user_orgs_parameters.go          |   220 +
 .../org_list_user_orgs_responses.go           |   166 +
 .../org_publicize_member_parameters.go        |   173 +
 .../org_publicize_member_responses.go         |   228 +
 .../org_remove_team_member_parameters.go      |   176 +
 .../org_remove_team_member_responses.go       |   150 +
 .../org_remove_team_repository_parameters.go  |   198 +
 .../org_remove_team_repository_responses.go   |   228 +
 .../org_update_avatar_parameters.go           |   172 +
 .../org_update_avatar_responses.go            |   150 +
 .../organization_block_user_parameters.go     |   207 +
 .../organization_block_user_responses.go      |   228 +
 ...rganization_check_user_block_parameters.go |   173 +
 ...organization_check_user_block_responses.go |   150 +
 .../organization/organization_client.go       |  2536 +
 .../organization_list_blocks_parameters.go    |   220 +
 .../organization_list_blocks_responses.go     |   104 +
 .../organization_unblock_user_parameters.go   |   173 +
 .../organization_unblock_user_responses.go    |   228 +
 .../organization/team_search_parameters.go    |   288 +
 .../organization/team_search_responses.go     |   282 +
 .../update_org_secret_parameters.go           |   194 +
 .../update_org_secret_responses.go            |   290 +
 .../update_org_variable_parameters.go         |   194 +
 .../update_org_variable_responses.go          |   290 +
 .../delete_package_parameters.go              |   217 +
 .../delete_package_responses.go               |   150 +
 .../get_package_parameters.go                 |   217 +
 .../get_package_responses.go                  |   168 +
 .../list_package_files_parameters.go          |   217 +
 .../list_package_files_responses.go           |   166 +
 .../list_packages_parameters.go               |   288 +
 .../list_packages_responses.go                |   166 +
 .../package_operations_client.go              |   273 +
 .../accept_repo_transfer_parameters.go        |   173 +
 .../accept_repo_transfer_responses.go         |   246 +
 .../create_current_user_repo_parameters.go    |   150 +
 .../create_current_user_repo_responses.go     |   324 +
 .../repository/create_fork_parameters.go      |   194 +
 .../repository/create_fork_responses.go       |   386 +
 .../create_repo_variable_parameters.go        |   216 +
 .../create_repo_variable_responses.go         |   290 +
 .../delete_repo_secret_parameters.go          |   195 +
 .../delete_repo_secret_responses.go           |   228 +
 .../delete_repo_variable_parameters.go        |   195 +
 .../delete_repo_variable_responses.go         |   370 +
 .../repository/generate_repo_parameters.go    |   194 +
 .../repository/generate_repo_responses.go     |   386 +
 .../get_annotated_tag_parameters.go           |   195 +
 .../repository/get_annotated_tag_responses.go |   246 +
 .../client/repository/get_blob_parameters.go  |   195 +
 .../client/repository/get_blob_responses.go   |   246 +
 .../get_repo_variable_parameters.go           |   195 +
 .../repository/get_repo_variable_responses.go |   246 +
 .../get_repo_variables_list_parameters.go     |   242 +
 .../get_repo_variables_list_responses.go      |   244 +
 .../client/repository/get_tree_parameters.go  |   298 +
 .../client/repository/get_tree_responses.go   |   246 +
 .../repository/list_forks_parameters.go       |   242 +
 .../client/repository/list_forks_responses.go |   166 +
 .../reject_repo_transfer_parameters.go        |   173 +
 .../reject_repo_transfer_responses.go         |   246 +
 .../repo_add_collaborator_parameters.go       |   216 +
 .../repo_add_collaborator_responses.go        |   306 +
 .../repo_add_push_mirror_parameters.go        |   194 +
 .../repo_add_push_mirror_responses.go         |   324 +
 .../repository/repo_add_team_parameters.go    |   195 +
 .../repository/repo_add_team_responses.go     |   306 +
 .../repository/repo_add_topic_parameters.go   |   195 +
 .../repository/repo_add_topic_responses.go    |   256 +
 .../repo_apply_diff_patch_parameters.go       |   194 +
 .../repo_apply_diff_patch_responses.go        |   246 +
 ..._cancel_scheduled_auto_merge_parameters.go |   198 +
 ...o_cancel_scheduled_auto_merge_responses.go |   306 +
 .../repo_change_files_parameters.go           |   194 +
 .../repository/repo_change_files_responses.go |   402 +
 .../repo_check_collaborator_parameters.go     |   195 +
 .../repo_check_collaborator_responses.go      |   228 +
 .../repository/repo_check_team_parameters.go  |   195 +
 .../repository/repo_check_team_responses.go   |   246 +
 .../repo_compare_diff_parameters.go           |   195 +
 .../repository/repo_compare_diff_responses.go |   168 +
 .../repo_create_branch_parameters.go          |   194 +
 ...epo_create_branch_protection_parameters.go |   194 +
 ...repo_create_branch_protection_responses.go |   402 +
 .../repo_create_branch_responses.go           |   370 +
 .../repository/repo_create_file_parameters.go |   216 +
 .../repository/repo_create_file_responses.go  |   402 +
 .../repository/repo_create_hook_parameters.go |   194 +
 .../repository/repo_create_hook_responses.go  |   168 +
 .../repository/repo_create_key_parameters.go  |   194 +
 .../repository/repo_create_key_responses.go   |   246 +
 .../repo_create_pull_request_parameters.go    |   194 +
 .../repo_create_pull_request_responses.go     |   480 +
 .../repo_create_pull_review_parameters.go     |   219 +
 ..._create_pull_review_requests_parameters.go |   219 +
 ...o_create_pull_review_requests_responses.go |   244 +
 .../repo_create_pull_review_responses.go      |   246 +
 ...po_create_release_attachment_parameters.go |   259 +
 ...epo_create_release_attachment_responses.go |   246 +
 .../repo_create_release_parameters.go         |   194 +
 .../repo_create_release_responses.go          |   324 +
 .../repo_create_status_parameters.go          |   216 +
 .../repo_create_status_responses.go           |   246 +
 .../repository/repo_create_tag_parameters.go  |   194 +
 .../repository/repo_create_tag_responses.go   |   448 +
 .../repo_create_wiki_page_parameters.go       |   194 +
 .../repo_create_wiki_page_responses.go        |   402 +
 .../repo_delete_avatar_parameters.go          |   173 +
 .../repo_delete_avatar_responses.go           |   150 +
 .../repo_delete_branch_parameters.go          |   195 +
 ...epo_delete_branch_protection_parameters.go |   195 +
 ...repo_delete_branch_protection_responses.go |   150 +
 .../repo_delete_branch_responses.go           |   306 +
 .../repo_delete_collaborator_parameters.go    |   195 +
 .../repo_delete_collaborator_responses.go     |   228 +
 .../repository/repo_delete_file_parameters.go |   216 +
 .../repository/repo_delete_file_responses.go  |   418 +
 .../repo_delete_git_hook_parameters.go        |   195 +
 .../repo_delete_git_hook_responses.go         |   150 +
 .../repository/repo_delete_hook_parameters.go |   198 +
 .../repository/repo_delete_hook_responses.go  |   150 +
 .../repository/repo_delete_key_parameters.go  |   198 +
 .../repository/repo_delete_key_responses.go   |   228 +
 .../repository/repo_delete_parameters.go      |   173 +
 .../repo_delete_pull_review_parameters.go     |   222 +
 ..._delete_pull_review_requests_parameters.go |   219 +
 ...o_delete_pull_review_requests_responses.go |   306 +
 .../repo_delete_pull_review_responses.go      |   228 +
 .../repo_delete_push_mirror_parameters.go     |   195 +
 .../repo_delete_push_mirror_responses.go      |   228 +
 ...po_delete_release_attachment_parameters.go |   222 +
 ...epo_delete_release_attachment_responses.go |   150 +
 .../repo_delete_release_by_tag_parameters.go  |   195 +
 .../repo_delete_release_by_tag_responses.go   |   228 +
 .../repo_delete_release_parameters.go         |   198 +
 .../repo_delete_release_responses.go          |   228 +
 .../repository/repo_delete_responses.go       |   228 +
 .../repository/repo_delete_tag_parameters.go  |   195 +
 .../repository/repo_delete_tag_responses.go   |   430 +
 .../repository/repo_delete_team_parameters.go |   195 +
 .../repository/repo_delete_team_responses.go  |   306 +
 .../repo_delete_topic_parameters.go           |   195 +
 .../repository/repo_delete_topic_responses.go |   256 +
 .../repo_delete_wiki_page_parameters.go       |   195 +
 .../repo_delete_wiki_page_responses.go        |   306 +
 .../repo_dismiss_pull_review_parameters.go    |   243 +
 .../repo_dismiss_pull_review_responses.go     |   324 +
 ...ownload_commit_diff_or_patch_parameters.go |   217 +
 ...download_commit_diff_or_patch_responses.go |   164 +
 ..._download_pull_diff_or_patch_parameters.go |   254 +
 ...o_download_pull_diff_or_patch_responses.go |   164 +
 .../repo_edit_branch_protection_parameters.go |   216 +
 .../repo_edit_branch_protection_responses.go  |   324 +
 .../repo_edit_git_hook_parameters.go          |   216 +
 .../repo_edit_git_hook_responses.go           |   168 +
 .../repository/repo_edit_hook_parameters.go   |   219 +
 .../repository/repo_edit_hook_responses.go    |   168 +
 .../client/repository/repo_edit_parameters.go |   197 +
 .../repo_edit_pull_request_parameters.go      |   219 +
 .../repo_edit_pull_request_responses.go       |   480 +
 ...repo_edit_release_attachment_parameters.go |   243 +
 .../repo_edit_release_attachment_responses.go |   168 +
 .../repo_edit_release_parameters.go           |   219 +
 .../repository/repo_edit_release_responses.go |   168 +
 .../client/repository/repo_edit_responses.go  |   324 +
 .../repo_edit_wiki_page_parameters.go         |   216 +
 .../repo_edit_wiki_page_responses.go          |   402 +
 .../repo_get_all_commits_parameters.go        |   446 +
 .../repo_get_all_commits_responses.go         |   328 +
 .../repository/repo_get_archive_parameters.go |   195 +
 .../repository/repo_get_archive_responses.go  |   150 +
 .../repo_get_assignees_parameters.go          |   173 +
 .../repo_get_assignees_responses.go           |   166 +
 .../repository/repo_get_branch_parameters.go  |   195 +
 .../repo_get_branch_protection_parameters.go  |   195 +
 .../repo_get_branch_protection_responses.go   |   168 +
 .../repository/repo_get_branch_responses.go   |   168 +
 .../repository/repo_get_by_id_parameters.go   |   154 +
 .../repository/repo_get_by_id_responses.go    |   168 +
 ...o_get_combined_status_by_ref_parameters.go |   264 +
 ...po_get_combined_status_by_ref_responses.go |   246 +
 ...repo_get_commit_pull_request_parameters.go |   195 +
 .../repo_get_commit_pull_request_responses.go |   168 +
 .../repo_get_contents_list_parameters.go      |   207 +
 .../repo_get_contents_list_responses.go       |   166 +
 .../repo_get_contents_parameters.go           |   229 +
 .../repository/repo_get_contents_responses.go |   168 +
 .../repo_get_editor_config_parameters.go      |   229 +
 .../repo_get_editor_config_responses.go       |   150 +
 .../repo_get_git_hook_parameters.go           |   195 +
 .../repository/repo_get_git_hook_responses.go |   168 +
 .../repository/repo_get_hook_parameters.go    |   198 +
 .../repository/repo_get_hook_responses.go     |   168 +
 .../repo_get_issue_config_parameters.go       |   173 +
 .../repo_get_issue_config_responses.go        |   168 +
 .../repo_get_issue_templates_parameters.go    |   173 +
 .../repo_get_issue_templates_responses.go     |   166 +
 .../repository/repo_get_key_parameters.go     |   198 +
 .../repository/repo_get_key_responses.go      |   168 +
 .../repo_get_languages_parameters.go          |   173 +
 .../repo_get_languages_responses.go           |   164 +
 .../repo_get_latest_release_parameters.go     |   173 +
 .../repo_get_latest_release_responses.go      |   168 +
 .../repository/repo_get_note_parameters.go    |   264 +
 .../repository/repo_get_note_responses.go     |   246 +
 .../client/repository/repo_get_parameters.go  |   173 +
 ...et_pull_request_by_base_head_parameters.go |   217 +
 ...get_pull_request_by_base_head_responses.go |   168 +
 ...epo_get_pull_request_commits_parameters.go |   334 +
 ...repo_get_pull_request_commits_responses.go |   252 +
 .../repo_get_pull_request_files_parameters.go |   334 +
 .../repo_get_pull_request_files_responses.go  |   252 +
 .../repo_get_pull_request_parameters.go       |   198 +
 .../repo_get_pull_request_responses.go        |   168 +
 ...epo_get_pull_review_comments_parameters.go |   222 +
 ...repo_get_pull_review_comments_responses.go |   166 +
 .../repo_get_pull_review_parameters.go        |   222 +
 .../repo_get_pull_review_responses.go         |   168 +
 ...t_push_mirror_by_remote_name_parameters.go |   195 +
 ...et_push_mirror_by_remote_name_responses.go |   324 +
 .../repo_get_raw_file_or_l_f_s_parameters.go  |   229 +
 .../repo_get_raw_file_or_l_f_s_responses.go   |   150 +
 .../repo_get_raw_file_parameters.go           |   229 +
 .../repository/repo_get_raw_file_responses.go |   150 +
 .../repo_get_release_attachment_parameters.go |   222 +
 .../repo_get_release_attachment_responses.go  |   168 +
 .../repo_get_release_by_tag_parameters.go     |   195 +
 .../repo_get_release_by_tag_responses.go      |   168 +
 .../repository/repo_get_release_parameters.go |   198 +
 .../repository/repo_get_release_responses.go  |   168 +
 .../repo_get_repo_permissions_parameters.go   |   195 +
 .../repo_get_repo_permissions_responses.go    |   246 +
 .../client/repository/repo_get_responses.go   |   168 +
 .../repo_get_reviewers_parameters.go          |   173 +
 .../repo_get_reviewers_responses.go           |   166 +
 ...et_runner_registration_token_parameters.go |   173 +
 ...get_runner_registration_token_responses.go |    96 +
 .../repo_get_single_commit_parameters.go      |   298 +
 .../repo_get_single_commit_responses.go       |   246 +
 .../repository/repo_get_tag_parameters.go     |   195 +
 .../repository/repo_get_tag_responses.go      |   168 +
 .../repo_get_wiki_page_parameters.go          |   195 +
 .../repo_get_wiki_page_responses.go           |   168 +
 ...repo_get_wiki_page_revisions_parameters.go |   230 +
 .../repo_get_wiki_page_revisions_responses.go |   168 +
 .../repo_get_wiki_pages_parameters.go         |   242 +
 .../repo_get_wiki_pages_responses.go          |   166 +
 .../repo_list_actions_secrets_parameters.go   |   242 +
 .../repo_list_actions_secrets_responses.go    |   166 +
 .../repo_list_activity_feeds_parameters.go    |   278 +
 .../repo_list_activity_feeds_responses.go     |   166 +
 .../repo_list_all_git_refs_parameters.go      |   173 +
 .../repo_list_all_git_refs_responses.go       |   166 +
 .../repo_list_branch_protection_parameters.go |   173 +
 .../repo_list_branch_protection_responses.go  |   104 +
 .../repo_list_branches_parameters.go          |   242 +
 .../repo_list_branches_responses.go           |   104 +
 .../repo_list_collaborators_parameters.go     |   242 +
 .../repo_list_collaborators_responses.go      |   166 +
 .../repo_list_git_hooks_parameters.go         |   173 +
 .../repo_list_git_hooks_responses.go          |   166 +
 .../repo_list_git_refs_parameters.go          |   195 +
 .../repo_list_git_refs_responses.go           |   166 +
 .../repository/repo_list_hooks_parameters.go  |   242 +
 .../repository/repo_list_hooks_responses.go   |   166 +
 .../repository/repo_list_keys_parameters.go   |   310 +
 .../repository/repo_list_keys_responses.go    |   166 +
 .../repo_list_pinned_issues_parameters.go     |   173 +
 .../repo_list_pinned_issues_responses.go      |   166 +
 ...po_list_pinned_pull_requests_parameters.go |   173 +
 ...epo_list_pinned_pull_requests_responses.go |   166 +
 .../repo_list_pull_requests_parameters.go     |   391 +
 .../repo_list_pull_requests_responses.go      |   166 +
 .../repo_list_pull_reviews_parameters.go      |   266 +
 .../repo_list_pull_reviews_responses.go       |   166 +
 .../repo_list_push_mirrors_parameters.go      |   242 +
 .../repo_list_push_mirrors_responses.go       |   322 +
 ...epo_list_release_attachments_parameters.go |   198 +
 ...repo_list_release_attachments_responses.go |   166 +
 .../repo_list_releases_parameters.go          |   310 +
 .../repo_list_releases_responses.go           |   166 +
 .../repo_list_stargazers_parameters.go        |   242 +
 .../repo_list_stargazers_responses.go         |   166 +
 .../repo_list_statuses_by_ref_parameters.go   |   332 +
 .../repo_list_statuses_by_ref_responses.go    |   244 +
 .../repo_list_statuses_parameters.go          |   332 +
 .../repo_list_statuses_responses.go           |   244 +
 .../repo_list_subscribers_parameters.go       |   242 +
 .../repo_list_subscribers_responses.go        |   166 +
 .../repository/repo_list_tags_parameters.go   |   242 +
 .../repository/repo_list_tags_responses.go    |   166 +
 .../repository/repo_list_teams_parameters.go  |   173 +
 .../repository/repo_list_teams_responses.go   |   166 +
 .../repository/repo_list_topics_parameters.go |   242 +
 .../repository/repo_list_topics_responses.go  |   168 +
 .../repo_merge_pull_request_parameters.go     |   219 +
 .../repo_merge_pull_request_responses.go      |   368 +
 .../repository/repo_migrate_parameters.go     |   150 +
 .../repository/repo_migrate_responses.go      |   324 +
 .../repository/repo_mirror_sync_parameters.go |   173 +
 .../repository/repo_mirror_sync_responses.go  |   228 +
 .../repo_new_pin_allowed_parameters.go        |   173 +
 .../repo_new_pin_allowed_responses.go         |   168 +
 .../repo_pull_request_is_merged_parameters.go |   198 +
 .../repo_pull_request_is_merged_responses.go  |   150 +
 .../repo_push_mirror_sync_parameters.go       |   173 +
 .../repo_push_mirror_sync_responses.go        |   306 +
 .../repository/repo_search_parameters.go      |   716 +
 .../repository/repo_search_responses.go       |   184 +
 .../repository/repo_signing_key_parameters.go |   173 +
 .../repository/repo_signing_key_responses.go  |   102 +
 .../repo_submit_pull_review_parameters.go     |   243 +
 .../repo_submit_pull_review_responses.go      |   246 +
 .../repository/repo_test_hook_parameters.go   |   232 +
 .../repository/repo_test_hook_responses.go    |   150 +
 .../repo_tracked_times_parameters.go          |   348 +
 .../repo_tracked_times_responses.go           |   322 +
 .../repository/repo_transfer_parameters.go    |   197 +
 .../repository/repo_transfer_responses.go     |   324 +
 .../repo_un_dismiss_pull_review_parameters.go |   222 +
 .../repo_un_dismiss_pull_review_responses.go  |   324 +
 .../repo_update_avatar_parameters.go          |   194 +
 .../repo_update_avatar_responses.go           |   150 +
 .../repository/repo_update_file_parameters.go |   216 +
 .../repository/repo_update_file_responses.go  |   402 +
 .../repo_update_pull_request_parameters.go    |   232 +
 .../repo_update_pull_request_responses.go     |   384 +
 .../repo_update_topics_parameters.go          |   194 +
 .../repo_update_topics_responses.go           |   256 +
 .../repo_validate_issue_config_parameters.go  |   173 +
 .../repo_validate_issue_config_responses.go   |   168 +
 .../client/repository/repository_client.go    |  6526 +++
 .../repository/topic_search_parameters.go     |   225 +
 .../repository/topic_search_responses.go      |   244 +
 .../update_repo_secret_parameters.go          |   216 +
 .../update_repo_secret_responses.go           |   290 +
 .../update_repo_variable_parameters.go        |   216 +
 .../update_repo_variable_responses.go         |   290 +
 ...r_current_check_subscription_parameters.go |   173 +
 ...er_current_check_subscription_responses.go |   168 +
 ..._current_delete_subscription_parameters.go |   173 +
 ...r_current_delete_subscription_responses.go |   150 +
 ...ser_current_put_subscription_parameters.go |   173 +
 ...user_current_put_subscription_responses.go |   246 +
 .../user_tracked_times_parameters.go          |   195 +
 .../user_tracked_times_responses.go           |   322 +
 .../get_general_api_settings_parameters.go    |   128 +
 .../get_general_api_settings_responses.go     |   106 +
 ..._general_attachment_settings_parameters.go |   128 +
 ...t_general_attachment_settings_responses.go |   106 +
 ..._general_repository_settings_parameters.go |   128 +
 ...t_general_repository_settings_responses.go |   106 +
 .../get_general_ui_settings_parameters.go     |   128 +
 .../get_general_ui_settings_responses.go      |   106 +
 .../client/settings/settings_client.go        |   253 +
 .../user/create_user_variable_parameters.go   |   172 +
 .../user/create_user_variable_responses.go    |   290 +
 .../user/delete_user_secret_parameters.go     |   151 +
 .../user/delete_user_secret_responses.go      |   228 +
 .../user/delete_user_variable_parameters.go   |   151 +
 .../user/delete_user_variable_responses.go    |   290 +
 .../user/get_user_settings_parameters.go      |   128 +
 .../user/get_user_settings_responses.go       |   104 +
 .../user/get_user_variable_parameters.go      |   151 +
 .../user/get_user_variable_responses.go       |   246 +
 .../get_user_variables_list_parameters.go     |   198 +
 .../user/get_user_variables_list_responses.go |   244 +
 .../user/get_verification_token_parameters.go |   128 +
 .../user/get_verification_token_responses.go  |   164 +
 .../user/update_user_secret_parameters.go     |   172 +
 .../user/update_user_secret_responses.go      |   290 +
 .../user/update_user_settings_parameters.go   |   150 +
 .../user/update_user_settings_responses.go    |   104 +
 .../user/update_user_variable_parameters.go   |   172 +
 .../user/update_user_variable_responses.go    |   290 +
 .../client/user/user_add_email_parameters.go  |   150 +
 .../client/user/user_add_email_responses.go   |   182 +
 .../client/user/user_block_user_parameters.go |   185 +
 .../client/user/user_block_user_responses.go  |   228 +
 .../user/user_check_following_parameters.go   |   173 +
 .../user/user_check_following_responses.go    |   150 +
 .../user/user_check_user_block_parameters.go  |   151 +
 .../user/user_check_user_block_responses.go   |   150 +
 .../client/user/user_client.go                |  2947 +
 .../user/user_create_hook_parameters.go       |   150 +
 .../client/user/user_create_hook_responses.go |   106 +
 ...r_create_o_auth2_application_parameters.go |   150 +
 ...er_create_o_auth2_application_responses.go |   184 +
 .../user/user_create_token_parameters.go      |   172 +
 .../user/user_create_token_responses.go       |   262 +
 ...user_current_check_following_parameters.go |   151 +
 .../user_current_check_following_responses.go |   150 +
 .../user_current_check_starring_parameters.go |   173 +
 .../user_current_check_starring_responses.go  |   150 +
 .../user_current_delete_follow_parameters.go  |   151 +
 .../user_current_delete_follow_responses.go   |   150 +
 ...ser_current_delete_g_p_g_key_parameters.go |   154 +
 ...user_current_delete_g_p_g_key_responses.go |   228 +
 .../user_current_delete_key_parameters.go     |   154 +
 .../user/user_current_delete_key_responses.go |   228 +
 .../user_current_delete_star_parameters.go    |   173 +
 .../user_current_delete_star_responses.go     |   150 +
 .../user_current_get_g_p_g_key_parameters.go  |   154 +
 .../user_current_get_g_p_g_key_responses.go   |   168 +
 .../user/user_current_get_key_parameters.go   |   154 +
 .../user/user_current_get_key_responses.go    |   168 +
 .../user_current_list_followers_parameters.go |   198 +
 .../user_current_list_followers_responses.go  |   104 +
 .../user_current_list_following_parameters.go |   198 +
 .../user_current_list_following_responses.go  |   104 +
 ...user_current_list_g_p_g_keys_parameters.go |   198 +
 .../user_current_list_g_p_g_keys_responses.go |   104 +
 .../user/user_current_list_keys_parameters.go |   232 +
 .../user/user_current_list_keys_responses.go  |   104 +
 .../user_current_list_repos_parameters.go     |   198 +
 .../user/user_current_list_repos_responses.go |   104 +
 .../user_current_list_starred_parameters.go   |   198 +
 .../user_current_list_starred_responses.go    |   104 +
 ...r_current_list_subscriptions_parameters.go |   198 +
 ...er_current_list_subscriptions_responses.go |   104 +
 .../user_current_post_g_p_g_key_parameters.go |   150 +
 .../user_current_post_g_p_g_key_responses.go  |   246 +
 .../user/user_current_post_key_parameters.go  |   150 +
 .../user/user_current_post_key_responses.go   |   184 +
 .../user_current_put_follow_parameters.go     |   151 +
 .../user/user_current_put_follow_responses.go |   228 +
 .../user/user_current_put_star_parameters.go  |   173 +
 .../user/user_current_put_star_responses.go   |   228 +
 .../user_current_tracked_times_parameters.go  |   270 +
 .../user_current_tracked_times_responses.go   |   104 +
 .../user_delete_access_token_parameters.go    |   173 +
 .../user_delete_access_token_responses.go     |   306 +
 .../user/user_delete_avatar_parameters.go     |   128 +
 .../user/user_delete_avatar_responses.go      |    88 +
 .../user/user_delete_email_parameters.go      |   150 +
 .../user/user_delete_email_responses.go       |   150 +
 .../user/user_delete_hook_parameters.go       |   154 +
 .../client/user/user_delete_hook_responses.go |    88 +
 ...r_delete_o_auth2_application_parameters.go |   154 +
 ...er_delete_o_auth2_application_responses.go |   150 +
 .../client/user/user_edit_hook_parameters.go  |   175 +
 .../client/user/user_edit_hook_responses.go   |   106 +
 .../user/user_get_current_parameters.go       |   128 +
 .../client/user/user_get_current_responses.go |   106 +
 .../user/user_get_heatmap_data_parameters.go  |   151 +
 .../user/user_get_heatmap_data_responses.go   |   166 +
 .../client/user/user_get_hook_parameters.go   |   154 +
 .../client/user/user_get_hook_responses.go    |   106 +
 ...user_get_o_auth2_application_parameters.go |   154 +
 .../user_get_o_auth2_application_responses.go |   168 +
 .../user_get_oauth2_application_parameters.go |   198 +
 .../user_get_oauth2_application_responses.go  |   104 +
 .../client/user/user_get_parameters.go        |   151 +
 .../client/user/user_get_responses.go         |   168 +
 ...et_runner_registration_token_parameters.go |   128 +
 ...get_runner_registration_token_responses.go |    96 +
 .../user/user_get_stop_watches_parameters.go  |   198 +
 .../user/user_get_stop_watches_responses.go   |   104 +
 .../client/user/user_get_tokens_parameters.go |   220 +
 .../client/user/user_get_tokens_responses.go  |   182 +
 .../user_list_activity_feeds_parameters.go    |   290 +
 .../user_list_activity_feeds_responses.go     |   166 +
 .../user/user_list_blocks_parameters.go       |   198 +
 .../client/user/user_list_blocks_responses.go |   104 +
 .../user/user_list_emails_parameters.go       |   128 +
 .../client/user/user_list_emails_responses.go |   104 +
 .../user/user_list_followers_parameters.go    |   220 +
 .../user/user_list_followers_responses.go     |   166 +
 .../user/user_list_following_parameters.go    |   220 +
 .../user/user_list_following_responses.go     |   166 +
 .../user/user_list_g_p_g_keys_parameters.go   |   220 +
 .../user/user_list_g_p_g_keys_responses.go    |   166 +
 .../client/user/user_list_hooks_parameters.go |   198 +
 .../client/user/user_list_hooks_responses.go  |   104 +
 .../client/user/user_list_keys_parameters.go  |   254 +
 .../client/user/user_list_keys_responses.go   |   166 +
 .../client/user/user_list_repos_parameters.go |   220 +
 .../client/user/user_list_repos_responses.go  |   166 +
 .../user/user_list_starred_parameters.go      |   220 +
 .../user/user_list_starred_responses.go       |   166 +
 .../user_list_subscriptions_parameters.go     |   220 +
 .../user/user_list_subscriptions_responses.go |   166 +
 .../client/user/user_list_teams_parameters.go |   198 +
 .../client/user/user_list_teams_responses.go  |   104 +
 .../client/user/user_search_parameters.go     |   268 +
 .../client/user/user_search_responses.go      |   220 +
 .../user/user_unblock_user_parameters.go      |   151 +
 .../user/user_unblock_user_responses.go       |   228 +
 .../user/user_update_avatar_parameters.go     |   150 +
 .../user/user_update_avatar_responses.go      |    88 +
 ...r_update_o_auth2_application_parameters.go |   175 +
 ...er_update_o_auth2_application_responses.go |   168 +
 .../user/user_verify_g_p_g_key_parameters.go  |   128 +
 .../user/user_verify_g_p_g_key_responses.go   |   246 +
 .../gitea-generated/models/access_token.go    |    62 +
 .../gitea-generated/models/action_variable.go |    59 +
 .../gitea-generated/models/activity.go        |   259 +
 .../gitea-generated/models/activity_pub.go    |    50 +
 .../models/add_collaborator_option.go         |    50 +
 .../gitea-generated/models/add_time_option.go |    94 +
 .../gitea-generated/models/annotated_tag.go   |   223 +
 .../models/annotated_tag_object.go            |    56 +
 .../gitea-generated/models/api_error.go       |    53 +
 .../gitea-generated/models/attachment.go      |    92 +
 bots-common/gitea-generated/models/badge.go   |    59 +
 bots-common/gitea-generated/models/branch.go  |   133 +
 .../models/branch_protection.go               |   166 +
 .../models/change_file_operation.go           |   136 +
 .../models/change_files_options.go            |   290 +
 .../gitea-generated/models/changed_file.go    |    74 +
 .../gitea-generated/models/combined_status.go |   230 +
 bots-common/gitea-generated/models/comment.go |   234 +
 bots-common/gitea-generated/models/commit.go  |   417 +
 .../models/commit_affected_files.go           |    53 +
 .../models/commit_date_options.go             |    94 +
 .../gitea-generated/models/commit_meta.go     |    80 +
 .../gitea-generated/models/commit_stats.go    |    56 +
 .../gitea-generated/models/commit_status.go   |   211 +
 .../models/commit_status_state.go             |    28 +
 .../gitea-generated/models/commit_user.go     |    80 +
 bots-common/gitea-generated/models/compare.go |   124 +
 .../models/contents_response.go               |   151 +
 .../models/create_access_token_option.go      |    74 +
 .../models/create_branch_protection_option.go |   119 +
 .../models/create_branch_repo_option.go       |    78 +
 .../models/create_email_option.go             |    50 +
 .../models/create_file_options.go             |   242 +
 .../models/create_fork_option.go              |    53 +
 .../models/create_g_p_g_key_option.go         |    74 +
 .../models/create_hook_option.go              |   194 +
 .../models/create_hook_option_config.go       |    28 +
 .../models/create_issue_comment_option.go     |    71 +
 .../models/create_issue_option.go             |   112 +
 .../models/create_key_option.go               |    91 +
 .../models/create_label_option.go             |   100 +
 .../models/create_milestone_option.go         |   131 +
 .../create_o_auth2_application_options.go     |    56 +
 .../models/create_or_update_secret_option.go  |    71 +
 .../models/create_org_option.go               |   143 +
 .../models/create_pull_request_option.go      |    98 +
 .../models/create_pull_review_comment.go      |    59 +
 .../models/create_pull_review_options.go      |   173 +
 .../models/create_push_mirror_option.go       |    62 +
 .../models/create_release_option.go           |    86 +
 .../models/create_repo_option.go              |   205 +
 .../models/create_status_option.go            |   113 +
 .../models/create_tag_option.go               |    77 +
 .../models/create_team_option.go              |   142 +
 .../models/create_user_option.go              |   139 +
 .../models/create_variable_option.go          |    71 +
 .../models/create_wiki_page_options.go        |    56 +
 bots-common/gitea-generated/models/cron.go    |   103 +
 .../models/delete_email_option.go             |    50 +
 .../models/delete_file_options.go             |   242 +
 .../gitea-generated/models/deploy_key.go      |   151 +
 .../models/dismiss_pull_review_options.go     |    53 +
 .../models/edit_attachment_options.go         |    50 +
 .../models/edit_branch_protection_option.go   |   113 +
 .../models/edit_deadline_option.go            |    76 +
 .../models/edit_git_hook_option.go            |    50 +
 .../models/edit_hook_option.go                |    62 +
 .../models/edit_issue_comment_option.go       |    71 +
 .../models/edit_issue_option.go               |    98 +
 .../models/edit_label_option.go               |    65 +
 .../models/edit_milestone_option.go           |    83 +
 .../gitea-generated/models/edit_org_option.go |   126 +
 .../models/edit_pull_request_option.go        |   104 +
 .../models/edit_reaction_option.go            |    50 +
 .../models/edit_release_option.go             |    65 +
 .../models/edit_repo_option.go                |   300 +
 .../models/edit_team_option.go                |   142 +
 .../models/edit_user_option.go                |   153 +
 bots-common/gitea-generated/models/email.go   |    86 +
 .../models/external_tracker.go                |    59 +
 .../gitea-generated/models/external_wiki.go   |    50 +
 .../models/file_commit_response.go            |   307 +
 .../models/file_delete_response.go            |   163 +
 .../models/file_links_response.go             |    56 +
 .../gitea-generated/models/file_response.go   |   211 +
 .../gitea-generated/models/files_response.go  |   223 +
 .../gitea-generated/models/g_p_g_key.go       |   251 +
 .../gitea-generated/models/g_p_g_key_email.go |    53 +
 .../models/general_api_settings.go            |    59 +
 .../models/general_attachment_settings.go     |    59 +
 .../models/general_repo_settings.go           |    65 +
 .../models/general_ui_settings.go             |    56 +
 .../models/generate_repo_option.go            |   118 +
 .../models/git_blob_response.go               |    62 +
 .../gitea-generated/models/git_entry.go       |    65 +
 .../gitea-generated/models/git_hook.go        |    56 +
 .../gitea-generated/models/git_object.go      |    56 +
 .../models/git_tree_response.go               |   136 +
 .../models/gitignore_template_info.go         |    53 +
 bots-common/gitea-generated/models/hook.go    |   115 +
 .../gitea-generated/models/identity.go        |    77 +
 .../models/internal_tracker.go                |    56 +
 bots-common/gitea-generated/models/issue.go   |   663 +
 .../gitea-generated/models/issue_config.go    |   124 +
 .../models/issue_config_contact_link.go       |    56 +
 .../models/issue_config_validation.go         |    53 +
 .../gitea-generated/models/issue_deadline.go  |    74 +
 .../models/issue_form_field.go                |   168 +
 .../models/issue_form_field_type.go           |    27 +
 .../models/issue_form_field_visible.go        |    27 +
 .../models/issue_labels_option.go             |    51 +
 .../gitea-generated/models/issue_meta.go      |    56 +
 .../gitea-generated/models/issue_template.go  |   181 +
 .../models/issue_template_labels.go           |    27 +
 bots-common/gitea-generated/models/label.go   |    71 +
 .../gitea-generated/models/label_template.go  |    61 +
 .../models/license_template_info.go           |    62 +
 .../models/licenses_template_list_entry.go    |    56 +
 .../gitea-generated/models/markdown_option.go |    68 +
 .../gitea-generated/models/markup_option.go   |    73 +
 .../models/merge_pull_request_form.go         |   140 +
 .../models/migrate_repo_options.go            |   209 +
 .../gitea-generated/models/milestone.go       |   200 +
 .../models/new_issue_pins_allowed.go          |    53 +
 .../gitea-generated/models/node_info.go       |   223 +
 .../models/node_info_services.go              |    53 +
 .../models/node_info_software.go              |    59 +
 .../gitea-generated/models/node_info_usage.go |   115 +
 .../models/node_info_usage_users.go           |    56 +
 bots-common/gitea-generated/models/note.go    |   112 +
 .../models/notification_count.go              |    50 +
 .../models/notification_subject.go            |   165 +
 .../models/notification_thread.go             |   193 +
 .../models/notify_subject_type.go             |    27 +
 .../models/o_auth2_application.go             |    92 +
 .../gitea-generated/models/organization.go    |    80 +
 .../models/organization_permissions.go        |    62 +
 .../gitea-generated/models/p_r_branch_info.go |   121 +
 bots-common/gitea-generated/models/package.go |   247 +
 .../gitea-generated/models/package_file.go    |    68 +
 .../gitea-generated/models/payload_commit.go  |   250 +
 .../models/payload_commit_verification.go     |   121 +
 .../gitea-generated/models/payload_user.go    |    80 +
 .../gitea-generated/models/permission.go      |    56 +
 .../gitea-generated/models/public_key.go      |   151 +
 .../gitea-generated/models/pull_request.go    |   761 +
 .../models/pull_request_meta.go               |    83 +
 .../gitea-generated/models/pull_review.go     |   274 +
 .../models/pull_review_comment.go             |   234 +
 .../models/pull_review_request_options.go     |    53 +
 .../gitea-generated/models/push_mirror.go     |   112 +
 .../gitea-generated/models/reaction.go        |   133 +
 .../gitea-generated/models/reference.go       |   115 +
 bots-common/gitea-generated/models/release.go |   249 +
 .../models/rename_user_option.go              |    71 +
 .../models/repo_collaborator_permission.go    |   115 +
 .../gitea-generated/models/repo_commit.go     |   268 +
 .../models/repo_topic_options.go              |    50 +
 .../gitea-generated/models/repo_transfer.go   |   223 +
 .../gitea-generated/models/repository.go      |   691 +
 .../gitea-generated/models/repository_meta.go |    59 +
 .../models/review_state_type.go               |    27 +
 .../gitea-generated/models/search_results.go  |   124 +
 bots-common/gitea-generated/models/secret.go  |    77 +
 .../gitea-generated/models/server_version.go  |    50 +
 .../gitea-generated/models/state_type.go      |    27 +
 .../gitea-generated/models/stop_watch.go      |    92 +
 .../models/submit_pull_review_options.go      |   107 +
 bots-common/gitea-generated/models/tag.go     |   124 +
 bots-common/gitea-generated/models/team.go    |   193 +
 .../gitea-generated/models/time_stamp.go      |    27 +
 .../models/timeline_comment.go                |   708 +
 .../gitea-generated/models/topic_name.go      |    50 +
 .../gitea-generated/models/topic_response.go  |   103 +
 .../gitea-generated/models/tracked_time.go    |   145 +
 .../models/transfer_repo_option.go            |    74 +
 .../models/update_file_options.go             |   262 +
 .../models/update_repo_avatar_option.go       |    50 +
 .../models/update_user_avatar_option.go       |    50 +
 .../models/update_variable_option.go          |    74 +
 bots-common/gitea-generated/models/user.go    |   171 +
 .../models/user_badge_option.go               |    51 +
 .../models/user_heatmap_data.go               |   107 +
 .../gitea-generated/models/user_settings.go   |    74 +
 .../models/user_settings_options.go           |    74 +
 .../gitea-generated/models/watch_info.go      |    89 +
 .../gitea-generated/models/wiki_commit.go     |   166 +
 .../models/wiki_commit_list.go                |   124 +
 .../gitea-generated/models/wiki_page.go       |   130 +
 .../models/wiki_page_meta_data.go             |   118 +
 bots-common/gitea_utils.go                    |    88 +
 bots-common/go.mod                            |    36 +
 bots-common/go.sum                            |    75 +
 bots-common/log.go                            |    81 +
 bots-common/log_test.go                       |    46 +
 bots-common/obs.api.yaml                      | 47328 ++++++++++++++++
 bots-common/readme.go                         |    11 +
 bots-common/request_handler.go                |    47 +
 bots-common/request_push.go                   |    52 +
 bots-common/request_push_test.go              |    57 +
 bots-common/request_repo.go                   |    74 +
 bots-common/request_repo_test.go              |    43 +
 obs-staging-bot/.gitignore                    |     1 +
 obs-staging-bot/Makefile                      |    14 +
 obs-staging-bot/devtest.sh                    |     8 +
 obs-staging-bot/go.mod                        |    35 +
 obs-staging-bot/go.sum                        |    75 +
 obs-staging-bot/main.go                       |    52 +
 obs-staging-bot/main_test.go                  |     2 +
 pr-review/.gitignore                          |     1 +
 pr-review/Makefile                            |    14 +
 pr-review/api.json                            | 25728 +++++++++
 pr-review/devtest.sh                          |     8 +
 pr-review/go.mod                              |    35 +
 pr-review/go.sum                              |    75 +
 pr-review/listen.go                           |     3 +
 pr-review/main.go                             |    95 +
 pr-review/main_test.go                        |     2 +
 pr-review/readme.go                           |    11 +
 pr-review/request_pr.go                       |    91 +
 prjgit-updater/.gitignore                     |     1 +
 prjgit-updater/Makefile                       |    14 +
 prjgit-updater/devtest.sh                     |     8 +
 prjgit-updater/go.mod                         |    35 +
 prjgit-updater/go.sum                         |    75 +
 prjgit-updater/main.go                        |   164 +
 prjgit-updater/main_test.go                   |     2 +
 1058 files changed, 309291 insertions(+)
 create mode 100644 bots-common/Makefile
 create mode 100644 bots-common/api.json
 create mode 100644 bots-common/cfg.yaml
 create mode 100644 bots-common/consts.go
 create mode 100644 bots-common/conststring_test.go
 create mode 100755 bots-common/devtest.sh
 create mode 100644 bots-common/generate.go
 create mode 100644 bots-common/git_utils.go
 create mode 100644 bots-common/gitea-generated/client/activitypub/activitypub_client.go
 create mode 100644 bots-common/gitea-generated/client/activitypub/activitypub_person_inbox_parameters.go
 create mode 100644 bots-common/gitea-generated/client/activitypub/activitypub_person_inbox_responses.go
 create mode 100644 bots-common/gitea-generated/client/activitypub/activitypub_person_parameters.go
 create mode 100644 bots-common/gitea-generated/client/activitypub/activitypub_person_responses.go
 create mode 100644 bots-common/gitea-generated/client/admin/admin_add_user_badges_parameters.go
 create mode 100644 bots-common/gitea-generated/client/admin/admin_add_user_badges_responses.go
 create mode 100644 bots-common/gitea-generated/client/admin/admin_adopt_repository_parameters.go
 create mode 100644 bots-common/gitea-generated/client/admin/admin_adopt_repository_responses.go
 create mode 100644 bots-common/gitea-generated/client/admin/admin_client.go
 create mode 100644 bots-common/gitea-generated/client/admin/admin_create_hook_parameters.go
 create mode 100644 bots-common/gitea-generated/client/admin/admin_create_hook_responses.go
 create mode 100644 bots-common/gitea-generated/client/admin/admin_create_org_parameters.go
 create mode 100644 bots-common/gitea-generated/client/admin/admin_create_org_responses.go
 create mode 100644 bots-common/gitea-generated/client/admin/admin_create_public_key_parameters.go
 create mode 100644 bots-common/gitea-generated/client/admin/admin_create_public_key_responses.go
 create mode 100644 bots-common/gitea-generated/client/admin/admin_create_repo_parameters.go
 create mode 100644 bots-common/gitea-generated/client/admin/admin_create_repo_responses.go
 create mode 100644 bots-common/gitea-generated/client/admin/admin_create_user_parameters.go
 create mode 100644 bots-common/gitea-generated/client/admin/admin_create_user_responses.go
 create mode 100644 bots-common/gitea-generated/client/admin/admin_cron_list_parameters.go
 create mode 100644 bots-common/gitea-generated/client/admin/admin_cron_list_responses.go
 create mode 100644 bots-common/gitea-generated/client/admin/admin_cron_run_parameters.go
 create mode 100644 bots-common/gitea-generated/client/admin/admin_cron_run_responses.go
 create mode 100644 bots-common/gitea-generated/client/admin/admin_delete_hook_parameters.go
 create mode 100644 bots-common/gitea-generated/client/admin/admin_delete_hook_responses.go
 create mode 100644 bots-common/gitea-generated/client/admin/admin_delete_unadopted_repository_parameters.go
 create mode 100644 bots-common/gitea-generated/client/admin/admin_delete_unadopted_repository_responses.go
 create mode 100644 bots-common/gitea-generated/client/admin/admin_delete_user_badges_parameters.go
 create mode 100644 bots-common/gitea-generated/client/admin/admin_delete_user_badges_responses.go
 create mode 100644 bots-common/gitea-generated/client/admin/admin_delete_user_parameters.go
 create mode 100644 bots-common/gitea-generated/client/admin/admin_delete_user_public_key_parameters.go
 create mode 100644 bots-common/gitea-generated/client/admin/admin_delete_user_public_key_responses.go
 create mode 100644 bots-common/gitea-generated/client/admin/admin_delete_user_responses.go
 create mode 100644 bots-common/gitea-generated/client/admin/admin_edit_hook_parameters.go
 create mode 100644 bots-common/gitea-generated/client/admin/admin_edit_hook_responses.go
 create mode 100644 bots-common/gitea-generated/client/admin/admin_edit_user_parameters.go
 create mode 100644 bots-common/gitea-generated/client/admin/admin_edit_user_responses.go
 create mode 100644 bots-common/gitea-generated/client/admin/admin_get_all_emails_parameters.go
 create mode 100644 bots-common/gitea-generated/client/admin/admin_get_all_emails_responses.go
 create mode 100644 bots-common/gitea-generated/client/admin/admin_get_all_orgs_parameters.go
 create mode 100644 bots-common/gitea-generated/client/admin/admin_get_all_orgs_responses.go
 create mode 100644 bots-common/gitea-generated/client/admin/admin_get_hook_parameters.go
 create mode 100644 bots-common/gitea-generated/client/admin/admin_get_hook_responses.go
 create mode 100644 bots-common/gitea-generated/client/admin/admin_get_runner_registration_token_parameters.go
 create mode 100644 bots-common/gitea-generated/client/admin/admin_get_runner_registration_token_responses.go
 create mode 100644 bots-common/gitea-generated/client/admin/admin_list_hooks_parameters.go
 create mode 100644 bots-common/gitea-generated/client/admin/admin_list_hooks_responses.go
 create mode 100644 bots-common/gitea-generated/client/admin/admin_list_user_badges_parameters.go
 create mode 100644 bots-common/gitea-generated/client/admin/admin_list_user_badges_responses.go
 create mode 100644 bots-common/gitea-generated/client/admin/admin_rename_user_parameters.go
 create mode 100644 bots-common/gitea-generated/client/admin/admin_rename_user_responses.go
 create mode 100644 bots-common/gitea-generated/client/admin/admin_search_emails_parameters.go
 create mode 100644 bots-common/gitea-generated/client/admin/admin_search_emails_responses.go
 create mode 100644 bots-common/gitea-generated/client/admin/admin_search_users_parameters.go
 create mode 100644 bots-common/gitea-generated/client/admin/admin_search_users_responses.go
 create mode 100644 bots-common/gitea-generated/client/admin/admin_unadopted_list_parameters.go
 create mode 100644 bots-common/gitea-generated/client/admin/admin_unadopted_list_responses.go
 create mode 100644 bots-common/gitea-generated/client/gitea_api_client.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_add_label_parameters.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_add_label_responses.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_add_subscription_parameters.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_add_subscription_responses.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_add_time_parameters.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_add_time_responses.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_check_subscription_parameters.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_check_subscription_responses.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_clear_labels_parameters.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_clear_labels_responses.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_client.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_create_comment_parameters.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_create_comment_responses.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_create_issue_attachment_parameters.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_create_issue_attachment_responses.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_create_issue_blocking_parameters.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_create_issue_blocking_responses.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_create_issue_comment_attachment_parameters.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_create_issue_comment_attachment_responses.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_create_issue_dependencies_parameters.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_create_issue_dependencies_responses.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_create_issue_parameters.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_create_issue_responses.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_create_label_parameters.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_create_label_responses.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_create_milestone_parameters.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_create_milestone_responses.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_delete_comment_deprecated_parameters.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_delete_comment_deprecated_responses.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_delete_comment_parameters.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_delete_comment_reaction_parameters.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_delete_comment_reaction_responses.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_delete_comment_responses.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_delete_issue_attachment_parameters.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_delete_issue_attachment_responses.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_delete_issue_comment_attachment_parameters.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_delete_issue_comment_attachment_responses.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_delete_issue_reaction_parameters.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_delete_issue_reaction_responses.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_delete_label_parameters.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_delete_label_responses.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_delete_milestone_parameters.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_delete_milestone_responses.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_delete_parameters.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_delete_responses.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_delete_stop_watch_parameters.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_delete_stop_watch_responses.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_delete_subscription_parameters.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_delete_subscription_responses.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_delete_time_parameters.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_delete_time_responses.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_edit_comment_deprecated_parameters.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_edit_comment_deprecated_responses.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_edit_comment_parameters.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_edit_comment_responses.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_edit_issue_attachment_parameters.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_edit_issue_attachment_responses.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_edit_issue_comment_attachment_parameters.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_edit_issue_comment_attachment_responses.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_edit_issue_deadline_parameters.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_edit_issue_deadline_responses.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_edit_issue_parameters.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_edit_issue_responses.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_edit_label_parameters.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_edit_label_responses.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_edit_milestone_parameters.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_edit_milestone_responses.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_get_comment_parameters.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_get_comment_reactions_parameters.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_get_comment_reactions_responses.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_get_comment_responses.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_get_comments_and_timeline_parameters.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_get_comments_and_timeline_responses.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_get_comments_parameters.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_get_comments_responses.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_get_issue_attachment_parameters.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_get_issue_attachment_responses.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_get_issue_comment_attachment_parameters.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_get_issue_comment_attachment_responses.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_get_issue_parameters.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_get_issue_reactions_parameters.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_get_issue_reactions_responses.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_get_issue_responses.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_get_label_parameters.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_get_label_responses.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_get_labels_parameters.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_get_labels_responses.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_get_milestone_parameters.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_get_milestone_responses.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_get_milestones_list_parameters.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_get_milestones_list_responses.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_get_repo_comments_parameters.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_get_repo_comments_responses.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_list_blocks_parameters.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_list_blocks_responses.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_list_issue_attachments_parameters.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_list_issue_attachments_responses.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_list_issue_comment_attachments_parameters.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_list_issue_comment_attachments_responses.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_list_issue_dependencies_parameters.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_list_issue_dependencies_responses.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_list_issues_parameters.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_list_issues_responses.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_list_labels_parameters.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_list_labels_responses.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_post_comment_reaction_parameters.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_post_comment_reaction_responses.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_post_issue_reaction_parameters.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_post_issue_reaction_responses.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_remove_issue_blocking_parameters.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_remove_issue_blocking_responses.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_remove_issue_dependencies_parameters.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_remove_issue_dependencies_responses.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_remove_label_parameters.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_remove_label_responses.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_replace_labels_parameters.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_replace_labels_responses.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_reset_time_parameters.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_reset_time_responses.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_search_issues_parameters.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_search_issues_responses.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_start_stop_watch_parameters.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_start_stop_watch_responses.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_stop_stop_watch_parameters.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_stop_stop_watch_responses.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_subscriptions_parameters.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_subscriptions_responses.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_tracked_times_parameters.go
 create mode 100644 bots-common/gitea-generated/client/issue/issue_tracked_times_responses.go
 create mode 100644 bots-common/gitea-generated/client/issue/move_issue_pin_parameters.go
 create mode 100644 bots-common/gitea-generated/client/issue/move_issue_pin_responses.go
 create mode 100644 bots-common/gitea-generated/client/issue/pin_issue_parameters.go
 create mode 100644 bots-common/gitea-generated/client/issue/pin_issue_responses.go
 create mode 100644 bots-common/gitea-generated/client/issue/unpin_issue_parameters.go
 create mode 100644 bots-common/gitea-generated/client/issue/unpin_issue_responses.go
 create mode 100644 bots-common/gitea-generated/client/miscellaneous/get_gitignore_template_info_parameters.go
 create mode 100644 bots-common/gitea-generated/client/miscellaneous/get_gitignore_template_info_responses.go
 create mode 100644 bots-common/gitea-generated/client/miscellaneous/get_label_template_info_parameters.go
 create mode 100644 bots-common/gitea-generated/client/miscellaneous/get_label_template_info_responses.go
 create mode 100644 bots-common/gitea-generated/client/miscellaneous/get_license_template_info_parameters.go
 create mode 100644 bots-common/gitea-generated/client/miscellaneous/get_license_template_info_responses.go
 create mode 100644 bots-common/gitea-generated/client/miscellaneous/get_node_info_parameters.go
 create mode 100644 bots-common/gitea-generated/client/miscellaneous/get_node_info_responses.go
 create mode 100644 bots-common/gitea-generated/client/miscellaneous/get_signing_key_parameters.go
 create mode 100644 bots-common/gitea-generated/client/miscellaneous/get_signing_key_responses.go
 create mode 100644 bots-common/gitea-generated/client/miscellaneous/get_version_parameters.go
 create mode 100644 bots-common/gitea-generated/client/miscellaneous/get_version_responses.go
 create mode 100644 bots-common/gitea-generated/client/miscellaneous/list_gitignores_templates_parameters.go
 create mode 100644 bots-common/gitea-generated/client/miscellaneous/list_gitignores_templates_responses.go
 create mode 100644 bots-common/gitea-generated/client/miscellaneous/list_label_templates_parameters.go
 create mode 100644 bots-common/gitea-generated/client/miscellaneous/list_label_templates_responses.go
 create mode 100644 bots-common/gitea-generated/client/miscellaneous/list_license_templates_parameters.go
 create mode 100644 bots-common/gitea-generated/client/miscellaneous/list_license_templates_responses.go
 create mode 100644 bots-common/gitea-generated/client/miscellaneous/miscellaneous_client.go
 create mode 100644 bots-common/gitea-generated/client/miscellaneous/render_markdown_parameters.go
 create mode 100644 bots-common/gitea-generated/client/miscellaneous/render_markdown_raw_parameters.go
 create mode 100644 bots-common/gitea-generated/client/miscellaneous/render_markdown_raw_responses.go
 create mode 100644 bots-common/gitea-generated/client/miscellaneous/render_markdown_responses.go
 create mode 100644 bots-common/gitea-generated/client/miscellaneous/render_markup_parameters.go
 create mode 100644 bots-common/gitea-generated/client/miscellaneous/render_markup_responses.go
 create mode 100644 bots-common/gitea-generated/client/notification/notification_client.go
 create mode 100644 bots-common/gitea-generated/client/notification/notify_get_list_parameters.go
 create mode 100644 bots-common/gitea-generated/client/notification/notify_get_list_responses.go
 create mode 100644 bots-common/gitea-generated/client/notification/notify_get_repo_list_parameters.go
 create mode 100644 bots-common/gitea-generated/client/notification/notify_get_repo_list_responses.go
 create mode 100644 bots-common/gitea-generated/client/notification/notify_get_thread_parameters.go
 create mode 100644 bots-common/gitea-generated/client/notification/notify_get_thread_responses.go
 create mode 100644 bots-common/gitea-generated/client/notification/notify_new_available_parameters.go
 create mode 100644 bots-common/gitea-generated/client/notification/notify_new_available_responses.go
 create mode 100644 bots-common/gitea-generated/client/notification/notify_read_list_parameters.go
 create mode 100644 bots-common/gitea-generated/client/notification/notify_read_list_responses.go
 create mode 100644 bots-common/gitea-generated/client/notification/notify_read_repo_list_parameters.go
 create mode 100644 bots-common/gitea-generated/client/notification/notify_read_repo_list_responses.go
 create mode 100644 bots-common/gitea-generated/client/notification/notify_read_thread_parameters.go
 create mode 100644 bots-common/gitea-generated/client/notification/notify_read_thread_responses.go
 create mode 100644 bots-common/gitea-generated/client/organization/create_org_repo_deprecated_parameters.go
 create mode 100644 bots-common/gitea-generated/client/organization/create_org_repo_deprecated_responses.go
 create mode 100644 bots-common/gitea-generated/client/organization/create_org_repo_parameters.go
 create mode 100644 bots-common/gitea-generated/client/organization/create_org_repo_responses.go
 create mode 100644 bots-common/gitea-generated/client/organization/create_org_variable_parameters.go
 create mode 100644 bots-common/gitea-generated/client/organization/create_org_variable_responses.go
 create mode 100644 bots-common/gitea-generated/client/organization/delete_org_secret_parameters.go
 create mode 100644 bots-common/gitea-generated/client/organization/delete_org_secret_responses.go
 create mode 100644 bots-common/gitea-generated/client/organization/delete_org_variable_parameters.go
 create mode 100644 bots-common/gitea-generated/client/organization/delete_org_variable_responses.go
 create mode 100644 bots-common/gitea-generated/client/organization/get_org_variable_parameters.go
 create mode 100644 bots-common/gitea-generated/client/organization/get_org_variable_responses.go
 create mode 100644 bots-common/gitea-generated/client/organization/get_org_variables_list_parameters.go
 create mode 100644 bots-common/gitea-generated/client/organization/get_org_variables_list_responses.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_add_team_member_parameters.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_add_team_member_responses.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_add_team_repository_parameters.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_add_team_repository_responses.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_conceal_member_parameters.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_conceal_member_responses.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_create_hook_parameters.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_create_hook_responses.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_create_label_parameters.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_create_label_responses.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_create_parameters.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_create_responses.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_create_team_parameters.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_create_team_responses.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_delete_avatar_parameters.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_delete_avatar_responses.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_delete_hook_parameters.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_delete_hook_responses.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_delete_label_parameters.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_delete_label_responses.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_delete_member_parameters.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_delete_member_responses.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_delete_parameters.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_delete_responses.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_delete_team_parameters.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_delete_team_responses.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_edit_hook_parameters.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_edit_hook_responses.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_edit_label_parameters.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_edit_label_responses.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_edit_parameters.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_edit_responses.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_edit_team_parameters.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_edit_team_responses.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_get_all_parameters.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_get_all_responses.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_get_hook_parameters.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_get_hook_responses.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_get_label_parameters.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_get_label_responses.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_get_parameters.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_get_responses.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_get_runner_registration_token_parameters.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_get_runner_registration_token_responses.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_get_team_parameters.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_get_team_responses.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_get_user_permissions_parameters.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_get_user_permissions_responses.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_is_member_parameters.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_is_member_responses.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_is_public_member_parameters.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_is_public_member_responses.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_list_actions_secrets_parameters.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_list_actions_secrets_responses.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_list_activity_feeds_parameters.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_list_activity_feeds_responses.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_list_current_user_orgs_parameters.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_list_current_user_orgs_responses.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_list_hooks_parameters.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_list_hooks_responses.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_list_labels_parameters.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_list_labels_responses.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_list_members_parameters.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_list_members_responses.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_list_public_members_parameters.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_list_public_members_responses.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_list_repos_parameters.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_list_repos_responses.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_list_team_activity_feeds_parameters.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_list_team_activity_feeds_responses.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_list_team_member_parameters.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_list_team_member_responses.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_list_team_members_parameters.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_list_team_members_responses.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_list_team_repo_parameters.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_list_team_repo_responses.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_list_team_repos_parameters.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_list_team_repos_responses.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_list_teams_parameters.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_list_teams_responses.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_list_user_orgs_parameters.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_list_user_orgs_responses.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_publicize_member_parameters.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_publicize_member_responses.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_remove_team_member_parameters.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_remove_team_member_responses.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_remove_team_repository_parameters.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_remove_team_repository_responses.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_update_avatar_parameters.go
 create mode 100644 bots-common/gitea-generated/client/organization/org_update_avatar_responses.go
 create mode 100644 bots-common/gitea-generated/client/organization/organization_block_user_parameters.go
 create mode 100644 bots-common/gitea-generated/client/organization/organization_block_user_responses.go
 create mode 100644 bots-common/gitea-generated/client/organization/organization_check_user_block_parameters.go
 create mode 100644 bots-common/gitea-generated/client/organization/organization_check_user_block_responses.go
 create mode 100644 bots-common/gitea-generated/client/organization/organization_client.go
 create mode 100644 bots-common/gitea-generated/client/organization/organization_list_blocks_parameters.go
 create mode 100644 bots-common/gitea-generated/client/organization/organization_list_blocks_responses.go
 create mode 100644 bots-common/gitea-generated/client/organization/organization_unblock_user_parameters.go
 create mode 100644 bots-common/gitea-generated/client/organization/organization_unblock_user_responses.go
 create mode 100644 bots-common/gitea-generated/client/organization/team_search_parameters.go
 create mode 100644 bots-common/gitea-generated/client/organization/team_search_responses.go
 create mode 100644 bots-common/gitea-generated/client/organization/update_org_secret_parameters.go
 create mode 100644 bots-common/gitea-generated/client/organization/update_org_secret_responses.go
 create mode 100644 bots-common/gitea-generated/client/organization/update_org_variable_parameters.go
 create mode 100644 bots-common/gitea-generated/client/organization/update_org_variable_responses.go
 create mode 100644 bots-common/gitea-generated/client/package_operations/delete_package_parameters.go
 create mode 100644 bots-common/gitea-generated/client/package_operations/delete_package_responses.go
 create mode 100644 bots-common/gitea-generated/client/package_operations/get_package_parameters.go
 create mode 100644 bots-common/gitea-generated/client/package_operations/get_package_responses.go
 create mode 100644 bots-common/gitea-generated/client/package_operations/list_package_files_parameters.go
 create mode 100644 bots-common/gitea-generated/client/package_operations/list_package_files_responses.go
 create mode 100644 bots-common/gitea-generated/client/package_operations/list_packages_parameters.go
 create mode 100644 bots-common/gitea-generated/client/package_operations/list_packages_responses.go
 create mode 100644 bots-common/gitea-generated/client/package_operations/package_operations_client.go
 create mode 100644 bots-common/gitea-generated/client/repository/accept_repo_transfer_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/accept_repo_transfer_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/create_current_user_repo_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/create_current_user_repo_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/create_fork_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/create_fork_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/create_repo_variable_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/create_repo_variable_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/delete_repo_secret_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/delete_repo_secret_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/delete_repo_variable_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/delete_repo_variable_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/generate_repo_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/generate_repo_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/get_annotated_tag_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/get_annotated_tag_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/get_blob_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/get_blob_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/get_repo_variable_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/get_repo_variable_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/get_repo_variables_list_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/get_repo_variables_list_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/get_tree_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/get_tree_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/list_forks_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/list_forks_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/reject_repo_transfer_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/reject_repo_transfer_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_add_collaborator_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_add_collaborator_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_add_push_mirror_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_add_push_mirror_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_add_team_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_add_team_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_add_topic_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_add_topic_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_apply_diff_patch_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_apply_diff_patch_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_cancel_scheduled_auto_merge_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_cancel_scheduled_auto_merge_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_change_files_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_change_files_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_check_collaborator_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_check_collaborator_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_check_team_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_check_team_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_compare_diff_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_compare_diff_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_create_branch_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_create_branch_protection_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_create_branch_protection_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_create_branch_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_create_file_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_create_file_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_create_hook_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_create_hook_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_create_key_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_create_key_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_create_pull_request_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_create_pull_request_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_create_pull_review_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_create_pull_review_requests_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_create_pull_review_requests_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_create_pull_review_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_create_release_attachment_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_create_release_attachment_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_create_release_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_create_release_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_create_status_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_create_status_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_create_tag_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_create_tag_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_create_wiki_page_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_create_wiki_page_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_delete_avatar_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_delete_avatar_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_delete_branch_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_delete_branch_protection_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_delete_branch_protection_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_delete_branch_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_delete_collaborator_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_delete_collaborator_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_delete_file_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_delete_file_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_delete_git_hook_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_delete_git_hook_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_delete_hook_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_delete_hook_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_delete_key_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_delete_key_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_delete_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_delete_pull_review_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_delete_pull_review_requests_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_delete_pull_review_requests_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_delete_pull_review_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_delete_push_mirror_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_delete_push_mirror_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_delete_release_attachment_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_delete_release_attachment_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_delete_release_by_tag_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_delete_release_by_tag_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_delete_release_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_delete_release_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_delete_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_delete_tag_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_delete_tag_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_delete_team_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_delete_team_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_delete_topic_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_delete_topic_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_delete_wiki_page_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_delete_wiki_page_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_dismiss_pull_review_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_dismiss_pull_review_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_download_commit_diff_or_patch_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_download_commit_diff_or_patch_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_download_pull_diff_or_patch_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_download_pull_diff_or_patch_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_edit_branch_protection_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_edit_branch_protection_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_edit_git_hook_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_edit_git_hook_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_edit_hook_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_edit_hook_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_edit_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_edit_pull_request_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_edit_pull_request_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_edit_release_attachment_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_edit_release_attachment_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_edit_release_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_edit_release_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_edit_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_edit_wiki_page_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_edit_wiki_page_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_get_all_commits_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_get_all_commits_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_get_archive_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_get_archive_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_get_assignees_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_get_assignees_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_get_branch_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_get_branch_protection_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_get_branch_protection_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_get_branch_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_get_by_id_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_get_by_id_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_get_combined_status_by_ref_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_get_combined_status_by_ref_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_get_commit_pull_request_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_get_commit_pull_request_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_get_contents_list_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_get_contents_list_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_get_contents_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_get_contents_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_get_editor_config_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_get_editor_config_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_get_git_hook_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_get_git_hook_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_get_hook_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_get_hook_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_get_issue_config_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_get_issue_config_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_get_issue_templates_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_get_issue_templates_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_get_key_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_get_key_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_get_languages_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_get_languages_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_get_latest_release_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_get_latest_release_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_get_note_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_get_note_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_get_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_get_pull_request_by_base_head_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_get_pull_request_by_base_head_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_get_pull_request_commits_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_get_pull_request_commits_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_get_pull_request_files_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_get_pull_request_files_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_get_pull_request_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_get_pull_request_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_get_pull_review_comments_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_get_pull_review_comments_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_get_pull_review_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_get_pull_review_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_get_push_mirror_by_remote_name_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_get_push_mirror_by_remote_name_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_get_raw_file_or_l_f_s_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_get_raw_file_or_l_f_s_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_get_raw_file_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_get_raw_file_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_get_release_attachment_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_get_release_attachment_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_get_release_by_tag_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_get_release_by_tag_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_get_release_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_get_release_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_get_repo_permissions_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_get_repo_permissions_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_get_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_get_reviewers_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_get_reviewers_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_get_runner_registration_token_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_get_runner_registration_token_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_get_single_commit_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_get_single_commit_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_get_tag_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_get_tag_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_get_wiki_page_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_get_wiki_page_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_get_wiki_page_revisions_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_get_wiki_page_revisions_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_get_wiki_pages_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_get_wiki_pages_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_list_actions_secrets_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_list_actions_secrets_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_list_activity_feeds_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_list_activity_feeds_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_list_all_git_refs_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_list_all_git_refs_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_list_branch_protection_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_list_branch_protection_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_list_branches_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_list_branches_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_list_collaborators_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_list_collaborators_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_list_git_hooks_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_list_git_hooks_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_list_git_refs_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_list_git_refs_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_list_hooks_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_list_hooks_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_list_keys_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_list_keys_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_list_pinned_issues_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_list_pinned_issues_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_list_pinned_pull_requests_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_list_pinned_pull_requests_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_list_pull_requests_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_list_pull_requests_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_list_pull_reviews_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_list_pull_reviews_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_list_push_mirrors_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_list_push_mirrors_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_list_release_attachments_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_list_release_attachments_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_list_releases_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_list_releases_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_list_stargazers_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_list_stargazers_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_list_statuses_by_ref_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_list_statuses_by_ref_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_list_statuses_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_list_statuses_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_list_subscribers_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_list_subscribers_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_list_tags_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_list_tags_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_list_teams_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_list_teams_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_list_topics_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_list_topics_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_merge_pull_request_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_merge_pull_request_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_migrate_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_migrate_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_mirror_sync_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_mirror_sync_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_new_pin_allowed_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_new_pin_allowed_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_pull_request_is_merged_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_pull_request_is_merged_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_push_mirror_sync_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_push_mirror_sync_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_search_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_search_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_signing_key_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_signing_key_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_submit_pull_review_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_submit_pull_review_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_test_hook_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_test_hook_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_tracked_times_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_tracked_times_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_transfer_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_transfer_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_un_dismiss_pull_review_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_un_dismiss_pull_review_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_update_avatar_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_update_avatar_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_update_file_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_update_file_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_update_pull_request_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_update_pull_request_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_update_topics_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_update_topics_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_validate_issue_config_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/repo_validate_issue_config_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/repository_client.go
 create mode 100644 bots-common/gitea-generated/client/repository/topic_search_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/topic_search_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/update_repo_secret_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/update_repo_secret_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/update_repo_variable_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/update_repo_variable_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/user_current_check_subscription_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/user_current_check_subscription_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/user_current_delete_subscription_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/user_current_delete_subscription_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/user_current_put_subscription_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/user_current_put_subscription_responses.go
 create mode 100644 bots-common/gitea-generated/client/repository/user_tracked_times_parameters.go
 create mode 100644 bots-common/gitea-generated/client/repository/user_tracked_times_responses.go
 create mode 100644 bots-common/gitea-generated/client/settings/get_general_api_settings_parameters.go
 create mode 100644 bots-common/gitea-generated/client/settings/get_general_api_settings_responses.go
 create mode 100644 bots-common/gitea-generated/client/settings/get_general_attachment_settings_parameters.go
 create mode 100644 bots-common/gitea-generated/client/settings/get_general_attachment_settings_responses.go
 create mode 100644 bots-common/gitea-generated/client/settings/get_general_repository_settings_parameters.go
 create mode 100644 bots-common/gitea-generated/client/settings/get_general_repository_settings_responses.go
 create mode 100644 bots-common/gitea-generated/client/settings/get_general_ui_settings_parameters.go
 create mode 100644 bots-common/gitea-generated/client/settings/get_general_ui_settings_responses.go
 create mode 100644 bots-common/gitea-generated/client/settings/settings_client.go
 create mode 100644 bots-common/gitea-generated/client/user/create_user_variable_parameters.go
 create mode 100644 bots-common/gitea-generated/client/user/create_user_variable_responses.go
 create mode 100644 bots-common/gitea-generated/client/user/delete_user_secret_parameters.go
 create mode 100644 bots-common/gitea-generated/client/user/delete_user_secret_responses.go
 create mode 100644 bots-common/gitea-generated/client/user/delete_user_variable_parameters.go
 create mode 100644 bots-common/gitea-generated/client/user/delete_user_variable_responses.go
 create mode 100644 bots-common/gitea-generated/client/user/get_user_settings_parameters.go
 create mode 100644 bots-common/gitea-generated/client/user/get_user_settings_responses.go
 create mode 100644 bots-common/gitea-generated/client/user/get_user_variable_parameters.go
 create mode 100644 bots-common/gitea-generated/client/user/get_user_variable_responses.go
 create mode 100644 bots-common/gitea-generated/client/user/get_user_variables_list_parameters.go
 create mode 100644 bots-common/gitea-generated/client/user/get_user_variables_list_responses.go
 create mode 100644 bots-common/gitea-generated/client/user/get_verification_token_parameters.go
 create mode 100644 bots-common/gitea-generated/client/user/get_verification_token_responses.go
 create mode 100644 bots-common/gitea-generated/client/user/update_user_secret_parameters.go
 create mode 100644 bots-common/gitea-generated/client/user/update_user_secret_responses.go
 create mode 100644 bots-common/gitea-generated/client/user/update_user_settings_parameters.go
 create mode 100644 bots-common/gitea-generated/client/user/update_user_settings_responses.go
 create mode 100644 bots-common/gitea-generated/client/user/update_user_variable_parameters.go
 create mode 100644 bots-common/gitea-generated/client/user/update_user_variable_responses.go
 create mode 100644 bots-common/gitea-generated/client/user/user_add_email_parameters.go
 create mode 100644 bots-common/gitea-generated/client/user/user_add_email_responses.go
 create mode 100644 bots-common/gitea-generated/client/user/user_block_user_parameters.go
 create mode 100644 bots-common/gitea-generated/client/user/user_block_user_responses.go
 create mode 100644 bots-common/gitea-generated/client/user/user_check_following_parameters.go
 create mode 100644 bots-common/gitea-generated/client/user/user_check_following_responses.go
 create mode 100644 bots-common/gitea-generated/client/user/user_check_user_block_parameters.go
 create mode 100644 bots-common/gitea-generated/client/user/user_check_user_block_responses.go
 create mode 100644 bots-common/gitea-generated/client/user/user_client.go
 create mode 100644 bots-common/gitea-generated/client/user/user_create_hook_parameters.go
 create mode 100644 bots-common/gitea-generated/client/user/user_create_hook_responses.go
 create mode 100644 bots-common/gitea-generated/client/user/user_create_o_auth2_application_parameters.go
 create mode 100644 bots-common/gitea-generated/client/user/user_create_o_auth2_application_responses.go
 create mode 100644 bots-common/gitea-generated/client/user/user_create_token_parameters.go
 create mode 100644 bots-common/gitea-generated/client/user/user_create_token_responses.go
 create mode 100644 bots-common/gitea-generated/client/user/user_current_check_following_parameters.go
 create mode 100644 bots-common/gitea-generated/client/user/user_current_check_following_responses.go
 create mode 100644 bots-common/gitea-generated/client/user/user_current_check_starring_parameters.go
 create mode 100644 bots-common/gitea-generated/client/user/user_current_check_starring_responses.go
 create mode 100644 bots-common/gitea-generated/client/user/user_current_delete_follow_parameters.go
 create mode 100644 bots-common/gitea-generated/client/user/user_current_delete_follow_responses.go
 create mode 100644 bots-common/gitea-generated/client/user/user_current_delete_g_p_g_key_parameters.go
 create mode 100644 bots-common/gitea-generated/client/user/user_current_delete_g_p_g_key_responses.go
 create mode 100644 bots-common/gitea-generated/client/user/user_current_delete_key_parameters.go
 create mode 100644 bots-common/gitea-generated/client/user/user_current_delete_key_responses.go
 create mode 100644 bots-common/gitea-generated/client/user/user_current_delete_star_parameters.go
 create mode 100644 bots-common/gitea-generated/client/user/user_current_delete_star_responses.go
 create mode 100644 bots-common/gitea-generated/client/user/user_current_get_g_p_g_key_parameters.go
 create mode 100644 bots-common/gitea-generated/client/user/user_current_get_g_p_g_key_responses.go
 create mode 100644 bots-common/gitea-generated/client/user/user_current_get_key_parameters.go
 create mode 100644 bots-common/gitea-generated/client/user/user_current_get_key_responses.go
 create mode 100644 bots-common/gitea-generated/client/user/user_current_list_followers_parameters.go
 create mode 100644 bots-common/gitea-generated/client/user/user_current_list_followers_responses.go
 create mode 100644 bots-common/gitea-generated/client/user/user_current_list_following_parameters.go
 create mode 100644 bots-common/gitea-generated/client/user/user_current_list_following_responses.go
 create mode 100644 bots-common/gitea-generated/client/user/user_current_list_g_p_g_keys_parameters.go
 create mode 100644 bots-common/gitea-generated/client/user/user_current_list_g_p_g_keys_responses.go
 create mode 100644 bots-common/gitea-generated/client/user/user_current_list_keys_parameters.go
 create mode 100644 bots-common/gitea-generated/client/user/user_current_list_keys_responses.go
 create mode 100644 bots-common/gitea-generated/client/user/user_current_list_repos_parameters.go
 create mode 100644 bots-common/gitea-generated/client/user/user_current_list_repos_responses.go
 create mode 100644 bots-common/gitea-generated/client/user/user_current_list_starred_parameters.go
 create mode 100644 bots-common/gitea-generated/client/user/user_current_list_starred_responses.go
 create mode 100644 bots-common/gitea-generated/client/user/user_current_list_subscriptions_parameters.go
 create mode 100644 bots-common/gitea-generated/client/user/user_current_list_subscriptions_responses.go
 create mode 100644 bots-common/gitea-generated/client/user/user_current_post_g_p_g_key_parameters.go
 create mode 100644 bots-common/gitea-generated/client/user/user_current_post_g_p_g_key_responses.go
 create mode 100644 bots-common/gitea-generated/client/user/user_current_post_key_parameters.go
 create mode 100644 bots-common/gitea-generated/client/user/user_current_post_key_responses.go
 create mode 100644 bots-common/gitea-generated/client/user/user_current_put_follow_parameters.go
 create mode 100644 bots-common/gitea-generated/client/user/user_current_put_follow_responses.go
 create mode 100644 bots-common/gitea-generated/client/user/user_current_put_star_parameters.go
 create mode 100644 bots-common/gitea-generated/client/user/user_current_put_star_responses.go
 create mode 100644 bots-common/gitea-generated/client/user/user_current_tracked_times_parameters.go
 create mode 100644 bots-common/gitea-generated/client/user/user_current_tracked_times_responses.go
 create mode 100644 bots-common/gitea-generated/client/user/user_delete_access_token_parameters.go
 create mode 100644 bots-common/gitea-generated/client/user/user_delete_access_token_responses.go
 create mode 100644 bots-common/gitea-generated/client/user/user_delete_avatar_parameters.go
 create mode 100644 bots-common/gitea-generated/client/user/user_delete_avatar_responses.go
 create mode 100644 bots-common/gitea-generated/client/user/user_delete_email_parameters.go
 create mode 100644 bots-common/gitea-generated/client/user/user_delete_email_responses.go
 create mode 100644 bots-common/gitea-generated/client/user/user_delete_hook_parameters.go
 create mode 100644 bots-common/gitea-generated/client/user/user_delete_hook_responses.go
 create mode 100644 bots-common/gitea-generated/client/user/user_delete_o_auth2_application_parameters.go
 create mode 100644 bots-common/gitea-generated/client/user/user_delete_o_auth2_application_responses.go
 create mode 100644 bots-common/gitea-generated/client/user/user_edit_hook_parameters.go
 create mode 100644 bots-common/gitea-generated/client/user/user_edit_hook_responses.go
 create mode 100644 bots-common/gitea-generated/client/user/user_get_current_parameters.go
 create mode 100644 bots-common/gitea-generated/client/user/user_get_current_responses.go
 create mode 100644 bots-common/gitea-generated/client/user/user_get_heatmap_data_parameters.go
 create mode 100644 bots-common/gitea-generated/client/user/user_get_heatmap_data_responses.go
 create mode 100644 bots-common/gitea-generated/client/user/user_get_hook_parameters.go
 create mode 100644 bots-common/gitea-generated/client/user/user_get_hook_responses.go
 create mode 100644 bots-common/gitea-generated/client/user/user_get_o_auth2_application_parameters.go
 create mode 100644 bots-common/gitea-generated/client/user/user_get_o_auth2_application_responses.go
 create mode 100644 bots-common/gitea-generated/client/user/user_get_oauth2_application_parameters.go
 create mode 100644 bots-common/gitea-generated/client/user/user_get_oauth2_application_responses.go
 create mode 100644 bots-common/gitea-generated/client/user/user_get_parameters.go
 create mode 100644 bots-common/gitea-generated/client/user/user_get_responses.go
 create mode 100644 bots-common/gitea-generated/client/user/user_get_runner_registration_token_parameters.go
 create mode 100644 bots-common/gitea-generated/client/user/user_get_runner_registration_token_responses.go
 create mode 100644 bots-common/gitea-generated/client/user/user_get_stop_watches_parameters.go
 create mode 100644 bots-common/gitea-generated/client/user/user_get_stop_watches_responses.go
 create mode 100644 bots-common/gitea-generated/client/user/user_get_tokens_parameters.go
 create mode 100644 bots-common/gitea-generated/client/user/user_get_tokens_responses.go
 create mode 100644 bots-common/gitea-generated/client/user/user_list_activity_feeds_parameters.go
 create mode 100644 bots-common/gitea-generated/client/user/user_list_activity_feeds_responses.go
 create mode 100644 bots-common/gitea-generated/client/user/user_list_blocks_parameters.go
 create mode 100644 bots-common/gitea-generated/client/user/user_list_blocks_responses.go
 create mode 100644 bots-common/gitea-generated/client/user/user_list_emails_parameters.go
 create mode 100644 bots-common/gitea-generated/client/user/user_list_emails_responses.go
 create mode 100644 bots-common/gitea-generated/client/user/user_list_followers_parameters.go
 create mode 100644 bots-common/gitea-generated/client/user/user_list_followers_responses.go
 create mode 100644 bots-common/gitea-generated/client/user/user_list_following_parameters.go
 create mode 100644 bots-common/gitea-generated/client/user/user_list_following_responses.go
 create mode 100644 bots-common/gitea-generated/client/user/user_list_g_p_g_keys_parameters.go
 create mode 100644 bots-common/gitea-generated/client/user/user_list_g_p_g_keys_responses.go
 create mode 100644 bots-common/gitea-generated/client/user/user_list_hooks_parameters.go
 create mode 100644 bots-common/gitea-generated/client/user/user_list_hooks_responses.go
 create mode 100644 bots-common/gitea-generated/client/user/user_list_keys_parameters.go
 create mode 100644 bots-common/gitea-generated/client/user/user_list_keys_responses.go
 create mode 100644 bots-common/gitea-generated/client/user/user_list_repos_parameters.go
 create mode 100644 bots-common/gitea-generated/client/user/user_list_repos_responses.go
 create mode 100644 bots-common/gitea-generated/client/user/user_list_starred_parameters.go
 create mode 100644 bots-common/gitea-generated/client/user/user_list_starred_responses.go
 create mode 100644 bots-common/gitea-generated/client/user/user_list_subscriptions_parameters.go
 create mode 100644 bots-common/gitea-generated/client/user/user_list_subscriptions_responses.go
 create mode 100644 bots-common/gitea-generated/client/user/user_list_teams_parameters.go
 create mode 100644 bots-common/gitea-generated/client/user/user_list_teams_responses.go
 create mode 100644 bots-common/gitea-generated/client/user/user_search_parameters.go
 create mode 100644 bots-common/gitea-generated/client/user/user_search_responses.go
 create mode 100644 bots-common/gitea-generated/client/user/user_unblock_user_parameters.go
 create mode 100644 bots-common/gitea-generated/client/user/user_unblock_user_responses.go
 create mode 100644 bots-common/gitea-generated/client/user/user_update_avatar_parameters.go
 create mode 100644 bots-common/gitea-generated/client/user/user_update_avatar_responses.go
 create mode 100644 bots-common/gitea-generated/client/user/user_update_o_auth2_application_parameters.go
 create mode 100644 bots-common/gitea-generated/client/user/user_update_o_auth2_application_responses.go
 create mode 100644 bots-common/gitea-generated/client/user/user_verify_g_p_g_key_parameters.go
 create mode 100644 bots-common/gitea-generated/client/user/user_verify_g_p_g_key_responses.go
 create mode 100644 bots-common/gitea-generated/models/access_token.go
 create mode 100644 bots-common/gitea-generated/models/action_variable.go
 create mode 100644 bots-common/gitea-generated/models/activity.go
 create mode 100644 bots-common/gitea-generated/models/activity_pub.go
 create mode 100644 bots-common/gitea-generated/models/add_collaborator_option.go
 create mode 100644 bots-common/gitea-generated/models/add_time_option.go
 create mode 100644 bots-common/gitea-generated/models/annotated_tag.go
 create mode 100644 bots-common/gitea-generated/models/annotated_tag_object.go
 create mode 100644 bots-common/gitea-generated/models/api_error.go
 create mode 100644 bots-common/gitea-generated/models/attachment.go
 create mode 100644 bots-common/gitea-generated/models/badge.go
 create mode 100644 bots-common/gitea-generated/models/branch.go
 create mode 100644 bots-common/gitea-generated/models/branch_protection.go
 create mode 100644 bots-common/gitea-generated/models/change_file_operation.go
 create mode 100644 bots-common/gitea-generated/models/change_files_options.go
 create mode 100644 bots-common/gitea-generated/models/changed_file.go
 create mode 100644 bots-common/gitea-generated/models/combined_status.go
 create mode 100644 bots-common/gitea-generated/models/comment.go
 create mode 100644 bots-common/gitea-generated/models/commit.go
 create mode 100644 bots-common/gitea-generated/models/commit_affected_files.go
 create mode 100644 bots-common/gitea-generated/models/commit_date_options.go
 create mode 100644 bots-common/gitea-generated/models/commit_meta.go
 create mode 100644 bots-common/gitea-generated/models/commit_stats.go
 create mode 100644 bots-common/gitea-generated/models/commit_status.go
 create mode 100644 bots-common/gitea-generated/models/commit_status_state.go
 create mode 100644 bots-common/gitea-generated/models/commit_user.go
 create mode 100644 bots-common/gitea-generated/models/compare.go
 create mode 100644 bots-common/gitea-generated/models/contents_response.go
 create mode 100644 bots-common/gitea-generated/models/create_access_token_option.go
 create mode 100644 bots-common/gitea-generated/models/create_branch_protection_option.go
 create mode 100644 bots-common/gitea-generated/models/create_branch_repo_option.go
 create mode 100644 bots-common/gitea-generated/models/create_email_option.go
 create mode 100644 bots-common/gitea-generated/models/create_file_options.go
 create mode 100644 bots-common/gitea-generated/models/create_fork_option.go
 create mode 100644 bots-common/gitea-generated/models/create_g_p_g_key_option.go
 create mode 100644 bots-common/gitea-generated/models/create_hook_option.go
 create mode 100644 bots-common/gitea-generated/models/create_hook_option_config.go
 create mode 100644 bots-common/gitea-generated/models/create_issue_comment_option.go
 create mode 100644 bots-common/gitea-generated/models/create_issue_option.go
 create mode 100644 bots-common/gitea-generated/models/create_key_option.go
 create mode 100644 bots-common/gitea-generated/models/create_label_option.go
 create mode 100644 bots-common/gitea-generated/models/create_milestone_option.go
 create mode 100644 bots-common/gitea-generated/models/create_o_auth2_application_options.go
 create mode 100644 bots-common/gitea-generated/models/create_or_update_secret_option.go
 create mode 100644 bots-common/gitea-generated/models/create_org_option.go
 create mode 100644 bots-common/gitea-generated/models/create_pull_request_option.go
 create mode 100644 bots-common/gitea-generated/models/create_pull_review_comment.go
 create mode 100644 bots-common/gitea-generated/models/create_pull_review_options.go
 create mode 100644 bots-common/gitea-generated/models/create_push_mirror_option.go
 create mode 100644 bots-common/gitea-generated/models/create_release_option.go
 create mode 100644 bots-common/gitea-generated/models/create_repo_option.go
 create mode 100644 bots-common/gitea-generated/models/create_status_option.go
 create mode 100644 bots-common/gitea-generated/models/create_tag_option.go
 create mode 100644 bots-common/gitea-generated/models/create_team_option.go
 create mode 100644 bots-common/gitea-generated/models/create_user_option.go
 create mode 100644 bots-common/gitea-generated/models/create_variable_option.go
 create mode 100644 bots-common/gitea-generated/models/create_wiki_page_options.go
 create mode 100644 bots-common/gitea-generated/models/cron.go
 create mode 100644 bots-common/gitea-generated/models/delete_email_option.go
 create mode 100644 bots-common/gitea-generated/models/delete_file_options.go
 create mode 100644 bots-common/gitea-generated/models/deploy_key.go
 create mode 100644 bots-common/gitea-generated/models/dismiss_pull_review_options.go
 create mode 100644 bots-common/gitea-generated/models/edit_attachment_options.go
 create mode 100644 bots-common/gitea-generated/models/edit_branch_protection_option.go
 create mode 100644 bots-common/gitea-generated/models/edit_deadline_option.go
 create mode 100644 bots-common/gitea-generated/models/edit_git_hook_option.go
 create mode 100644 bots-common/gitea-generated/models/edit_hook_option.go
 create mode 100644 bots-common/gitea-generated/models/edit_issue_comment_option.go
 create mode 100644 bots-common/gitea-generated/models/edit_issue_option.go
 create mode 100644 bots-common/gitea-generated/models/edit_label_option.go
 create mode 100644 bots-common/gitea-generated/models/edit_milestone_option.go
 create mode 100644 bots-common/gitea-generated/models/edit_org_option.go
 create mode 100644 bots-common/gitea-generated/models/edit_pull_request_option.go
 create mode 100644 bots-common/gitea-generated/models/edit_reaction_option.go
 create mode 100644 bots-common/gitea-generated/models/edit_release_option.go
 create mode 100644 bots-common/gitea-generated/models/edit_repo_option.go
 create mode 100644 bots-common/gitea-generated/models/edit_team_option.go
 create mode 100644 bots-common/gitea-generated/models/edit_user_option.go
 create mode 100644 bots-common/gitea-generated/models/email.go
 create mode 100644 bots-common/gitea-generated/models/external_tracker.go
 create mode 100644 bots-common/gitea-generated/models/external_wiki.go
 create mode 100644 bots-common/gitea-generated/models/file_commit_response.go
 create mode 100644 bots-common/gitea-generated/models/file_delete_response.go
 create mode 100644 bots-common/gitea-generated/models/file_links_response.go
 create mode 100644 bots-common/gitea-generated/models/file_response.go
 create mode 100644 bots-common/gitea-generated/models/files_response.go
 create mode 100644 bots-common/gitea-generated/models/g_p_g_key.go
 create mode 100644 bots-common/gitea-generated/models/g_p_g_key_email.go
 create mode 100644 bots-common/gitea-generated/models/general_api_settings.go
 create mode 100644 bots-common/gitea-generated/models/general_attachment_settings.go
 create mode 100644 bots-common/gitea-generated/models/general_repo_settings.go
 create mode 100644 bots-common/gitea-generated/models/general_ui_settings.go
 create mode 100644 bots-common/gitea-generated/models/generate_repo_option.go
 create mode 100644 bots-common/gitea-generated/models/git_blob_response.go
 create mode 100644 bots-common/gitea-generated/models/git_entry.go
 create mode 100644 bots-common/gitea-generated/models/git_hook.go
 create mode 100644 bots-common/gitea-generated/models/git_object.go
 create mode 100644 bots-common/gitea-generated/models/git_tree_response.go
 create mode 100644 bots-common/gitea-generated/models/gitignore_template_info.go
 create mode 100644 bots-common/gitea-generated/models/hook.go
 create mode 100644 bots-common/gitea-generated/models/identity.go
 create mode 100644 bots-common/gitea-generated/models/internal_tracker.go
 create mode 100644 bots-common/gitea-generated/models/issue.go
 create mode 100644 bots-common/gitea-generated/models/issue_config.go
 create mode 100644 bots-common/gitea-generated/models/issue_config_contact_link.go
 create mode 100644 bots-common/gitea-generated/models/issue_config_validation.go
 create mode 100644 bots-common/gitea-generated/models/issue_deadline.go
 create mode 100644 bots-common/gitea-generated/models/issue_form_field.go
 create mode 100644 bots-common/gitea-generated/models/issue_form_field_type.go
 create mode 100644 bots-common/gitea-generated/models/issue_form_field_visible.go
 create mode 100644 bots-common/gitea-generated/models/issue_labels_option.go
 create mode 100644 bots-common/gitea-generated/models/issue_meta.go
 create mode 100644 bots-common/gitea-generated/models/issue_template.go
 create mode 100644 bots-common/gitea-generated/models/issue_template_labels.go
 create mode 100644 bots-common/gitea-generated/models/label.go
 create mode 100644 bots-common/gitea-generated/models/label_template.go
 create mode 100644 bots-common/gitea-generated/models/license_template_info.go
 create mode 100644 bots-common/gitea-generated/models/licenses_template_list_entry.go
 create mode 100644 bots-common/gitea-generated/models/markdown_option.go
 create mode 100644 bots-common/gitea-generated/models/markup_option.go
 create mode 100644 bots-common/gitea-generated/models/merge_pull_request_form.go
 create mode 100644 bots-common/gitea-generated/models/migrate_repo_options.go
 create mode 100644 bots-common/gitea-generated/models/milestone.go
 create mode 100644 bots-common/gitea-generated/models/new_issue_pins_allowed.go
 create mode 100644 bots-common/gitea-generated/models/node_info.go
 create mode 100644 bots-common/gitea-generated/models/node_info_services.go
 create mode 100644 bots-common/gitea-generated/models/node_info_software.go
 create mode 100644 bots-common/gitea-generated/models/node_info_usage.go
 create mode 100644 bots-common/gitea-generated/models/node_info_usage_users.go
 create mode 100644 bots-common/gitea-generated/models/note.go
 create mode 100644 bots-common/gitea-generated/models/notification_count.go
 create mode 100644 bots-common/gitea-generated/models/notification_subject.go
 create mode 100644 bots-common/gitea-generated/models/notification_thread.go
 create mode 100644 bots-common/gitea-generated/models/notify_subject_type.go
 create mode 100644 bots-common/gitea-generated/models/o_auth2_application.go
 create mode 100644 bots-common/gitea-generated/models/organization.go
 create mode 100644 bots-common/gitea-generated/models/organization_permissions.go
 create mode 100644 bots-common/gitea-generated/models/p_r_branch_info.go
 create mode 100644 bots-common/gitea-generated/models/package.go
 create mode 100644 bots-common/gitea-generated/models/package_file.go
 create mode 100644 bots-common/gitea-generated/models/payload_commit.go
 create mode 100644 bots-common/gitea-generated/models/payload_commit_verification.go
 create mode 100644 bots-common/gitea-generated/models/payload_user.go
 create mode 100644 bots-common/gitea-generated/models/permission.go
 create mode 100644 bots-common/gitea-generated/models/public_key.go
 create mode 100644 bots-common/gitea-generated/models/pull_request.go
 create mode 100644 bots-common/gitea-generated/models/pull_request_meta.go
 create mode 100644 bots-common/gitea-generated/models/pull_review.go
 create mode 100644 bots-common/gitea-generated/models/pull_review_comment.go
 create mode 100644 bots-common/gitea-generated/models/pull_review_request_options.go
 create mode 100644 bots-common/gitea-generated/models/push_mirror.go
 create mode 100644 bots-common/gitea-generated/models/reaction.go
 create mode 100644 bots-common/gitea-generated/models/reference.go
 create mode 100644 bots-common/gitea-generated/models/release.go
 create mode 100644 bots-common/gitea-generated/models/rename_user_option.go
 create mode 100644 bots-common/gitea-generated/models/repo_collaborator_permission.go
 create mode 100644 bots-common/gitea-generated/models/repo_commit.go
 create mode 100644 bots-common/gitea-generated/models/repo_topic_options.go
 create mode 100644 bots-common/gitea-generated/models/repo_transfer.go
 create mode 100644 bots-common/gitea-generated/models/repository.go
 create mode 100644 bots-common/gitea-generated/models/repository_meta.go
 create mode 100644 bots-common/gitea-generated/models/review_state_type.go
 create mode 100644 bots-common/gitea-generated/models/search_results.go
 create mode 100644 bots-common/gitea-generated/models/secret.go
 create mode 100644 bots-common/gitea-generated/models/server_version.go
 create mode 100644 bots-common/gitea-generated/models/state_type.go
 create mode 100644 bots-common/gitea-generated/models/stop_watch.go
 create mode 100644 bots-common/gitea-generated/models/submit_pull_review_options.go
 create mode 100644 bots-common/gitea-generated/models/tag.go
 create mode 100644 bots-common/gitea-generated/models/team.go
 create mode 100644 bots-common/gitea-generated/models/time_stamp.go
 create mode 100644 bots-common/gitea-generated/models/timeline_comment.go
 create mode 100644 bots-common/gitea-generated/models/topic_name.go
 create mode 100644 bots-common/gitea-generated/models/topic_response.go
 create mode 100644 bots-common/gitea-generated/models/tracked_time.go
 create mode 100644 bots-common/gitea-generated/models/transfer_repo_option.go
 create mode 100644 bots-common/gitea-generated/models/update_file_options.go
 create mode 100644 bots-common/gitea-generated/models/update_repo_avatar_option.go
 create mode 100644 bots-common/gitea-generated/models/update_user_avatar_option.go
 create mode 100644 bots-common/gitea-generated/models/update_variable_option.go
 create mode 100644 bots-common/gitea-generated/models/user.go
 create mode 100644 bots-common/gitea-generated/models/user_badge_option.go
 create mode 100644 bots-common/gitea-generated/models/user_heatmap_data.go
 create mode 100644 bots-common/gitea-generated/models/user_settings.go
 create mode 100644 bots-common/gitea-generated/models/user_settings_options.go
 create mode 100644 bots-common/gitea-generated/models/watch_info.go
 create mode 100644 bots-common/gitea-generated/models/wiki_commit.go
 create mode 100644 bots-common/gitea-generated/models/wiki_commit_list.go
 create mode 100644 bots-common/gitea-generated/models/wiki_page.go
 create mode 100644 bots-common/gitea-generated/models/wiki_page_meta_data.go
 create mode 100644 bots-common/gitea_utils.go
 create mode 100644 bots-common/go.mod
 create mode 100644 bots-common/go.sum
 create mode 100644 bots-common/log.go
 create mode 100644 bots-common/log_test.go
 create mode 100644 bots-common/obs.api.yaml
 create mode 100644 bots-common/readme.go
 create mode 100644 bots-common/request_handler.go
 create mode 100644 bots-common/request_push.go
 create mode 100644 bots-common/request_push_test.go
 create mode 100644 bots-common/request_repo.go
 create mode 100644 bots-common/request_repo_test.go
 create mode 100644 obs-staging-bot/.gitignore
 create mode 100644 obs-staging-bot/Makefile
 create mode 100755 obs-staging-bot/devtest.sh
 create mode 100644 obs-staging-bot/go.mod
 create mode 100644 obs-staging-bot/go.sum
 create mode 100644 obs-staging-bot/main.go
 create mode 100644 obs-staging-bot/main_test.go
 create mode 100644 pr-review/.gitignore
 create mode 100644 pr-review/Makefile
 create mode 100644 pr-review/api.json
 create mode 100755 pr-review/devtest.sh
 create mode 100644 pr-review/go.mod
 create mode 100644 pr-review/go.sum
 create mode 100644 pr-review/listen.go
 create mode 100644 pr-review/main.go
 create mode 100644 pr-review/main_test.go
 create mode 100644 pr-review/readme.go
 create mode 100644 pr-review/request_pr.go
 create mode 100644 prjgit-updater/.gitignore
 create mode 100644 prjgit-updater/Makefile
 create mode 100755 prjgit-updater/devtest.sh
 create mode 100644 prjgit-updater/go.mod
 create mode 100644 prjgit-updater/go.sum
 create mode 100644 prjgit-updater/main.go
 create mode 100644 prjgit-updater/main_test.go

diff --git a/bots-common/Makefile b/bots-common/Makefile
new file mode 100644
index 0000000..b5939b5
--- /dev/null
+++ b/bots-common/Makefile
@@ -0,0 +1,20 @@
+all: build
+
+api.json:
+	curl -o api.json https://src.opensuse.org/swagger.v1.json
+
+obs.api.json:
+	curl -o obs.api.yaml https://api.opensuse.org/apidocs/OBS-v2.10.50.yaml
+
+gitea-generated/client/gitea_api_client.go: api.json
+	[ -d gitea-generated ] || mkdir gitea-generated
+	podman run --rm -v $$(pwd):/api ghcr.io/go-swagger/go-swagger generate client -f /api/api.json -t /api/gitea-generated
+
+generate.go:
+	go generate
+
+api: gitea-generated/client/gitea_api_client.go
+
+build: api
+	go build
+
diff --git a/bots-common/api.json b/bots-common/api.json
new file mode 100644
index 0000000..11e941b
--- /dev/null
+++ b/bots-common/api.json
@@ -0,0 +1,25728 @@
+{
+  "consumes": [
+    "application/json",
+    "text/plain"
+  ],
+  "produces": [
+    "application/json",
+    "text/html"
+  ],
+  "schemes": [
+    "https",
+    "http"
+  ],
+  "swagger": "2.0",
+  "info": {
+    "description": "This documentation describes the Gitea API.",
+    "title": "Gitea API",
+    "license": {
+      "name": "MIT",
+      "url": "http://opensource.org/licenses/MIT"
+    },
+    "version": "1.22.1"
+  },
+  "basePath": "/api/v1",
+  "paths": {
+    "/activitypub/user-id/{user-id}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "activitypub"
+        ],
+        "summary": "Returns the Person actor for a user",
+        "operationId": "activitypubPerson",
+        "parameters": [
+          {
+            "type": "integer",
+            "description": "user ID of the user",
+            "name": "user-id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/ActivityPub"
+          }
+        }
+      }
+    },
+    "/activitypub/user-id/{user-id}/inbox": {
+      "post": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "activitypub"
+        ],
+        "summary": "Send to the inbox",
+        "operationId": "activitypubPersonInbox",
+        "parameters": [
+          {
+            "type": "integer",
+            "description": "user ID of the user",
+            "name": "user-id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          }
+        }
+      }
+    },
+    "/admin/cron": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "admin"
+        ],
+        "summary": "List cron tasks",
+        "operationId": "adminCronList",
+        "parameters": [
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/CronList"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          }
+        }
+      }
+    },
+    "/admin/cron/{task}": {
+      "post": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "admin"
+        ],
+        "summary": "Run cron task",
+        "operationId": "adminCronRun",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "task to run",
+            "name": "task",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/admin/emails": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "admin"
+        ],
+        "summary": "List all emails",
+        "operationId": "adminGetAllEmails",
+        "parameters": [
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/EmailList"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          }
+        }
+      }
+    },
+    "/admin/emails/search": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "admin"
+        ],
+        "summary": "Search all emails",
+        "operationId": "adminSearchEmails",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "keyword",
+            "name": "q",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/EmailList"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          }
+        }
+      }
+    },
+    "/admin/hooks": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "admin"
+        ],
+        "summary": "List system's webhooks",
+        "operationId": "adminListHooks",
+        "parameters": [
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/HookList"
+          }
+        }
+      },
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "admin"
+        ],
+        "summary": "Create a hook",
+        "operationId": "adminCreateHook",
+        "parameters": [
+          {
+            "name": "body",
+            "in": "body",
+            "required": true,
+            "schema": {
+              "$ref": "#/definitions/CreateHookOption"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/Hook"
+          }
+        }
+      }
+    },
+    "/admin/hooks/{id}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "admin"
+        ],
+        "summary": "Get a hook",
+        "operationId": "adminGetHook",
+        "parameters": [
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the hook to get",
+            "name": "id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Hook"
+          }
+        }
+      },
+      "delete": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "admin"
+        ],
+        "summary": "Delete a hook",
+        "operationId": "adminDeleteHook",
+        "parameters": [
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the hook to delete",
+            "name": "id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          }
+        }
+      },
+      "patch": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "admin"
+        ],
+        "summary": "Update a hook",
+        "operationId": "adminEditHook",
+        "parameters": [
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the hook to update",
+            "name": "id",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/EditHookOption"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Hook"
+          }
+        }
+      }
+    },
+    "/admin/orgs": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "admin"
+        ],
+        "summary": "List all organizations",
+        "operationId": "adminGetAllOrgs",
+        "parameters": [
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/OrganizationList"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          }
+        }
+      }
+    },
+    "/admin/runners/registration-token": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "admin"
+        ],
+        "summary": "Get an global actions runner registration token",
+        "operationId": "adminGetRunnerRegistrationToken",
+        "responses": {
+          "200": {
+            "$ref": "#/responses/RegistrationToken"
+          }
+        }
+      }
+    },
+    "/admin/unadopted": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "admin"
+        ],
+        "summary": "List unadopted repositories",
+        "operationId": "adminUnadoptedList",
+        "parameters": [
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          },
+          {
+            "type": "string",
+            "description": "pattern of repositories to search for",
+            "name": "pattern",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/StringSlice"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          }
+        }
+      }
+    },
+    "/admin/unadopted/{owner}/{repo}": {
+      "post": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "admin"
+        ],
+        "summary": "Adopt unadopted files as a repository",
+        "operationId": "adminAdoptRepository",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "admin"
+        ],
+        "summary": "Delete unadopted files",
+        "operationId": "adminDeleteUnadoptedRepository",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          }
+        }
+      }
+    },
+    "/admin/users": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "admin"
+        ],
+        "summary": "Search users according filter conditions",
+        "operationId": "adminSearchUsers",
+        "parameters": [
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "ID of the user's login source to search for",
+            "name": "source_id",
+            "in": "query"
+          },
+          {
+            "type": "string",
+            "description": "user's login name to search for",
+            "name": "login_name",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/UserList"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          }
+        }
+      },
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "admin"
+        ],
+        "summary": "Create a user",
+        "operationId": "adminCreateUser",
+        "parameters": [
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/CreateUserOption"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/User"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      }
+    },
+    "/admin/users/{username}": {
+      "delete": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "admin"
+        ],
+        "summary": "Delete a user",
+        "operationId": "adminDeleteUser",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "username of user to delete",
+            "name": "username",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "boolean",
+            "description": "purge the user from the system completely",
+            "name": "purge",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      },
+      "patch": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "admin"
+        ],
+        "summary": "Edit an existing user",
+        "operationId": "adminEditUser",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "username of user to edit",
+            "name": "username",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/EditUserOption"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/User"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      }
+    },
+    "/admin/users/{username}/badges": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "admin"
+        ],
+        "summary": "List a user's badges",
+        "operationId": "adminListUserBadges",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "username of user",
+            "name": "username",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/BadgeList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "admin"
+        ],
+        "summary": "Add a badge to a user",
+        "operationId": "adminAddUserBadges",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "username of user",
+            "name": "username",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/UserBadgeOption"
+            }
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          }
+        }
+      },
+      "delete": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "admin"
+        ],
+        "summary": "Remove a badge from a user",
+        "operationId": "adminDeleteUserBadges",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "username of user",
+            "name": "username",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/UserBadgeOption"
+            }
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      }
+    },
+    "/admin/users/{username}/keys": {
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "admin"
+        ],
+        "summary": "Add a public key on behalf of a user",
+        "operationId": "adminCreatePublicKey",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "username of the user",
+            "name": "username",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "key",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/CreateKeyOption"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/PublicKey"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      }
+    },
+    "/admin/users/{username}/keys/{id}": {
+      "delete": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "admin"
+        ],
+        "summary": "Delete a user's public key",
+        "operationId": "adminDeleteUserPublicKey",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "username of user",
+            "name": "username",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the key to delete",
+            "name": "id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/admin/users/{username}/orgs": {
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "admin"
+        ],
+        "summary": "Create an organization",
+        "operationId": "adminCreateOrg",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "username of the user that will own the created organization",
+            "name": "username",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "organization",
+            "in": "body",
+            "required": true,
+            "schema": {
+              "$ref": "#/definitions/CreateOrgOption"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/Organization"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      }
+    },
+    "/admin/users/{username}/rename": {
+      "post": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "admin"
+        ],
+        "summary": "Rename a user",
+        "operationId": "adminRenameUser",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "existing username of user",
+            "name": "username",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "required": true,
+            "schema": {
+              "$ref": "#/definitions/RenameUserOption"
+            }
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      }
+    },
+    "/admin/users/{username}/repos": {
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "admin"
+        ],
+        "summary": "Create a repository on behalf of a user",
+        "operationId": "adminCreateRepo",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "username of the user. This user will own the created repository",
+            "name": "username",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "repository",
+            "in": "body",
+            "required": true,
+            "schema": {
+              "$ref": "#/definitions/CreateRepoOption"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/Repository"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "409": {
+            "$ref": "#/responses/error"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      }
+    },
+    "/gitignore/templates": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "miscellaneous"
+        ],
+        "summary": "Returns a list of all gitignore templates",
+        "operationId": "listGitignoresTemplates",
+        "responses": {
+          "200": {
+            "$ref": "#/responses/GitignoreTemplateList"
+          }
+        }
+      }
+    },
+    "/gitignore/templates/{name}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "miscellaneous"
+        ],
+        "summary": "Returns information about a gitignore template",
+        "operationId": "getGitignoreTemplateInfo",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the template",
+            "name": "name",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/GitignoreTemplateInfo"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/label/templates": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "miscellaneous"
+        ],
+        "summary": "Returns a list of all label templates",
+        "operationId": "listLabelTemplates",
+        "responses": {
+          "200": {
+            "$ref": "#/responses/LabelTemplateList"
+          }
+        }
+      }
+    },
+    "/label/templates/{name}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "miscellaneous"
+        ],
+        "summary": "Returns all labels in a template",
+        "operationId": "getLabelTemplateInfo",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the template",
+            "name": "name",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/LabelTemplateInfo"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/licenses": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "miscellaneous"
+        ],
+        "summary": "Returns a list of all license templates",
+        "operationId": "listLicenseTemplates",
+        "responses": {
+          "200": {
+            "$ref": "#/responses/LicenseTemplateList"
+          }
+        }
+      }
+    },
+    "/licenses/{name}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "miscellaneous"
+        ],
+        "summary": "Returns information about a license template",
+        "operationId": "getLicenseTemplateInfo",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the license",
+            "name": "name",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/LicenseTemplateInfo"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/markdown": {
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "text/html"
+        ],
+        "tags": [
+          "miscellaneous"
+        ],
+        "summary": "Render a markdown document as HTML",
+        "operationId": "renderMarkdown",
+        "parameters": [
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/MarkdownOption"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/MarkdownRender"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      }
+    },
+    "/markdown/raw": {
+      "post": {
+        "consumes": [
+          "text/plain"
+        ],
+        "produces": [
+          "text/html"
+        ],
+        "tags": [
+          "miscellaneous"
+        ],
+        "summary": "Render raw markdown as HTML",
+        "operationId": "renderMarkdownRaw",
+        "parameters": [
+          {
+            "description": "Request body to render",
+            "name": "body",
+            "in": "body",
+            "required": true,
+            "schema": {
+              "type": "string"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/MarkdownRender"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      }
+    },
+    "/markup": {
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "text/html"
+        ],
+        "tags": [
+          "miscellaneous"
+        ],
+        "summary": "Render a markup document as HTML",
+        "operationId": "renderMarkup",
+        "parameters": [
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/MarkupOption"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/MarkupRender"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      }
+    },
+    "/nodeinfo": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "miscellaneous"
+        ],
+        "summary": "Returns the nodeinfo of the Gitea application",
+        "operationId": "getNodeInfo",
+        "responses": {
+          "200": {
+            "$ref": "#/responses/NodeInfo"
+          }
+        }
+      }
+    },
+    "/notifications": {
+      "get": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "notification"
+        ],
+        "summary": "List users's notification threads",
+        "operationId": "notifyGetList",
+        "parameters": [
+          {
+            "type": "boolean",
+            "description": "If true, show notifications marked as read. Default value is false",
+            "name": "all",
+            "in": "query"
+          },
+          {
+            "type": "array",
+            "items": {
+              "type": "string"
+            },
+            "collectionFormat": "multi",
+            "description": "Show notifications with the provided status types. Options are: unread, read and/or pinned. Defaults to unread \u0026 pinned.",
+            "name": "status-types",
+            "in": "query"
+          },
+          {
+            "type": "array",
+            "items": {
+              "enum": [
+                "issue",
+                "pull",
+                "commit",
+                "repository"
+              ],
+              "type": "string"
+            },
+            "collectionFormat": "multi",
+            "description": "filter notifications by subject type",
+            "name": "subject-type",
+            "in": "query"
+          },
+          {
+            "type": "string",
+            "format": "date-time",
+            "description": "Only show notifications updated after the given time. This is a timestamp in RFC 3339 format",
+            "name": "since",
+            "in": "query"
+          },
+          {
+            "type": "string",
+            "format": "date-time",
+            "description": "Only show notifications updated before the given time. This is a timestamp in RFC 3339 format",
+            "name": "before",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/NotificationThreadList"
+          }
+        }
+      },
+      "put": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "notification"
+        ],
+        "summary": "Mark notification threads as read, pinned or unread",
+        "operationId": "notifyReadList",
+        "parameters": [
+          {
+            "type": "string",
+            "format": "date-time",
+            "description": "Describes the last point that notifications were checked. Anything updated since this time will not be updated.",
+            "name": "last_read_at",
+            "in": "query"
+          },
+          {
+            "type": "string",
+            "description": "If true, mark all notifications on this repo. Default value is false",
+            "name": "all",
+            "in": "query"
+          },
+          {
+            "type": "array",
+            "items": {
+              "type": "string"
+            },
+            "collectionFormat": "multi",
+            "description": "Mark notifications with the provided status types. Options are: unread, read and/or pinned. Defaults to unread.",
+            "name": "status-types",
+            "in": "query"
+          },
+          {
+            "type": "string",
+            "description": "Status to mark notifications as, Defaults to read.",
+            "name": "to-status",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "205": {
+            "$ref": "#/responses/NotificationThreadList"
+          }
+        }
+      }
+    },
+    "/notifications/new": {
+      "get": {
+        "tags": [
+          "notification"
+        ],
+        "summary": "Check if unread notifications exist",
+        "operationId": "notifyNewAvailable",
+        "responses": {
+          "200": {
+            "$ref": "#/responses/NotificationCount"
+          }
+        }
+      }
+    },
+    "/notifications/threads/{id}": {
+      "get": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "notification"
+        ],
+        "summary": "Get notification thread by ID",
+        "operationId": "notifyGetThread",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "id of notification thread",
+            "name": "id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/NotificationThread"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "patch": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "notification"
+        ],
+        "summary": "Mark notification thread as read by ID",
+        "operationId": "notifyReadThread",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "id of notification thread",
+            "name": "id",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "default": "read",
+            "description": "Status to mark notifications as",
+            "name": "to-status",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "205": {
+            "$ref": "#/responses/NotificationThread"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/org/{org}/repos": {
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "Create a repository in an organization",
+        "operationId": "createOrgRepoDeprecated",
+        "deprecated": true,
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of organization",
+            "name": "org",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/CreateRepoOption"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/Repository"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      }
+    },
+    "/orgs": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "Get list of organizations",
+        "operationId": "orgGetAll",
+        "parameters": [
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/OrganizationList"
+          }
+        }
+      },
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "Create an organization",
+        "operationId": "orgCreate",
+        "parameters": [
+          {
+            "name": "organization",
+            "in": "body",
+            "required": true,
+            "schema": {
+              "$ref": "#/definitions/CreateOrgOption"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/Organization"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      }
+    },
+    "/orgs/{org}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "Get an organization",
+        "operationId": "orgGet",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the organization to get",
+            "name": "org",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Organization"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "Delete an organization",
+        "operationId": "orgDelete",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "organization that is to be deleted",
+            "name": "org",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "patch": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "Edit an organization",
+        "operationId": "orgEdit",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the organization to edit",
+            "name": "org",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "required": true,
+            "schema": {
+              "$ref": "#/definitions/EditOrgOption"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Organization"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/orgs/{org}/actions/runners/registration-token": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "Get an organization's actions runner registration token",
+        "operationId": "orgGetRunnerRegistrationToken",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the organization",
+            "name": "org",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/RegistrationToken"
+          }
+        }
+      }
+    },
+    "/orgs/{org}/actions/secrets": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "List an organization's actions secrets",
+        "operationId": "orgListActionsSecrets",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the organization",
+            "name": "org",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/SecretList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/orgs/{org}/actions/secrets/{secretname}": {
+      "put": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "Create or Update a secret value in an organization",
+        "operationId": "updateOrgSecret",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of organization",
+            "name": "org",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the secret",
+            "name": "secretname",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/CreateOrUpdateSecretOption"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "description": "response when creating a secret"
+          },
+          "204": {
+            "description": "response when updating a secret"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "Delete a secret in an organization",
+        "operationId": "deleteOrgSecret",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of organization",
+            "name": "org",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the secret",
+            "name": "secretname",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "description": "delete one secret of the organization"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/orgs/{org}/actions/variables": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "Get an org-level variables list",
+        "operationId": "getOrgVariablesList",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the organization",
+            "name": "org",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/VariableList"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/orgs/{org}/actions/variables/{variablename}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "Get an org-level variable",
+        "operationId": "getOrgVariable",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the organization",
+            "name": "org",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the variable",
+            "name": "variablename",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/ActionVariable"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "put": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "Update an org-level variable",
+        "operationId": "updateOrgVariable",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the organization",
+            "name": "org",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the variable",
+            "name": "variablename",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/UpdateVariableOption"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "description": "response when updating an org-level variable"
+          },
+          "204": {
+            "description": "response when updating an org-level variable"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "Create an org-level variable",
+        "operationId": "createOrgVariable",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the organization",
+            "name": "org",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the variable",
+            "name": "variablename",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/CreateVariableOption"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "description": "response when creating an org-level variable"
+          },
+          "204": {
+            "description": "response when creating an org-level variable"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "Delete an org-level variable",
+        "operationId": "deleteOrgVariable",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the organization",
+            "name": "org",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the variable",
+            "name": "variablename",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/ActionVariable"
+          },
+          "201": {
+            "description": "response when deleting a variable"
+          },
+          "204": {
+            "description": "response when deleting a variable"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/orgs/{org}/activities/feeds": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "List an organization's activity feeds",
+        "operationId": "orgListActivityFeeds",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the org",
+            "name": "org",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "format": "date",
+            "description": "the date of the activities to be found",
+            "name": "date",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/ActivityFeedsList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/orgs/{org}/avatar": {
+      "post": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "Update Avatar",
+        "operationId": "orgUpdateAvatar",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the organization",
+            "name": "org",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/UpdateUserAvatarOption"
+            }
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "Delete Avatar",
+        "operationId": "orgDeleteAvatar",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the organization",
+            "name": "org",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/orgs/{org}/blocks": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "List users blocked by the organization",
+        "operationId": "organizationListBlocks",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the organization",
+            "name": "org",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/UserList"
+          }
+        }
+      }
+    },
+    "/orgs/{org}/blocks/{username}": {
+      "get": {
+        "tags": [
+          "organization"
+        ],
+        "summary": "Check if a user is blocked by the organization",
+        "operationId": "organizationCheckUserBlock",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the organization",
+            "name": "org",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "user to check",
+            "name": "username",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "put": {
+        "tags": [
+          "organization"
+        ],
+        "summary": "Block a user",
+        "operationId": "organizationBlockUser",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the organization",
+            "name": "org",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "user to block",
+            "name": "username",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "optional note for the block",
+            "name": "note",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      },
+      "delete": {
+        "tags": [
+          "organization"
+        ],
+        "summary": "Unblock a user",
+        "operationId": "organizationUnblockUser",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the organization",
+            "name": "org",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "user to unblock",
+            "name": "username",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      }
+    },
+    "/orgs/{org}/hooks": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "List an organization's webhooks",
+        "operationId": "orgListHooks",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the organization",
+            "name": "org",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/HookList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "Create a hook",
+        "operationId": "orgCreateHook",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the organization",
+            "name": "org",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "required": true,
+            "schema": {
+              "$ref": "#/definitions/CreateHookOption"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/Hook"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/orgs/{org}/hooks/{id}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "Get a hook",
+        "operationId": "orgGetHook",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the organization",
+            "name": "org",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the hook to get",
+            "name": "id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Hook"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "Delete a hook",
+        "operationId": "orgDeleteHook",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the organization",
+            "name": "org",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the hook to delete",
+            "name": "id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "patch": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "Update a hook",
+        "operationId": "orgEditHook",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the organization",
+            "name": "org",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the hook to update",
+            "name": "id",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/EditHookOption"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Hook"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/orgs/{org}/labels": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "List an organization's labels",
+        "operationId": "orgListLabels",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the organization",
+            "name": "org",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/LabelList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "Create a label for an organization",
+        "operationId": "orgCreateLabel",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the organization",
+            "name": "org",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/CreateLabelOption"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/Label"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      }
+    },
+    "/orgs/{org}/labels/{id}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "Get a single label",
+        "operationId": "orgGetLabel",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the organization",
+            "name": "org",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the label to get",
+            "name": "id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Label"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "tags": [
+          "organization"
+        ],
+        "summary": "Delete a label",
+        "operationId": "orgDeleteLabel",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the organization",
+            "name": "org",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the label to delete",
+            "name": "id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "patch": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "Update a label",
+        "operationId": "orgEditLabel",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the organization",
+            "name": "org",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the label to edit",
+            "name": "id",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/EditLabelOption"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Label"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      }
+    },
+    "/orgs/{org}/members": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "List an organization's members",
+        "operationId": "orgListMembers",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the organization",
+            "name": "org",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/UserList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/orgs/{org}/members/{username}": {
+      "get": {
+        "tags": [
+          "organization"
+        ],
+        "summary": "Check if a user is a member of an organization",
+        "operationId": "orgIsMember",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the organization",
+            "name": "org",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "username of the user",
+            "name": "username",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "description": "user is a member"
+          },
+          "303": {
+            "description": "redirection to /orgs/{org}/public_members/{username}"
+          },
+          "404": {
+            "description": "user is not a member"
+          }
+        }
+      },
+      "delete": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "Remove a member from an organization",
+        "operationId": "orgDeleteMember",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the organization",
+            "name": "org",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "username of the user",
+            "name": "username",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "description": "member removed"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/orgs/{org}/public_members": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "List an organization's public members",
+        "operationId": "orgListPublicMembers",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the organization",
+            "name": "org",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/UserList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/orgs/{org}/public_members/{username}": {
+      "get": {
+        "tags": [
+          "organization"
+        ],
+        "summary": "Check if a user is a public member of an organization",
+        "operationId": "orgIsPublicMember",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the organization",
+            "name": "org",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "username of the user",
+            "name": "username",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "description": "user is a public member"
+          },
+          "404": {
+            "description": "user is not a public member"
+          }
+        }
+      },
+      "put": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "Publicize a user's membership",
+        "operationId": "orgPublicizeMember",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the organization",
+            "name": "org",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "username of the user",
+            "name": "username",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "description": "membership publicized"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "Conceal a user's membership",
+        "operationId": "orgConcealMember",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the organization",
+            "name": "org",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "username of the user",
+            "name": "username",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/orgs/{org}/repos": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "List an organization's repos",
+        "operationId": "orgListRepos",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the organization",
+            "name": "org",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/RepositoryList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "Create a repository in an organization",
+        "operationId": "createOrgRepo",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of organization",
+            "name": "org",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/CreateRepoOption"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/Repository"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/orgs/{org}/teams": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "List an organization's teams",
+        "operationId": "orgListTeams",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the organization",
+            "name": "org",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/TeamList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "Create a team",
+        "operationId": "orgCreateTeam",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the organization",
+            "name": "org",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/CreateTeamOption"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/Team"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      }
+    },
+    "/orgs/{org}/teams/search": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "Search for teams within an organization",
+        "operationId": "teamSearch",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the organization",
+            "name": "org",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "keywords to search",
+            "name": "q",
+            "in": "query"
+          },
+          {
+            "type": "boolean",
+            "description": "include search within team description (defaults to true)",
+            "name": "include_desc",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "SearchResults of a successful search",
+            "schema": {
+              "type": "object",
+              "properties": {
+                "data": {
+                  "type": "array",
+                  "items": {
+                    "$ref": "#/definitions/Team"
+                  }
+                },
+                "ok": {
+                  "type": "boolean"
+                }
+              }
+            }
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/packages/{owner}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "package"
+        ],
+        "summary": "Gets all packages of an owner",
+        "operationId": "listPackages",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the packages",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          },
+          {
+            "enum": [
+              "alpine",
+              "cargo",
+              "chef",
+              "composer",
+              "conan",
+              "conda",
+              "container",
+              "cran",
+              "debian",
+              "generic",
+              "go",
+              "helm",
+              "maven",
+              "npm",
+              "nuget",
+              "pub",
+              "pypi",
+              "rpm",
+              "rubygems",
+              "swift",
+              "vagrant"
+            ],
+            "type": "string",
+            "description": "package type filter",
+            "name": "type",
+            "in": "query"
+          },
+          {
+            "type": "string",
+            "description": "name filter",
+            "name": "q",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/PackageList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/packages/{owner}/{type}/{name}/{version}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "package"
+        ],
+        "summary": "Gets a package",
+        "operationId": "getPackage",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the package",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "type of the package",
+            "name": "type",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the package",
+            "name": "name",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "version of the package",
+            "name": "version",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Package"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "tags": [
+          "package"
+        ],
+        "summary": "Delete a package",
+        "operationId": "deletePackage",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the package",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "type of the package",
+            "name": "type",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the package",
+            "name": "name",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "version of the package",
+            "name": "version",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/packages/{owner}/{type}/{name}/{version}/files": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "package"
+        ],
+        "summary": "Gets all files of a package",
+        "operationId": "listPackageFiles",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the package",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "type of the package",
+            "name": "type",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the package",
+            "name": "name",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "version of the package",
+            "name": "version",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/PackageFileList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/issues/search": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Search for issues across the repositories that the user has access to",
+        "operationId": "issueSearchIssues",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "whether issue is open or closed",
+            "name": "state",
+            "in": "query"
+          },
+          {
+            "type": "string",
+            "description": "comma separated list of labels. Fetch only issues that have any of this labels. Non existent labels are discarded",
+            "name": "labels",
+            "in": "query"
+          },
+          {
+            "type": "string",
+            "description": "comma separated list of milestone names. Fetch only issues that have any of this milestones. Non existent are discarded",
+            "name": "milestones",
+            "in": "query"
+          },
+          {
+            "type": "string",
+            "description": "search string",
+            "name": "q",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "repository to prioritize in the results",
+            "name": "priority_repo_id",
+            "in": "query"
+          },
+          {
+            "type": "string",
+            "description": "filter by type (issues / pulls) if set",
+            "name": "type",
+            "in": "query"
+          },
+          {
+            "type": "string",
+            "format": "date-time",
+            "description": "Only show notifications updated after the given time. This is a timestamp in RFC 3339 format",
+            "name": "since",
+            "in": "query"
+          },
+          {
+            "type": "string",
+            "format": "date-time",
+            "description": "Only show notifications updated before the given time. This is a timestamp in RFC 3339 format",
+            "name": "before",
+            "in": "query"
+          },
+          {
+            "type": "boolean",
+            "description": "filter (issues / pulls) assigned to you, default is false",
+            "name": "assigned",
+            "in": "query"
+          },
+          {
+            "type": "boolean",
+            "description": "filter (issues / pulls) created by you, default is false",
+            "name": "created",
+            "in": "query"
+          },
+          {
+            "type": "boolean",
+            "description": "filter (issues / pulls) mentioning you, default is false",
+            "name": "mentioned",
+            "in": "query"
+          },
+          {
+            "type": "boolean",
+            "description": "filter pulls requesting your review, default is false",
+            "name": "review_requested",
+            "in": "query"
+          },
+          {
+            "type": "boolean",
+            "description": "filter pulls reviewed by you, default is false",
+            "name": "reviewed",
+            "in": "query"
+          },
+          {
+            "type": "string",
+            "description": "filter by owner",
+            "name": "owner",
+            "in": "query"
+          },
+          {
+            "type": "string",
+            "description": "filter by team (requires organization owner parameter to be provided)",
+            "name": "team",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/IssueList"
+          }
+        }
+      }
+    },
+    "/repos/migrate": {
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Migrate a remote git repository",
+        "operationId": "repoMigrate",
+        "parameters": [
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/MigrateRepoOptions"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/Repository"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "409": {
+            "description": "The repository with the same name already exists."
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      }
+    },
+    "/repos/search": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Search for repositories",
+        "operationId": "repoSearch",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "keyword",
+            "name": "q",
+            "in": "query"
+          },
+          {
+            "type": "boolean",
+            "description": "Limit search to repositories with keyword as topic",
+            "name": "topic",
+            "in": "query"
+          },
+          {
+            "type": "boolean",
+            "description": "include search of keyword within repository description",
+            "name": "includeDesc",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "search only for repos that the user with the given id owns or contributes to",
+            "name": "uid",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "repo owner to prioritize in the results",
+            "name": "priority_owner_id",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "search only for repos that belong to the given team id",
+            "name": "team_id",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "search only for repos that the user with the given id has starred",
+            "name": "starredBy",
+            "in": "query"
+          },
+          {
+            "type": "boolean",
+            "description": "include private repositories this user has access to (defaults to true)",
+            "name": "private",
+            "in": "query"
+          },
+          {
+            "type": "boolean",
+            "description": "show only pubic, private or all repositories (defaults to all)",
+            "name": "is_private",
+            "in": "query"
+          },
+          {
+            "type": "boolean",
+            "description": "include template repositories this user has access to (defaults to true)",
+            "name": "template",
+            "in": "query"
+          },
+          {
+            "type": "boolean",
+            "description": "show only archived, non-archived or all repositories (defaults to all)",
+            "name": "archived",
+            "in": "query"
+          },
+          {
+            "type": "string",
+            "description": "type of repository to search for. Supported values are \"fork\", \"source\", \"mirror\" and \"collaborative\"",
+            "name": "mode",
+            "in": "query"
+          },
+          {
+            "type": "boolean",
+            "description": "if `uid` is given, search only for repos that the user owns",
+            "name": "exclusive",
+            "in": "query"
+          },
+          {
+            "type": "string",
+            "description": "sort repos by attribute. Supported values are \"alpha\", \"created\", \"updated\", \"size\", and \"id\". Default is \"alpha\"",
+            "name": "sort",
+            "in": "query"
+          },
+          {
+            "type": "string",
+            "description": "sort order, either \"asc\" (ascending) or \"desc\" (descending). Default is \"asc\", ignored if \"sort\" is not specified.",
+            "name": "order",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/SearchResults"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get a repository",
+        "operationId": "repoGet",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Repository"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Delete a repository",
+        "operationId": "repoDelete",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo to delete",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo to delete",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "patch": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Edit a repository's properties. Only fields that are set will be changed.",
+        "operationId": "repoEdit",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo to edit",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo to edit",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "description": "Properties of a repo that you can edit",
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/EditRepoOption"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Repository"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/actions/secrets": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "List an repo's actions secrets",
+        "operationId": "repoListActionsSecrets",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repository",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repository",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/SecretList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/actions/secrets/{secretname}": {
+      "put": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Create or Update a secret value in a repository",
+        "operationId": "updateRepoSecret",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repository",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repository",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the secret",
+            "name": "secretname",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/CreateOrUpdateSecretOption"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "description": "response when creating a secret"
+          },
+          "204": {
+            "description": "response when updating a secret"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Delete a secret in a repository",
+        "operationId": "deleteRepoSecret",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repository",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repository",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the secret",
+            "name": "secretname",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "description": "delete one secret of the organization"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/actions/variables": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get repo-level variables list",
+        "operationId": "getRepoVariablesList",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the owner",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repository",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/VariableList"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/actions/variables/{variablename}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get a repo-level variable",
+        "operationId": "getRepoVariable",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the owner",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repository",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the variable",
+            "name": "variablename",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/ActionVariable"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "put": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Update a repo-level variable",
+        "operationId": "updateRepoVariable",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the owner",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repository",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the variable",
+            "name": "variablename",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/UpdateVariableOption"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "description": "response when updating a repo-level variable"
+          },
+          "204": {
+            "description": "response when updating a repo-level variable"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "post": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Create a repo-level variable",
+        "operationId": "createRepoVariable",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the owner",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repository",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the variable",
+            "name": "variablename",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/CreateVariableOption"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "description": "response when creating a repo-level variable"
+          },
+          "204": {
+            "description": "response when creating a repo-level variable"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Delete a repo-level variable",
+        "operationId": "deleteRepoVariable",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the owner",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repository",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the variable",
+            "name": "variablename",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/ActionVariable"
+          },
+          "201": {
+            "description": "response when deleting a variable"
+          },
+          "204": {
+            "description": "response when deleting a variable"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/activities/feeds": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "List a repository's activity feeds",
+        "operationId": "repoListActivityFeeds",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "format": "date",
+            "description": "the date of the activities to be found",
+            "name": "date",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/ActivityFeedsList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/archive/{archive}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get an archive of a repository",
+        "operationId": "repoGetArchive",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "the git reference for download with attached archive format (e.g. master.zip)",
+            "name": "archive",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "success"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/assignees": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Return all users that have write access and can be assigned to issues",
+        "operationId": "repoGetAssignees",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/UserList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/avatar": {
+      "post": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Update avatar",
+        "operationId": "repoUpdateAvatar",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/UpdateRepoAvatarOption"
+            }
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Delete avatar",
+        "operationId": "repoDeleteAvatar",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/branch_protections": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "List branch protections for a repository",
+        "operationId": "repoListBranchProtection",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/BranchProtectionList"
+          }
+        }
+      },
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Create a branch protections for a repository",
+        "operationId": "repoCreateBranchProtection",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/CreateBranchProtectionOption"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/BranchProtection"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          },
+          "423": {
+            "$ref": "#/responses/repoArchivedError"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/branch_protections/{name}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get a specific branch protection for the repository",
+        "operationId": "repoGetBranchProtection",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of protected branch",
+            "name": "name",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/BranchProtection"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Delete a specific branch protection for the repository",
+        "operationId": "repoDeleteBranchProtection",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of protected branch",
+            "name": "name",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "patch": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Edit a branch protections for a repository. Only fields that are set will be changed",
+        "operationId": "repoEditBranchProtection",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of protected branch",
+            "name": "name",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/EditBranchProtectionOption"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/BranchProtection"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          },
+          "423": {
+            "$ref": "#/responses/repoArchivedError"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/branches": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "List a repository's branches",
+        "operationId": "repoListBranches",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/BranchList"
+          }
+        }
+      },
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Create a branch",
+        "operationId": "repoCreateBranch",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/CreateBranchRepoOption"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/Branch"
+          },
+          "403": {
+            "description": "The branch is archived or a mirror."
+          },
+          "404": {
+            "description": "The old branch does not exist."
+          },
+          "409": {
+            "description": "The branch with the same name already exists."
+          },
+          "423": {
+            "$ref": "#/responses/repoArchivedError"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/branches/{branch}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Retrieve a specific branch from a repository, including its effective branch protection",
+        "operationId": "repoGetBranch",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "branch to get",
+            "name": "branch",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Branch"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Delete a specific branch from a repository",
+        "operationId": "repoDeleteBranch",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "branch to delete",
+            "name": "branch",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "403": {
+            "$ref": "#/responses/error"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "423": {
+            "$ref": "#/responses/repoArchivedError"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/collaborators": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "List a repository's collaborators",
+        "operationId": "repoListCollaborators",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/UserList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/collaborators/{collaborator}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Check if a user is a collaborator of a repository",
+        "operationId": "repoCheckCollaborator",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "username of the collaborator",
+            "name": "collaborator",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      },
+      "put": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Add a collaborator to a repository",
+        "operationId": "repoAddCollaborator",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "username of the collaborator to add",
+            "name": "collaborator",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/AddCollaboratorOption"
+            }
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      },
+      "delete": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Delete a collaborator from a repository",
+        "operationId": "repoDeleteCollaborator",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "username of the collaborator to delete",
+            "name": "collaborator",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/collaborators/{collaborator}/permission": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get repository permissions for a user",
+        "operationId": "repoGetRepoPermissions",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "username of the collaborator",
+            "name": "collaborator",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/RepoCollaboratorPermission"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/commits": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get a list of all commits from a repository",
+        "operationId": "repoGetAllCommits",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "SHA or branch to start listing commits from (usually 'master')",
+            "name": "sha",
+            "in": "query"
+          },
+          {
+            "type": "string",
+            "description": "filepath of a file/dir",
+            "name": "path",
+            "in": "query"
+          },
+          {
+            "type": "boolean",
+            "description": "include diff stats for every commit (disable for speedup, default 'true')",
+            "name": "stat",
+            "in": "query"
+          },
+          {
+            "type": "boolean",
+            "description": "include verification for every commit (disable for speedup, default 'true')",
+            "name": "verification",
+            "in": "query"
+          },
+          {
+            "type": "boolean",
+            "description": "include a list of affected files for every commit (disable for speedup, default 'true')",
+            "name": "files",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results (ignored if used with 'path')",
+            "name": "limit",
+            "in": "query"
+          },
+          {
+            "type": "string",
+            "description": "commits that match the given specifier will not be listed.",
+            "name": "not",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/CommitList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "409": {
+            "$ref": "#/responses/EmptyRepository"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/commits/{ref}/status": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get a commit's combined status, by branch/tag/commit reference",
+        "operationId": "repoGetCombinedStatusByRef",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of branch/tag/commit",
+            "name": "ref",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/CombinedStatus"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/commits/{ref}/statuses": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get a commit's statuses, by branch/tag/commit reference",
+        "operationId": "repoListStatusesByRef",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of branch/tag/commit",
+            "name": "ref",
+            "in": "path",
+            "required": true
+          },
+          {
+            "enum": [
+              "oldest",
+              "recentupdate",
+              "leastupdate",
+              "leastindex",
+              "highestindex"
+            ],
+            "type": "string",
+            "description": "type of sort",
+            "name": "sort",
+            "in": "query"
+          },
+          {
+            "enum": [
+              "pending",
+              "success",
+              "error",
+              "failure",
+              "warning"
+            ],
+            "type": "string",
+            "description": "type of state",
+            "name": "state",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/CommitStatusList"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/commits/{sha}/pull": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get the pull request of the commit",
+        "operationId": "repoGetCommitPullRequest",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "SHA of the commit to get",
+            "name": "sha",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/PullRequest"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/compare/{basehead}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get commit comparison information",
+        "operationId": "repoCompareDiff",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "compare two branches or commits",
+            "name": "basehead",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Compare"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/contents": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Gets the metadata of all the entries of the root dir",
+        "operationId": "repoGetContentsList",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "The name of the commit/branch/tag. Default the repository’s default branch (usually master)",
+            "name": "ref",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/ContentsListResponse"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Modify multiple files in a repository",
+        "operationId": "repoChangeFiles",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "required": true,
+            "schema": {
+              "$ref": "#/definitions/ChangeFilesOptions"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/FilesResponse"
+          },
+          "403": {
+            "$ref": "#/responses/error"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "422": {
+            "$ref": "#/responses/error"
+          },
+          "423": {
+            "$ref": "#/responses/repoArchivedError"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/contents/{filepath}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Gets the metadata and contents (if a file) of an entry in a repository, or a list of entries if a dir",
+        "operationId": "repoGetContents",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "path of the dir, file, symlink or submodule in the repo",
+            "name": "filepath",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "The name of the commit/branch/tag. Default the repository’s default branch (usually master)",
+            "name": "ref",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/ContentsResponse"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "put": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Update a file in a repository",
+        "operationId": "repoUpdateFile",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "path of the file to update",
+            "name": "filepath",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "required": true,
+            "schema": {
+              "$ref": "#/definitions/UpdateFileOptions"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/FileResponse"
+          },
+          "403": {
+            "$ref": "#/responses/error"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "422": {
+            "$ref": "#/responses/error"
+          },
+          "423": {
+            "$ref": "#/responses/repoArchivedError"
+          }
+        }
+      },
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Create a file in a repository",
+        "operationId": "repoCreateFile",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "path of the file to create",
+            "name": "filepath",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "required": true,
+            "schema": {
+              "$ref": "#/definitions/CreateFileOptions"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/FileResponse"
+          },
+          "403": {
+            "$ref": "#/responses/error"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "422": {
+            "$ref": "#/responses/error"
+          },
+          "423": {
+            "$ref": "#/responses/repoArchivedError"
+          }
+        }
+      },
+      "delete": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Delete a file in a repository",
+        "operationId": "repoDeleteFile",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "path of the file to delete",
+            "name": "filepath",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "required": true,
+            "schema": {
+              "$ref": "#/definitions/DeleteFileOptions"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/FileDeleteResponse"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "403": {
+            "$ref": "#/responses/error"
+          },
+          "404": {
+            "$ref": "#/responses/error"
+          },
+          "423": {
+            "$ref": "#/responses/repoArchivedError"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/diffpatch": {
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Apply diff patch to repository",
+        "operationId": "repoApplyDiffPatch",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "required": true,
+            "schema": {
+              "$ref": "#/definitions/UpdateFileOptions"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/FileResponse"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "423": {
+            "$ref": "#/responses/repoArchivedError"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/editorconfig/{filepath}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get the EditorConfig definitions of a file in a repository",
+        "operationId": "repoGetEditorConfig",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "filepath of file to get",
+            "name": "filepath",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "The name of the commit/branch/tag. Default the repository’s default branch (usually master)",
+            "name": "ref",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "success"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/forks": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "List a repository's forks",
+        "operationId": "listForks",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/RepositoryList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "post": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Fork a repository",
+        "operationId": "createFork",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo to fork",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo to fork",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/CreateForkOption"
+            }
+          }
+        ],
+        "responses": {
+          "202": {
+            "$ref": "#/responses/Repository"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "409": {
+            "description": "The repository with the same name already exists."
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/git/blobs/{sha}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Gets the blob of a repository.",
+        "operationId": "GetBlob",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "sha of the commit",
+            "name": "sha",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/GitBlobResponse"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/git/commits/{sha}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get a single commit from a repository",
+        "operationId": "repoGetSingleCommit",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "a git ref or commit sha",
+            "name": "sha",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "boolean",
+            "description": "include diff stats for every commit (disable for speedup, default 'true')",
+            "name": "stat",
+            "in": "query"
+          },
+          {
+            "type": "boolean",
+            "description": "include verification for every commit (disable for speedup, default 'true')",
+            "name": "verification",
+            "in": "query"
+          },
+          {
+            "type": "boolean",
+            "description": "include a list of affected files for every commit (disable for speedup, default 'true')",
+            "name": "files",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Commit"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/git/commits/{sha}.{diffType}": {
+      "get": {
+        "produces": [
+          "text/plain"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get a commit's diff or patch",
+        "operationId": "repoDownloadCommitDiffOrPatch",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "SHA of the commit to get",
+            "name": "sha",
+            "in": "path",
+            "required": true
+          },
+          {
+            "enum": [
+              "diff",
+              "patch"
+            ],
+            "type": "string",
+            "description": "whether the output is diff or patch",
+            "name": "diffType",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/string"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/git/notes/{sha}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get a note corresponding to a single commit from a repository",
+        "operationId": "repoGetNote",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "a git ref or commit sha",
+            "name": "sha",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "boolean",
+            "description": "include verification for every commit (disable for speedup, default 'true')",
+            "name": "verification",
+            "in": "query"
+          },
+          {
+            "type": "boolean",
+            "description": "include a list of affected files for every commit (disable for speedup, default 'true')",
+            "name": "files",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Note"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/git/refs": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get specified ref or filtered repository's refs",
+        "operationId": "repoListAllGitRefs",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/ReferenceList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/git/refs/{ref}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get specified ref or filtered repository's refs",
+        "operationId": "repoListGitRefs",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "part or full name of the ref",
+            "name": "ref",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/ReferenceList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/git/tags/{sha}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Gets the tag object of an annotated tag (not lightweight tags)",
+        "operationId": "GetAnnotatedTag",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "sha of the tag. The Git tags API only supports annotated tag objects, not lightweight tags.",
+            "name": "sha",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/AnnotatedTag"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/git/trees/{sha}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Gets the tree of a repository.",
+        "operationId": "GetTree",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "sha of the commit",
+            "name": "sha",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "boolean",
+            "description": "show all directories and files",
+            "name": "recursive",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page number; the 'truncated' field in the response will be true if there are still more items after this page, false if the last page",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "number of items per page",
+            "name": "per_page",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/GitTreeResponse"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/hooks": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "List the hooks in a repository",
+        "operationId": "repoListHooks",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/HookList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Create a hook",
+        "operationId": "repoCreateHook",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/CreateHookOption"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/Hook"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/hooks/git": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "List the Git hooks in a repository",
+        "operationId": "repoListGitHooks",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/GitHookList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/hooks/git/{id}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get a Git hook",
+        "operationId": "repoGetGitHook",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "id of the hook to get",
+            "name": "id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/GitHook"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Delete a Git hook in a repository",
+        "operationId": "repoDeleteGitHook",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "id of the hook to get",
+            "name": "id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "patch": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Edit a Git hook in a repository",
+        "operationId": "repoEditGitHook",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "id of the hook to get",
+            "name": "id",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/EditGitHookOption"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/GitHook"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/hooks/{id}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get a hook",
+        "operationId": "repoGetHook",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the hook to get",
+            "name": "id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Hook"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Delete a hook in a repository",
+        "operationId": "repoDeleteHook",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the hook to delete",
+            "name": "id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "patch": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Edit a hook in a repository",
+        "operationId": "repoEditHook",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the hook",
+            "name": "id",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/EditHookOption"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Hook"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/hooks/{id}/tests": {
+      "post": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Test a push webhook",
+        "operationId": "repoTestHook",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the hook to test",
+            "name": "id",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "The name of the commit/branch/tag, indicates which commit will be loaded to the webhook payload.",
+            "name": "ref",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/issue_config": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Returns the issue config for a repo",
+        "operationId": "repoGetIssueConfig",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/RepoIssueConfig"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/issue_config/validate": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Returns the validation information for a issue config",
+        "operationId": "repoValidateIssueConfig",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/RepoIssueConfigValidation"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/issue_templates": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get available issue templates for a repository",
+        "operationId": "repoGetIssueTemplates",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/IssueTemplates"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/issues": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "List a repository's issues",
+        "operationId": "issueListIssues",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "enum": [
+              "closed",
+              "open",
+              "all"
+            ],
+            "type": "string",
+            "description": "whether issue is open or closed",
+            "name": "state",
+            "in": "query"
+          },
+          {
+            "type": "string",
+            "description": "comma separated list of labels. Fetch only issues that have any of this labels. Non existent labels are discarded",
+            "name": "labels",
+            "in": "query"
+          },
+          {
+            "type": "string",
+            "description": "search string",
+            "name": "q",
+            "in": "query"
+          },
+          {
+            "enum": [
+              "issues",
+              "pulls"
+            ],
+            "type": "string",
+            "description": "filter by type (issues / pulls) if set",
+            "name": "type",
+            "in": "query"
+          },
+          {
+            "type": "string",
+            "description": "comma separated list of milestone names or ids. It uses names and fall back to ids. Fetch only issues that have any of this milestones. Non existent milestones are discarded",
+            "name": "milestones",
+            "in": "query"
+          },
+          {
+            "type": "string",
+            "format": "date-time",
+            "description": "Only show items updated after the given time. This is a timestamp in RFC 3339 format",
+            "name": "since",
+            "in": "query"
+          },
+          {
+            "type": "string",
+            "format": "date-time",
+            "description": "Only show items updated before the given time. This is a timestamp in RFC 3339 format",
+            "name": "before",
+            "in": "query"
+          },
+          {
+            "type": "string",
+            "description": "Only show items which were created by the given user",
+            "name": "created_by",
+            "in": "query"
+          },
+          {
+            "type": "string",
+            "description": "Only show items for which the given user is assigned",
+            "name": "assigned_by",
+            "in": "query"
+          },
+          {
+            "type": "string",
+            "description": "Only show items in which the given user was mentioned",
+            "name": "mentioned_by",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/IssueList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Create an issue. If using deadline only the date will be taken into account, and time of day ignored.",
+        "operationId": "issueCreateIssue",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/CreateIssueOption"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/Issue"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "412": {
+            "$ref": "#/responses/error"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          },
+          "423": {
+            "$ref": "#/responses/repoArchivedError"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/issues/comments": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "List all comments in a repository",
+        "operationId": "issueGetRepoComments",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "format": "date-time",
+            "description": "if provided, only comments updated since the provided time are returned.",
+            "name": "since",
+            "in": "query"
+          },
+          {
+            "type": "string",
+            "format": "date-time",
+            "description": "if provided, only comments updated before the provided time are returned.",
+            "name": "before",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/CommentList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/issues/comments/{id}": {
+      "get": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Get a comment",
+        "operationId": "issueGetComment",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the comment",
+            "name": "id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Comment"
+          },
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "tags": [
+          "issue"
+        ],
+        "summary": "Delete a comment",
+        "operationId": "issueDeleteComment",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of comment to delete",
+            "name": "id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "patch": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Edit a comment",
+        "operationId": "issueEditComment",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the comment to edit",
+            "name": "id",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/EditIssueCommentOption"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Comment"
+          },
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "423": {
+            "$ref": "#/responses/repoArchivedError"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/issues/comments/{id}/assets": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "List comment's attachments",
+        "operationId": "issueListIssueCommentAttachments",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the comment",
+            "name": "id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/AttachmentList"
+          },
+          "404": {
+            "$ref": "#/responses/error"
+          }
+        }
+      },
+      "post": {
+        "consumes": [
+          "multipart/form-data"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Create a comment attachment",
+        "operationId": "issueCreateIssueCommentAttachment",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the comment",
+            "name": "id",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the attachment",
+            "name": "name",
+            "in": "query"
+          },
+          {
+            "type": "file",
+            "description": "attachment to upload",
+            "name": "attachment",
+            "in": "formData",
+            "required": true
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/Attachment"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/error"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          },
+          "423": {
+            "$ref": "#/responses/repoArchivedError"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/issues/comments/{id}/assets/{attachment_id}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Get a comment attachment",
+        "operationId": "issueGetIssueCommentAttachment",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the comment",
+            "name": "id",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the attachment to get",
+            "name": "attachment_id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Attachment"
+          },
+          "404": {
+            "$ref": "#/responses/error"
+          }
+        }
+      },
+      "delete": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Delete a comment attachment",
+        "operationId": "issueDeleteIssueCommentAttachment",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the comment",
+            "name": "id",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the attachment to delete",
+            "name": "attachment_id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "404": {
+            "$ref": "#/responses/error"
+          },
+          "423": {
+            "$ref": "#/responses/repoArchivedError"
+          }
+        }
+      },
+      "patch": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Edit a comment attachment",
+        "operationId": "issueEditIssueCommentAttachment",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the comment",
+            "name": "id",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the attachment to edit",
+            "name": "attachment_id",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/EditAttachmentOptions"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/Attachment"
+          },
+          "404": {
+            "$ref": "#/responses/error"
+          },
+          "423": {
+            "$ref": "#/responses/repoArchivedError"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/issues/comments/{id}/reactions": {
+      "get": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Get a list of reactions from a comment of an issue",
+        "operationId": "issueGetCommentReactions",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the comment to edit",
+            "name": "id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/ReactionList"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Add a reaction to a comment of an issue",
+        "operationId": "issuePostCommentReaction",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the comment to edit",
+            "name": "id",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "content",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/EditReactionOption"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Reaction"
+          },
+          "201": {
+            "$ref": "#/responses/Reaction"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Remove a reaction from a comment of an issue",
+        "operationId": "issueDeleteCommentReaction",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the comment to edit",
+            "name": "id",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "content",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/EditReactionOption"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/empty"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/issues/pinned": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "List a repo's pinned issues",
+        "operationId": "repoListPinnedIssues",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/IssueList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/issues/{index}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Get an issue",
+        "operationId": "issueGetIssue",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the issue to get",
+            "name": "index",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Issue"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "tags": [
+          "issue"
+        ],
+        "summary": "Delete an issue",
+        "operationId": "issueDelete",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of issue to delete",
+            "name": "index",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "patch": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Edit an issue. If using deadline only the date will be taken into account, and time of day ignored.",
+        "operationId": "issueEditIssue",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the issue to edit",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/EditIssueOption"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/Issue"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "412": {
+            "$ref": "#/responses/error"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/issues/{index}/assets": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "List issue's attachments",
+        "operationId": "issueListIssueAttachments",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the issue",
+            "name": "index",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/AttachmentList"
+          },
+          "404": {
+            "$ref": "#/responses/error"
+          }
+        }
+      },
+      "post": {
+        "consumes": [
+          "multipart/form-data"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Create an issue attachment",
+        "operationId": "issueCreateIssueAttachment",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the issue",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the attachment",
+            "name": "name",
+            "in": "query"
+          },
+          {
+            "type": "file",
+            "description": "attachment to upload",
+            "name": "attachment",
+            "in": "formData",
+            "required": true
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/Attachment"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "404": {
+            "$ref": "#/responses/error"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          },
+          "423": {
+            "$ref": "#/responses/repoArchivedError"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/issues/{index}/assets/{attachment_id}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Get an issue attachment",
+        "operationId": "issueGetIssueAttachment",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the issue",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the attachment to get",
+            "name": "attachment_id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Attachment"
+          },
+          "404": {
+            "$ref": "#/responses/error"
+          }
+        }
+      },
+      "delete": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Delete an issue attachment",
+        "operationId": "issueDeleteIssueAttachment",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the issue",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the attachment to delete",
+            "name": "attachment_id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "404": {
+            "$ref": "#/responses/error"
+          },
+          "423": {
+            "$ref": "#/responses/repoArchivedError"
+          }
+        }
+      },
+      "patch": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Edit an issue attachment",
+        "operationId": "issueEditIssueAttachment",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the issue",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the attachment to edit",
+            "name": "attachment_id",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/EditAttachmentOptions"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/Attachment"
+          },
+          "404": {
+            "$ref": "#/responses/error"
+          },
+          "423": {
+            "$ref": "#/responses/repoArchivedError"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/issues/{index}/blocks": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "List issues that are blocked by this issue",
+        "operationId": "issueListBlocks",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "index of the issue",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/IssueList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "post": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Block the issue given in the body by the issue in path",
+        "operationId": "issueCreateIssueBlocking",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "index of the issue",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/IssueMeta"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/Issue"
+          },
+          "404": {
+            "description": "the issue does not exist"
+          }
+        }
+      },
+      "delete": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Unblock the issue given in the body by the issue in path",
+        "operationId": "issueRemoveIssueBlocking",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "index of the issue",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/IssueMeta"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Issue"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/issues/{index}/comments": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "List all comments on an issue",
+        "operationId": "issueGetComments",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the issue",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "format": "date-time",
+            "description": "if provided, only comments updated since the specified time are returned.",
+            "name": "since",
+            "in": "query"
+          },
+          {
+            "type": "string",
+            "format": "date-time",
+            "description": "if provided, only comments updated before the provided time are returned.",
+            "name": "before",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/CommentList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Add a comment to an issue",
+        "operationId": "issueCreateComment",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the issue",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/CreateIssueCommentOption"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/Comment"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "423": {
+            "$ref": "#/responses/repoArchivedError"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/issues/{index}/comments/{id}": {
+      "delete": {
+        "tags": [
+          "issue"
+        ],
+        "summary": "Delete a comment",
+        "operationId": "issueDeleteCommentDeprecated",
+        "deprecated": true,
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "this parameter is ignored",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of comment to delete",
+            "name": "id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "patch": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Edit a comment",
+        "operationId": "issueEditCommentDeprecated",
+        "deprecated": true,
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "this parameter is ignored",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the comment to edit",
+            "name": "id",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/EditIssueCommentOption"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Comment"
+          },
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/issues/{index}/deadline": {
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Set an issue deadline. If set to null, the deadline is deleted. If using deadline only the date will be taken into account, and time of day ignored.",
+        "operationId": "issueEditIssueDeadline",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the issue to create or update a deadline on",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/EditDeadlineOption"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/IssueDeadline"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/issues/{index}/dependencies": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "List an issue's dependencies, i.e all issues that block this issue.",
+        "operationId": "issueListIssueDependencies",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "index of the issue",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/IssueList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "post": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Make the issue in the url depend on the issue in the form.",
+        "operationId": "issueCreateIssueDependencies",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "index of the issue",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/IssueMeta"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/Issue"
+          },
+          "404": {
+            "description": "the issue does not exist"
+          },
+          "423": {
+            "$ref": "#/responses/repoArchivedError"
+          }
+        }
+      },
+      "delete": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Remove an issue dependency",
+        "operationId": "issueRemoveIssueDependencies",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "index of the issue",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/IssueMeta"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Issue"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "423": {
+            "$ref": "#/responses/repoArchivedError"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/issues/{index}/labels": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Get an issue's labels",
+        "operationId": "issueGetLabels",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the issue",
+            "name": "index",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/LabelList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "put": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Replace an issue's labels",
+        "operationId": "issueReplaceLabels",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the issue",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/IssueLabelsOption"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/LabelList"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Add a label to an issue",
+        "operationId": "issueAddLabel",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the issue",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/IssueLabelsOption"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/LabelList"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Remove all labels from an issue",
+        "operationId": "issueClearLabels",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the issue",
+            "name": "index",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/issues/{index}/labels/{id}": {
+      "delete": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Remove a label from an issue",
+        "operationId": "issueRemoveLabel",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the issue",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the label to remove",
+            "name": "id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/issues/{index}/pin": {
+      "post": {
+        "tags": [
+          "issue"
+        ],
+        "summary": "Pin an Issue",
+        "operationId": "pinIssue",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of issue to pin",
+            "name": "index",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "tags": [
+          "issue"
+        ],
+        "summary": "Unpin an Issue",
+        "operationId": "unpinIssue",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of issue to unpin",
+            "name": "index",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/issues/{index}/pin/{position}": {
+      "patch": {
+        "tags": [
+          "issue"
+        ],
+        "summary": "Moves the Pin to the given Position",
+        "operationId": "moveIssuePin",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of issue",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "the new position",
+            "name": "position",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/issues/{index}/reactions": {
+      "get": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Get a list reactions of an issue",
+        "operationId": "issueGetIssueReactions",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the issue",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/ReactionList"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Add a reaction to an issue",
+        "operationId": "issuePostIssueReaction",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the issue",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "content",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/EditReactionOption"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Reaction"
+          },
+          "201": {
+            "$ref": "#/responses/Reaction"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Remove a reaction from an issue",
+        "operationId": "issueDeleteIssueReaction",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the issue",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "content",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/EditReactionOption"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/empty"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/issues/{index}/stopwatch/delete": {
+      "delete": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Delete an issue's existing stopwatch.",
+        "operationId": "issueDeleteStopWatch",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the issue to stop the stopwatch on",
+            "name": "index",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "403": {
+            "description": "Not repo writer, user does not have rights to toggle stopwatch"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "409": {
+            "description": "Cannot cancel a non existent stopwatch"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/issues/{index}/stopwatch/start": {
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Start stopwatch on an issue.",
+        "operationId": "issueStartStopWatch",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the issue to create the stopwatch on",
+            "name": "index",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/empty"
+          },
+          "403": {
+            "description": "Not repo writer, user does not have rights to toggle stopwatch"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "409": {
+            "description": "Cannot start a stopwatch again if it already exists"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/issues/{index}/stopwatch/stop": {
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Stop an issue's existing stopwatch.",
+        "operationId": "issueStopStopWatch",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the issue to stop the stopwatch on",
+            "name": "index",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/empty"
+          },
+          "403": {
+            "description": "Not repo writer, user does not have rights to toggle stopwatch"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "409": {
+            "description": "Cannot stop a non existent stopwatch"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/issues/{index}/subscriptions": {
+      "get": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Get users who subscribed on an issue.",
+        "operationId": "issueSubscriptions",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the issue",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/UserList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/issues/{index}/subscriptions/check": {
+      "get": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Check if user is subscribed to an issue",
+        "operationId": "issueCheckSubscription",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the issue",
+            "name": "index",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/WatchInfo"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/issues/{index}/subscriptions/{user}": {
+      "put": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Subscribe user to issue",
+        "operationId": "issueAddSubscription",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the issue",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "user to subscribe",
+            "name": "user",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Already subscribed"
+          },
+          "201": {
+            "description": "Successfully Subscribed"
+          },
+          "304": {
+            "description": "User can only subscribe itself if he is no admin"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Unsubscribe user from issue",
+        "operationId": "issueDeleteSubscription",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the issue",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "user witch unsubscribe",
+            "name": "user",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Already unsubscribed"
+          },
+          "201": {
+            "description": "Successfully Unsubscribed"
+          },
+          "304": {
+            "description": "User can only subscribe itself if he is no admin"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/issues/{index}/timeline": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "List all comments and events on an issue",
+        "operationId": "issueGetCommentsAndTimeline",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the issue",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "format": "date-time",
+            "description": "if provided, only comments updated since the specified time are returned.",
+            "name": "since",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          },
+          {
+            "type": "string",
+            "format": "date-time",
+            "description": "if provided, only comments updated before the provided time are returned.",
+            "name": "before",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/TimelineList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/issues/{index}/times": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "List an issue's tracked times",
+        "operationId": "issueTrackedTimes",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the issue",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "optional filter by user (available for issue managers)",
+            "name": "user",
+            "in": "query"
+          },
+          {
+            "type": "string",
+            "format": "date-time",
+            "description": "Only show times updated after the given time. This is a timestamp in RFC 3339 format",
+            "name": "since",
+            "in": "query"
+          },
+          {
+            "type": "string",
+            "format": "date-time",
+            "description": "Only show times updated before the given time. This is a timestamp in RFC 3339 format",
+            "name": "before",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/TrackedTimeList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Add tracked time to a issue",
+        "operationId": "issueAddTime",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the issue",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/AddTimeOption"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/TrackedTime"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Reset a tracked time of an issue",
+        "operationId": "issueResetTime",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the issue to add tracked time to",
+            "name": "index",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/issues/{index}/times/{id}": {
+      "delete": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Delete specific tracked time",
+        "operationId": "issueDeleteTime",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the issue",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of time to delete",
+            "name": "id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/keys": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "List a repository's keys",
+        "operationId": "repoListKeys",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "the key_id to search for",
+            "name": "key_id",
+            "in": "query"
+          },
+          {
+            "type": "string",
+            "description": "fingerprint of the key",
+            "name": "fingerprint",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/DeployKeyList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Add a key to a repository",
+        "operationId": "repoCreateKey",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/CreateKeyOption"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/DeployKey"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/keys/{id}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get a repository's key by id",
+        "operationId": "repoGetKey",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the key to get",
+            "name": "id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/DeployKey"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "tags": [
+          "repository"
+        ],
+        "summary": "Delete a key from a repository",
+        "operationId": "repoDeleteKey",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the key to delete",
+            "name": "id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/labels": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Get all of a repository's labels",
+        "operationId": "issueListLabels",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/LabelList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Create a label",
+        "operationId": "issueCreateLabel",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/CreateLabelOption"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/Label"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/labels/{id}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Get a single label",
+        "operationId": "issueGetLabel",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the label to get",
+            "name": "id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Label"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "tags": [
+          "issue"
+        ],
+        "summary": "Delete a label",
+        "operationId": "issueDeleteLabel",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the label to delete",
+            "name": "id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "patch": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Update a label",
+        "operationId": "issueEditLabel",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the label to edit",
+            "name": "id",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/EditLabelOption"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Label"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/languages": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get languages and number of bytes of code written",
+        "operationId": "repoGetLanguages",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/LanguageStatistics"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/media/{filepath}": {
+      "get": {
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get a file or it's LFS object from a repository",
+        "operationId": "repoGetRawFileOrLFS",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "filepath of the file to get",
+            "name": "filepath",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "The name of the commit/branch/tag. Default the repository’s default branch (usually master)",
+            "name": "ref",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Returns raw file content."
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/milestones": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Get all of a repository's opened milestones",
+        "operationId": "issueGetMilestonesList",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "Milestone state, Recognized values are open, closed and all. Defaults to \"open\"",
+            "name": "state",
+            "in": "query"
+          },
+          {
+            "type": "string",
+            "description": "filter by milestone name",
+            "name": "name",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/MilestoneList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Create a milestone",
+        "operationId": "issueCreateMilestone",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/CreateMilestoneOption"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/Milestone"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/milestones/{id}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Get a milestone",
+        "operationId": "issueGetMilestone",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "the milestone to get, identified by ID and if not available by name",
+            "name": "id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Milestone"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "tags": [
+          "issue"
+        ],
+        "summary": "Delete a milestone",
+        "operationId": "issueDeleteMilestone",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "the milestone to delete, identified by ID and if not available by name",
+            "name": "id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "patch": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Update a milestone",
+        "operationId": "issueEditMilestone",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "the milestone to edit, identified by ID and if not available by name",
+            "name": "id",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/EditMilestoneOption"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Milestone"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/mirror-sync": {
+      "post": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Sync a mirrored repository",
+        "operationId": "repoMirrorSync",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo to sync",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo to sync",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/empty"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/new_pin_allowed": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Returns if new Issue Pins are allowed",
+        "operationId": "repoNewPinAllowed",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/RepoNewIssuePinsAllowed"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/notifications": {
+      "get": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "notification"
+        ],
+        "summary": "List users's notification threads on a specific repo",
+        "operationId": "notifyGetRepoList",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "boolean",
+            "description": "If true, show notifications marked as read. Default value is false",
+            "name": "all",
+            "in": "query"
+          },
+          {
+            "type": "array",
+            "items": {
+              "type": "string"
+            },
+            "collectionFormat": "multi",
+            "description": "Show notifications with the provided status types. Options are: unread, read and/or pinned. Defaults to unread \u0026 pinned",
+            "name": "status-types",
+            "in": "query"
+          },
+          {
+            "type": "array",
+            "items": {
+              "enum": [
+                "issue",
+                "pull",
+                "commit",
+                "repository"
+              ],
+              "type": "string"
+            },
+            "collectionFormat": "multi",
+            "description": "filter notifications by subject type",
+            "name": "subject-type",
+            "in": "query"
+          },
+          {
+            "type": "string",
+            "format": "date-time",
+            "description": "Only show notifications updated after the given time. This is a timestamp in RFC 3339 format",
+            "name": "since",
+            "in": "query"
+          },
+          {
+            "type": "string",
+            "format": "date-time",
+            "description": "Only show notifications updated before the given time. This is a timestamp in RFC 3339 format",
+            "name": "before",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/NotificationThreadList"
+          }
+        }
+      },
+      "put": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "notification"
+        ],
+        "summary": "Mark notification threads as read, pinned or unread on a specific repo",
+        "operationId": "notifyReadRepoList",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "If true, mark all notifications on this repo. Default value is false",
+            "name": "all",
+            "in": "query"
+          },
+          {
+            "type": "array",
+            "items": {
+              "type": "string"
+            },
+            "collectionFormat": "multi",
+            "description": "Mark notifications with the provided status types. Options are: unread, read and/or pinned. Defaults to unread.",
+            "name": "status-types",
+            "in": "query"
+          },
+          {
+            "type": "string",
+            "description": "Status to mark notifications as. Defaults to read.",
+            "name": "to-status",
+            "in": "query"
+          },
+          {
+            "type": "string",
+            "format": "date-time",
+            "description": "Describes the last point that notifications were checked. Anything updated since this time will not be updated.",
+            "name": "last_read_at",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "205": {
+            "$ref": "#/responses/NotificationThreadList"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/pulls": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "List a repo's pull requests",
+        "operationId": "repoListPullRequests",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "enum": [
+              "closed",
+              "open",
+              "all"
+            ],
+            "type": "string",
+            "description": "State of pull request: open or closed (optional)",
+            "name": "state",
+            "in": "query"
+          },
+          {
+            "enum": [
+              "oldest",
+              "recentupdate",
+              "leastupdate",
+              "mostcomment",
+              "leastcomment",
+              "priority"
+            ],
+            "type": "string",
+            "description": "Type of sort",
+            "name": "sort",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "ID of the milestone",
+            "name": "milestone",
+            "in": "query"
+          },
+          {
+            "type": "array",
+            "items": {
+              "type": "integer",
+              "format": "int64"
+            },
+            "collectionFormat": "multi",
+            "description": "Label IDs",
+            "name": "labels",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/PullRequestList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Create a pull request",
+        "operationId": "repoCreatePullRequest",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/CreatePullRequestOption"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/PullRequest"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "409": {
+            "$ref": "#/responses/error"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          },
+          "423": {
+            "$ref": "#/responses/repoArchivedError"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/pulls/pinned": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "List a repo's pinned pull requests",
+        "operationId": "repoListPinnedPullRequests",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/PullRequestList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/pulls/{base}/{head}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get a pull request by base and head",
+        "operationId": "repoGetPullRequestByBaseHead",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "base of the pull request to get",
+            "name": "base",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "head of the pull request to get",
+            "name": "head",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/PullRequest"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/pulls/{index}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get a pull request",
+        "operationId": "repoGetPullRequest",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the pull request to get",
+            "name": "index",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/PullRequest"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "patch": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Update a pull request. If using deadline only the date will be taken into account, and time of day ignored.",
+        "operationId": "repoEditPullRequest",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the pull request to edit",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/EditPullRequestOption"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/PullRequest"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "409": {
+            "$ref": "#/responses/error"
+          },
+          "412": {
+            "$ref": "#/responses/error"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/pulls/{index}.{diffType}": {
+      "get": {
+        "produces": [
+          "text/plain"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get a pull request diff or patch",
+        "operationId": "repoDownloadPullDiffOrPatch",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the pull request to get",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "enum": [
+              "diff",
+              "patch"
+            ],
+            "type": "string",
+            "description": "whether the output is diff or patch",
+            "name": "diffType",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "boolean",
+            "description": "whether to include binary file changes. if true, the diff is applicable with `git apply`",
+            "name": "binary",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/string"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/pulls/{index}/commits": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get commits for a pull request",
+        "operationId": "repoGetPullRequestCommits",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the pull request to get",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          },
+          {
+            "type": "boolean",
+            "description": "include verification for every commit (disable for speedup, default 'true')",
+            "name": "verification",
+            "in": "query"
+          },
+          {
+            "type": "boolean",
+            "description": "include a list of affected files for every commit (disable for speedup, default 'true')",
+            "name": "files",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/CommitList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/pulls/{index}/files": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get changed files for a pull request",
+        "operationId": "repoGetPullRequestFiles",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the pull request to get",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "skip to given file",
+            "name": "skip-to",
+            "in": "query"
+          },
+          {
+            "enum": [
+              "ignore-all",
+              "ignore-change",
+              "ignore-eol",
+              "show-all"
+            ],
+            "type": "string",
+            "description": "whitespace behavior",
+            "name": "whitespace",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/ChangedFileList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/pulls/{index}/merge": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Check if a pull request has been merged",
+        "operationId": "repoPullRequestIsMerged",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the pull request",
+            "name": "index",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "description": "pull request has been merged"
+          },
+          "404": {
+            "description": "pull request has not been merged"
+          }
+        }
+      },
+      "post": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Merge a pull request",
+        "operationId": "repoMergePullRequest",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the pull request to merge",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/MergePullRequestOption"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/empty"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "405": {
+            "$ref": "#/responses/empty"
+          },
+          "409": {
+            "$ref": "#/responses/error"
+          },
+          "423": {
+            "$ref": "#/responses/repoArchivedError"
+          }
+        }
+      },
+      "delete": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Cancel the scheduled auto merge for the given pull request",
+        "operationId": "repoCancelScheduledAutoMerge",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the pull request to merge",
+            "name": "index",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "423": {
+            "$ref": "#/responses/repoArchivedError"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/pulls/{index}/requested_reviewers": {
+      "post": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "create review requests for a pull request",
+        "operationId": "repoCreatePullReviewRequests",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the pull request",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "required": true,
+            "schema": {
+              "$ref": "#/definitions/PullReviewRequestOptions"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/PullReviewList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      },
+      "delete": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "cancel review requests for a pull request",
+        "operationId": "repoDeletePullReviewRequests",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the pull request",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "required": true,
+            "schema": {
+              "$ref": "#/definitions/PullReviewRequestOptions"
+            }
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/pulls/{index}/reviews": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "List all reviews for a pull request",
+        "operationId": "repoListPullReviews",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the pull request",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/PullReviewList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "post": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Create a review to an pull request",
+        "operationId": "repoCreatePullReview",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the pull request",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "required": true,
+            "schema": {
+              "$ref": "#/definitions/CreatePullReviewOptions"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/PullReview"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/pulls/{index}/reviews/{id}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get a specific review for a pull request",
+        "operationId": "repoGetPullReview",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the pull request",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the review",
+            "name": "id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/PullReview"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "post": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Submit a pending review to an pull request",
+        "operationId": "repoSubmitPullReview",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the pull request",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the review",
+            "name": "id",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "required": true,
+            "schema": {
+              "$ref": "#/definitions/SubmitPullReviewOptions"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/PullReview"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      },
+      "delete": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Delete a specific review from a pull request",
+        "operationId": "repoDeletePullReview",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the pull request",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the review",
+            "name": "id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/pulls/{index}/reviews/{id}/comments": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get a specific review for a pull request",
+        "operationId": "repoGetPullReviewComments",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the pull request",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the review",
+            "name": "id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/PullReviewCommentList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/pulls/{index}/reviews/{id}/dismissals": {
+      "post": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Dismiss a review for a pull request",
+        "operationId": "repoDismissPullReview",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the pull request",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the review",
+            "name": "id",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "required": true,
+            "schema": {
+              "$ref": "#/definitions/DismissPullReviewOptions"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/PullReview"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/pulls/{index}/reviews/{id}/undismissals": {
+      "post": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Cancel to dismiss a review for a pull request",
+        "operationId": "repoUnDismissPullReview",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the pull request",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the review",
+            "name": "id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/PullReview"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/pulls/{index}/update": {
+      "post": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Merge PR's baseBranch into headBranch",
+        "operationId": "repoUpdatePullRequest",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the pull request to get",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "enum": [
+              "merge",
+              "rebase"
+            ],
+            "type": "string",
+            "description": "how to update pull request",
+            "name": "style",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/empty"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "409": {
+            "$ref": "#/responses/error"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/push_mirrors": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get all push mirrors of the repository",
+        "operationId": "repoListPushMirrors",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/PushMirrorList"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "add a push mirror to the repository",
+        "operationId": "repoAddPushMirror",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/CreatePushMirrorOption"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/PushMirror"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/push_mirrors-sync": {
+      "post": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Sync all push mirrored repository",
+        "operationId": "repoPushMirrorSync",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo to sync",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo to sync",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/empty"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/push_mirrors/{name}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get push mirror of the repository by remoteName",
+        "operationId": "repoGetPushMirrorByRemoteName",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "remote name of push mirror",
+            "name": "name",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/PushMirror"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "deletes a push mirror from a repository by remoteName",
+        "operationId": "repoDeletePushMirror",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "remote name of the pushMirror",
+            "name": "name",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/raw/{filepath}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get a file from a repository",
+        "operationId": "repoGetRawFile",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "filepath of the file to get",
+            "name": "filepath",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "The name of the commit/branch/tag. Default the repository’s default branch (usually master)",
+            "name": "ref",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Returns raw file content."
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/releases": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "List a repo's releases",
+        "operationId": "repoListReleases",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "boolean",
+            "description": "filter (exclude / include) drafts, if you dont have repo write access none will show",
+            "name": "draft",
+            "in": "query"
+          },
+          {
+            "type": "boolean",
+            "description": "filter (exclude / include) pre-releases",
+            "name": "pre-release",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/ReleaseList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Create a release",
+        "operationId": "repoCreateRelease",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/CreateReleaseOption"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/Release"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "409": {
+            "$ref": "#/responses/error"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/releases/latest": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Gets the most recent non-prerelease, non-draft release of a repository, sorted by created_at",
+        "operationId": "repoGetLatestRelease",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Release"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/releases/tags/{tag}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get a release by tag name",
+        "operationId": "repoGetReleaseByTag",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "tag name of the release to get",
+            "name": "tag",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Release"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "tags": [
+          "repository"
+        ],
+        "summary": "Delete a release by tag name",
+        "operationId": "repoDeleteReleaseByTag",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "tag name of the release to delete",
+            "name": "tag",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/releases/{id}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get a release",
+        "operationId": "repoGetRelease",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the release to get",
+            "name": "id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Release"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "tags": [
+          "repository"
+        ],
+        "summary": "Delete a release",
+        "operationId": "repoDeleteRelease",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the release to delete",
+            "name": "id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      },
+      "patch": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Update a release",
+        "operationId": "repoEditRelease",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the release to edit",
+            "name": "id",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/EditReleaseOption"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Release"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/releases/{id}/assets": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "List release's attachments",
+        "operationId": "repoListReleaseAttachments",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the release",
+            "name": "id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/AttachmentList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "post": {
+        "consumes": [
+          "multipart/form-data",
+          "application/octet-stream"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Create a release attachment",
+        "operationId": "repoCreateReleaseAttachment",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the release",
+            "name": "id",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the attachment",
+            "name": "name",
+            "in": "query"
+          },
+          {
+            "type": "file",
+            "description": "attachment to upload",
+            "name": "attachment",
+            "in": "formData"
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/Attachment"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/releases/{id}/assets/{attachment_id}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get a release attachment",
+        "operationId": "repoGetReleaseAttachment",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the release",
+            "name": "id",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the attachment to get",
+            "name": "attachment_id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Attachment"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Delete a release attachment",
+        "operationId": "repoDeleteReleaseAttachment",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the release",
+            "name": "id",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the attachment to delete",
+            "name": "attachment_id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "patch": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Edit a release attachment",
+        "operationId": "repoEditReleaseAttachment",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the release",
+            "name": "id",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the attachment to edit",
+            "name": "attachment_id",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/EditAttachmentOptions"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/Attachment"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/reviewers": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Return all users that can be requested to review in this repo",
+        "operationId": "repoGetReviewers",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/UserList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/runners/registration-token": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get a repository's actions runner registration token",
+        "operationId": "repoGetRunnerRegistrationToken",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/RegistrationToken"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/signing-key.gpg": {
+      "get": {
+        "produces": [
+          "text/plain"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get signing-key.gpg for given repository",
+        "operationId": "repoSigningKey",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "GPG armored public key",
+            "schema": {
+              "type": "string"
+            }
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/stargazers": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "List a repo's stargazers",
+        "operationId": "repoListStargazers",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/UserList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/statuses/{sha}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get a commit's statuses",
+        "operationId": "repoListStatuses",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "sha of the commit",
+            "name": "sha",
+            "in": "path",
+            "required": true
+          },
+          {
+            "enum": [
+              "oldest",
+              "recentupdate",
+              "leastupdate",
+              "leastindex",
+              "highestindex"
+            ],
+            "type": "string",
+            "description": "type of sort",
+            "name": "sort",
+            "in": "query"
+          },
+          {
+            "enum": [
+              "pending",
+              "success",
+              "error",
+              "failure",
+              "warning"
+            ],
+            "type": "string",
+            "description": "type of state",
+            "name": "state",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/CommitStatusList"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "post": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Create a commit status",
+        "operationId": "repoCreateStatus",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "sha of the commit",
+            "name": "sha",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/CreateStatusOption"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/CommitStatus"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/subscribers": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "List a repo's watchers",
+        "operationId": "repoListSubscribers",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/UserList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/subscription": {
+      "get": {
+        "tags": [
+          "repository"
+        ],
+        "summary": "Check if the current user is watching a repo",
+        "operationId": "userCurrentCheckSubscription",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/WatchInfo"
+          },
+          "404": {
+            "description": "User is not watching this repo or repo do not exist"
+          }
+        }
+      },
+      "put": {
+        "tags": [
+          "repository"
+        ],
+        "summary": "Watch a repo",
+        "operationId": "userCurrentPutSubscription",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/WatchInfo"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "tags": [
+          "repository"
+        ],
+        "summary": "Unwatch a repo",
+        "operationId": "userCurrentDeleteSubscription",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/tags": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "List a repository's tags",
+        "operationId": "repoListTags",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results, default maximum page size is 50",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/TagList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "post": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Create a new git tag in a repository",
+        "operationId": "repoCreateTag",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/CreateTagOption"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Tag"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "405": {
+            "$ref": "#/responses/empty"
+          },
+          "409": {
+            "$ref": "#/responses/conflict"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          },
+          "423": {
+            "$ref": "#/responses/repoArchivedError"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/tags/{tag}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get the tag of a repository by tag name",
+        "operationId": "repoGetTag",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of tag",
+            "name": "tag",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Tag"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Delete a repository's tag by name",
+        "operationId": "repoDeleteTag",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of tag to delete",
+            "name": "tag",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "405": {
+            "$ref": "#/responses/empty"
+          },
+          "409": {
+            "$ref": "#/responses/conflict"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          },
+          "423": {
+            "$ref": "#/responses/repoArchivedError"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/teams": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "List a repository's teams",
+        "operationId": "repoListTeams",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/TeamList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/teams/{team}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Check if a team is assigned to a repository",
+        "operationId": "repoCheckTeam",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "team name",
+            "name": "team",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Team"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "405": {
+            "$ref": "#/responses/error"
+          }
+        }
+      },
+      "put": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Add a team to a repository",
+        "operationId": "repoAddTeam",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "team name",
+            "name": "team",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "405": {
+            "$ref": "#/responses/error"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      },
+      "delete": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Delete a team from a repository",
+        "operationId": "repoDeleteTeam",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "team name",
+            "name": "team",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "405": {
+            "$ref": "#/responses/error"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/times": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "List a repo's tracked times",
+        "operationId": "repoTrackedTimes",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "optional filter by user (available for issue managers)",
+            "name": "user",
+            "in": "query"
+          },
+          {
+            "type": "string",
+            "format": "date-time",
+            "description": "Only show times updated after the given time. This is a timestamp in RFC 3339 format",
+            "name": "since",
+            "in": "query"
+          },
+          {
+            "type": "string",
+            "format": "date-time",
+            "description": "Only show times updated before the given time. This is a timestamp in RFC 3339 format",
+            "name": "before",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/TrackedTimeList"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/times/{user}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "List a user's tracked times in a repo",
+        "operationId": "userTrackedTimes",
+        "deprecated": true,
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "username of user",
+            "name": "user",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/TrackedTimeList"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/topics": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get list of topics that a repository has",
+        "operationId": "repoListTopics",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/TopicNames"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "put": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Replace list of topics for a repository",
+        "operationId": "repoUpdateTopics",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/RepoTopicOptions"
+            }
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "422": {
+            "$ref": "#/responses/invalidTopicsError"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/topics/{topic}": {
+      "put": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Add a topic to a repository",
+        "operationId": "repoAddTopic",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the topic to add",
+            "name": "topic",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "422": {
+            "$ref": "#/responses/invalidTopicsError"
+          }
+        }
+      },
+      "delete": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Delete a topic from a repository",
+        "operationId": "repoDeleteTopic",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the topic to delete",
+            "name": "topic",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "422": {
+            "$ref": "#/responses/invalidTopicsError"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/transfer": {
+      "post": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Transfer a repo ownership",
+        "operationId": "repoTransfer",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo to transfer",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo to transfer",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "description": "Transfer Options",
+            "name": "body",
+            "in": "body",
+            "required": true,
+            "schema": {
+              "$ref": "#/definitions/TransferRepoOption"
+            }
+          }
+        ],
+        "responses": {
+          "202": {
+            "$ref": "#/responses/Repository"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/transfer/accept": {
+      "post": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Accept a repo transfer",
+        "operationId": "acceptRepoTransfer",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo to transfer",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo to transfer",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "202": {
+            "$ref": "#/responses/Repository"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/transfer/reject": {
+      "post": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Reject a repo transfer",
+        "operationId": "rejectRepoTransfer",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo to transfer",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo to transfer",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Repository"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/wiki/new": {
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Create a wiki page",
+        "operationId": "repoCreateWikiPage",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/CreateWikiPageOptions"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/WikiPage"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "423": {
+            "$ref": "#/responses/repoArchivedError"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/wiki/page/{pageName}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get a wiki page",
+        "operationId": "repoGetWikiPage",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the page",
+            "name": "pageName",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/WikiPage"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "tags": [
+          "repository"
+        ],
+        "summary": "Delete a wiki page",
+        "operationId": "repoDeleteWikiPage",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the page",
+            "name": "pageName",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "423": {
+            "$ref": "#/responses/repoArchivedError"
+          }
+        }
+      },
+      "patch": {
+        "consumes": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Edit a wiki page",
+        "operationId": "repoEditWikiPage",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the page",
+            "name": "pageName",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/CreateWikiPageOptions"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/WikiPage"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "423": {
+            "$ref": "#/responses/repoArchivedError"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/wiki/pages": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get all wiki pages",
+        "operationId": "repoGetWikiPages",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/WikiPageList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/wiki/revisions/{pageName}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get revisions of a wiki page",
+        "operationId": "repoGetWikiPageRevisions",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the page",
+            "name": "pageName",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/WikiCommitList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{template_owner}/{template_repo}/generate": {
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Create a repository using a template",
+        "operationId": "generateRepo",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the template repository owner",
+            "name": "template_owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the template repository",
+            "name": "template_repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/GenerateRepoOption"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/Repository"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "409": {
+            "description": "The repository with the same name already exists."
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      }
+    },
+    "/repositories/{id}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get a repository by id",
+        "operationId": "repoGetByID",
+        "parameters": [
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the repo to get",
+            "name": "id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Repository"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/settings/api": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "settings"
+        ],
+        "summary": "Get instance's global settings for api",
+        "operationId": "getGeneralAPISettings",
+        "responses": {
+          "200": {
+            "$ref": "#/responses/GeneralAPISettings"
+          }
+        }
+      }
+    },
+    "/settings/attachment": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "settings"
+        ],
+        "summary": "Get instance's global settings for Attachment",
+        "operationId": "getGeneralAttachmentSettings",
+        "responses": {
+          "200": {
+            "$ref": "#/responses/GeneralAttachmentSettings"
+          }
+        }
+      }
+    },
+    "/settings/repository": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "settings"
+        ],
+        "summary": "Get instance's global settings for repositories",
+        "operationId": "getGeneralRepositorySettings",
+        "responses": {
+          "200": {
+            "$ref": "#/responses/GeneralRepoSettings"
+          }
+        }
+      }
+    },
+    "/settings/ui": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "settings"
+        ],
+        "summary": "Get instance's global settings for ui",
+        "operationId": "getGeneralUISettings",
+        "responses": {
+          "200": {
+            "$ref": "#/responses/GeneralUISettings"
+          }
+        }
+      }
+    },
+    "/signing-key.gpg": {
+      "get": {
+        "produces": [
+          "text/plain"
+        ],
+        "tags": [
+          "miscellaneous"
+        ],
+        "summary": "Get default signing-key.gpg",
+        "operationId": "getSigningKey",
+        "responses": {
+          "200": {
+            "description": "GPG armored public key",
+            "schema": {
+              "type": "string"
+            }
+          }
+        }
+      }
+    },
+    "/teams/{id}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "Get a team",
+        "operationId": "orgGetTeam",
+        "parameters": [
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the team to get",
+            "name": "id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Team"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "tags": [
+          "organization"
+        ],
+        "summary": "Delete a team",
+        "operationId": "orgDeleteTeam",
+        "parameters": [
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the team to delete",
+            "name": "id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "description": "team deleted"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "patch": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "Edit a team",
+        "operationId": "orgEditTeam",
+        "parameters": [
+          {
+            "type": "integer",
+            "description": "id of the team to edit",
+            "name": "id",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/EditTeamOption"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Team"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/teams/{id}/activities/feeds": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "List a team's activity feeds",
+        "operationId": "orgListTeamActivityFeeds",
+        "parameters": [
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the team",
+            "name": "id",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "format": "date",
+            "description": "the date of the activities to be found",
+            "name": "date",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/ActivityFeedsList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/teams/{id}/members": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "List a team's members",
+        "operationId": "orgListTeamMembers",
+        "parameters": [
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the team",
+            "name": "id",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/UserList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/teams/{id}/members/{username}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "List a particular member of team",
+        "operationId": "orgListTeamMember",
+        "parameters": [
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the team",
+            "name": "id",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "username of the member to list",
+            "name": "username",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/User"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "put": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "Add a team member",
+        "operationId": "orgAddTeamMember",
+        "parameters": [
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the team",
+            "name": "id",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "username of the user to add",
+            "name": "username",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "Remove a team member",
+        "operationId": "orgRemoveTeamMember",
+        "parameters": [
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the team",
+            "name": "id",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "username of the user to remove",
+            "name": "username",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/teams/{id}/repos": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "List a team's repos",
+        "operationId": "orgListTeamRepos",
+        "parameters": [
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the team",
+            "name": "id",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/RepositoryList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/teams/{id}/repos/{org}/{repo}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "List a particular repo of team",
+        "operationId": "orgListTeamRepo",
+        "parameters": [
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the team",
+            "name": "id",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "organization that owns the repo to list",
+            "name": "org",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo to list",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Repository"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "put": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "Add a repository to a team",
+        "operationId": "orgAddTeamRepository",
+        "parameters": [
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the team",
+            "name": "id",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "organization that owns the repo to add",
+            "name": "org",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo to add",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "description": "This does not delete the repository, it only removes the repository from the team.",
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "Remove a repository from a team",
+        "operationId": "orgRemoveTeamRepository",
+        "parameters": [
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the team",
+            "name": "id",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "organization that owns the repo to remove",
+            "name": "org",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo to remove",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/topics/search": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "search topics via keyword",
+        "operationId": "topicSearch",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "keywords to search",
+            "name": "q",
+            "in": "query",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/TopicListResponse"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/user": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "Get the authenticated user",
+        "operationId": "userGetCurrent",
+        "responses": {
+          "200": {
+            "$ref": "#/responses/User"
+          }
+        }
+      }
+    },
+    "/user/actions/runners/registration-token": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "Get an user's actions runner registration token",
+        "operationId": "userGetRunnerRegistrationToken",
+        "responses": {
+          "200": {
+            "$ref": "#/responses/RegistrationToken"
+          }
+        }
+      }
+    },
+    "/user/actions/secrets/{secretname}": {
+      "put": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "Create or Update a secret value in a user scope",
+        "operationId": "updateUserSecret",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the secret",
+            "name": "secretname",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/CreateOrUpdateSecretOption"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "description": "response when creating a secret"
+          },
+          "204": {
+            "description": "response when updating a secret"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "Delete a secret in a user scope",
+        "operationId": "deleteUserSecret",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the secret",
+            "name": "secretname",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "description": "delete one secret of the user"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/user/actions/variables": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "Get the user-level list of variables which is created by current doer",
+        "operationId": "getUserVariablesList",
+        "parameters": [
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/VariableList"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/user/actions/variables/{variablename}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "Get a user-level variable which is created by current doer",
+        "operationId": "getUserVariable",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the variable",
+            "name": "variablename",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/ActionVariable"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "put": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "Update a user-level variable which is created by current doer",
+        "operationId": "updateUserVariable",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the variable",
+            "name": "variablename",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/UpdateVariableOption"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "description": "response when updating a variable"
+          },
+          "204": {
+            "description": "response when updating a variable"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "Create a user-level variable",
+        "operationId": "createUserVariable",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the variable",
+            "name": "variablename",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/CreateVariableOption"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "description": "response when creating a variable"
+          },
+          "204": {
+            "description": "response when creating a variable"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "Delete a user-level variable which is created by current doer",
+        "operationId": "deleteUserVariable",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the variable",
+            "name": "variablename",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "201": {
+            "description": "response when deleting a variable"
+          },
+          "204": {
+            "description": "response when deleting a variable"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/user/applications/oauth2": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "List the authenticated user's oauth2 applications",
+        "operationId": "userGetOauth2Application",
+        "parameters": [
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/OAuth2ApplicationList"
+          }
+        }
+      },
+      "post": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "creates a new OAuth2 application",
+        "operationId": "userCreateOAuth2Application",
+        "parameters": [
+          {
+            "name": "body",
+            "in": "body",
+            "required": true,
+            "schema": {
+              "$ref": "#/definitions/CreateOAuth2ApplicationOptions"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/OAuth2Application"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          }
+        }
+      }
+    },
+    "/user/applications/oauth2/{id}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "get an OAuth2 Application",
+        "operationId": "userGetOAuth2Application",
+        "parameters": [
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "Application ID to be found",
+            "name": "id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/OAuth2Application"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "delete an OAuth2 Application",
+        "operationId": "userDeleteOAuth2Application",
+        "parameters": [
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "token to be deleted",
+            "name": "id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "patch": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "update an OAuth2 Application, this includes regenerating the client secret",
+        "operationId": "userUpdateOAuth2Application",
+        "parameters": [
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "application to be updated",
+            "name": "id",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "required": true,
+            "schema": {
+              "$ref": "#/definitions/CreateOAuth2ApplicationOptions"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/OAuth2Application"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/user/avatar": {
+      "post": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "Update Avatar",
+        "operationId": "userUpdateAvatar",
+        "parameters": [
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/UpdateUserAvatarOption"
+            }
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          }
+        }
+      },
+      "delete": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "Delete Avatar",
+        "operationId": "userDeleteAvatar",
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          }
+        }
+      }
+    },
+    "/user/blocks": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "List users blocked by the authenticated user",
+        "operationId": "userListBlocks",
+        "parameters": [
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/UserList"
+          }
+        }
+      }
+    },
+    "/user/blocks/{username}": {
+      "get": {
+        "tags": [
+          "user"
+        ],
+        "summary": "Check if a user is blocked by the authenticated user",
+        "operationId": "userCheckUserBlock",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "user to check",
+            "name": "username",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "put": {
+        "tags": [
+          "user"
+        ],
+        "summary": "Block a user",
+        "operationId": "userBlockUser",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "user to block",
+            "name": "username",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "optional note for the block",
+            "name": "note",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      },
+      "delete": {
+        "tags": [
+          "user"
+        ],
+        "summary": "Unblock a user",
+        "operationId": "userUnblockUser",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "user to unblock",
+            "name": "username",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      }
+    },
+    "/user/emails": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "List the authenticated user's email addresses",
+        "operationId": "userListEmails",
+        "responses": {
+          "200": {
+            "$ref": "#/responses/EmailList"
+          }
+        }
+      },
+      "post": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "Add email addresses",
+        "operationId": "userAddEmail",
+        "parameters": [
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/CreateEmailOption"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/EmailList"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      },
+      "delete": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "Delete email addresses",
+        "operationId": "userDeleteEmail",
+        "parameters": [
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/DeleteEmailOption"
+            }
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/user/followers": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "List the authenticated user's followers",
+        "operationId": "userCurrentListFollowers",
+        "parameters": [
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/UserList"
+          }
+        }
+      }
+    },
+    "/user/following": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "List the users that the authenticated user is following",
+        "operationId": "userCurrentListFollowing",
+        "parameters": [
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/UserList"
+          }
+        }
+      }
+    },
+    "/user/following/{username}": {
+      "get": {
+        "tags": [
+          "user"
+        ],
+        "summary": "Check whether a user is followed by the authenticated user",
+        "operationId": "userCurrentCheckFollowing",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "username of followed user",
+            "name": "username",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "put": {
+        "tags": [
+          "user"
+        ],
+        "summary": "Follow a user",
+        "operationId": "userCurrentPutFollow",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "username of user to follow",
+            "name": "username",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "tags": [
+          "user"
+        ],
+        "summary": "Unfollow a user",
+        "operationId": "userCurrentDeleteFollow",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "username of user to unfollow",
+            "name": "username",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/user/gpg_key_token": {
+      "get": {
+        "produces": [
+          "text/plain"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "Get a Token to verify",
+        "operationId": "getVerificationToken",
+        "responses": {
+          "200": {
+            "$ref": "#/responses/string"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/user/gpg_key_verify": {
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "Verify a GPG key",
+        "operationId": "userVerifyGPGKey",
+        "responses": {
+          "201": {
+            "$ref": "#/responses/GPGKey"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      }
+    },
+    "/user/gpg_keys": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "List the authenticated user's GPG keys",
+        "operationId": "userCurrentListGPGKeys",
+        "parameters": [
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/GPGKeyList"
+          }
+        }
+      },
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "Create a GPG key",
+        "operationId": "userCurrentPostGPGKey",
+        "parameters": [
+          {
+            "name": "Form",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/CreateGPGKeyOption"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/GPGKey"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      }
+    },
+    "/user/gpg_keys/{id}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "Get a GPG key",
+        "operationId": "userCurrentGetGPGKey",
+        "parameters": [
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of key to get",
+            "name": "id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/GPGKey"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "Remove a GPG key",
+        "operationId": "userCurrentDeleteGPGKey",
+        "parameters": [
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of key to delete",
+            "name": "id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/user/hooks": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "List the authenticated user's webhooks",
+        "operationId": "userListHooks",
+        "parameters": [
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/HookList"
+          }
+        }
+      },
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "Create a hook",
+        "operationId": "userCreateHook",
+        "parameters": [
+          {
+            "name": "body",
+            "in": "body",
+            "required": true,
+            "schema": {
+              "$ref": "#/definitions/CreateHookOption"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/Hook"
+          }
+        }
+      }
+    },
+    "/user/hooks/{id}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "Get a hook",
+        "operationId": "userGetHook",
+        "parameters": [
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the hook to get",
+            "name": "id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Hook"
+          }
+        }
+      },
+      "delete": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "Delete a hook",
+        "operationId": "userDeleteHook",
+        "parameters": [
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the hook to delete",
+            "name": "id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          }
+        }
+      },
+      "patch": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "Update a hook",
+        "operationId": "userEditHook",
+        "parameters": [
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the hook to update",
+            "name": "id",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/EditHookOption"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Hook"
+          }
+        }
+      }
+    },
+    "/user/keys": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "List the authenticated user's public keys",
+        "operationId": "userCurrentListKeys",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "fingerprint of the key",
+            "name": "fingerprint",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/PublicKeyList"
+          }
+        }
+      },
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "Create a public key",
+        "operationId": "userCurrentPostKey",
+        "parameters": [
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/CreateKeyOption"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/PublicKey"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      }
+    },
+    "/user/keys/{id}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "Get a public key",
+        "operationId": "userCurrentGetKey",
+        "parameters": [
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of key to get",
+            "name": "id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/PublicKey"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "Delete a public key",
+        "operationId": "userCurrentDeleteKey",
+        "parameters": [
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of key to delete",
+            "name": "id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/user/orgs": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "List the current user's organizations",
+        "operationId": "orgListCurrentUserOrgs",
+        "parameters": [
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/OrganizationList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/user/repos": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "List the repos that the authenticated user owns",
+        "operationId": "userCurrentListRepos",
+        "parameters": [
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/RepositoryList"
+          }
+        }
+      },
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository",
+          "user"
+        ],
+        "summary": "Create a repository",
+        "operationId": "createCurrentUserRepo",
+        "parameters": [
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/CreateRepoOption"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/Repository"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "409": {
+            "description": "The repository with the same name already exists."
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      }
+    },
+    "/user/settings": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "Get user settings",
+        "operationId": "getUserSettings",
+        "responses": {
+          "200": {
+            "$ref": "#/responses/UserSettings"
+          }
+        }
+      },
+      "patch": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "Update user settings",
+        "operationId": "updateUserSettings",
+        "parameters": [
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/UserSettingsOptions"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/UserSettings"
+          }
+        }
+      }
+    },
+    "/user/starred": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "The repos that the authenticated user has starred",
+        "operationId": "userCurrentListStarred",
+        "parameters": [
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/RepositoryList"
+          }
+        }
+      }
+    },
+    "/user/starred/{owner}/{repo}": {
+      "get": {
+        "tags": [
+          "user"
+        ],
+        "summary": "Whether the authenticated is starring the repo",
+        "operationId": "userCurrentCheckStarring",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "put": {
+        "tags": [
+          "user"
+        ],
+        "summary": "Star the given repo",
+        "operationId": "userCurrentPutStar",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo to star",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo to star",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "tags": [
+          "user"
+        ],
+        "summary": "Unstar the given repo",
+        "operationId": "userCurrentDeleteStar",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo to unstar",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo to unstar",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/user/stopwatches": {
+      "get": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "Get list of all existing stopwatches",
+        "operationId": "userGetStopWatches",
+        "parameters": [
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/StopWatchList"
+          }
+        }
+      }
+    },
+    "/user/subscriptions": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "List repositories watched by the authenticated user",
+        "operationId": "userCurrentListSubscriptions",
+        "parameters": [
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/RepositoryList"
+          }
+        }
+      }
+    },
+    "/user/teams": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "List all the teams a user belongs to",
+        "operationId": "userListTeams",
+        "parameters": [
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/TeamList"
+          }
+        }
+      }
+    },
+    "/user/times": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "List the current user's tracked times",
+        "operationId": "userCurrentTrackedTimes",
+        "parameters": [
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          },
+          {
+            "type": "string",
+            "format": "date-time",
+            "description": "Only show times updated after the given time. This is a timestamp in RFC 3339 format",
+            "name": "since",
+            "in": "query"
+          },
+          {
+            "type": "string",
+            "format": "date-time",
+            "description": "Only show times updated before the given time. This is a timestamp in RFC 3339 format",
+            "name": "before",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/TrackedTimeList"
+          }
+        }
+      }
+    },
+    "/users/search": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "Search for users",
+        "operationId": "userSearch",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "keyword",
+            "name": "q",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "ID of the user to search for",
+            "name": "uid",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "SearchResults of a successful search",
+            "schema": {
+              "type": "object",
+              "properties": {
+                "data": {
+                  "type": "array",
+                  "items": {
+                    "$ref": "#/definitions/User"
+                  }
+                },
+                "ok": {
+                  "type": "boolean"
+                }
+              }
+            }
+          }
+        }
+      }
+    },
+    "/users/{username}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "Get a user",
+        "operationId": "userGet",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "username of user to get",
+            "name": "username",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/User"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/users/{username}/activities/feeds": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "List a user's activity feeds",
+        "operationId": "userListActivityFeeds",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "username of user",
+            "name": "username",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "boolean",
+            "description": "if true, only show actions performed by the requested user",
+            "name": "only-performed-by",
+            "in": "query"
+          },
+          {
+            "type": "string",
+            "format": "date",
+            "description": "the date of the activities to be found",
+            "name": "date",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/ActivityFeedsList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/users/{username}/followers": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "List the given user's followers",
+        "operationId": "userListFollowers",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "username of user",
+            "name": "username",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/UserList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/users/{username}/following": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "List the users that the given user is following",
+        "operationId": "userListFollowing",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "username of user",
+            "name": "username",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/UserList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/users/{username}/following/{target}": {
+      "get": {
+        "tags": [
+          "user"
+        ],
+        "summary": "Check if one user is following another user",
+        "operationId": "userCheckFollowing",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "username of following user",
+            "name": "username",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "username of followed user",
+            "name": "target",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/users/{username}/gpg_keys": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "List the given user's GPG keys",
+        "operationId": "userListGPGKeys",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "username of user",
+            "name": "username",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/GPGKeyList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/users/{username}/heatmap": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "Get a user's heatmap",
+        "operationId": "userGetHeatmapData",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "username of user to get",
+            "name": "username",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/UserHeatmapData"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/users/{username}/keys": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "List the given user's public keys",
+        "operationId": "userListKeys",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "username of user",
+            "name": "username",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "fingerprint of the key",
+            "name": "fingerprint",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/PublicKeyList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/users/{username}/orgs": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "List a user's organizations",
+        "operationId": "orgListUserOrgs",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "username of user",
+            "name": "username",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/OrganizationList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/users/{username}/orgs/{org}/permissions": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "Get user permissions in organization",
+        "operationId": "orgGetUserPermissions",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "username of user",
+            "name": "username",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the organization",
+            "name": "org",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/OrganizationPermissions"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/users/{username}/repos": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "List the repos owned by the given user",
+        "operationId": "userListRepos",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "username of user",
+            "name": "username",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/RepositoryList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/users/{username}/starred": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "The repos that the given user has starred",
+        "operationId": "userListStarred",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "username of user",
+            "name": "username",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/RepositoryList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/users/{username}/subscriptions": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "List the repositories watched by a user",
+        "operationId": "userListSubscriptions",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "username of the user",
+            "name": "username",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/RepositoryList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/users/{username}/tokens": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "List the authenticated user's access tokens",
+        "operationId": "userGetTokens",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "username of user",
+            "name": "username",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/AccessTokenList"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          }
+        }
+      },
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "Create an access token",
+        "operationId": "userCreateToken",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "username of user",
+            "name": "username",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/CreateAccessTokenOption"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/AccessToken"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          }
+        }
+      }
+    },
+    "/users/{username}/tokens/{token}": {
+      "delete": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "delete an access token",
+        "operationId": "userDeleteAccessToken",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "username of user",
+            "name": "username",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "token to be deleted, identified by ID and if not available by name",
+            "name": "token",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "422": {
+            "$ref": "#/responses/error"
+          }
+        }
+      }
+    },
+    "/version": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "miscellaneous"
+        ],
+        "summary": "Returns the version of the Gitea application",
+        "operationId": "getVersion",
+        "responses": {
+          "200": {
+            "$ref": "#/responses/ServerVersion"
+          }
+        }
+      }
+    }
+  },
+  "definitions": {
+    "APIError": {
+      "description": "APIError is an api error with a message",
+      "type": "object",
+      "properties": {
+        "message": {
+          "type": "string",
+          "x-go-name": "Message"
+        },
+        "url": {
+          "type": "string",
+          "x-go-name": "URL"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "AccessToken": {
+      "type": "object",
+      "title": "AccessToken represents an API access token.",
+      "properties": {
+        "id": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "ID"
+        },
+        "name": {
+          "type": "string",
+          "x-go-name": "Name"
+        },
+        "scopes": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "Scopes"
+        },
+        "sha1": {
+          "type": "string",
+          "x-go-name": "Token"
+        },
+        "token_last_eight": {
+          "type": "string",
+          "x-go-name": "TokenLastEight"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "ActionVariable": {
+      "description": "ActionVariable return value of the query API",
+      "type": "object",
+      "properties": {
+        "data": {
+          "description": "the value of the variable",
+          "type": "string",
+          "x-go-name": "Data"
+        },
+        "name": {
+          "description": "the name of the variable",
+          "type": "string",
+          "x-go-name": "Name"
+        },
+        "owner_id": {
+          "description": "the owner to which the variable belongs",
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "OwnerID"
+        },
+        "repo_id": {
+          "description": "the repository to which the variable belongs",
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "RepoID"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "Activity": {
+      "type": "object",
+      "properties": {
+        "act_user": {
+          "$ref": "#/definitions/User"
+        },
+        "act_user_id": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "ActUserID"
+        },
+        "comment": {
+          "$ref": "#/definitions/Comment"
+        },
+        "comment_id": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "CommentID"
+        },
+        "content": {
+          "type": "string",
+          "x-go-name": "Content"
+        },
+        "created": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Created"
+        },
+        "id": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "ID"
+        },
+        "is_private": {
+          "type": "boolean",
+          "x-go-name": "IsPrivate"
+        },
+        "op_type": {
+          "type": "string",
+          "x-go-name": "OpType"
+        },
+        "ref_name": {
+          "type": "string",
+          "x-go-name": "RefName"
+        },
+        "repo": {
+          "$ref": "#/definitions/Repository"
+        },
+        "repo_id": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "RepoID"
+        },
+        "user_id": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "UserID"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "ActivityPub": {
+      "description": "ActivityPub type",
+      "type": "object",
+      "properties": {
+        "@context": {
+          "type": "string",
+          "x-go-name": "Context"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "AddCollaboratorOption": {
+      "description": "AddCollaboratorOption options when adding a user as a collaborator of a repository",
+      "type": "object",
+      "properties": {
+        "permission": {
+          "type": "string",
+          "x-go-name": "Permission"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "AddTimeOption": {
+      "description": "AddTimeOption options for adding time to an issue",
+      "type": "object",
+      "required": [
+        "time"
+      ],
+      "properties": {
+        "created": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Created"
+        },
+        "time": {
+          "description": "time in seconds",
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "Time"
+        },
+        "user_name": {
+          "description": "User who spent the time (optional)",
+          "type": "string",
+          "x-go-name": "User"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "AnnotatedTag": {
+      "description": "AnnotatedTag represents an annotated tag",
+      "type": "object",
+      "properties": {
+        "message": {
+          "type": "string",
+          "x-go-name": "Message"
+        },
+        "object": {
+          "$ref": "#/definitions/AnnotatedTagObject"
+        },
+        "sha": {
+          "type": "string",
+          "x-go-name": "SHA"
+        },
+        "tag": {
+          "type": "string",
+          "x-go-name": "Tag"
+        },
+        "tagger": {
+          "$ref": "#/definitions/CommitUser"
+        },
+        "url": {
+          "type": "string",
+          "x-go-name": "URL"
+        },
+        "verification": {
+          "$ref": "#/definitions/PayloadCommitVerification"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "AnnotatedTagObject": {
+      "description": "AnnotatedTagObject contains meta information of the tag object",
+      "type": "object",
+      "properties": {
+        "sha": {
+          "type": "string",
+          "x-go-name": "SHA"
+        },
+        "type": {
+          "type": "string",
+          "x-go-name": "Type"
+        },
+        "url": {
+          "type": "string",
+          "x-go-name": "URL"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "Attachment": {
+      "description": "Attachment a generic attachment",
+      "type": "object",
+      "properties": {
+        "browser_download_url": {
+          "type": "string",
+          "x-go-name": "DownloadURL"
+        },
+        "created_at": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Created"
+        },
+        "download_count": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "DownloadCount"
+        },
+        "id": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "ID"
+        },
+        "name": {
+          "type": "string",
+          "x-go-name": "Name"
+        },
+        "size": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "Size"
+        },
+        "uuid": {
+          "type": "string",
+          "x-go-name": "UUID"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "Badge": {
+      "description": "Badge represents a user badge",
+      "type": "object",
+      "properties": {
+        "description": {
+          "type": "string",
+          "x-go-name": "Description"
+        },
+        "id": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "ID"
+        },
+        "image_url": {
+          "type": "string",
+          "x-go-name": "ImageURL"
+        },
+        "slug": {
+          "type": "string",
+          "x-go-name": "Slug"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "Branch": {
+      "description": "Branch represents a repository branch",
+      "type": "object",
+      "properties": {
+        "commit": {
+          "$ref": "#/definitions/PayloadCommit"
+        },
+        "effective_branch_protection_name": {
+          "type": "string",
+          "x-go-name": "EffectiveBranchProtectionName"
+        },
+        "enable_status_check": {
+          "type": "boolean",
+          "x-go-name": "EnableStatusCheck"
+        },
+        "name": {
+          "type": "string",
+          "x-go-name": "Name"
+        },
+        "protected": {
+          "type": "boolean",
+          "x-go-name": "Protected"
+        },
+        "required_approvals": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "RequiredApprovals"
+        },
+        "status_check_contexts": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "StatusCheckContexts"
+        },
+        "user_can_merge": {
+          "type": "boolean",
+          "x-go-name": "UserCanMerge"
+        },
+        "user_can_push": {
+          "type": "boolean",
+          "x-go-name": "UserCanPush"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "BranchProtection": {
+      "description": "BranchProtection represents a branch protection for a repository",
+      "type": "object",
+      "properties": {
+        "approvals_whitelist_teams": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "ApprovalsWhitelistTeams"
+        },
+        "approvals_whitelist_username": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "ApprovalsWhitelistUsernames"
+        },
+        "block_on_official_review_requests": {
+          "type": "boolean",
+          "x-go-name": "BlockOnOfficialReviewRequests"
+        },
+        "block_on_outdated_branch": {
+          "type": "boolean",
+          "x-go-name": "BlockOnOutdatedBranch"
+        },
+        "block_on_rejected_reviews": {
+          "type": "boolean",
+          "x-go-name": "BlockOnRejectedReviews"
+        },
+        "branch_name": {
+          "description": "Deprecated: true",
+          "type": "string",
+          "x-go-name": "BranchName"
+        },
+        "created_at": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Created"
+        },
+        "dismiss_stale_approvals": {
+          "type": "boolean",
+          "x-go-name": "DismissStaleApprovals"
+        },
+        "enable_approvals_whitelist": {
+          "type": "boolean",
+          "x-go-name": "EnableApprovalsWhitelist"
+        },
+        "enable_merge_whitelist": {
+          "type": "boolean",
+          "x-go-name": "EnableMergeWhitelist"
+        },
+        "enable_push": {
+          "type": "boolean",
+          "x-go-name": "EnablePush"
+        },
+        "enable_push_whitelist": {
+          "type": "boolean",
+          "x-go-name": "EnablePushWhitelist"
+        },
+        "enable_status_check": {
+          "type": "boolean",
+          "x-go-name": "EnableStatusCheck"
+        },
+        "ignore_stale_approvals": {
+          "type": "boolean",
+          "x-go-name": "IgnoreStaleApprovals"
+        },
+        "merge_whitelist_teams": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "MergeWhitelistTeams"
+        },
+        "merge_whitelist_usernames": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "MergeWhitelistUsernames"
+        },
+        "protected_file_patterns": {
+          "type": "string",
+          "x-go-name": "ProtectedFilePatterns"
+        },
+        "push_whitelist_deploy_keys": {
+          "type": "boolean",
+          "x-go-name": "PushWhitelistDeployKeys"
+        },
+        "push_whitelist_teams": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "PushWhitelistTeams"
+        },
+        "push_whitelist_usernames": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "PushWhitelistUsernames"
+        },
+        "require_signed_commits": {
+          "type": "boolean",
+          "x-go-name": "RequireSignedCommits"
+        },
+        "required_approvals": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "RequiredApprovals"
+        },
+        "rule_name": {
+          "type": "string",
+          "x-go-name": "RuleName"
+        },
+        "status_check_contexts": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "StatusCheckContexts"
+        },
+        "unprotected_file_patterns": {
+          "type": "string",
+          "x-go-name": "UnprotectedFilePatterns"
+        },
+        "updated_at": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Updated"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "ChangeFileOperation": {
+      "description": "ChangeFileOperation for creating, updating or deleting a file",
+      "type": "object",
+      "required": [
+        "operation",
+        "path"
+      ],
+      "properties": {
+        "content": {
+          "description": "new or updated file content, must be base64 encoded",
+          "type": "string",
+          "x-go-name": "ContentBase64"
+        },
+        "from_path": {
+          "description": "old path of the file to move",
+          "type": "string",
+          "x-go-name": "FromPath"
+        },
+        "operation": {
+          "description": "indicates what to do with the file",
+          "type": "string",
+          "enum": [
+            "create",
+            "update",
+            "delete"
+          ],
+          "x-go-name": "Operation"
+        },
+        "path": {
+          "description": "path to the existing or new file",
+          "type": "string",
+          "x-go-name": "Path"
+        },
+        "sha": {
+          "description": "sha is the SHA for the file that already exists, required for update or delete",
+          "type": "string",
+          "x-go-name": "SHA"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "ChangeFilesOptions": {
+      "description": "ChangeFilesOptions options for creating, updating or deleting multiple files\nNote: `author` and `committer` are optional (if only one is given, it will be used for the other, otherwise the authenticated user will be used)",
+      "type": "object",
+      "required": [
+        "files"
+      ],
+      "properties": {
+        "author": {
+          "$ref": "#/definitions/Identity"
+        },
+        "branch": {
+          "description": "branch (optional) to base this file from. if not given, the default branch is used",
+          "type": "string",
+          "x-go-name": "BranchName"
+        },
+        "committer": {
+          "$ref": "#/definitions/Identity"
+        },
+        "dates": {
+          "$ref": "#/definitions/CommitDateOptions"
+        },
+        "files": {
+          "description": "list of file operations",
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/ChangeFileOperation"
+          },
+          "x-go-name": "Files"
+        },
+        "message": {
+          "description": "message (optional) for the commit of this file. if not supplied, a default message will be used",
+          "type": "string",
+          "x-go-name": "Message"
+        },
+        "new_branch": {
+          "description": "new_branch (optional) will make a new branch from `branch` before creating the file",
+          "type": "string",
+          "x-go-name": "NewBranchName"
+        },
+        "signoff": {
+          "description": "Add a Signed-off-by trailer by the committer at the end of the commit log message.",
+          "type": "boolean",
+          "x-go-name": "Signoff"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "ChangedFile": {
+      "description": "ChangedFile store information about files affected by the pull request",
+      "type": "object",
+      "properties": {
+        "additions": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "Additions"
+        },
+        "changes": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "Changes"
+        },
+        "contents_url": {
+          "type": "string",
+          "x-go-name": "ContentsURL"
+        },
+        "deletions": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "Deletions"
+        },
+        "filename": {
+          "type": "string",
+          "x-go-name": "Filename"
+        },
+        "html_url": {
+          "type": "string",
+          "x-go-name": "HTMLURL"
+        },
+        "previous_filename": {
+          "type": "string",
+          "x-go-name": "PreviousFilename"
+        },
+        "raw_url": {
+          "type": "string",
+          "x-go-name": "RawURL"
+        },
+        "status": {
+          "type": "string",
+          "x-go-name": "Status"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "CombinedStatus": {
+      "description": "CombinedStatus holds the combined state of several statuses for a single commit",
+      "type": "object",
+      "properties": {
+        "commit_url": {
+          "type": "string",
+          "x-go-name": "CommitURL"
+        },
+        "repository": {
+          "$ref": "#/definitions/Repository"
+        },
+        "sha": {
+          "type": "string",
+          "x-go-name": "SHA"
+        },
+        "state": {
+          "$ref": "#/definitions/CommitStatusState"
+        },
+        "statuses": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/CommitStatus"
+          },
+          "x-go-name": "Statuses"
+        },
+        "total_count": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "TotalCount"
+        },
+        "url": {
+          "type": "string",
+          "x-go-name": "URL"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "Comment": {
+      "description": "Comment represents a comment on a commit or issue",
+      "type": "object",
+      "properties": {
+        "assets": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/Attachment"
+          },
+          "x-go-name": "Attachments"
+        },
+        "body": {
+          "type": "string",
+          "x-go-name": "Body"
+        },
+        "created_at": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Created"
+        },
+        "html_url": {
+          "type": "string",
+          "x-go-name": "HTMLURL"
+        },
+        "id": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "ID"
+        },
+        "issue_url": {
+          "type": "string",
+          "x-go-name": "IssueURL"
+        },
+        "original_author": {
+          "type": "string",
+          "x-go-name": "OriginalAuthor"
+        },
+        "original_author_id": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "OriginalAuthorID"
+        },
+        "pull_request_url": {
+          "type": "string",
+          "x-go-name": "PRURL"
+        },
+        "updated_at": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Updated"
+        },
+        "user": {
+          "$ref": "#/definitions/User"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "Commit": {
+      "type": "object",
+      "title": "Commit contains information generated from a Git commit.",
+      "properties": {
+        "author": {
+          "$ref": "#/definitions/User"
+        },
+        "commit": {
+          "$ref": "#/definitions/RepoCommit"
+        },
+        "committer": {
+          "$ref": "#/definitions/User"
+        },
+        "created": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Created"
+        },
+        "files": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/CommitAffectedFiles"
+          },
+          "x-go-name": "Files"
+        },
+        "html_url": {
+          "type": "string",
+          "x-go-name": "HTMLURL"
+        },
+        "parents": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/CommitMeta"
+          },
+          "x-go-name": "Parents"
+        },
+        "sha": {
+          "type": "string",
+          "x-go-name": "SHA"
+        },
+        "stats": {
+          "$ref": "#/definitions/CommitStats"
+        },
+        "url": {
+          "type": "string",
+          "x-go-name": "URL"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "CommitAffectedFiles": {
+      "description": "CommitAffectedFiles store information about files affected by the commit",
+      "type": "object",
+      "properties": {
+        "filename": {
+          "type": "string",
+          "x-go-name": "Filename"
+        },
+        "status": {
+          "type": "string",
+          "x-go-name": "Status"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "CommitDateOptions": {
+      "description": "CommitDateOptions store dates for GIT_AUTHOR_DATE and GIT_COMMITTER_DATE",
+      "type": "object",
+      "properties": {
+        "author": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Author"
+        },
+        "committer": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Committer"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "CommitMeta": {
+      "type": "object",
+      "title": "CommitMeta contains meta information of a commit in terms of API.",
+      "properties": {
+        "created": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Created"
+        },
+        "sha": {
+          "type": "string",
+          "x-go-name": "SHA"
+        },
+        "url": {
+          "type": "string",
+          "x-go-name": "URL"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "CommitStats": {
+      "description": "CommitStats is statistics for a RepoCommit",
+      "type": "object",
+      "properties": {
+        "additions": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "Additions"
+        },
+        "deletions": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "Deletions"
+        },
+        "total": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "Total"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "CommitStatus": {
+      "description": "CommitStatus holds a single status of a single Commit",
+      "type": "object",
+      "properties": {
+        "context": {
+          "type": "string",
+          "x-go-name": "Context"
+        },
+        "created_at": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Created"
+        },
+        "creator": {
+          "$ref": "#/definitions/User"
+        },
+        "description": {
+          "type": "string",
+          "x-go-name": "Description"
+        },
+        "id": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "ID"
+        },
+        "status": {
+          "$ref": "#/definitions/CommitStatusState"
+        },
+        "target_url": {
+          "type": "string",
+          "x-go-name": "TargetURL"
+        },
+        "updated_at": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Updated"
+        },
+        "url": {
+          "type": "string",
+          "x-go-name": "URL"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "CommitStatusState": {
+      "description": "CommitStatusState holds the state of a CommitStatus\nIt can be \"pending\", \"success\", \"error\" and \"failure\"",
+      "type": "string",
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "CommitUser": {
+      "type": "object",
+      "title": "CommitUser contains information of a user in the context of a commit.",
+      "properties": {
+        "date": {
+          "type": "string",
+          "x-go-name": "Date"
+        },
+        "email": {
+          "type": "string",
+          "format": "email",
+          "x-go-name": "Email"
+        },
+        "name": {
+          "type": "string",
+          "x-go-name": "Name"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "Compare": {
+      "type": "object",
+      "title": "Compare represents a comparison between two commits.",
+      "properties": {
+        "commits": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/Commit"
+          },
+          "x-go-name": "Commits"
+        },
+        "total_commits": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "TotalCommits"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "ContentsResponse": {
+      "description": "ContentsResponse contains information about a repo's entry's (dir, file, symlink, submodule) metadata and content",
+      "type": "object",
+      "properties": {
+        "_links": {
+          "$ref": "#/definitions/FileLinksResponse"
+        },
+        "content": {
+          "description": "`content` is populated when `type` is `file`, otherwise null",
+          "type": "string",
+          "x-go-name": "Content"
+        },
+        "download_url": {
+          "type": "string",
+          "x-go-name": "DownloadURL"
+        },
+        "encoding": {
+          "description": "`encoding` is populated when `type` is `file`, otherwise null",
+          "type": "string",
+          "x-go-name": "Encoding"
+        },
+        "git_url": {
+          "type": "string",
+          "x-go-name": "GitURL"
+        },
+        "html_url": {
+          "type": "string",
+          "x-go-name": "HTMLURL"
+        },
+        "last_commit_sha": {
+          "type": "string",
+          "x-go-name": "LastCommitSHA"
+        },
+        "name": {
+          "type": "string",
+          "x-go-name": "Name"
+        },
+        "path": {
+          "type": "string",
+          "x-go-name": "Path"
+        },
+        "sha": {
+          "type": "string",
+          "x-go-name": "SHA"
+        },
+        "size": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "Size"
+        },
+        "submodule_git_url": {
+          "description": "`submodule_git_url` is populated when `type` is `submodule`, otherwise null",
+          "type": "string",
+          "x-go-name": "SubmoduleGitURL"
+        },
+        "target": {
+          "description": "`target` is populated when `type` is `symlink`, otherwise null",
+          "type": "string",
+          "x-go-name": "Target"
+        },
+        "type": {
+          "description": "`type` will be `file`, `dir`, `symlink`, or `submodule`",
+          "type": "string",
+          "x-go-name": "Type"
+        },
+        "url": {
+          "type": "string",
+          "x-go-name": "URL"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "CreateAccessTokenOption": {
+      "description": "CreateAccessTokenOption options when create access token",
+      "type": "object",
+      "required": [
+        "name"
+      ],
+      "properties": {
+        "name": {
+          "type": "string",
+          "x-go-name": "Name"
+        },
+        "scopes": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "Scopes"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "CreateBranchProtectionOption": {
+      "description": "CreateBranchProtectionOption options for creating a branch protection",
+      "type": "object",
+      "properties": {
+        "approvals_whitelist_teams": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "ApprovalsWhitelistTeams"
+        },
+        "approvals_whitelist_username": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "ApprovalsWhitelistUsernames"
+        },
+        "block_on_official_review_requests": {
+          "type": "boolean",
+          "x-go-name": "BlockOnOfficialReviewRequests"
+        },
+        "block_on_outdated_branch": {
+          "type": "boolean",
+          "x-go-name": "BlockOnOutdatedBranch"
+        },
+        "block_on_rejected_reviews": {
+          "type": "boolean",
+          "x-go-name": "BlockOnRejectedReviews"
+        },
+        "branch_name": {
+          "description": "Deprecated: true",
+          "type": "string",
+          "x-go-name": "BranchName"
+        },
+        "dismiss_stale_approvals": {
+          "type": "boolean",
+          "x-go-name": "DismissStaleApprovals"
+        },
+        "enable_approvals_whitelist": {
+          "type": "boolean",
+          "x-go-name": "EnableApprovalsWhitelist"
+        },
+        "enable_merge_whitelist": {
+          "type": "boolean",
+          "x-go-name": "EnableMergeWhitelist"
+        },
+        "enable_push": {
+          "type": "boolean",
+          "x-go-name": "EnablePush"
+        },
+        "enable_push_whitelist": {
+          "type": "boolean",
+          "x-go-name": "EnablePushWhitelist"
+        },
+        "enable_status_check": {
+          "type": "boolean",
+          "x-go-name": "EnableStatusCheck"
+        },
+        "ignore_stale_approvals": {
+          "type": "boolean",
+          "x-go-name": "IgnoreStaleApprovals"
+        },
+        "merge_whitelist_teams": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "MergeWhitelistTeams"
+        },
+        "merge_whitelist_usernames": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "MergeWhitelistUsernames"
+        },
+        "protected_file_patterns": {
+          "type": "string",
+          "x-go-name": "ProtectedFilePatterns"
+        },
+        "push_whitelist_deploy_keys": {
+          "type": "boolean",
+          "x-go-name": "PushWhitelistDeployKeys"
+        },
+        "push_whitelist_teams": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "PushWhitelistTeams"
+        },
+        "push_whitelist_usernames": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "PushWhitelistUsernames"
+        },
+        "require_signed_commits": {
+          "type": "boolean",
+          "x-go-name": "RequireSignedCommits"
+        },
+        "required_approvals": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "RequiredApprovals"
+        },
+        "rule_name": {
+          "type": "string",
+          "x-go-name": "RuleName"
+        },
+        "status_check_contexts": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "StatusCheckContexts"
+        },
+        "unprotected_file_patterns": {
+          "type": "string",
+          "x-go-name": "UnprotectedFilePatterns"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "CreateBranchRepoOption": {
+      "description": "CreateBranchRepoOption options when creating a branch in a repository",
+      "type": "object",
+      "required": [
+        "new_branch_name"
+      ],
+      "properties": {
+        "new_branch_name": {
+          "description": "Name of the branch to create",
+          "type": "string",
+          "uniqueItems": true,
+          "x-go-name": "BranchName"
+        },
+        "old_branch_name": {
+          "description": "Deprecated: true\nName of the old branch to create from",
+          "type": "string",
+          "uniqueItems": true,
+          "x-go-name": "OldBranchName"
+        },
+        "old_ref_name": {
+          "description": "Name of the old branch/tag/commit to create from",
+          "type": "string",
+          "uniqueItems": true,
+          "x-go-name": "OldRefName"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "CreateEmailOption": {
+      "description": "CreateEmailOption options when creating email addresses",
+      "type": "object",
+      "properties": {
+        "emails": {
+          "description": "email addresses to add",
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "Emails"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "CreateFileOptions": {
+      "description": "CreateFileOptions options for creating files\nNote: `author` and `committer` are optional (if only one is given, it will be used for the other, otherwise the authenticated user will be used)",
+      "type": "object",
+      "required": [
+        "content"
+      ],
+      "properties": {
+        "author": {
+          "$ref": "#/definitions/Identity"
+        },
+        "branch": {
+          "description": "branch (optional) to base this file from. if not given, the default branch is used",
+          "type": "string",
+          "x-go-name": "BranchName"
+        },
+        "committer": {
+          "$ref": "#/definitions/Identity"
+        },
+        "content": {
+          "description": "content must be base64 encoded",
+          "type": "string",
+          "x-go-name": "ContentBase64"
+        },
+        "dates": {
+          "$ref": "#/definitions/CommitDateOptions"
+        },
+        "message": {
+          "description": "message (optional) for the commit of this file. if not supplied, a default message will be used",
+          "type": "string",
+          "x-go-name": "Message"
+        },
+        "new_branch": {
+          "description": "new_branch (optional) will make a new branch from `branch` before creating the file",
+          "type": "string",
+          "x-go-name": "NewBranchName"
+        },
+        "signoff": {
+          "description": "Add a Signed-off-by trailer by the committer at the end of the commit log message.",
+          "type": "boolean",
+          "x-go-name": "Signoff"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "CreateForkOption": {
+      "description": "CreateForkOption options for creating a fork",
+      "type": "object",
+      "properties": {
+        "name": {
+          "description": "name of the forked repository",
+          "type": "string",
+          "x-go-name": "Name"
+        },
+        "organization": {
+          "description": "organization name, if forking into an organization",
+          "type": "string",
+          "x-go-name": "Organization"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "CreateGPGKeyOption": {
+      "description": "CreateGPGKeyOption options create user GPG key",
+      "type": "object",
+      "required": [
+        "armored_public_key"
+      ],
+      "properties": {
+        "armored_public_key": {
+          "description": "An armored GPG key to add",
+          "type": "string",
+          "uniqueItems": true,
+          "x-go-name": "ArmoredKey"
+        },
+        "armored_signature": {
+          "type": "string",
+          "x-go-name": "Signature"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "CreateHookOption": {
+      "description": "CreateHookOption options when create a hook",
+      "type": "object",
+      "required": [
+        "type",
+        "config"
+      ],
+      "properties": {
+        "active": {
+          "type": "boolean",
+          "default": false,
+          "x-go-name": "Active"
+        },
+        "authorization_header": {
+          "type": "string",
+          "x-go-name": "AuthorizationHeader"
+        },
+        "branch_filter": {
+          "type": "string",
+          "x-go-name": "BranchFilter"
+        },
+        "config": {
+          "$ref": "#/definitions/CreateHookOptionConfig"
+        },
+        "events": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "Events"
+        },
+        "type": {
+          "type": "string",
+          "enum": [
+            "dingtalk",
+            "discord",
+            "gitea",
+            "gogs",
+            "msteams",
+            "slack",
+            "telegram",
+            "feishu",
+            "wechatwork",
+            "packagist"
+          ],
+          "x-go-name": "Type"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "CreateHookOptionConfig": {
+      "description": "CreateHookOptionConfig has all config options in it\nrequired are \"content_type\" and \"url\" Required",
+      "type": "object",
+      "additionalProperties": {
+        "type": "string"
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "CreateIssueCommentOption": {
+      "description": "CreateIssueCommentOption options for creating a comment on an issue",
+      "type": "object",
+      "required": [
+        "body"
+      ],
+      "properties": {
+        "body": {
+          "type": "string",
+          "x-go-name": "Body"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "CreateIssueOption": {
+      "description": "CreateIssueOption options to create one issue",
+      "type": "object",
+      "required": [
+        "title"
+      ],
+      "properties": {
+        "assignee": {
+          "description": "deprecated",
+          "type": "string",
+          "x-go-name": "Assignee"
+        },
+        "assignees": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "Assignees"
+        },
+        "body": {
+          "type": "string",
+          "x-go-name": "Body"
+        },
+        "closed": {
+          "type": "boolean",
+          "x-go-name": "Closed"
+        },
+        "due_date": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Deadline"
+        },
+        "labels": {
+          "description": "list of label ids",
+          "type": "array",
+          "items": {
+            "type": "integer",
+            "format": "int64"
+          },
+          "x-go-name": "Labels"
+        },
+        "milestone": {
+          "description": "milestone id",
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "Milestone"
+        },
+        "ref": {
+          "type": "string",
+          "x-go-name": "Ref"
+        },
+        "title": {
+          "type": "string",
+          "x-go-name": "Title"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "CreateKeyOption": {
+      "description": "CreateKeyOption options when creating a key",
+      "type": "object",
+      "required": [
+        "title",
+        "key"
+      ],
+      "properties": {
+        "key": {
+          "description": "An armored SSH key to add",
+          "type": "string",
+          "uniqueItems": true,
+          "x-go-name": "Key"
+        },
+        "read_only": {
+          "description": "Describe if the key has only read access or read/write",
+          "type": "boolean",
+          "x-go-name": "ReadOnly"
+        },
+        "title": {
+          "description": "Title of the key to add",
+          "type": "string",
+          "uniqueItems": true,
+          "x-go-name": "Title"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "CreateLabelOption": {
+      "description": "CreateLabelOption options for creating a label",
+      "type": "object",
+      "required": [
+        "name",
+        "color"
+      ],
+      "properties": {
+        "color": {
+          "type": "string",
+          "x-go-name": "Color",
+          "example": "#00aabb"
+        },
+        "description": {
+          "type": "string",
+          "x-go-name": "Description"
+        },
+        "exclusive": {
+          "type": "boolean",
+          "x-go-name": "Exclusive",
+          "example": false
+        },
+        "is_archived": {
+          "type": "boolean",
+          "x-go-name": "IsArchived",
+          "example": false
+        },
+        "name": {
+          "type": "string",
+          "x-go-name": "Name"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "CreateMilestoneOption": {
+      "description": "CreateMilestoneOption options for creating a milestone",
+      "type": "object",
+      "properties": {
+        "description": {
+          "type": "string",
+          "x-go-name": "Description"
+        },
+        "due_on": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Deadline"
+        },
+        "state": {
+          "type": "string",
+          "enum": [
+            "open",
+            "closed"
+          ],
+          "x-go-name": "State"
+        },
+        "title": {
+          "type": "string",
+          "x-go-name": "Title"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "CreateOAuth2ApplicationOptions": {
+      "description": "CreateOAuth2ApplicationOptions holds options to create an oauth2 application",
+      "type": "object",
+      "properties": {
+        "confidential_client": {
+          "type": "boolean",
+          "x-go-name": "ConfidentialClient"
+        },
+        "name": {
+          "type": "string",
+          "x-go-name": "Name"
+        },
+        "redirect_uris": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "RedirectURIs"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "CreateOrUpdateSecretOption": {
+      "description": "CreateOrUpdateSecretOption options when creating or updating secret",
+      "type": "object",
+      "required": [
+        "data"
+      ],
+      "properties": {
+        "data": {
+          "description": "Data of the secret to update",
+          "type": "string",
+          "x-go-name": "Data"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "CreateOrgOption": {
+      "description": "CreateOrgOption options for creating an organization",
+      "type": "object",
+      "required": [
+        "username"
+      ],
+      "properties": {
+        "description": {
+          "type": "string",
+          "x-go-name": "Description"
+        },
+        "email": {
+          "type": "string",
+          "x-go-name": "Email"
+        },
+        "full_name": {
+          "type": "string",
+          "x-go-name": "FullName"
+        },
+        "location": {
+          "type": "string",
+          "x-go-name": "Location"
+        },
+        "repo_admin_change_team_access": {
+          "type": "boolean",
+          "x-go-name": "RepoAdminChangeTeamAccess"
+        },
+        "username": {
+          "type": "string",
+          "x-go-name": "UserName"
+        },
+        "visibility": {
+          "description": "possible values are `public` (default), `limited` or `private`",
+          "type": "string",
+          "enum": [
+            "public",
+            "limited",
+            "private"
+          ],
+          "x-go-name": "Visibility"
+        },
+        "website": {
+          "type": "string",
+          "x-go-name": "Website"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "CreatePullRequestOption": {
+      "description": "CreatePullRequestOption options when creating a pull request",
+      "type": "object",
+      "properties": {
+        "assignee": {
+          "type": "string",
+          "x-go-name": "Assignee"
+        },
+        "assignees": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "Assignees"
+        },
+        "base": {
+          "type": "string",
+          "x-go-name": "Base"
+        },
+        "body": {
+          "type": "string",
+          "x-go-name": "Body"
+        },
+        "due_date": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Deadline"
+        },
+        "head": {
+          "type": "string",
+          "x-go-name": "Head"
+        },
+        "labels": {
+          "type": "array",
+          "items": {
+            "type": "integer",
+            "format": "int64"
+          },
+          "x-go-name": "Labels"
+        },
+        "milestone": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "Milestone"
+        },
+        "title": {
+          "type": "string",
+          "x-go-name": "Title"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "CreatePullReviewComment": {
+      "description": "CreatePullReviewComment represent a review comment for creation api",
+      "type": "object",
+      "properties": {
+        "body": {
+          "type": "string",
+          "x-go-name": "Body"
+        },
+        "new_position": {
+          "description": "if comment to new file line or 0",
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "NewLineNum"
+        },
+        "old_position": {
+          "description": "if comment to old file line or 0",
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "OldLineNum"
+        },
+        "path": {
+          "description": "the tree path",
+          "type": "string",
+          "x-go-name": "Path"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "CreatePullReviewOptions": {
+      "description": "CreatePullReviewOptions are options to create a pull review",
+      "type": "object",
+      "properties": {
+        "body": {
+          "type": "string",
+          "x-go-name": "Body"
+        },
+        "comments": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/CreatePullReviewComment"
+          },
+          "x-go-name": "Comments"
+        },
+        "commit_id": {
+          "type": "string",
+          "x-go-name": "CommitID"
+        },
+        "event": {
+          "$ref": "#/definitions/ReviewStateType"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "CreatePushMirrorOption": {
+      "type": "object",
+      "title": "CreatePushMirrorOption represents need information to create a push mirror of a repository.",
+      "properties": {
+        "interval": {
+          "type": "string",
+          "x-go-name": "Interval"
+        },
+        "remote_address": {
+          "type": "string",
+          "x-go-name": "RemoteAddress"
+        },
+        "remote_password": {
+          "type": "string",
+          "x-go-name": "RemotePassword"
+        },
+        "remote_username": {
+          "type": "string",
+          "x-go-name": "RemoteUsername"
+        },
+        "sync_on_commit": {
+          "type": "boolean",
+          "x-go-name": "SyncOnCommit"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "CreateReleaseOption": {
+      "description": "CreateReleaseOption options when creating a release",
+      "type": "object",
+      "required": [
+        "tag_name"
+      ],
+      "properties": {
+        "body": {
+          "type": "string",
+          "x-go-name": "Note"
+        },
+        "draft": {
+          "type": "boolean",
+          "x-go-name": "IsDraft"
+        },
+        "name": {
+          "type": "string",
+          "x-go-name": "Title"
+        },
+        "prerelease": {
+          "type": "boolean",
+          "x-go-name": "IsPrerelease"
+        },
+        "tag_name": {
+          "type": "string",
+          "x-go-name": "TagName"
+        },
+        "target_commitish": {
+          "type": "string",
+          "x-go-name": "Target"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "CreateRepoOption": {
+      "description": "CreateRepoOption options when creating repository",
+      "type": "object",
+      "required": [
+        "name"
+      ],
+      "properties": {
+        "auto_init": {
+          "description": "Whether the repository should be auto-initialized?",
+          "type": "boolean",
+          "x-go-name": "AutoInit"
+        },
+        "default_branch": {
+          "description": "DefaultBranch of the repository (used when initializes and in template)",
+          "type": "string",
+          "x-go-name": "DefaultBranch"
+        },
+        "description": {
+          "description": "Description of the repository to create",
+          "type": "string",
+          "x-go-name": "Description"
+        },
+        "gitignores": {
+          "description": "Gitignores to use",
+          "type": "string",
+          "x-go-name": "Gitignores"
+        },
+        "issue_labels": {
+          "description": "Label-Set to use",
+          "type": "string",
+          "x-go-name": "IssueLabels"
+        },
+        "license": {
+          "description": "License to use",
+          "type": "string",
+          "x-go-name": "License"
+        },
+        "name": {
+          "description": "Name of the repository to create",
+          "type": "string",
+          "uniqueItems": true,
+          "x-go-name": "Name"
+        },
+        "object_format_name": {
+          "description": "ObjectFormatName of the underlying git repository",
+          "type": "string",
+          "enum": [
+            "sha1",
+            "sha256"
+          ],
+          "x-go-name": "ObjectFormatName"
+        },
+        "private": {
+          "description": "Whether the repository is private",
+          "type": "boolean",
+          "x-go-name": "Private"
+        },
+        "readme": {
+          "description": "Readme of the repository to create",
+          "type": "string",
+          "x-go-name": "Readme"
+        },
+        "template": {
+          "description": "Whether the repository is template",
+          "type": "boolean",
+          "x-go-name": "Template"
+        },
+        "trust_model": {
+          "description": "TrustModel of the repository",
+          "type": "string",
+          "enum": [
+            "default",
+            "collaborator",
+            "committer",
+            "collaboratorcommitter"
+          ],
+          "x-go-name": "TrustModel"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "CreateStatusOption": {
+      "description": "CreateStatusOption holds the information needed to create a new CommitStatus for a Commit",
+      "type": "object",
+      "properties": {
+        "context": {
+          "type": "string",
+          "x-go-name": "Context"
+        },
+        "description": {
+          "type": "string",
+          "x-go-name": "Description"
+        },
+        "state": {
+          "$ref": "#/definitions/CommitStatusState"
+        },
+        "target_url": {
+          "type": "string",
+          "x-go-name": "TargetURL"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "CreateTagOption": {
+      "description": "CreateTagOption options when creating a tag",
+      "type": "object",
+      "required": [
+        "tag_name"
+      ],
+      "properties": {
+        "message": {
+          "type": "string",
+          "x-go-name": "Message"
+        },
+        "tag_name": {
+          "type": "string",
+          "x-go-name": "TagName"
+        },
+        "target": {
+          "type": "string",
+          "x-go-name": "Target"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "CreateTeamOption": {
+      "description": "CreateTeamOption options for creating a team",
+      "type": "object",
+      "required": [
+        "name"
+      ],
+      "properties": {
+        "can_create_org_repo": {
+          "type": "boolean",
+          "x-go-name": "CanCreateOrgRepo"
+        },
+        "description": {
+          "type": "string",
+          "x-go-name": "Description"
+        },
+        "includes_all_repositories": {
+          "type": "boolean",
+          "x-go-name": "IncludesAllRepositories"
+        },
+        "name": {
+          "type": "string",
+          "x-go-name": "Name"
+        },
+        "permission": {
+          "type": "string",
+          "enum": [
+            "read",
+            "write",
+            "admin"
+          ],
+          "x-go-name": "Permission"
+        },
+        "units": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "Units",
+          "example": [
+            "repo.actions",
+            "repo.code",
+            "repo.issues",
+            "repo.ext_issues",
+            "repo.wiki",
+            "repo.ext_wiki",
+            "repo.pulls",
+            "repo.releases",
+            "repo.projects",
+            "repo.ext_wiki"
+          ]
+        },
+        "units_map": {
+          "type": "object",
+          "additionalProperties": {
+            "type": "string"
+          },
+          "x-go-name": "UnitsMap",
+          "example": "{\"repo.actions\",\"repo.packages\",\"repo.code\":\"read\",\"repo.issues\":\"write\",\"repo.ext_issues\":\"none\",\"repo.wiki\":\"admin\",\"repo.pulls\":\"owner\",\"repo.releases\":\"none\",\"repo.projects\":\"none\",\"repo.ext_wiki\":\"none\"}"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "CreateUserOption": {
+      "description": "CreateUserOption create user options",
+      "type": "object",
+      "required": [
+        "username",
+        "email"
+      ],
+      "properties": {
+        "created_at": {
+          "description": "For explicitly setting the user creation timestamp. Useful when users are\nmigrated from other systems. When omitted, the user's creation timestamp\nwill be set to \"now\".",
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Created"
+        },
+        "email": {
+          "type": "string",
+          "format": "email",
+          "x-go-name": "Email"
+        },
+        "full_name": {
+          "type": "string",
+          "x-go-name": "FullName"
+        },
+        "login_name": {
+          "type": "string",
+          "x-go-name": "LoginName"
+        },
+        "must_change_password": {
+          "type": "boolean",
+          "x-go-name": "MustChangePassword"
+        },
+        "password": {
+          "type": "string",
+          "x-go-name": "Password"
+        },
+        "restricted": {
+          "type": "boolean",
+          "x-go-name": "Restricted"
+        },
+        "send_notify": {
+          "type": "boolean",
+          "x-go-name": "SendNotify"
+        },
+        "source_id": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "SourceID"
+        },
+        "username": {
+          "type": "string",
+          "x-go-name": "Username"
+        },
+        "visibility": {
+          "type": "string",
+          "x-go-name": "Visibility"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "CreateVariableOption": {
+      "description": "CreateVariableOption the option when creating variable",
+      "type": "object",
+      "required": [
+        "value"
+      ],
+      "properties": {
+        "value": {
+          "description": "Value of the variable to create",
+          "type": "string",
+          "x-go-name": "Value"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "CreateWikiPageOptions": {
+      "description": "CreateWikiPageOptions form for creating wiki",
+      "type": "object",
+      "properties": {
+        "content_base64": {
+          "description": "content must be base64 encoded",
+          "type": "string",
+          "x-go-name": "ContentBase64"
+        },
+        "message": {
+          "description": "optional commit message summarizing the change",
+          "type": "string",
+          "x-go-name": "Message"
+        },
+        "title": {
+          "description": "page title. leave empty to keep unchanged",
+          "type": "string",
+          "x-go-name": "Title"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "Cron": {
+      "description": "Cron represents a Cron task",
+      "type": "object",
+      "properties": {
+        "exec_times": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "ExecTimes"
+        },
+        "name": {
+          "type": "string",
+          "x-go-name": "Name"
+        },
+        "next": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Next"
+        },
+        "prev": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Prev"
+        },
+        "schedule": {
+          "type": "string",
+          "x-go-name": "Schedule"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "DeleteEmailOption": {
+      "description": "DeleteEmailOption options when deleting email addresses",
+      "type": "object",
+      "properties": {
+        "emails": {
+          "description": "email addresses to delete",
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "Emails"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "DeleteFileOptions": {
+      "description": "DeleteFileOptions options for deleting files (used for other File structs below)\nNote: `author` and `committer` are optional (if only one is given, it will be used for the other, otherwise the authenticated user will be used)",
+      "type": "object",
+      "required": [
+        "sha"
+      ],
+      "properties": {
+        "author": {
+          "$ref": "#/definitions/Identity"
+        },
+        "branch": {
+          "description": "branch (optional) to base this file from. if not given, the default branch is used",
+          "type": "string",
+          "x-go-name": "BranchName"
+        },
+        "committer": {
+          "$ref": "#/definitions/Identity"
+        },
+        "dates": {
+          "$ref": "#/definitions/CommitDateOptions"
+        },
+        "message": {
+          "description": "message (optional) for the commit of this file. if not supplied, a default message will be used",
+          "type": "string",
+          "x-go-name": "Message"
+        },
+        "new_branch": {
+          "description": "new_branch (optional) will make a new branch from `branch` before creating the file",
+          "type": "string",
+          "x-go-name": "NewBranchName"
+        },
+        "sha": {
+          "description": "sha is the SHA for the file that already exists",
+          "type": "string",
+          "x-go-name": "SHA"
+        },
+        "signoff": {
+          "description": "Add a Signed-off-by trailer by the committer at the end of the commit log message.",
+          "type": "boolean",
+          "x-go-name": "Signoff"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "DeployKey": {
+      "description": "DeployKey a deploy key",
+      "type": "object",
+      "properties": {
+        "created_at": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Created"
+        },
+        "fingerprint": {
+          "type": "string",
+          "x-go-name": "Fingerprint"
+        },
+        "id": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "ID"
+        },
+        "key": {
+          "type": "string",
+          "x-go-name": "Key"
+        },
+        "key_id": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "KeyID"
+        },
+        "read_only": {
+          "type": "boolean",
+          "x-go-name": "ReadOnly"
+        },
+        "repository": {
+          "$ref": "#/definitions/Repository"
+        },
+        "title": {
+          "type": "string",
+          "x-go-name": "Title"
+        },
+        "url": {
+          "type": "string",
+          "x-go-name": "URL"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "DismissPullReviewOptions": {
+      "description": "DismissPullReviewOptions are options to dismiss a pull review",
+      "type": "object",
+      "properties": {
+        "message": {
+          "type": "string",
+          "x-go-name": "Message"
+        },
+        "priors": {
+          "type": "boolean",
+          "x-go-name": "Priors"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "EditAttachmentOptions": {
+      "description": "EditAttachmentOptions options for editing attachments",
+      "type": "object",
+      "properties": {
+        "name": {
+          "type": "string",
+          "x-go-name": "Name"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "EditBranchProtectionOption": {
+      "description": "EditBranchProtectionOption options for editing a branch protection",
+      "type": "object",
+      "properties": {
+        "approvals_whitelist_teams": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "ApprovalsWhitelistTeams"
+        },
+        "approvals_whitelist_username": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "ApprovalsWhitelistUsernames"
+        },
+        "block_on_official_review_requests": {
+          "type": "boolean",
+          "x-go-name": "BlockOnOfficialReviewRequests"
+        },
+        "block_on_outdated_branch": {
+          "type": "boolean",
+          "x-go-name": "BlockOnOutdatedBranch"
+        },
+        "block_on_rejected_reviews": {
+          "type": "boolean",
+          "x-go-name": "BlockOnRejectedReviews"
+        },
+        "dismiss_stale_approvals": {
+          "type": "boolean",
+          "x-go-name": "DismissStaleApprovals"
+        },
+        "enable_approvals_whitelist": {
+          "type": "boolean",
+          "x-go-name": "EnableApprovalsWhitelist"
+        },
+        "enable_merge_whitelist": {
+          "type": "boolean",
+          "x-go-name": "EnableMergeWhitelist"
+        },
+        "enable_push": {
+          "type": "boolean",
+          "x-go-name": "EnablePush"
+        },
+        "enable_push_whitelist": {
+          "type": "boolean",
+          "x-go-name": "EnablePushWhitelist"
+        },
+        "enable_status_check": {
+          "type": "boolean",
+          "x-go-name": "EnableStatusCheck"
+        },
+        "ignore_stale_approvals": {
+          "type": "boolean",
+          "x-go-name": "IgnoreStaleApprovals"
+        },
+        "merge_whitelist_teams": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "MergeWhitelistTeams"
+        },
+        "merge_whitelist_usernames": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "MergeWhitelistUsernames"
+        },
+        "protected_file_patterns": {
+          "type": "string",
+          "x-go-name": "ProtectedFilePatterns"
+        },
+        "push_whitelist_deploy_keys": {
+          "type": "boolean",
+          "x-go-name": "PushWhitelistDeployKeys"
+        },
+        "push_whitelist_teams": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "PushWhitelistTeams"
+        },
+        "push_whitelist_usernames": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "PushWhitelistUsernames"
+        },
+        "require_signed_commits": {
+          "type": "boolean",
+          "x-go-name": "RequireSignedCommits"
+        },
+        "required_approvals": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "RequiredApprovals"
+        },
+        "status_check_contexts": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "StatusCheckContexts"
+        },
+        "unprotected_file_patterns": {
+          "type": "string",
+          "x-go-name": "UnprotectedFilePatterns"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "EditDeadlineOption": {
+      "description": "EditDeadlineOption options for creating a deadline",
+      "type": "object",
+      "required": [
+        "due_date"
+      ],
+      "properties": {
+        "due_date": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Deadline"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "EditGitHookOption": {
+      "description": "EditGitHookOption options when modifying one Git hook",
+      "type": "object",
+      "properties": {
+        "content": {
+          "type": "string",
+          "x-go-name": "Content"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "EditHookOption": {
+      "description": "EditHookOption options when modify one hook",
+      "type": "object",
+      "properties": {
+        "active": {
+          "type": "boolean",
+          "x-go-name": "Active"
+        },
+        "authorization_header": {
+          "type": "string",
+          "x-go-name": "AuthorizationHeader"
+        },
+        "branch_filter": {
+          "type": "string",
+          "x-go-name": "BranchFilter"
+        },
+        "config": {
+          "type": "object",
+          "additionalProperties": {
+            "type": "string"
+          },
+          "x-go-name": "Config"
+        },
+        "events": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "Events"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "EditIssueCommentOption": {
+      "description": "EditIssueCommentOption options for editing a comment",
+      "type": "object",
+      "required": [
+        "body"
+      ],
+      "properties": {
+        "body": {
+          "type": "string",
+          "x-go-name": "Body"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "EditIssueOption": {
+      "description": "EditIssueOption options for editing an issue",
+      "type": "object",
+      "properties": {
+        "assignee": {
+          "description": "deprecated",
+          "type": "string",
+          "x-go-name": "Assignee"
+        },
+        "assignees": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "Assignees"
+        },
+        "body": {
+          "type": "string",
+          "x-go-name": "Body"
+        },
+        "due_date": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Deadline"
+        },
+        "milestone": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "Milestone"
+        },
+        "ref": {
+          "type": "string",
+          "x-go-name": "Ref"
+        },
+        "state": {
+          "type": "string",
+          "x-go-name": "State"
+        },
+        "title": {
+          "type": "string",
+          "x-go-name": "Title"
+        },
+        "unset_due_date": {
+          "type": "boolean",
+          "x-go-name": "RemoveDeadline"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "EditLabelOption": {
+      "description": "EditLabelOption options for editing a label",
+      "type": "object",
+      "properties": {
+        "color": {
+          "type": "string",
+          "x-go-name": "Color",
+          "example": "#00aabb"
+        },
+        "description": {
+          "type": "string",
+          "x-go-name": "Description"
+        },
+        "exclusive": {
+          "type": "boolean",
+          "x-go-name": "Exclusive",
+          "example": false
+        },
+        "is_archived": {
+          "type": "boolean",
+          "x-go-name": "IsArchived",
+          "example": false
+        },
+        "name": {
+          "type": "string",
+          "x-go-name": "Name"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "EditMilestoneOption": {
+      "description": "EditMilestoneOption options for editing a milestone",
+      "type": "object",
+      "properties": {
+        "description": {
+          "type": "string",
+          "x-go-name": "Description"
+        },
+        "due_on": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Deadline"
+        },
+        "state": {
+          "type": "string",
+          "x-go-name": "State"
+        },
+        "title": {
+          "type": "string",
+          "x-go-name": "Title"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "EditOrgOption": {
+      "description": "EditOrgOption options for editing an organization",
+      "type": "object",
+      "properties": {
+        "description": {
+          "type": "string",
+          "x-go-name": "Description"
+        },
+        "email": {
+          "type": "string",
+          "x-go-name": "Email"
+        },
+        "full_name": {
+          "type": "string",
+          "x-go-name": "FullName"
+        },
+        "location": {
+          "type": "string",
+          "x-go-name": "Location"
+        },
+        "repo_admin_change_team_access": {
+          "type": "boolean",
+          "x-go-name": "RepoAdminChangeTeamAccess"
+        },
+        "visibility": {
+          "description": "possible values are `public`, `limited` or `private`",
+          "type": "string",
+          "enum": [
+            "public",
+            "limited",
+            "private"
+          ],
+          "x-go-name": "Visibility"
+        },
+        "website": {
+          "type": "string",
+          "x-go-name": "Website"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "EditPullRequestOption": {
+      "description": "EditPullRequestOption options when modify pull request",
+      "type": "object",
+      "properties": {
+        "allow_maintainer_edit": {
+          "type": "boolean",
+          "x-go-name": "AllowMaintainerEdit"
+        },
+        "assignee": {
+          "type": "string",
+          "x-go-name": "Assignee"
+        },
+        "assignees": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "Assignees"
+        },
+        "base": {
+          "type": "string",
+          "x-go-name": "Base"
+        },
+        "body": {
+          "type": "string",
+          "x-go-name": "Body"
+        },
+        "due_date": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Deadline"
+        },
+        "labels": {
+          "type": "array",
+          "items": {
+            "type": "integer",
+            "format": "int64"
+          },
+          "x-go-name": "Labels"
+        },
+        "milestone": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "Milestone"
+        },
+        "state": {
+          "type": "string",
+          "x-go-name": "State"
+        },
+        "title": {
+          "type": "string",
+          "x-go-name": "Title"
+        },
+        "unset_due_date": {
+          "type": "boolean",
+          "x-go-name": "RemoveDeadline"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "EditReactionOption": {
+      "description": "EditReactionOption contain the reaction type",
+      "type": "object",
+      "properties": {
+        "content": {
+          "type": "string",
+          "x-go-name": "Reaction"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "EditReleaseOption": {
+      "description": "EditReleaseOption options when editing a release",
+      "type": "object",
+      "properties": {
+        "body": {
+          "type": "string",
+          "x-go-name": "Note"
+        },
+        "draft": {
+          "type": "boolean",
+          "x-go-name": "IsDraft"
+        },
+        "name": {
+          "type": "string",
+          "x-go-name": "Title"
+        },
+        "prerelease": {
+          "type": "boolean",
+          "x-go-name": "IsPrerelease"
+        },
+        "tag_name": {
+          "type": "string",
+          "x-go-name": "TagName"
+        },
+        "target_commitish": {
+          "type": "string",
+          "x-go-name": "Target"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "EditRepoOption": {
+      "description": "EditRepoOption options when editing a repository's properties",
+      "type": "object",
+      "properties": {
+        "allow_fast_forward_only_merge": {
+          "description": "either `true` to allow fast-forward-only merging pull requests, or `false` to prevent fast-forward-only merging.",
+          "type": "boolean",
+          "x-go-name": "AllowFastForwardOnly"
+        },
+        "allow_manual_merge": {
+          "description": "either `true` to allow mark pr as merged manually, or `false` to prevent it.",
+          "type": "boolean",
+          "x-go-name": "AllowManualMerge"
+        },
+        "allow_merge_commits": {
+          "description": "either `true` to allow merging pull requests with a merge commit, or `false` to prevent merging pull requests with merge commits.",
+          "type": "boolean",
+          "x-go-name": "AllowMerge"
+        },
+        "allow_rebase": {
+          "description": "either `true` to allow rebase-merging pull requests, or `false` to prevent rebase-merging.",
+          "type": "boolean",
+          "x-go-name": "AllowRebase"
+        },
+        "allow_rebase_explicit": {
+          "description": "either `true` to allow rebase with explicit merge commits (--no-ff), or `false` to prevent rebase with explicit merge commits.",
+          "type": "boolean",
+          "x-go-name": "AllowRebaseMerge"
+        },
+        "allow_rebase_update": {
+          "description": "either `true` to allow updating pull request branch by rebase, or `false` to prevent it.",
+          "type": "boolean",
+          "x-go-name": "AllowRebaseUpdate"
+        },
+        "allow_squash_merge": {
+          "description": "either `true` to allow squash-merging pull requests, or `false` to prevent squash-merging.",
+          "type": "boolean",
+          "x-go-name": "AllowSquash"
+        },
+        "archived": {
+          "description": "set to `true` to archive this repository.",
+          "type": "boolean",
+          "x-go-name": "Archived"
+        },
+        "autodetect_manual_merge": {
+          "description": "either `true` to enable AutodetectManualMerge, or `false` to prevent it. Note: In some special cases, misjudgments can occur.",
+          "type": "boolean",
+          "x-go-name": "AutodetectManualMerge"
+        },
+        "default_allow_maintainer_edit": {
+          "description": "set to `true` to allow edits from maintainers by default",
+          "type": "boolean",
+          "x-go-name": "DefaultAllowMaintainerEdit"
+        },
+        "default_branch": {
+          "description": "sets the default branch for this repository.",
+          "type": "string",
+          "x-go-name": "DefaultBranch"
+        },
+        "default_delete_branch_after_merge": {
+          "description": "set to `true` to delete pr branch after merge by default",
+          "type": "boolean",
+          "x-go-name": "DefaultDeleteBranchAfterMerge"
+        },
+        "default_merge_style": {
+          "description": "set to a merge style to be used by this repository: \"merge\", \"rebase\", \"rebase-merge\", \"squash\", or \"fast-forward-only\".",
+          "type": "string",
+          "x-go-name": "DefaultMergeStyle"
+        },
+        "description": {
+          "description": "a short description of the repository.",
+          "type": "string",
+          "x-go-name": "Description"
+        },
+        "enable_prune": {
+          "description": "enable prune - remove obsolete remote-tracking references when mirroring",
+          "type": "boolean",
+          "x-go-name": "EnablePrune"
+        },
+        "external_tracker": {
+          "$ref": "#/definitions/ExternalTracker"
+        },
+        "external_wiki": {
+          "$ref": "#/definitions/ExternalWiki"
+        },
+        "has_actions": {
+          "description": "either `true` to enable actions unit, or `false` to disable them.",
+          "type": "boolean",
+          "x-go-name": "HasActions"
+        },
+        "has_issues": {
+          "description": "either `true` to enable issues for this repository or `false` to disable them.",
+          "type": "boolean",
+          "x-go-name": "HasIssues"
+        },
+        "has_packages": {
+          "description": "either `true` to enable packages unit, or `false` to disable them.",
+          "type": "boolean",
+          "x-go-name": "HasPackages"
+        },
+        "has_projects": {
+          "description": "either `true` to enable project unit, or `false` to disable them.",
+          "type": "boolean",
+          "x-go-name": "HasProjects"
+        },
+        "has_pull_requests": {
+          "description": "either `true` to allow pull requests, or `false` to prevent pull request.",
+          "type": "boolean",
+          "x-go-name": "HasPullRequests"
+        },
+        "has_releases": {
+          "description": "either `true` to enable releases unit, or `false` to disable them.",
+          "type": "boolean",
+          "x-go-name": "HasReleases"
+        },
+        "has_wiki": {
+          "description": "either `true` to enable the wiki for this repository or `false` to disable it.",
+          "type": "boolean",
+          "x-go-name": "HasWiki"
+        },
+        "ignore_whitespace_conflicts": {
+          "description": "either `true` to ignore whitespace for conflicts, or `false` to not ignore whitespace.",
+          "type": "boolean",
+          "x-go-name": "IgnoreWhitespaceConflicts"
+        },
+        "internal_tracker": {
+          "$ref": "#/definitions/InternalTracker"
+        },
+        "mirror_interval": {
+          "description": "set to a string like `8h30m0s` to set the mirror interval time",
+          "type": "string",
+          "x-go-name": "MirrorInterval"
+        },
+        "name": {
+          "description": "name of the repository",
+          "type": "string",
+          "uniqueItems": true,
+          "x-go-name": "Name"
+        },
+        "private": {
+          "description": "either `true` to make the repository private or `false` to make it public.\nNote: you will get a 422 error if the organization restricts changing repository visibility to organization\nowners and a non-owner tries to change the value of private.",
+          "type": "boolean",
+          "x-go-name": "Private"
+        },
+        "projects_mode": {
+          "description": "`repo` to only allow repo-level projects, `owner` to only allow owner projects, `all` to allow both.",
+          "type": "string",
+          "x-go-name": "ProjectsMode"
+        },
+        "template": {
+          "description": "either `true` to make this repository a template or `false` to make it a normal repository",
+          "type": "boolean",
+          "x-go-name": "Template"
+        },
+        "website": {
+          "description": "a URL with more information about the repository.",
+          "type": "string",
+          "x-go-name": "Website"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "EditTeamOption": {
+      "description": "EditTeamOption options for editing a team",
+      "type": "object",
+      "required": [
+        "name"
+      ],
+      "properties": {
+        "can_create_org_repo": {
+          "type": "boolean",
+          "x-go-name": "CanCreateOrgRepo"
+        },
+        "description": {
+          "type": "string",
+          "x-go-name": "Description"
+        },
+        "includes_all_repositories": {
+          "type": "boolean",
+          "x-go-name": "IncludesAllRepositories"
+        },
+        "name": {
+          "type": "string",
+          "x-go-name": "Name"
+        },
+        "permission": {
+          "type": "string",
+          "enum": [
+            "read",
+            "write",
+            "admin"
+          ],
+          "x-go-name": "Permission"
+        },
+        "units": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "Units",
+          "example": [
+            "repo.code",
+            "repo.issues",
+            "repo.ext_issues",
+            "repo.wiki",
+            "repo.pulls",
+            "repo.releases",
+            "repo.projects",
+            "repo.ext_wiki"
+          ]
+        },
+        "units_map": {
+          "type": "object",
+          "additionalProperties": {
+            "type": "string"
+          },
+          "x-go-name": "UnitsMap",
+          "example": {
+            "repo.code": "read",
+            "repo.ext_issues": "none",
+            "repo.ext_wiki": "none",
+            "repo.issues": "write",
+            "repo.projects": "none",
+            "repo.pulls": "owner",
+            "repo.releases": "none",
+            "repo.wiki": "admin"
+          }
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "EditUserOption": {
+      "description": "EditUserOption edit user options",
+      "type": "object",
+      "required": [
+        "source_id",
+        "login_name"
+      ],
+      "properties": {
+        "active": {
+          "type": "boolean",
+          "x-go-name": "Active"
+        },
+        "admin": {
+          "type": "boolean",
+          "x-go-name": "Admin"
+        },
+        "allow_create_organization": {
+          "type": "boolean",
+          "x-go-name": "AllowCreateOrganization"
+        },
+        "allow_git_hook": {
+          "type": "boolean",
+          "x-go-name": "AllowGitHook"
+        },
+        "allow_import_local": {
+          "type": "boolean",
+          "x-go-name": "AllowImportLocal"
+        },
+        "description": {
+          "type": "string",
+          "x-go-name": "Description"
+        },
+        "email": {
+          "type": "string",
+          "format": "email",
+          "x-go-name": "Email"
+        },
+        "full_name": {
+          "type": "string",
+          "x-go-name": "FullName"
+        },
+        "location": {
+          "type": "string",
+          "x-go-name": "Location"
+        },
+        "login_name": {
+          "type": "string",
+          "x-go-name": "LoginName"
+        },
+        "max_repo_creation": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "MaxRepoCreation"
+        },
+        "must_change_password": {
+          "type": "boolean",
+          "x-go-name": "MustChangePassword"
+        },
+        "password": {
+          "type": "string",
+          "x-go-name": "Password"
+        },
+        "prohibit_login": {
+          "type": "boolean",
+          "x-go-name": "ProhibitLogin"
+        },
+        "restricted": {
+          "type": "boolean",
+          "x-go-name": "Restricted"
+        },
+        "source_id": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "SourceID"
+        },
+        "visibility": {
+          "type": "string",
+          "x-go-name": "Visibility"
+        },
+        "website": {
+          "type": "string",
+          "x-go-name": "Website"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "Email": {
+      "description": "Email an email address belonging to a user",
+      "type": "object",
+      "properties": {
+        "email": {
+          "type": "string",
+          "format": "email",
+          "x-go-name": "Email"
+        },
+        "primary": {
+          "type": "boolean",
+          "x-go-name": "Primary"
+        },
+        "user_id": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "UserID"
+        },
+        "username": {
+          "type": "string",
+          "x-go-name": "UserName"
+        },
+        "verified": {
+          "type": "boolean",
+          "x-go-name": "Verified"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "ExternalTracker": {
+      "description": "ExternalTracker represents settings for external tracker",
+      "type": "object",
+      "properties": {
+        "external_tracker_format": {
+          "description": "External Issue Tracker URL Format. Use the placeholders {user}, {repo} and {index} for the username, repository name and issue index.",
+          "type": "string",
+          "x-go-name": "ExternalTrackerFormat"
+        },
+        "external_tracker_regexp_pattern": {
+          "description": "External Issue Tracker issue regular expression",
+          "type": "string",
+          "x-go-name": "ExternalTrackerRegexpPattern"
+        },
+        "external_tracker_style": {
+          "description": "External Issue Tracker Number Format, either `numeric`, `alphanumeric`, or `regexp`",
+          "type": "string",
+          "x-go-name": "ExternalTrackerStyle"
+        },
+        "external_tracker_url": {
+          "description": "URL of external issue tracker.",
+          "type": "string",
+          "x-go-name": "ExternalTrackerURL"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "ExternalWiki": {
+      "description": "ExternalWiki represents setting for external wiki",
+      "type": "object",
+      "properties": {
+        "external_wiki_url": {
+          "description": "URL of external wiki.",
+          "type": "string",
+          "x-go-name": "ExternalWikiURL"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "FileCommitResponse": {
+      "type": "object",
+      "title": "FileCommitResponse contains information generated from a Git commit for a repo's file.",
+      "properties": {
+        "author": {
+          "$ref": "#/definitions/CommitUser"
+        },
+        "committer": {
+          "$ref": "#/definitions/CommitUser"
+        },
+        "created": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Created"
+        },
+        "html_url": {
+          "type": "string",
+          "x-go-name": "HTMLURL"
+        },
+        "message": {
+          "type": "string",
+          "x-go-name": "Message"
+        },
+        "parents": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/CommitMeta"
+          },
+          "x-go-name": "Parents"
+        },
+        "sha": {
+          "type": "string",
+          "x-go-name": "SHA"
+        },
+        "tree": {
+          "$ref": "#/definitions/CommitMeta"
+        },
+        "url": {
+          "type": "string",
+          "x-go-name": "URL"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "FileDeleteResponse": {
+      "description": "FileDeleteResponse contains information about a repo's file that was deleted",
+      "type": "object",
+      "properties": {
+        "commit": {
+          "$ref": "#/definitions/FileCommitResponse"
+        },
+        "content": {
+          "x-go-name": "Content"
+        },
+        "verification": {
+          "$ref": "#/definitions/PayloadCommitVerification"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "FileLinksResponse": {
+      "description": "FileLinksResponse contains the links for a repo's file",
+      "type": "object",
+      "properties": {
+        "git": {
+          "type": "string",
+          "x-go-name": "GitURL"
+        },
+        "html": {
+          "type": "string",
+          "x-go-name": "HTMLURL"
+        },
+        "self": {
+          "type": "string",
+          "x-go-name": "Self"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "FileResponse": {
+      "description": "FileResponse contains information about a repo's file",
+      "type": "object",
+      "properties": {
+        "commit": {
+          "$ref": "#/definitions/FileCommitResponse"
+        },
+        "content": {
+          "$ref": "#/definitions/ContentsResponse"
+        },
+        "verification": {
+          "$ref": "#/definitions/PayloadCommitVerification"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "FilesResponse": {
+      "description": "FilesResponse contains information about multiple files from a repo",
+      "type": "object",
+      "properties": {
+        "commit": {
+          "$ref": "#/definitions/FileCommitResponse"
+        },
+        "files": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/ContentsResponse"
+          },
+          "x-go-name": "Files"
+        },
+        "verification": {
+          "$ref": "#/definitions/PayloadCommitVerification"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "GPGKey": {
+      "description": "GPGKey a user GPG key to sign commit and tag in repository",
+      "type": "object",
+      "properties": {
+        "can_certify": {
+          "type": "boolean",
+          "x-go-name": "CanCertify"
+        },
+        "can_encrypt_comms": {
+          "type": "boolean",
+          "x-go-name": "CanEncryptComms"
+        },
+        "can_encrypt_storage": {
+          "type": "boolean",
+          "x-go-name": "CanEncryptStorage"
+        },
+        "can_sign": {
+          "type": "boolean",
+          "x-go-name": "CanSign"
+        },
+        "created_at": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Created"
+        },
+        "emails": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/GPGKeyEmail"
+          },
+          "x-go-name": "Emails"
+        },
+        "expires_at": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Expires"
+        },
+        "id": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "ID"
+        },
+        "key_id": {
+          "type": "string",
+          "x-go-name": "KeyID"
+        },
+        "primary_key_id": {
+          "type": "string",
+          "x-go-name": "PrimaryKeyID"
+        },
+        "public_key": {
+          "type": "string",
+          "x-go-name": "PublicKey"
+        },
+        "subkeys": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/GPGKey"
+          },
+          "x-go-name": "SubsKey"
+        },
+        "verified": {
+          "type": "boolean",
+          "x-go-name": "Verified"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "GPGKeyEmail": {
+      "description": "GPGKeyEmail an email attached to a GPGKey",
+      "type": "object",
+      "properties": {
+        "email": {
+          "type": "string",
+          "x-go-name": "Email"
+        },
+        "verified": {
+          "type": "boolean",
+          "x-go-name": "Verified"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "GeneralAPISettings": {
+      "description": "GeneralAPISettings contains global api settings exposed by it",
+      "type": "object",
+      "properties": {
+        "default_git_trees_per_page": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "DefaultGitTreesPerPage"
+        },
+        "default_max_blob_size": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "DefaultMaxBlobSize"
+        },
+        "default_paging_num": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "DefaultPagingNum"
+        },
+        "max_response_items": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "MaxResponseItems"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "GeneralAttachmentSettings": {
+      "description": "GeneralAttachmentSettings contains global Attachment settings exposed by API",
+      "type": "object",
+      "properties": {
+        "allowed_types": {
+          "type": "string",
+          "x-go-name": "AllowedTypes"
+        },
+        "enabled": {
+          "type": "boolean",
+          "x-go-name": "Enabled"
+        },
+        "max_files": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "MaxFiles"
+        },
+        "max_size": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "MaxSize"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "GeneralRepoSettings": {
+      "description": "GeneralRepoSettings contains global repository settings exposed by API",
+      "type": "object",
+      "properties": {
+        "http_git_disabled": {
+          "type": "boolean",
+          "x-go-name": "HTTPGitDisabled"
+        },
+        "lfs_disabled": {
+          "type": "boolean",
+          "x-go-name": "LFSDisabled"
+        },
+        "migrations_disabled": {
+          "type": "boolean",
+          "x-go-name": "MigrationsDisabled"
+        },
+        "mirrors_disabled": {
+          "type": "boolean",
+          "x-go-name": "MirrorsDisabled"
+        },
+        "stars_disabled": {
+          "type": "boolean",
+          "x-go-name": "StarsDisabled"
+        },
+        "time_tracking_disabled": {
+          "type": "boolean",
+          "x-go-name": "TimeTrackingDisabled"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "GeneralUISettings": {
+      "description": "GeneralUISettings contains global ui settings exposed by API",
+      "type": "object",
+      "properties": {
+        "allowed_reactions": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "AllowedReactions"
+        },
+        "custom_emojis": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "CustomEmojis"
+        },
+        "default_theme": {
+          "type": "string",
+          "x-go-name": "DefaultTheme"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "GenerateRepoOption": {
+      "description": "GenerateRepoOption options when creating repository using a template",
+      "type": "object",
+      "required": [
+        "owner",
+        "name"
+      ],
+      "properties": {
+        "avatar": {
+          "description": "include avatar of the template repo",
+          "type": "boolean",
+          "x-go-name": "Avatar"
+        },
+        "default_branch": {
+          "description": "Default branch of the new repository",
+          "type": "string",
+          "x-go-name": "DefaultBranch"
+        },
+        "description": {
+          "description": "Description of the repository to create",
+          "type": "string",
+          "x-go-name": "Description"
+        },
+        "git_content": {
+          "description": "include git content of default branch in template repo",
+          "type": "boolean",
+          "x-go-name": "GitContent"
+        },
+        "git_hooks": {
+          "description": "include git hooks in template repo",
+          "type": "boolean",
+          "x-go-name": "GitHooks"
+        },
+        "labels": {
+          "description": "include labels in template repo",
+          "type": "boolean",
+          "x-go-name": "Labels"
+        },
+        "name": {
+          "description": "Name of the repository to create",
+          "type": "string",
+          "uniqueItems": true,
+          "x-go-name": "Name"
+        },
+        "owner": {
+          "description": "The organization or person who will own the new repository",
+          "type": "string",
+          "x-go-name": "Owner"
+        },
+        "private": {
+          "description": "Whether the repository is private",
+          "type": "boolean",
+          "x-go-name": "Private"
+        },
+        "protected_branch": {
+          "description": "include protected branches in template repo",
+          "type": "boolean",
+          "x-go-name": "ProtectedBranch"
+        },
+        "topics": {
+          "description": "include topics in template repo",
+          "type": "boolean",
+          "x-go-name": "Topics"
+        },
+        "webhooks": {
+          "description": "include webhooks in template repo",
+          "type": "boolean",
+          "x-go-name": "Webhooks"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "GitBlobResponse": {
+      "description": "GitBlobResponse represents a git blob",
+      "type": "object",
+      "properties": {
+        "content": {
+          "type": "string",
+          "x-go-name": "Content"
+        },
+        "encoding": {
+          "type": "string",
+          "x-go-name": "Encoding"
+        },
+        "sha": {
+          "type": "string",
+          "x-go-name": "SHA"
+        },
+        "size": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "Size"
+        },
+        "url": {
+          "type": "string",
+          "x-go-name": "URL"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "GitEntry": {
+      "description": "GitEntry represents a git tree",
+      "type": "object",
+      "properties": {
+        "mode": {
+          "type": "string",
+          "x-go-name": "Mode"
+        },
+        "path": {
+          "type": "string",
+          "x-go-name": "Path"
+        },
+        "sha": {
+          "type": "string",
+          "x-go-name": "SHA"
+        },
+        "size": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "Size"
+        },
+        "type": {
+          "type": "string",
+          "x-go-name": "Type"
+        },
+        "url": {
+          "type": "string",
+          "x-go-name": "URL"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "GitHook": {
+      "description": "GitHook represents a Git repository hook",
+      "type": "object",
+      "properties": {
+        "content": {
+          "type": "string",
+          "x-go-name": "Content"
+        },
+        "is_active": {
+          "type": "boolean",
+          "x-go-name": "IsActive"
+        },
+        "name": {
+          "type": "string",
+          "x-go-name": "Name"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "GitObject": {
+      "type": "object",
+      "title": "GitObject represents a Git object.",
+      "properties": {
+        "sha": {
+          "type": "string",
+          "x-go-name": "SHA"
+        },
+        "type": {
+          "type": "string",
+          "x-go-name": "Type"
+        },
+        "url": {
+          "type": "string",
+          "x-go-name": "URL"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "GitTreeResponse": {
+      "description": "GitTreeResponse returns a git tree",
+      "type": "object",
+      "properties": {
+        "page": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "Page"
+        },
+        "sha": {
+          "type": "string",
+          "x-go-name": "SHA"
+        },
+        "total_count": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "TotalCount"
+        },
+        "tree": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/GitEntry"
+          },
+          "x-go-name": "Entries"
+        },
+        "truncated": {
+          "type": "boolean",
+          "x-go-name": "Truncated"
+        },
+        "url": {
+          "type": "string",
+          "x-go-name": "URL"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "GitignoreTemplateInfo": {
+      "description": "GitignoreTemplateInfo name and text of a gitignore template",
+      "type": "object",
+      "properties": {
+        "name": {
+          "type": "string",
+          "x-go-name": "Name"
+        },
+        "source": {
+          "type": "string",
+          "x-go-name": "Source"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "Hook": {
+      "description": "Hook a hook is a web hook when one repository changed",
+      "type": "object",
+      "properties": {
+        "active": {
+          "type": "boolean",
+          "x-go-name": "Active"
+        },
+        "authorization_header": {
+          "type": "string",
+          "x-go-name": "AuthorizationHeader"
+        },
+        "branch_filter": {
+          "type": "string",
+          "x-go-name": "BranchFilter"
+        },
+        "config": {
+          "type": "object",
+          "additionalProperties": {
+            "type": "string"
+          },
+          "x-go-name": "Config"
+        },
+        "created_at": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Created"
+        },
+        "events": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "Events"
+        },
+        "id": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "ID"
+        },
+        "type": {
+          "type": "string",
+          "x-go-name": "Type"
+        },
+        "updated_at": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Updated"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "Identity": {
+      "description": "Identity for a person's identity like an author or committer",
+      "type": "object",
+      "properties": {
+        "email": {
+          "type": "string",
+          "format": "email",
+          "x-go-name": "Email"
+        },
+        "name": {
+          "type": "string",
+          "x-go-name": "Name"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "InternalTracker": {
+      "description": "InternalTracker represents settings for internal tracker",
+      "type": "object",
+      "properties": {
+        "allow_only_contributors_to_track_time": {
+          "description": "Let only contributors track time (Built-in issue tracker)",
+          "type": "boolean",
+          "x-go-name": "AllowOnlyContributorsToTrackTime"
+        },
+        "enable_issue_dependencies": {
+          "description": "Enable dependencies for issues and pull requests (Built-in issue tracker)",
+          "type": "boolean",
+          "x-go-name": "EnableIssueDependencies"
+        },
+        "enable_time_tracker": {
+          "description": "Enable time tracking (Built-in issue tracker)",
+          "type": "boolean",
+          "x-go-name": "EnableTimeTracker"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "Issue": {
+      "description": "Issue represents an issue in a repository",
+      "type": "object",
+      "properties": {
+        "assets": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/Attachment"
+          },
+          "x-go-name": "Attachments"
+        },
+        "assignee": {
+          "$ref": "#/definitions/User"
+        },
+        "assignees": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/User"
+          },
+          "x-go-name": "Assignees"
+        },
+        "body": {
+          "type": "string",
+          "x-go-name": "Body"
+        },
+        "closed_at": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Closed"
+        },
+        "comments": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "Comments"
+        },
+        "created_at": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Created"
+        },
+        "due_date": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Deadline"
+        },
+        "html_url": {
+          "type": "string",
+          "x-go-name": "HTMLURL"
+        },
+        "id": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "ID"
+        },
+        "is_locked": {
+          "type": "boolean",
+          "x-go-name": "IsLocked"
+        },
+        "labels": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/Label"
+          },
+          "x-go-name": "Labels"
+        },
+        "milestone": {
+          "$ref": "#/definitions/Milestone"
+        },
+        "number": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "Index"
+        },
+        "original_author": {
+          "type": "string",
+          "x-go-name": "OriginalAuthor"
+        },
+        "original_author_id": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "OriginalAuthorID"
+        },
+        "pin_order": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "PinOrder"
+        },
+        "pull_request": {
+          "$ref": "#/definitions/PullRequestMeta"
+        },
+        "ref": {
+          "type": "string",
+          "x-go-name": "Ref"
+        },
+        "repository": {
+          "$ref": "#/definitions/RepositoryMeta"
+        },
+        "state": {
+          "$ref": "#/definitions/StateType"
+        },
+        "title": {
+          "type": "string",
+          "x-go-name": "Title"
+        },
+        "updated_at": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Updated"
+        },
+        "url": {
+          "type": "string",
+          "x-go-name": "URL"
+        },
+        "user": {
+          "$ref": "#/definitions/User"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "IssueConfig": {
+      "type": "object",
+      "properties": {
+        "blank_issues_enabled": {
+          "type": "boolean",
+          "x-go-name": "BlankIssuesEnabled"
+        },
+        "contact_links": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/IssueConfigContactLink"
+          },
+          "x-go-name": "ContactLinks"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "IssueConfigContactLink": {
+      "type": "object",
+      "properties": {
+        "about": {
+          "type": "string",
+          "x-go-name": "About"
+        },
+        "name": {
+          "type": "string",
+          "x-go-name": "Name"
+        },
+        "url": {
+          "type": "string",
+          "x-go-name": "URL"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "IssueConfigValidation": {
+      "type": "object",
+      "properties": {
+        "message": {
+          "type": "string",
+          "x-go-name": "Message"
+        },
+        "valid": {
+          "type": "boolean",
+          "x-go-name": "Valid"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "IssueDeadline": {
+      "description": "IssueDeadline represents an issue deadline",
+      "type": "object",
+      "properties": {
+        "due_date": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Deadline"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "IssueFormField": {
+      "description": "IssueFormField represents a form field",
+      "type": "object",
+      "properties": {
+        "attributes": {
+          "type": "object",
+          "additionalProperties": {},
+          "x-go-name": "Attributes"
+        },
+        "id": {
+          "type": "string",
+          "x-go-name": "ID"
+        },
+        "type": {
+          "$ref": "#/definitions/IssueFormFieldType"
+        },
+        "validations": {
+          "type": "object",
+          "additionalProperties": {},
+          "x-go-name": "Validations"
+        },
+        "visible": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/IssueFormFieldVisible"
+          },
+          "x-go-name": "Visible"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "IssueFormFieldType": {
+      "type": "string",
+      "title": "IssueFormFieldType defines issue form field type, can be \"markdown\", \"textarea\", \"input\", \"dropdown\" or \"checkboxes\"",
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "IssueFormFieldVisible": {
+      "description": "IssueFormFieldVisible defines issue form field visible",
+      "type": "string",
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "IssueLabelsOption": {
+      "description": "IssueLabelsOption a collection of labels",
+      "type": "object",
+      "properties": {
+        "labels": {
+          "description": "Labels can be a list of integers representing label IDs\nor a list of strings representing label names",
+          "type": "array",
+          "items": {},
+          "x-go-name": "Labels"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "IssueMeta": {
+      "description": "IssueMeta basic issue information",
+      "type": "object",
+      "properties": {
+        "index": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "Index"
+        },
+        "owner": {
+          "type": "string",
+          "x-go-name": "Owner"
+        },
+        "repo": {
+          "type": "string",
+          "x-go-name": "Name"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "IssueTemplate": {
+      "description": "IssueTemplate represents an issue template for a repository",
+      "type": "object",
+      "properties": {
+        "about": {
+          "type": "string",
+          "x-go-name": "About"
+        },
+        "body": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/IssueFormField"
+          },
+          "x-go-name": "Fields"
+        },
+        "content": {
+          "type": "string",
+          "x-go-name": "Content"
+        },
+        "file_name": {
+          "type": "string",
+          "x-go-name": "FileName"
+        },
+        "labels": {
+          "$ref": "#/definitions/IssueTemplateLabels"
+        },
+        "name": {
+          "type": "string",
+          "x-go-name": "Name"
+        },
+        "ref": {
+          "type": "string",
+          "x-go-name": "Ref"
+        },
+        "title": {
+          "type": "string",
+          "x-go-name": "Title"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "IssueTemplateLabels": {
+      "type": "array",
+      "items": {
+        "type": "string"
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "Label": {
+      "description": "Label a label to an issue or a pr",
+      "type": "object",
+      "properties": {
+        "color": {
+          "type": "string",
+          "x-go-name": "Color",
+          "example": "00aabb"
+        },
+        "description": {
+          "type": "string",
+          "x-go-name": "Description"
+        },
+        "exclusive": {
+          "type": "boolean",
+          "x-go-name": "Exclusive",
+          "example": false
+        },
+        "id": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "ID"
+        },
+        "is_archived": {
+          "type": "boolean",
+          "x-go-name": "IsArchived",
+          "example": false
+        },
+        "name": {
+          "type": "string",
+          "x-go-name": "Name"
+        },
+        "url": {
+          "type": "string",
+          "x-go-name": "URL"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "LabelTemplate": {
+      "description": "LabelTemplate info of a Label template",
+      "type": "object",
+      "properties": {
+        "color": {
+          "type": "string",
+          "x-go-name": "Color",
+          "example": "00aabb"
+        },
+        "description": {
+          "type": "string",
+          "x-go-name": "Description"
+        },
+        "exclusive": {
+          "type": "boolean",
+          "x-go-name": "Exclusive",
+          "example": false
+        },
+        "name": {
+          "type": "string",
+          "x-go-name": "Name"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "LicenseTemplateInfo": {
+      "description": "LicensesInfo contains information about a License",
+      "type": "object",
+      "properties": {
+        "body": {
+          "type": "string",
+          "x-go-name": "Body"
+        },
+        "implementation": {
+          "type": "string",
+          "x-go-name": "Implementation"
+        },
+        "key": {
+          "type": "string",
+          "x-go-name": "Key"
+        },
+        "name": {
+          "type": "string",
+          "x-go-name": "Name"
+        },
+        "url": {
+          "type": "string",
+          "x-go-name": "URL"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "LicensesTemplateListEntry": {
+      "description": "LicensesListEntry is used for the API",
+      "type": "object",
+      "properties": {
+        "key": {
+          "type": "string",
+          "x-go-name": "Key"
+        },
+        "name": {
+          "type": "string",
+          "x-go-name": "Name"
+        },
+        "url": {
+          "type": "string",
+          "x-go-name": "URL"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "MarkdownOption": {
+      "description": "MarkdownOption markdown options",
+      "type": "object",
+      "properties": {
+        "Context": {
+          "description": "URL path for rendering issue, media and file links\nExpected format: /subpath/{user}/{repo}/src/{branch, commit, tag}/{identifier/path}/{file/dir}\n\nin: body",
+          "type": "string"
+        },
+        "Mode": {
+          "description": "Mode to render (comment, gfm, markdown)\n\nin: body",
+          "type": "string"
+        },
+        "Text": {
+          "description": "Text markdown to render\n\nin: body",
+          "type": "string"
+        },
+        "Wiki": {
+          "description": "Is it a wiki page ?\n\nin: body",
+          "type": "boolean"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "MarkupOption": {
+      "description": "MarkupOption markup options",
+      "type": "object",
+      "properties": {
+        "Context": {
+          "description": "URL path for rendering issue, media and file links\nExpected format: /subpath/{user}/{repo}/src/{branch, commit, tag}/{identifier/path}/{file/dir}\n\nin: body",
+          "type": "string"
+        },
+        "FilePath": {
+          "description": "File path for detecting extension in file mode\n\nin: body",
+          "type": "string"
+        },
+        "Mode": {
+          "description": "Mode to render (comment, gfm, markdown, file)\n\nin: body",
+          "type": "string"
+        },
+        "Text": {
+          "description": "Text markup to render\n\nin: body",
+          "type": "string"
+        },
+        "Wiki": {
+          "description": "Is it a wiki page ?\n\nin: body",
+          "type": "boolean"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "MergePullRequestOption": {
+      "description": "MergePullRequestForm form for merging Pull Request",
+      "type": "object",
+      "required": [
+        "Do"
+      ],
+      "properties": {
+        "Do": {
+          "type": "string",
+          "enum": [
+            "merge",
+            "rebase",
+            "rebase-merge",
+            "squash",
+            "fast-forward-only",
+            "manually-merged"
+          ]
+        },
+        "MergeCommitID": {
+          "type": "string"
+        },
+        "MergeMessageField": {
+          "type": "string"
+        },
+        "MergeTitleField": {
+          "type": "string"
+        },
+        "delete_branch_after_merge": {
+          "type": "boolean",
+          "x-go-name": "DeleteBranchAfterMerge"
+        },
+        "force_merge": {
+          "type": "boolean",
+          "x-go-name": "ForceMerge"
+        },
+        "head_commit_id": {
+          "type": "string",
+          "x-go-name": "HeadCommitID"
+        },
+        "merge_when_checks_succeed": {
+          "type": "boolean",
+          "x-go-name": "MergeWhenChecksSucceed"
+        }
+      },
+      "x-go-name": "MergePullRequestForm",
+      "x-go-package": "code.gitea.io/gitea/services/forms"
+    },
+    "MigrateRepoOptions": {
+      "description": "MigrateRepoOptions options for migrating repository's\nthis is used to interact with api v1",
+      "type": "object",
+      "required": [
+        "clone_addr",
+        "repo_name"
+      ],
+      "properties": {
+        "auth_password": {
+          "type": "string",
+          "x-go-name": "AuthPassword"
+        },
+        "auth_token": {
+          "type": "string",
+          "x-go-name": "AuthToken"
+        },
+        "auth_username": {
+          "type": "string",
+          "x-go-name": "AuthUsername"
+        },
+        "clone_addr": {
+          "type": "string",
+          "x-go-name": "CloneAddr"
+        },
+        "description": {
+          "type": "string",
+          "x-go-name": "Description"
+        },
+        "issues": {
+          "type": "boolean",
+          "x-go-name": "Issues"
+        },
+        "labels": {
+          "type": "boolean",
+          "x-go-name": "Labels"
+        },
+        "lfs": {
+          "type": "boolean",
+          "x-go-name": "LFS"
+        },
+        "lfs_endpoint": {
+          "type": "string",
+          "x-go-name": "LFSEndpoint"
+        },
+        "milestones": {
+          "type": "boolean",
+          "x-go-name": "Milestones"
+        },
+        "mirror": {
+          "type": "boolean",
+          "x-go-name": "Mirror"
+        },
+        "mirror_interval": {
+          "type": "string",
+          "x-go-name": "MirrorInterval"
+        },
+        "private": {
+          "type": "boolean",
+          "x-go-name": "Private"
+        },
+        "pull_requests": {
+          "type": "boolean",
+          "x-go-name": "PullRequests"
+        },
+        "releases": {
+          "type": "boolean",
+          "x-go-name": "Releases"
+        },
+        "repo_name": {
+          "type": "string",
+          "x-go-name": "RepoName"
+        },
+        "repo_owner": {
+          "description": "Name of User or Organisation who will own Repo after migration",
+          "type": "string",
+          "x-go-name": "RepoOwner"
+        },
+        "service": {
+          "type": "string",
+          "enum": [
+            "git",
+            "github",
+            "gitea",
+            "gitlab",
+            "gogs",
+            "onedev",
+            "gitbucket",
+            "codebase"
+          ],
+          "x-go-name": "Service"
+        },
+        "uid": {
+          "description": "deprecated (only for backwards compatibility)",
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "RepoOwnerID"
+        },
+        "wiki": {
+          "type": "boolean",
+          "x-go-name": "Wiki"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "Milestone": {
+      "description": "Milestone milestone is a collection of issues on one repository",
+      "type": "object",
+      "properties": {
+        "closed_at": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Closed"
+        },
+        "closed_issues": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "ClosedIssues"
+        },
+        "created_at": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Created"
+        },
+        "description": {
+          "type": "string",
+          "x-go-name": "Description"
+        },
+        "due_on": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Deadline"
+        },
+        "id": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "ID"
+        },
+        "open_issues": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "OpenIssues"
+        },
+        "state": {
+          "$ref": "#/definitions/StateType"
+        },
+        "title": {
+          "type": "string",
+          "x-go-name": "Title"
+        },
+        "updated_at": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Updated"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "NewIssuePinsAllowed": {
+      "description": "NewIssuePinsAllowed represents an API response that says if new Issue Pins are allowed",
+      "type": "object",
+      "properties": {
+        "issues": {
+          "type": "boolean",
+          "x-go-name": "Issues"
+        },
+        "pull_requests": {
+          "type": "boolean",
+          "x-go-name": "PullRequests"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "NodeInfo": {
+      "description": "NodeInfo contains standardized way of exposing metadata about a server running one of the distributed social networks",
+      "type": "object",
+      "properties": {
+        "metadata": {
+          "type": "object",
+          "x-go-name": "Metadata"
+        },
+        "openRegistrations": {
+          "type": "boolean",
+          "x-go-name": "OpenRegistrations"
+        },
+        "protocols": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "Protocols"
+        },
+        "services": {
+          "$ref": "#/definitions/NodeInfoServices"
+        },
+        "software": {
+          "$ref": "#/definitions/NodeInfoSoftware"
+        },
+        "usage": {
+          "$ref": "#/definitions/NodeInfoUsage"
+        },
+        "version": {
+          "type": "string",
+          "x-go-name": "Version"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "NodeInfoServices": {
+      "description": "NodeInfoServices contains the third party sites this server can connect to via their application API",
+      "type": "object",
+      "properties": {
+        "inbound": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "Inbound"
+        },
+        "outbound": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "Outbound"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "NodeInfoSoftware": {
+      "description": "NodeInfoSoftware contains Metadata about server software in use",
+      "type": "object",
+      "properties": {
+        "homepage": {
+          "type": "string",
+          "x-go-name": "Homepage"
+        },
+        "name": {
+          "type": "string",
+          "x-go-name": "Name"
+        },
+        "repository": {
+          "type": "string",
+          "x-go-name": "Repository"
+        },
+        "version": {
+          "type": "string",
+          "x-go-name": "Version"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "NodeInfoUsage": {
+      "description": "NodeInfoUsage contains usage statistics for this server",
+      "type": "object",
+      "properties": {
+        "localComments": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "LocalComments"
+        },
+        "localPosts": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "LocalPosts"
+        },
+        "users": {
+          "$ref": "#/definitions/NodeInfoUsageUsers"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "NodeInfoUsageUsers": {
+      "description": "NodeInfoUsageUsers contains statistics about the users of this server",
+      "type": "object",
+      "properties": {
+        "activeHalfyear": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "ActiveHalfyear"
+        },
+        "activeMonth": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "ActiveMonth"
+        },
+        "total": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "Total"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "Note": {
+      "description": "Note contains information related to a git note",
+      "type": "object",
+      "properties": {
+        "commit": {
+          "$ref": "#/definitions/Commit"
+        },
+        "message": {
+          "type": "string",
+          "x-go-name": "Message"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "NotificationCount": {
+      "description": "NotificationCount number of unread notifications",
+      "type": "object",
+      "properties": {
+        "new": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "New"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "NotificationSubject": {
+      "description": "NotificationSubject contains the notification subject (Issue/Pull/Commit)",
+      "type": "object",
+      "properties": {
+        "html_url": {
+          "type": "string",
+          "x-go-name": "HTMLURL"
+        },
+        "latest_comment_html_url": {
+          "type": "string",
+          "x-go-name": "LatestCommentHTMLURL"
+        },
+        "latest_comment_url": {
+          "type": "string",
+          "x-go-name": "LatestCommentURL"
+        },
+        "state": {
+          "$ref": "#/definitions/StateType"
+        },
+        "title": {
+          "type": "string",
+          "x-go-name": "Title"
+        },
+        "type": {
+          "$ref": "#/definitions/NotifySubjectType"
+        },
+        "url": {
+          "type": "string",
+          "x-go-name": "URL"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "NotificationThread": {
+      "description": "NotificationThread expose Notification on API",
+      "type": "object",
+      "properties": {
+        "id": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "ID"
+        },
+        "pinned": {
+          "type": "boolean",
+          "x-go-name": "Pinned"
+        },
+        "repository": {
+          "$ref": "#/definitions/Repository"
+        },
+        "subject": {
+          "$ref": "#/definitions/NotificationSubject"
+        },
+        "unread": {
+          "type": "boolean",
+          "x-go-name": "Unread"
+        },
+        "updated_at": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "UpdatedAt"
+        },
+        "url": {
+          "type": "string",
+          "x-go-name": "URL"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "NotifySubjectType": {
+      "description": "NotifySubjectType represent type of notification subject",
+      "type": "string",
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "OAuth2Application": {
+      "type": "object",
+      "title": "OAuth2Application represents an OAuth2 application.",
+      "properties": {
+        "client_id": {
+          "type": "string",
+          "x-go-name": "ClientID"
+        },
+        "client_secret": {
+          "type": "string",
+          "x-go-name": "ClientSecret"
+        },
+        "confidential_client": {
+          "type": "boolean",
+          "x-go-name": "ConfidentialClient"
+        },
+        "created": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Created"
+        },
+        "id": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "ID"
+        },
+        "name": {
+          "type": "string",
+          "x-go-name": "Name"
+        },
+        "redirect_uris": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "RedirectURIs"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "Organization": {
+      "description": "Organization represents an organization",
+      "type": "object",
+      "properties": {
+        "avatar_url": {
+          "type": "string",
+          "x-go-name": "AvatarURL"
+        },
+        "description": {
+          "type": "string",
+          "x-go-name": "Description"
+        },
+        "email": {
+          "type": "string",
+          "x-go-name": "Email"
+        },
+        "full_name": {
+          "type": "string",
+          "x-go-name": "FullName"
+        },
+        "id": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "ID"
+        },
+        "location": {
+          "type": "string",
+          "x-go-name": "Location"
+        },
+        "name": {
+          "type": "string",
+          "x-go-name": "Name"
+        },
+        "repo_admin_change_team_access": {
+          "type": "boolean",
+          "x-go-name": "RepoAdminChangeTeamAccess"
+        },
+        "username": {
+          "description": "deprecated",
+          "type": "string",
+          "x-go-name": "UserName"
+        },
+        "visibility": {
+          "type": "string",
+          "x-go-name": "Visibility"
+        },
+        "website": {
+          "type": "string",
+          "x-go-name": "Website"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "OrganizationPermissions": {
+      "description": "OrganizationPermissions list different users permissions on an organization",
+      "type": "object",
+      "properties": {
+        "can_create_repository": {
+          "type": "boolean",
+          "x-go-name": "CanCreateRepository"
+        },
+        "can_read": {
+          "type": "boolean",
+          "x-go-name": "CanRead"
+        },
+        "can_write": {
+          "type": "boolean",
+          "x-go-name": "CanWrite"
+        },
+        "is_admin": {
+          "type": "boolean",
+          "x-go-name": "IsAdmin"
+        },
+        "is_owner": {
+          "type": "boolean",
+          "x-go-name": "IsOwner"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "PRBranchInfo": {
+      "description": "PRBranchInfo information about a branch",
+      "type": "object",
+      "properties": {
+        "label": {
+          "type": "string",
+          "x-go-name": "Name"
+        },
+        "ref": {
+          "type": "string",
+          "x-go-name": "Ref"
+        },
+        "repo": {
+          "$ref": "#/definitions/Repository"
+        },
+        "repo_id": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "RepoID"
+        },
+        "sha": {
+          "type": "string",
+          "x-go-name": "Sha"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "Package": {
+      "description": "Package represents a package",
+      "type": "object",
+      "properties": {
+        "created_at": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "CreatedAt"
+        },
+        "creator": {
+          "$ref": "#/definitions/User"
+        },
+        "html_url": {
+          "type": "string",
+          "x-go-name": "HTMLURL"
+        },
+        "id": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "ID"
+        },
+        "name": {
+          "type": "string",
+          "x-go-name": "Name"
+        },
+        "owner": {
+          "$ref": "#/definitions/User"
+        },
+        "repository": {
+          "$ref": "#/definitions/Repository"
+        },
+        "type": {
+          "type": "string",
+          "x-go-name": "Type"
+        },
+        "version": {
+          "type": "string",
+          "x-go-name": "Version"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "PackageFile": {
+      "description": "PackageFile represents a package file",
+      "type": "object",
+      "properties": {
+        "Size": {
+          "type": "integer",
+          "format": "int64"
+        },
+        "id": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "ID"
+        },
+        "md5": {
+          "type": "string",
+          "x-go-name": "HashMD5"
+        },
+        "name": {
+          "type": "string",
+          "x-go-name": "Name"
+        },
+        "sha1": {
+          "type": "string",
+          "x-go-name": "HashSHA1"
+        },
+        "sha256": {
+          "type": "string",
+          "x-go-name": "HashSHA256"
+        },
+        "sha512": {
+          "type": "string",
+          "x-go-name": "HashSHA512"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "PayloadCommit": {
+      "description": "PayloadCommit represents a commit",
+      "type": "object",
+      "properties": {
+        "added": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "Added"
+        },
+        "author": {
+          "$ref": "#/definitions/PayloadUser"
+        },
+        "committer": {
+          "$ref": "#/definitions/PayloadUser"
+        },
+        "id": {
+          "description": "sha1 hash of the commit",
+          "type": "string",
+          "x-go-name": "ID"
+        },
+        "message": {
+          "type": "string",
+          "x-go-name": "Message"
+        },
+        "modified": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "Modified"
+        },
+        "removed": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "Removed"
+        },
+        "timestamp": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Timestamp"
+        },
+        "url": {
+          "type": "string",
+          "x-go-name": "URL"
+        },
+        "verification": {
+          "$ref": "#/definitions/PayloadCommitVerification"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "PayloadCommitVerification": {
+      "description": "PayloadCommitVerification represents the GPG verification of a commit",
+      "type": "object",
+      "properties": {
+        "payload": {
+          "type": "string",
+          "x-go-name": "Payload"
+        },
+        "reason": {
+          "type": "string",
+          "x-go-name": "Reason"
+        },
+        "signature": {
+          "type": "string",
+          "x-go-name": "Signature"
+        },
+        "signer": {
+          "$ref": "#/definitions/PayloadUser"
+        },
+        "verified": {
+          "type": "boolean",
+          "x-go-name": "Verified"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "PayloadUser": {
+      "description": "PayloadUser represents the author or committer of a commit",
+      "type": "object",
+      "properties": {
+        "email": {
+          "type": "string",
+          "format": "email",
+          "x-go-name": "Email"
+        },
+        "name": {
+          "description": "Full name of the commit author",
+          "type": "string",
+          "x-go-name": "Name"
+        },
+        "username": {
+          "type": "string",
+          "x-go-name": "UserName"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "Permission": {
+      "description": "Permission represents a set of permissions",
+      "type": "object",
+      "properties": {
+        "admin": {
+          "type": "boolean",
+          "x-go-name": "Admin"
+        },
+        "pull": {
+          "type": "boolean",
+          "x-go-name": "Pull"
+        },
+        "push": {
+          "type": "boolean",
+          "x-go-name": "Push"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "PublicKey": {
+      "description": "PublicKey publickey is a user key to push code to repository",
+      "type": "object",
+      "properties": {
+        "created_at": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Created"
+        },
+        "fingerprint": {
+          "type": "string",
+          "x-go-name": "Fingerprint"
+        },
+        "id": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "ID"
+        },
+        "key": {
+          "type": "string",
+          "x-go-name": "Key"
+        },
+        "key_type": {
+          "type": "string",
+          "x-go-name": "KeyType"
+        },
+        "read_only": {
+          "type": "boolean",
+          "x-go-name": "ReadOnly"
+        },
+        "title": {
+          "type": "string",
+          "x-go-name": "Title"
+        },
+        "url": {
+          "type": "string",
+          "x-go-name": "URL"
+        },
+        "user": {
+          "$ref": "#/definitions/User"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "PullRequest": {
+      "description": "PullRequest represents a pull request",
+      "type": "object",
+      "properties": {
+        "additions": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "Additions"
+        },
+        "allow_maintainer_edit": {
+          "type": "boolean",
+          "x-go-name": "AllowMaintainerEdit"
+        },
+        "assignee": {
+          "$ref": "#/definitions/User"
+        },
+        "assignees": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/User"
+          },
+          "x-go-name": "Assignees"
+        },
+        "base": {
+          "$ref": "#/definitions/PRBranchInfo"
+        },
+        "body": {
+          "type": "string",
+          "x-go-name": "Body"
+        },
+        "changed_files": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "ChangedFiles"
+        },
+        "closed_at": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Closed"
+        },
+        "comments": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "Comments"
+        },
+        "created_at": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Created"
+        },
+        "deletions": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "Deletions"
+        },
+        "diff_url": {
+          "type": "string",
+          "x-go-name": "DiffURL"
+        },
+        "draft": {
+          "type": "boolean",
+          "x-go-name": "Draft"
+        },
+        "due_date": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Deadline"
+        },
+        "head": {
+          "$ref": "#/definitions/PRBranchInfo"
+        },
+        "html_url": {
+          "type": "string",
+          "x-go-name": "HTMLURL"
+        },
+        "id": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "ID"
+        },
+        "is_locked": {
+          "type": "boolean",
+          "x-go-name": "IsLocked"
+        },
+        "labels": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/Label"
+          },
+          "x-go-name": "Labels"
+        },
+        "merge_base": {
+          "type": "string",
+          "x-go-name": "MergeBase"
+        },
+        "merge_commit_sha": {
+          "type": "string",
+          "x-go-name": "MergedCommitID"
+        },
+        "mergeable": {
+          "type": "boolean",
+          "x-go-name": "Mergeable"
+        },
+        "merged": {
+          "type": "boolean",
+          "x-go-name": "HasMerged"
+        },
+        "merged_at": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Merged"
+        },
+        "merged_by": {
+          "$ref": "#/definitions/User"
+        },
+        "milestone": {
+          "$ref": "#/definitions/Milestone"
+        },
+        "number": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "Index"
+        },
+        "patch_url": {
+          "type": "string",
+          "x-go-name": "PatchURL"
+        },
+        "pin_order": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "PinOrder"
+        },
+        "requested_reviewers": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/User"
+          },
+          "x-go-name": "RequestedReviewers"
+        },
+        "review_comments": {
+          "description": "number of review comments made on the diff of a PR review (not including comments on commits or issues in a PR)",
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "ReviewComments"
+        },
+        "state": {
+          "$ref": "#/definitions/StateType"
+        },
+        "title": {
+          "type": "string",
+          "x-go-name": "Title"
+        },
+        "updated_at": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Updated"
+        },
+        "url": {
+          "type": "string",
+          "x-go-name": "URL"
+        },
+        "user": {
+          "$ref": "#/definitions/User"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "PullRequestMeta": {
+      "description": "PullRequestMeta PR info if an issue is a PR",
+      "type": "object",
+      "properties": {
+        "draft": {
+          "type": "boolean",
+          "x-go-name": "IsWorkInProgress"
+        },
+        "html_url": {
+          "type": "string",
+          "x-go-name": "HTMLURL"
+        },
+        "merged": {
+          "type": "boolean",
+          "x-go-name": "HasMerged"
+        },
+        "merged_at": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Merged"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "PullReview": {
+      "description": "PullReview represents a pull request review",
+      "type": "object",
+      "properties": {
+        "body": {
+          "type": "string",
+          "x-go-name": "Body"
+        },
+        "comments_count": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "CodeCommentsCount"
+        },
+        "commit_id": {
+          "type": "string",
+          "x-go-name": "CommitID"
+        },
+        "dismissed": {
+          "type": "boolean",
+          "x-go-name": "Dismissed"
+        },
+        "html_url": {
+          "type": "string",
+          "x-go-name": "HTMLURL"
+        },
+        "id": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "ID"
+        },
+        "official": {
+          "type": "boolean",
+          "x-go-name": "Official"
+        },
+        "pull_request_url": {
+          "type": "string",
+          "x-go-name": "HTMLPullURL"
+        },
+        "stale": {
+          "type": "boolean",
+          "x-go-name": "Stale"
+        },
+        "state": {
+          "$ref": "#/definitions/ReviewStateType"
+        },
+        "submitted_at": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Submitted"
+        },
+        "team": {
+          "$ref": "#/definitions/Team"
+        },
+        "updated_at": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Updated"
+        },
+        "user": {
+          "$ref": "#/definitions/User"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "PullReviewComment": {
+      "description": "PullReviewComment represents a comment on a pull request review",
+      "type": "object",
+      "properties": {
+        "body": {
+          "type": "string",
+          "x-go-name": "Body"
+        },
+        "commit_id": {
+          "type": "string",
+          "x-go-name": "CommitID"
+        },
+        "created_at": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Created"
+        },
+        "diff_hunk": {
+          "type": "string",
+          "x-go-name": "DiffHunk"
+        },
+        "html_url": {
+          "type": "string",
+          "x-go-name": "HTMLURL"
+        },
+        "id": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "ID"
+        },
+        "original_commit_id": {
+          "type": "string",
+          "x-go-name": "OrigCommitID"
+        },
+        "original_position": {
+          "type": "integer",
+          "format": "uint64",
+          "x-go-name": "OldLineNum"
+        },
+        "path": {
+          "type": "string",
+          "x-go-name": "Path"
+        },
+        "position": {
+          "type": "integer",
+          "format": "uint64",
+          "x-go-name": "LineNum"
+        },
+        "pull_request_review_id": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "ReviewID"
+        },
+        "pull_request_url": {
+          "type": "string",
+          "x-go-name": "HTMLPullURL"
+        },
+        "resolver": {
+          "$ref": "#/definitions/User"
+        },
+        "updated_at": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Updated"
+        },
+        "user": {
+          "$ref": "#/definitions/User"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "PullReviewRequestOptions": {
+      "description": "PullReviewRequestOptions are options to add or remove pull review requests",
+      "type": "object",
+      "properties": {
+        "reviewers": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "Reviewers"
+        },
+        "team_reviewers": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "TeamReviewers"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "PushMirror": {
+      "description": "PushMirror represents information of a push mirror",
+      "type": "object",
+      "properties": {
+        "created": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "CreatedUnix"
+        },
+        "interval": {
+          "type": "string",
+          "x-go-name": "Interval"
+        },
+        "last_error": {
+          "type": "string",
+          "x-go-name": "LastError"
+        },
+        "last_update": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "LastUpdateUnix"
+        },
+        "remote_address": {
+          "type": "string",
+          "x-go-name": "RemoteAddress"
+        },
+        "remote_name": {
+          "type": "string",
+          "x-go-name": "RemoteName"
+        },
+        "repo_name": {
+          "type": "string",
+          "x-go-name": "RepoName"
+        },
+        "sync_on_commit": {
+          "type": "boolean",
+          "x-go-name": "SyncOnCommit"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "Reaction": {
+      "description": "Reaction contain one reaction",
+      "type": "object",
+      "properties": {
+        "content": {
+          "type": "string",
+          "x-go-name": "Reaction"
+        },
+        "created_at": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Created"
+        },
+        "user": {
+          "$ref": "#/definitions/User"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "Reference": {
+      "type": "object",
+      "title": "Reference represents a Git reference.",
+      "properties": {
+        "object": {
+          "$ref": "#/definitions/GitObject"
+        },
+        "ref": {
+          "type": "string",
+          "x-go-name": "Ref"
+        },
+        "url": {
+          "type": "string",
+          "x-go-name": "URL"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "Release": {
+      "description": "Release represents a repository release",
+      "type": "object",
+      "properties": {
+        "assets": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/Attachment"
+          },
+          "x-go-name": "Attachments"
+        },
+        "author": {
+          "$ref": "#/definitions/User"
+        },
+        "body": {
+          "type": "string",
+          "x-go-name": "Note"
+        },
+        "created_at": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "CreatedAt"
+        },
+        "draft": {
+          "type": "boolean",
+          "x-go-name": "IsDraft"
+        },
+        "html_url": {
+          "type": "string",
+          "x-go-name": "HTMLURL"
+        },
+        "id": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "ID"
+        },
+        "name": {
+          "type": "string",
+          "x-go-name": "Title"
+        },
+        "prerelease": {
+          "type": "boolean",
+          "x-go-name": "IsPrerelease"
+        },
+        "published_at": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "PublishedAt"
+        },
+        "tag_name": {
+          "type": "string",
+          "x-go-name": "TagName"
+        },
+        "tarball_url": {
+          "type": "string",
+          "x-go-name": "TarURL"
+        },
+        "target_commitish": {
+          "type": "string",
+          "x-go-name": "Target"
+        },
+        "upload_url": {
+          "type": "string",
+          "x-go-name": "UploadURL"
+        },
+        "url": {
+          "type": "string",
+          "x-go-name": "URL"
+        },
+        "zipball_url": {
+          "type": "string",
+          "x-go-name": "ZipURL"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "RenameUserOption": {
+      "description": "RenameUserOption options when renaming a user",
+      "type": "object",
+      "required": [
+        "new_username"
+      ],
+      "properties": {
+        "new_username": {
+          "description": "New username for this user. This name cannot be in use yet by any other user.",
+          "type": "string",
+          "uniqueItems": true,
+          "x-go-name": "NewName"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "RepoCollaboratorPermission": {
+      "description": "RepoCollaboratorPermission to get repository permission for a collaborator",
+      "type": "object",
+      "properties": {
+        "permission": {
+          "type": "string",
+          "x-go-name": "Permission"
+        },
+        "role_name": {
+          "type": "string",
+          "x-go-name": "RoleName"
+        },
+        "user": {
+          "$ref": "#/definitions/User"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "RepoCommit": {
+      "type": "object",
+      "title": "RepoCommit contains information of a commit in the context of a repository.",
+      "properties": {
+        "author": {
+          "$ref": "#/definitions/CommitUser"
+        },
+        "committer": {
+          "$ref": "#/definitions/CommitUser"
+        },
+        "message": {
+          "type": "string",
+          "x-go-name": "Message"
+        },
+        "tree": {
+          "$ref": "#/definitions/CommitMeta"
+        },
+        "url": {
+          "type": "string",
+          "x-go-name": "URL"
+        },
+        "verification": {
+          "$ref": "#/definitions/PayloadCommitVerification"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "RepoTopicOptions": {
+      "description": "RepoTopicOptions a collection of repo topic names",
+      "type": "object",
+      "properties": {
+        "topics": {
+          "description": "list of topic names",
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "Topics"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "RepoTransfer": {
+      "description": "RepoTransfer represents a pending repo transfer",
+      "type": "object",
+      "properties": {
+        "doer": {
+          "$ref": "#/definitions/User"
+        },
+        "recipient": {
+          "$ref": "#/definitions/User"
+        },
+        "teams": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/Team"
+          },
+          "x-go-name": "Teams"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "Repository": {
+      "description": "Repository represents a repository",
+      "type": "object",
+      "properties": {
+        "allow_fast_forward_only_merge": {
+          "type": "boolean",
+          "x-go-name": "AllowFastForwardOnly"
+        },
+        "allow_merge_commits": {
+          "type": "boolean",
+          "x-go-name": "AllowMerge"
+        },
+        "allow_rebase": {
+          "type": "boolean",
+          "x-go-name": "AllowRebase"
+        },
+        "allow_rebase_explicit": {
+          "type": "boolean",
+          "x-go-name": "AllowRebaseMerge"
+        },
+        "allow_rebase_update": {
+          "type": "boolean",
+          "x-go-name": "AllowRebaseUpdate"
+        },
+        "allow_squash_merge": {
+          "type": "boolean",
+          "x-go-name": "AllowSquash"
+        },
+        "archived": {
+          "type": "boolean",
+          "x-go-name": "Archived"
+        },
+        "archived_at": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "ArchivedAt"
+        },
+        "avatar_url": {
+          "type": "string",
+          "x-go-name": "AvatarURL"
+        },
+        "clone_url": {
+          "type": "string",
+          "x-go-name": "CloneURL"
+        },
+        "created_at": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Created"
+        },
+        "default_allow_maintainer_edit": {
+          "type": "boolean",
+          "x-go-name": "DefaultAllowMaintainerEdit"
+        },
+        "default_branch": {
+          "type": "string",
+          "x-go-name": "DefaultBranch"
+        },
+        "default_delete_branch_after_merge": {
+          "type": "boolean",
+          "x-go-name": "DefaultDeleteBranchAfterMerge"
+        },
+        "default_merge_style": {
+          "type": "string",
+          "x-go-name": "DefaultMergeStyle"
+        },
+        "description": {
+          "type": "string",
+          "x-go-name": "Description"
+        },
+        "empty": {
+          "type": "boolean",
+          "x-go-name": "Empty"
+        },
+        "external_tracker": {
+          "$ref": "#/definitions/ExternalTracker"
+        },
+        "external_wiki": {
+          "$ref": "#/definitions/ExternalWiki"
+        },
+        "fork": {
+          "type": "boolean",
+          "x-go-name": "Fork"
+        },
+        "forks_count": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "Forks"
+        },
+        "full_name": {
+          "type": "string",
+          "x-go-name": "FullName"
+        },
+        "has_actions": {
+          "type": "boolean",
+          "x-go-name": "HasActions"
+        },
+        "has_issues": {
+          "type": "boolean",
+          "x-go-name": "HasIssues"
+        },
+        "has_packages": {
+          "type": "boolean",
+          "x-go-name": "HasPackages"
+        },
+        "has_projects": {
+          "type": "boolean",
+          "x-go-name": "HasProjects"
+        },
+        "has_pull_requests": {
+          "type": "boolean",
+          "x-go-name": "HasPullRequests"
+        },
+        "has_releases": {
+          "type": "boolean",
+          "x-go-name": "HasReleases"
+        },
+        "has_wiki": {
+          "type": "boolean",
+          "x-go-name": "HasWiki"
+        },
+        "html_url": {
+          "type": "string",
+          "x-go-name": "HTMLURL"
+        },
+        "id": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "ID"
+        },
+        "ignore_whitespace_conflicts": {
+          "type": "boolean",
+          "x-go-name": "IgnoreWhitespaceConflicts"
+        },
+        "internal": {
+          "type": "boolean",
+          "x-go-name": "Internal"
+        },
+        "internal_tracker": {
+          "$ref": "#/definitions/InternalTracker"
+        },
+        "language": {
+          "type": "string",
+          "x-go-name": "Language"
+        },
+        "languages_url": {
+          "type": "string",
+          "x-go-name": "LanguagesURL"
+        },
+        "link": {
+          "type": "string",
+          "x-go-name": "Link"
+        },
+        "mirror": {
+          "type": "boolean",
+          "x-go-name": "Mirror"
+        },
+        "mirror_interval": {
+          "type": "string",
+          "x-go-name": "MirrorInterval"
+        },
+        "mirror_updated": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "MirrorUpdated"
+        },
+        "name": {
+          "type": "string",
+          "x-go-name": "Name"
+        },
+        "object_format_name": {
+          "description": "ObjectFormatName of the underlying git repository",
+          "type": "string",
+          "enum": [
+            "sha1",
+            "sha256"
+          ],
+          "x-go-name": "ObjectFormatName"
+        },
+        "open_issues_count": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "OpenIssues"
+        },
+        "open_pr_counter": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "OpenPulls"
+        },
+        "original_url": {
+          "type": "string",
+          "x-go-name": "OriginalURL"
+        },
+        "owner": {
+          "$ref": "#/definitions/User"
+        },
+        "parent": {
+          "$ref": "#/definitions/Repository"
+        },
+        "permissions": {
+          "$ref": "#/definitions/Permission"
+        },
+        "private": {
+          "type": "boolean",
+          "x-go-name": "Private"
+        },
+        "projects_mode": {
+          "type": "string",
+          "x-go-name": "ProjectsMode"
+        },
+        "release_counter": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "Releases"
+        },
+        "repo_transfer": {
+          "$ref": "#/definitions/RepoTransfer"
+        },
+        "size": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "Size"
+        },
+        "ssh_url": {
+          "type": "string",
+          "x-go-name": "SSHURL"
+        },
+        "stars_count": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "Stars"
+        },
+        "template": {
+          "type": "boolean",
+          "x-go-name": "Template"
+        },
+        "updated_at": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Updated"
+        },
+        "url": {
+          "type": "string",
+          "x-go-name": "URL"
+        },
+        "watchers_count": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "Watchers"
+        },
+        "website": {
+          "type": "string",
+          "x-go-name": "Website"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "RepositoryMeta": {
+      "description": "RepositoryMeta basic repository information",
+      "type": "object",
+      "properties": {
+        "full_name": {
+          "type": "string",
+          "x-go-name": "FullName"
+        },
+        "id": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "ID"
+        },
+        "name": {
+          "type": "string",
+          "x-go-name": "Name"
+        },
+        "owner": {
+          "type": "string",
+          "x-go-name": "Owner"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "ReviewStateType": {
+      "description": "ReviewStateType review state type",
+      "type": "string",
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "SearchResults": {
+      "description": "SearchResults results of a successful search",
+      "type": "object",
+      "properties": {
+        "data": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/Repository"
+          },
+          "x-go-name": "Data"
+        },
+        "ok": {
+          "type": "boolean",
+          "x-go-name": "OK"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "Secret": {
+      "description": "Secret represents a secret",
+      "type": "object",
+      "properties": {
+        "created_at": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Created"
+        },
+        "name": {
+          "description": "the secret's name",
+          "type": "string",
+          "x-go-name": "Name"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "ServerVersion": {
+      "description": "ServerVersion wraps the version of the server",
+      "type": "object",
+      "properties": {
+        "version": {
+          "type": "string",
+          "x-go-name": "Version"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "StateType": {
+      "description": "StateType issue state type",
+      "type": "string",
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "StopWatch": {
+      "description": "StopWatch represent a running stopwatch",
+      "type": "object",
+      "properties": {
+        "created": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Created"
+        },
+        "duration": {
+          "type": "string",
+          "x-go-name": "Duration"
+        },
+        "issue_index": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "IssueIndex"
+        },
+        "issue_title": {
+          "type": "string",
+          "x-go-name": "IssueTitle"
+        },
+        "repo_name": {
+          "type": "string",
+          "x-go-name": "RepoName"
+        },
+        "repo_owner_name": {
+          "type": "string",
+          "x-go-name": "RepoOwnerName"
+        },
+        "seconds": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "Seconds"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "SubmitPullReviewOptions": {
+      "description": "SubmitPullReviewOptions are options to submit a pending pull review",
+      "type": "object",
+      "properties": {
+        "body": {
+          "type": "string",
+          "x-go-name": "Body"
+        },
+        "event": {
+          "$ref": "#/definitions/ReviewStateType"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "Tag": {
+      "description": "Tag represents a repository tag",
+      "type": "object",
+      "properties": {
+        "commit": {
+          "$ref": "#/definitions/CommitMeta"
+        },
+        "id": {
+          "type": "string",
+          "x-go-name": "ID"
+        },
+        "message": {
+          "type": "string",
+          "x-go-name": "Message"
+        },
+        "name": {
+          "type": "string",
+          "x-go-name": "Name"
+        },
+        "tarball_url": {
+          "type": "string",
+          "x-go-name": "TarballURL"
+        },
+        "zipball_url": {
+          "type": "string",
+          "x-go-name": "ZipballURL"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "Team": {
+      "description": "Team represents a team in an organization",
+      "type": "object",
+      "properties": {
+        "can_create_org_repo": {
+          "type": "boolean",
+          "x-go-name": "CanCreateOrgRepo"
+        },
+        "description": {
+          "type": "string",
+          "x-go-name": "Description"
+        },
+        "id": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "ID"
+        },
+        "includes_all_repositories": {
+          "type": "boolean",
+          "x-go-name": "IncludesAllRepositories"
+        },
+        "name": {
+          "type": "string",
+          "x-go-name": "Name"
+        },
+        "organization": {
+          "$ref": "#/definitions/Organization"
+        },
+        "permission": {
+          "type": "string",
+          "enum": [
+            "none",
+            "read",
+            "write",
+            "admin",
+            "owner"
+          ],
+          "x-go-name": "Permission"
+        },
+        "units": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "Units",
+          "example": [
+            "repo.code",
+            "repo.issues",
+            "repo.ext_issues",
+            "repo.wiki",
+            "repo.pulls",
+            "repo.releases",
+            "repo.projects",
+            "repo.ext_wiki"
+          ]
+        },
+        "units_map": {
+          "type": "object",
+          "additionalProperties": {
+            "type": "string"
+          },
+          "x-go-name": "UnitsMap",
+          "example": {
+            "repo.code": "read",
+            "repo.ext_issues": "none",
+            "repo.ext_wiki": "none",
+            "repo.issues": "write",
+            "repo.projects": "none",
+            "repo.pulls": "owner",
+            "repo.releases": "none",
+            "repo.wiki": "admin"
+          }
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "TimeStamp": {
+      "description": "TimeStamp defines a timestamp",
+      "type": "integer",
+      "format": "int64",
+      "x-go-package": "code.gitea.io/gitea/modules/timeutil"
+    },
+    "TimelineComment": {
+      "description": "TimelineComment represents a timeline comment (comment of any type) on a commit or issue",
+      "type": "object",
+      "properties": {
+        "assignee": {
+          "$ref": "#/definitions/User"
+        },
+        "assignee_team": {
+          "$ref": "#/definitions/Team"
+        },
+        "body": {
+          "type": "string",
+          "x-go-name": "Body"
+        },
+        "created_at": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Created"
+        },
+        "dependent_issue": {
+          "$ref": "#/definitions/Issue"
+        },
+        "html_url": {
+          "type": "string",
+          "x-go-name": "HTMLURL"
+        },
+        "id": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "ID"
+        },
+        "issue_url": {
+          "type": "string",
+          "x-go-name": "IssueURL"
+        },
+        "label": {
+          "$ref": "#/definitions/Label"
+        },
+        "milestone": {
+          "$ref": "#/definitions/Milestone"
+        },
+        "new_ref": {
+          "type": "string",
+          "x-go-name": "NewRef"
+        },
+        "new_title": {
+          "type": "string",
+          "x-go-name": "NewTitle"
+        },
+        "old_milestone": {
+          "$ref": "#/definitions/Milestone"
+        },
+        "old_project_id": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "OldProjectID"
+        },
+        "old_ref": {
+          "type": "string",
+          "x-go-name": "OldRef"
+        },
+        "old_title": {
+          "type": "string",
+          "x-go-name": "OldTitle"
+        },
+        "project_id": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "ProjectID"
+        },
+        "pull_request_url": {
+          "type": "string",
+          "x-go-name": "PRURL"
+        },
+        "ref_action": {
+          "type": "string",
+          "x-go-name": "RefAction"
+        },
+        "ref_comment": {
+          "$ref": "#/definitions/Comment"
+        },
+        "ref_commit_sha": {
+          "description": "commit SHA where issue/PR was referenced",
+          "type": "string",
+          "x-go-name": "RefCommitSHA"
+        },
+        "ref_issue": {
+          "$ref": "#/definitions/Issue"
+        },
+        "removed_assignee": {
+          "description": "whether the assignees were removed or added",
+          "type": "boolean",
+          "x-go-name": "RemovedAssignee"
+        },
+        "resolve_doer": {
+          "$ref": "#/definitions/User"
+        },
+        "review_id": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "ReviewID"
+        },
+        "tracked_time": {
+          "$ref": "#/definitions/TrackedTime"
+        },
+        "type": {
+          "type": "string",
+          "x-go-name": "Type"
+        },
+        "updated_at": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Updated"
+        },
+        "user": {
+          "$ref": "#/definitions/User"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "TopicName": {
+      "description": "TopicName a list of repo topic names",
+      "type": "object",
+      "properties": {
+        "topics": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "TopicNames"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "TopicResponse": {
+      "description": "TopicResponse for returning topics",
+      "type": "object",
+      "properties": {
+        "created": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Created"
+        },
+        "id": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "ID"
+        },
+        "repo_count": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "RepoCount"
+        },
+        "topic_name": {
+          "type": "string",
+          "x-go-name": "Name"
+        },
+        "updated": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Updated"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "TrackedTime": {
+      "description": "TrackedTime worked time for an issue / pr",
+      "type": "object",
+      "properties": {
+        "created": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Created"
+        },
+        "id": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "ID"
+        },
+        "issue": {
+          "$ref": "#/definitions/Issue"
+        },
+        "issue_id": {
+          "description": "deprecated (only for backwards compatibility)",
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "IssueID"
+        },
+        "time": {
+          "description": "Time in seconds",
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "Time"
+        },
+        "user_id": {
+          "description": "deprecated (only for backwards compatibility)",
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "UserID"
+        },
+        "user_name": {
+          "type": "string",
+          "x-go-name": "UserName"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "TransferRepoOption": {
+      "description": "TransferRepoOption options when transfer a repository's ownership",
+      "type": "object",
+      "required": [
+        "new_owner"
+      ],
+      "properties": {
+        "new_owner": {
+          "type": "string",
+          "x-go-name": "NewOwner"
+        },
+        "team_ids": {
+          "description": "ID of the team or teams to add to the repository. Teams can only be added to organization-owned repositories.",
+          "type": "array",
+          "items": {
+            "type": "integer",
+            "format": "int64"
+          },
+          "x-go-name": "TeamIDs"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "UpdateFileOptions": {
+      "description": "UpdateFileOptions options for updating files\nNote: `author` and `committer` are optional (if only one is given, it will be used for the other, otherwise the authenticated user will be used)",
+      "type": "object",
+      "required": [
+        "sha",
+        "content"
+      ],
+      "properties": {
+        "author": {
+          "$ref": "#/definitions/Identity"
+        },
+        "branch": {
+          "description": "branch (optional) to base this file from. if not given, the default branch is used",
+          "type": "string",
+          "x-go-name": "BranchName"
+        },
+        "committer": {
+          "$ref": "#/definitions/Identity"
+        },
+        "content": {
+          "description": "content must be base64 encoded",
+          "type": "string",
+          "x-go-name": "ContentBase64"
+        },
+        "dates": {
+          "$ref": "#/definitions/CommitDateOptions"
+        },
+        "from_path": {
+          "description": "from_path (optional) is the path of the original file which will be moved/renamed to the path in the URL",
+          "type": "string",
+          "x-go-name": "FromPath"
+        },
+        "message": {
+          "description": "message (optional) for the commit of this file. if not supplied, a default message will be used",
+          "type": "string",
+          "x-go-name": "Message"
+        },
+        "new_branch": {
+          "description": "new_branch (optional) will make a new branch from `branch` before creating the file",
+          "type": "string",
+          "x-go-name": "NewBranchName"
+        },
+        "sha": {
+          "description": "sha is the SHA for the file that already exists",
+          "type": "string",
+          "x-go-name": "SHA"
+        },
+        "signoff": {
+          "description": "Add a Signed-off-by trailer by the committer at the end of the commit log message.",
+          "type": "boolean",
+          "x-go-name": "Signoff"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "UpdateRepoAvatarOption": {
+      "description": "UpdateRepoAvatarUserOption options when updating the repo avatar",
+      "type": "object",
+      "properties": {
+        "image": {
+          "description": "image must be base64 encoded",
+          "type": "string",
+          "x-go-name": "Image"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "UpdateUserAvatarOption": {
+      "description": "UpdateUserAvatarUserOption options when updating the user avatar",
+      "type": "object",
+      "properties": {
+        "image": {
+          "description": "image must be base64 encoded",
+          "type": "string",
+          "x-go-name": "Image"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "UpdateVariableOption": {
+      "description": "UpdateVariableOption the option when updating variable",
+      "type": "object",
+      "required": [
+        "value"
+      ],
+      "properties": {
+        "name": {
+          "description": "New name for the variable. If the field is empty, the variable name won't be updated.",
+          "type": "string",
+          "x-go-name": "Name"
+        },
+        "value": {
+          "description": "Value of the variable to update",
+          "type": "string",
+          "x-go-name": "Value"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "User": {
+      "description": "User represents a user",
+      "type": "object",
+      "properties": {
+        "active": {
+          "description": "Is user active",
+          "type": "boolean",
+          "x-go-name": "IsActive"
+        },
+        "avatar_url": {
+          "description": "URL to the user's avatar",
+          "type": "string",
+          "x-go-name": "AvatarURL"
+        },
+        "created": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Created"
+        },
+        "description": {
+          "description": "the user's description",
+          "type": "string",
+          "x-go-name": "Description"
+        },
+        "email": {
+          "type": "string",
+          "format": "email",
+          "x-go-name": "Email"
+        },
+        "followers_count": {
+          "description": "user counts",
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "Followers"
+        },
+        "following_count": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "Following"
+        },
+        "full_name": {
+          "description": "the user's full name",
+          "type": "string",
+          "x-go-name": "FullName"
+        },
+        "html_url": {
+          "description": "URL to the user's gitea page",
+          "type": "string",
+          "x-go-name": "HTMLURL"
+        },
+        "id": {
+          "description": "the user's id",
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "ID"
+        },
+        "is_admin": {
+          "description": "Is the user an administrator",
+          "type": "boolean",
+          "x-go-name": "IsAdmin"
+        },
+        "language": {
+          "description": "User locale",
+          "type": "string",
+          "x-go-name": "Language"
+        },
+        "last_login": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "LastLogin"
+        },
+        "location": {
+          "description": "the user's location",
+          "type": "string",
+          "x-go-name": "Location"
+        },
+        "login": {
+          "description": "the user's username",
+          "type": "string",
+          "x-go-name": "UserName"
+        },
+        "login_name": {
+          "description": "the user's authentication sign-in name.",
+          "type": "string",
+          "default": "empty",
+          "x-go-name": "LoginName"
+        },
+        "prohibit_login": {
+          "description": "Is user login prohibited",
+          "type": "boolean",
+          "x-go-name": "ProhibitLogin"
+        },
+        "restricted": {
+          "description": "Is user restricted",
+          "type": "boolean",
+          "x-go-name": "Restricted"
+        },
+        "source_id": {
+          "description": "The ID of the user's Authentication Source",
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "SourceID"
+        },
+        "starred_repos_count": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "StarredRepos"
+        },
+        "visibility": {
+          "description": "User visibility level option: public, limited, private",
+          "type": "string",
+          "x-go-name": "Visibility"
+        },
+        "website": {
+          "description": "the user's website",
+          "type": "string",
+          "x-go-name": "Website"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "UserBadgeOption": {
+      "description": "UserBadgeOption options for link between users and badges",
+      "type": "object",
+      "properties": {
+        "badge_slugs": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "BadgeSlugs",
+          "example": [
+            "badge1",
+            "badge2"
+          ]
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "UserHeatmapData": {
+      "description": "UserHeatmapData represents the data needed to create a heatmap",
+      "type": "object",
+      "properties": {
+        "contributions": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "Contributions"
+        },
+        "timestamp": {
+          "$ref": "#/definitions/TimeStamp"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/models/activities"
+    },
+    "UserSettings": {
+      "description": "UserSettings represents user settings",
+      "type": "object",
+      "properties": {
+        "description": {
+          "type": "string",
+          "x-go-name": "Description"
+        },
+        "diff_view_style": {
+          "type": "string",
+          "x-go-name": "DiffViewStyle"
+        },
+        "full_name": {
+          "type": "string",
+          "x-go-name": "FullName"
+        },
+        "hide_activity": {
+          "type": "boolean",
+          "x-go-name": "HideActivity"
+        },
+        "hide_email": {
+          "description": "Privacy",
+          "type": "boolean",
+          "x-go-name": "HideEmail"
+        },
+        "language": {
+          "type": "string",
+          "x-go-name": "Language"
+        },
+        "location": {
+          "type": "string",
+          "x-go-name": "Location"
+        },
+        "theme": {
+          "type": "string",
+          "x-go-name": "Theme"
+        },
+        "website": {
+          "type": "string",
+          "x-go-name": "Website"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "UserSettingsOptions": {
+      "description": "UserSettingsOptions represents options to change user settings",
+      "type": "object",
+      "properties": {
+        "description": {
+          "type": "string",
+          "x-go-name": "Description"
+        },
+        "diff_view_style": {
+          "type": "string",
+          "x-go-name": "DiffViewStyle"
+        },
+        "full_name": {
+          "type": "string",
+          "x-go-name": "FullName"
+        },
+        "hide_activity": {
+          "type": "boolean",
+          "x-go-name": "HideActivity"
+        },
+        "hide_email": {
+          "description": "Privacy",
+          "type": "boolean",
+          "x-go-name": "HideEmail"
+        },
+        "language": {
+          "type": "string",
+          "x-go-name": "Language"
+        },
+        "location": {
+          "type": "string",
+          "x-go-name": "Location"
+        },
+        "theme": {
+          "type": "string",
+          "x-go-name": "Theme"
+        },
+        "website": {
+          "type": "string",
+          "x-go-name": "Website"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "WatchInfo": {
+      "description": "WatchInfo represents an API watch status of one repository",
+      "type": "object",
+      "properties": {
+        "created_at": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "CreatedAt"
+        },
+        "ignored": {
+          "type": "boolean",
+          "x-go-name": "Ignored"
+        },
+        "reason": {
+          "x-go-name": "Reason"
+        },
+        "repository_url": {
+          "type": "string",
+          "x-go-name": "RepositoryURL"
+        },
+        "subscribed": {
+          "type": "boolean",
+          "x-go-name": "Subscribed"
+        },
+        "url": {
+          "type": "string",
+          "x-go-name": "URL"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "WikiCommit": {
+      "description": "WikiCommit page commit/revision",
+      "type": "object",
+      "properties": {
+        "author": {
+          "$ref": "#/definitions/CommitUser"
+        },
+        "commiter": {
+          "$ref": "#/definitions/CommitUser"
+        },
+        "message": {
+          "type": "string",
+          "x-go-name": "Message"
+        },
+        "sha": {
+          "type": "string",
+          "x-go-name": "ID"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "WikiCommitList": {
+      "description": "WikiCommitList commit/revision list",
+      "type": "object",
+      "properties": {
+        "commits": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/WikiCommit"
+          },
+          "x-go-name": "WikiCommits"
+        },
+        "count": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "Count"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "WikiPage": {
+      "description": "WikiPage a wiki page",
+      "type": "object",
+      "properties": {
+        "commit_count": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "CommitCount"
+        },
+        "content_base64": {
+          "description": "Page content, base64 encoded",
+          "type": "string",
+          "x-go-name": "ContentBase64"
+        },
+        "footer": {
+          "type": "string",
+          "x-go-name": "Footer"
+        },
+        "html_url": {
+          "type": "string",
+          "x-go-name": "HTMLURL"
+        },
+        "last_commit": {
+          "$ref": "#/definitions/WikiCommit"
+        },
+        "sidebar": {
+          "type": "string",
+          "x-go-name": "Sidebar"
+        },
+        "sub_url": {
+          "type": "string",
+          "x-go-name": "SubURL"
+        },
+        "title": {
+          "type": "string",
+          "x-go-name": "Title"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "WikiPageMetaData": {
+      "description": "WikiPageMetaData wiki page meta information",
+      "type": "object",
+      "properties": {
+        "html_url": {
+          "type": "string",
+          "x-go-name": "HTMLURL"
+        },
+        "last_commit": {
+          "$ref": "#/definitions/WikiCommit"
+        },
+        "sub_url": {
+          "type": "string",
+          "x-go-name": "SubURL"
+        },
+        "title": {
+          "type": "string",
+          "x-go-name": "Title"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    }
+  },
+  "responses": {
+    "AccessToken": {
+      "description": "AccessToken represents an API access token.",
+      "schema": {
+        "$ref": "#/definitions/AccessToken"
+      }
+    },
+    "AccessTokenList": {
+      "description": "AccessTokenList represents a list of API access token.",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/AccessToken"
+        }
+      }
+    },
+    "ActionVariable": {
+      "description": "ActionVariable",
+      "schema": {
+        "$ref": "#/definitions/ActionVariable"
+      }
+    },
+    "ActivityFeedsList": {
+      "description": "ActivityFeedsList",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/Activity"
+        }
+      }
+    },
+    "ActivityPub": {
+      "description": "ActivityPub",
+      "schema": {
+        "$ref": "#/definitions/ActivityPub"
+      }
+    },
+    "AnnotatedTag": {
+      "description": "AnnotatedTag",
+      "schema": {
+        "$ref": "#/definitions/AnnotatedTag"
+      }
+    },
+    "Attachment": {
+      "description": "Attachment",
+      "schema": {
+        "$ref": "#/definitions/Attachment"
+      }
+    },
+    "AttachmentList": {
+      "description": "AttachmentList",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/Attachment"
+        }
+      }
+    },
+    "BadgeList": {
+      "description": "BadgeList",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/Badge"
+        }
+      }
+    },
+    "Branch": {
+      "description": "Branch",
+      "schema": {
+        "$ref": "#/definitions/Branch"
+      }
+    },
+    "BranchList": {
+      "description": "BranchList",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/Branch"
+        }
+      }
+    },
+    "BranchProtection": {
+      "description": "BranchProtection",
+      "schema": {
+        "$ref": "#/definitions/BranchProtection"
+      }
+    },
+    "BranchProtectionList": {
+      "description": "BranchProtectionList",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/BranchProtection"
+        }
+      }
+    },
+    "ChangedFileList": {
+      "description": "ChangedFileList",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/ChangedFile"
+        }
+      },
+      "headers": {
+        "X-HasMore": {
+          "type": "boolean",
+          "description": "True if there is another page"
+        },
+        "X-Page": {
+          "type": "integer",
+          "format": "int64",
+          "description": "The current page"
+        },
+        "X-PageCount": {
+          "type": "integer",
+          "format": "int64",
+          "description": "Total number of pages"
+        },
+        "X-PerPage": {
+          "type": "integer",
+          "format": "int64",
+          "description": "Commits per page"
+        },
+        "X-Total": {
+          "type": "integer",
+          "format": "int64",
+          "description": "Total commit count"
+        }
+      }
+    },
+    "CombinedStatus": {
+      "description": "CombinedStatus",
+      "schema": {
+        "$ref": "#/definitions/CombinedStatus"
+      }
+    },
+    "Comment": {
+      "description": "Comment",
+      "schema": {
+        "$ref": "#/definitions/Comment"
+      }
+    },
+    "CommentList": {
+      "description": "CommentList",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/Comment"
+        }
+      }
+    },
+    "Commit": {
+      "description": "Commit",
+      "schema": {
+        "$ref": "#/definitions/Commit"
+      }
+    },
+    "CommitList": {
+      "description": "CommitList",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/Commit"
+        }
+      },
+      "headers": {
+        "X-HasMore": {
+          "type": "boolean",
+          "description": "True if there is another page"
+        },
+        "X-Page": {
+          "type": "integer",
+          "format": "int64",
+          "description": "The current page"
+        },
+        "X-PageCount": {
+          "type": "integer",
+          "format": "int64",
+          "description": "Total number of pages"
+        },
+        "X-PerPage": {
+          "type": "integer",
+          "format": "int64",
+          "description": "Commits per page"
+        },
+        "X-Total": {
+          "type": "integer",
+          "format": "int64",
+          "description": "Total commit count"
+        }
+      }
+    },
+    "CommitStatus": {
+      "description": "CommitStatus",
+      "schema": {
+        "$ref": "#/definitions/CommitStatus"
+      }
+    },
+    "CommitStatusList": {
+      "description": "CommitStatusList",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/CommitStatus"
+        }
+      }
+    },
+    "Compare": {
+      "description": "",
+      "schema": {
+        "$ref": "#/definitions/Compare"
+      }
+    },
+    "ContentsListResponse": {
+      "description": "ContentsListResponse",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/ContentsResponse"
+        }
+      }
+    },
+    "ContentsResponse": {
+      "description": "ContentsResponse",
+      "schema": {
+        "$ref": "#/definitions/ContentsResponse"
+      }
+    },
+    "CronList": {
+      "description": "CronList",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/Cron"
+        }
+      }
+    },
+    "DeployKey": {
+      "description": "DeployKey",
+      "schema": {
+        "$ref": "#/definitions/DeployKey"
+      }
+    },
+    "DeployKeyList": {
+      "description": "DeployKeyList",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/DeployKey"
+        }
+      }
+    },
+    "EmailList": {
+      "description": "EmailList",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/Email"
+        }
+      }
+    },
+    "EmptyRepository": {
+      "description": "EmptyRepository",
+      "schema": {
+        "$ref": "#/definitions/APIError"
+      }
+    },
+    "FileDeleteResponse": {
+      "description": "FileDeleteResponse",
+      "schema": {
+        "$ref": "#/definitions/FileDeleteResponse"
+      }
+    },
+    "FileResponse": {
+      "description": "FileResponse",
+      "schema": {
+        "$ref": "#/definitions/FileResponse"
+      }
+    },
+    "FilesResponse": {
+      "description": "FilesResponse",
+      "schema": {
+        "$ref": "#/definitions/FilesResponse"
+      }
+    },
+    "GPGKey": {
+      "description": "GPGKey",
+      "schema": {
+        "$ref": "#/definitions/GPGKey"
+      }
+    },
+    "GPGKeyList": {
+      "description": "GPGKeyList",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/GPGKey"
+        }
+      }
+    },
+    "GeneralAPISettings": {
+      "description": "GeneralAPISettings",
+      "schema": {
+        "$ref": "#/definitions/GeneralAPISettings"
+      }
+    },
+    "GeneralAttachmentSettings": {
+      "description": "GeneralAttachmentSettings",
+      "schema": {
+        "$ref": "#/definitions/GeneralAttachmentSettings"
+      }
+    },
+    "GeneralRepoSettings": {
+      "description": "GeneralRepoSettings",
+      "schema": {
+        "$ref": "#/definitions/GeneralRepoSettings"
+      }
+    },
+    "GeneralUISettings": {
+      "description": "GeneralUISettings",
+      "schema": {
+        "$ref": "#/definitions/GeneralUISettings"
+      }
+    },
+    "GitBlobResponse": {
+      "description": "GitBlobResponse",
+      "schema": {
+        "$ref": "#/definitions/GitBlobResponse"
+      }
+    },
+    "GitHook": {
+      "description": "GitHook",
+      "schema": {
+        "$ref": "#/definitions/GitHook"
+      }
+    },
+    "GitHookList": {
+      "description": "GitHookList",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/GitHook"
+        }
+      }
+    },
+    "GitTreeResponse": {
+      "description": "GitTreeResponse",
+      "schema": {
+        "$ref": "#/definitions/GitTreeResponse"
+      }
+    },
+    "GitignoreTemplateInfo": {
+      "description": "GitignoreTemplateInfo",
+      "schema": {
+        "$ref": "#/definitions/GitignoreTemplateInfo"
+      }
+    },
+    "GitignoreTemplateList": {
+      "description": "GitignoreTemplateList",
+      "schema": {
+        "type": "array",
+        "items": {
+          "type": "string"
+        }
+      }
+    },
+    "Hook": {
+      "description": "Hook",
+      "schema": {
+        "$ref": "#/definitions/Hook"
+      }
+    },
+    "HookList": {
+      "description": "HookList",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/Hook"
+        }
+      }
+    },
+    "Issue": {
+      "description": "Issue",
+      "schema": {
+        "$ref": "#/definitions/Issue"
+      }
+    },
+    "IssueDeadline": {
+      "description": "IssueDeadline",
+      "schema": {
+        "$ref": "#/definitions/IssueDeadline"
+      }
+    },
+    "IssueList": {
+      "description": "IssueList",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/Issue"
+        }
+      }
+    },
+    "IssueTemplates": {
+      "description": "IssueTemplates",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/IssueTemplate"
+        }
+      }
+    },
+    "Label": {
+      "description": "Label",
+      "schema": {
+        "$ref": "#/definitions/Label"
+      }
+    },
+    "LabelList": {
+      "description": "LabelList",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/Label"
+        }
+      }
+    },
+    "LabelTemplateInfo": {
+      "description": "LabelTemplateInfo",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/LabelTemplate"
+        }
+      }
+    },
+    "LabelTemplateList": {
+      "description": "LabelTemplateList",
+      "schema": {
+        "type": "array",
+        "items": {
+          "type": "string"
+        }
+      }
+    },
+    "LanguageStatistics": {
+      "description": "LanguageStatistics",
+      "schema": {
+        "type": "object",
+        "additionalProperties": {
+          "type": "integer",
+          "format": "int64"
+        }
+      }
+    },
+    "LicenseTemplateInfo": {
+      "description": "LicenseTemplateInfo",
+      "schema": {
+        "$ref": "#/definitions/LicenseTemplateInfo"
+      }
+    },
+    "LicenseTemplateList": {
+      "description": "LicenseTemplateList",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/LicensesTemplateListEntry"
+        }
+      }
+    },
+    "MarkdownRender": {
+      "description": "MarkdownRender is a rendered markdown document",
+      "schema": {
+        "type": "string"
+      }
+    },
+    "MarkupRender": {
+      "description": "MarkupRender is a rendered markup document",
+      "schema": {
+        "type": "string"
+      }
+    },
+    "Milestone": {
+      "description": "Milestone",
+      "schema": {
+        "$ref": "#/definitions/Milestone"
+      }
+    },
+    "MilestoneList": {
+      "description": "MilestoneList",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/Milestone"
+        }
+      }
+    },
+    "NodeInfo": {
+      "description": "NodeInfo",
+      "schema": {
+        "$ref": "#/definitions/NodeInfo"
+      }
+    },
+    "Note": {
+      "description": "Note",
+      "schema": {
+        "$ref": "#/definitions/Note"
+      }
+    },
+    "NotificationCount": {
+      "description": "Number of unread notifications",
+      "schema": {
+        "$ref": "#/definitions/NotificationCount"
+      }
+    },
+    "NotificationThread": {
+      "description": "NotificationThread",
+      "schema": {
+        "$ref": "#/definitions/NotificationThread"
+      }
+    },
+    "NotificationThreadList": {
+      "description": "NotificationThreadList",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/NotificationThread"
+        }
+      }
+    },
+    "OAuth2Application": {
+      "description": "OAuth2Application",
+      "schema": {
+        "$ref": "#/definitions/OAuth2Application"
+      }
+    },
+    "OAuth2ApplicationList": {
+      "description": "OAuth2ApplicationList represents a list of OAuth2 applications.",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/OAuth2Application"
+        }
+      }
+    },
+    "Organization": {
+      "description": "Organization",
+      "schema": {
+        "$ref": "#/definitions/Organization"
+      }
+    },
+    "OrganizationList": {
+      "description": "OrganizationList",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/Organization"
+        }
+      }
+    },
+    "OrganizationPermissions": {
+      "description": "OrganizationPermissions",
+      "schema": {
+        "$ref": "#/definitions/OrganizationPermissions"
+      }
+    },
+    "Package": {
+      "description": "Package",
+      "schema": {
+        "$ref": "#/definitions/Package"
+      }
+    },
+    "PackageFileList": {
+      "description": "PackageFileList",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/PackageFile"
+        }
+      }
+    },
+    "PackageList": {
+      "description": "PackageList",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/Package"
+        }
+      }
+    },
+    "PublicKey": {
+      "description": "PublicKey",
+      "schema": {
+        "$ref": "#/definitions/PublicKey"
+      }
+    },
+    "PublicKeyList": {
+      "description": "PublicKeyList",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/PublicKey"
+        }
+      }
+    },
+    "PullRequest": {
+      "description": "PullRequest",
+      "schema": {
+        "$ref": "#/definitions/PullRequest"
+      }
+    },
+    "PullRequestList": {
+      "description": "PullRequestList",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/PullRequest"
+        }
+      }
+    },
+    "PullReview": {
+      "description": "PullReview",
+      "schema": {
+        "$ref": "#/definitions/PullReview"
+      }
+    },
+    "PullReviewComment": {
+      "description": "PullComment",
+      "schema": {
+        "$ref": "#/definitions/PullReviewComment"
+      }
+    },
+    "PullReviewCommentList": {
+      "description": "PullCommentList",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/PullReviewComment"
+        }
+      }
+    },
+    "PullReviewList": {
+      "description": "PullReviewList",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/PullReview"
+        }
+      }
+    },
+    "PushMirror": {
+      "description": "PushMirror",
+      "schema": {
+        "$ref": "#/definitions/PushMirror"
+      }
+    },
+    "PushMirrorList": {
+      "description": "PushMirrorList",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/PushMirror"
+        }
+      }
+    },
+    "Reaction": {
+      "description": "Reaction",
+      "schema": {
+        "$ref": "#/definitions/Reaction"
+      }
+    },
+    "ReactionList": {
+      "description": "ReactionList",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/Reaction"
+        }
+      }
+    },
+    "Reference": {
+      "description": "Reference",
+      "schema": {
+        "$ref": "#/definitions/Reference"
+      }
+    },
+    "ReferenceList": {
+      "description": "ReferenceList",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/Reference"
+        }
+      }
+    },
+    "RegistrationToken": {
+      "description": "RegistrationToken is response related to registration token",
+      "headers": {
+        "token": {
+          "type": "string"
+        }
+      }
+    },
+    "Release": {
+      "description": "Release",
+      "schema": {
+        "$ref": "#/definitions/Release"
+      }
+    },
+    "ReleaseList": {
+      "description": "ReleaseList",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/Release"
+        }
+      }
+    },
+    "RepoCollaboratorPermission": {
+      "description": "RepoCollaboratorPermission",
+      "schema": {
+        "$ref": "#/definitions/RepoCollaboratorPermission"
+      }
+    },
+    "RepoIssueConfig": {
+      "description": "RepoIssueConfig",
+      "schema": {
+        "$ref": "#/definitions/IssueConfig"
+      }
+    },
+    "RepoIssueConfigValidation": {
+      "description": "RepoIssueConfigValidation",
+      "schema": {
+        "$ref": "#/definitions/IssueConfigValidation"
+      }
+    },
+    "RepoNewIssuePinsAllowed": {
+      "description": "RepoNewIssuePinsAllowed",
+      "schema": {
+        "$ref": "#/definitions/NewIssuePinsAllowed"
+      }
+    },
+    "Repository": {
+      "description": "Repository",
+      "schema": {
+        "$ref": "#/definitions/Repository"
+      }
+    },
+    "RepositoryList": {
+      "description": "RepositoryList",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/Repository"
+        }
+      }
+    },
+    "SearchResults": {
+      "description": "SearchResults",
+      "schema": {
+        "$ref": "#/definitions/SearchResults"
+      }
+    },
+    "Secret": {
+      "description": "Secret",
+      "schema": {
+        "$ref": "#/definitions/Secret"
+      }
+    },
+    "SecretList": {
+      "description": "SecretList",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/Secret"
+        }
+      }
+    },
+    "ServerVersion": {
+      "description": "ServerVersion",
+      "schema": {
+        "$ref": "#/definitions/ServerVersion"
+      }
+    },
+    "StopWatch": {
+      "description": "StopWatch",
+      "schema": {
+        "$ref": "#/definitions/StopWatch"
+      }
+    },
+    "StopWatchList": {
+      "description": "StopWatchList",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/StopWatch"
+        }
+      }
+    },
+    "StringSlice": {
+      "description": "StringSlice",
+      "schema": {
+        "type": "array",
+        "items": {
+          "type": "string"
+        }
+      }
+    },
+    "Tag": {
+      "description": "Tag",
+      "schema": {
+        "$ref": "#/definitions/Tag"
+      }
+    },
+    "TagList": {
+      "description": "TagList",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/Tag"
+        }
+      }
+    },
+    "Team": {
+      "description": "Team",
+      "schema": {
+        "$ref": "#/definitions/Team"
+      }
+    },
+    "TeamList": {
+      "description": "TeamList",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/Team"
+        }
+      }
+    },
+    "TimelineList": {
+      "description": "TimelineList",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/TimelineComment"
+        }
+      }
+    },
+    "TopicListResponse": {
+      "description": "TopicListResponse",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/TopicResponse"
+        }
+      }
+    },
+    "TopicNames": {
+      "description": "TopicNames",
+      "schema": {
+        "$ref": "#/definitions/TopicName"
+      }
+    },
+    "TrackedTime": {
+      "description": "TrackedTime",
+      "schema": {
+        "$ref": "#/definitions/TrackedTime"
+      }
+    },
+    "TrackedTimeList": {
+      "description": "TrackedTimeList",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/TrackedTime"
+        }
+      }
+    },
+    "User": {
+      "description": "User",
+      "schema": {
+        "$ref": "#/definitions/User"
+      }
+    },
+    "UserHeatmapData": {
+      "description": "UserHeatmapData",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/UserHeatmapData"
+        }
+      }
+    },
+    "UserList": {
+      "description": "UserList",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/User"
+        }
+      }
+    },
+    "UserSettings": {
+      "description": "UserSettings",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/UserSettings"
+        }
+      }
+    },
+    "VariableList": {
+      "description": "VariableList",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/ActionVariable"
+        }
+      }
+    },
+    "WatchInfo": {
+      "description": "WatchInfo",
+      "schema": {
+        "$ref": "#/definitions/WatchInfo"
+      }
+    },
+    "WikiCommitList": {
+      "description": "WikiCommitList",
+      "schema": {
+        "$ref": "#/definitions/WikiCommitList"
+      }
+    },
+    "WikiPage": {
+      "description": "WikiPage",
+      "schema": {
+        "$ref": "#/definitions/WikiPage"
+      }
+    },
+    "WikiPageList": {
+      "description": "WikiPageList",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/WikiPageMetaData"
+        }
+      }
+    },
+    "conflict": {
+      "description": "APIConflict is a conflict empty response"
+    },
+    "empty": {
+      "description": "APIEmpty is an empty response"
+    },
+    "error": {
+      "description": "APIError is error format response",
+      "headers": {
+        "message": {
+          "type": "string"
+        },
+        "url": {
+          "type": "string"
+        }
+      }
+    },
+    "forbidden": {
+      "description": "APIForbiddenError is a forbidden error response",
+      "headers": {
+        "message": {
+          "type": "string"
+        },
+        "url": {
+          "type": "string"
+        }
+      }
+    },
+    "invalidTopicsError": {
+      "description": "APIInvalidTopicsError is error format response to invalid topics",
+      "headers": {
+        "invalidTopics": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "message": {
+          "type": "string"
+        }
+      }
+    },
+    "notFound": {
+      "description": "APINotFound is a not found empty response"
+    },
+    "parameterBodies": {
+      "description": "parameterBodies",
+      "schema": {
+        "$ref": "#/definitions/UpdateVariableOption"
+      }
+    },
+    "redirect": {
+      "description": "APIRedirect is a redirect response"
+    },
+    "repoArchivedError": {
+      "description": "APIRepoArchivedError is an error that is raised when an archived repo should be modified",
+      "headers": {
+        "message": {
+          "type": "string"
+        },
+        "url": {
+          "type": "string"
+        }
+      }
+    },
+    "string": {
+      "description": "APIString is a string response",
+      "schema": {
+        "type": "string"
+      }
+    },
+    "validationError": {
+      "description": "APIValidationError is error format response related to input validation",
+      "headers": {
+        "message": {
+          "type": "string"
+        },
+        "url": {
+          "type": "string"
+        }
+      }
+    }
+  },
+  "securityDefinitions": {
+    "AccessToken": {
+      "description": "This authentication option is deprecated for removal in Gitea 1.23. Please use AuthorizationHeaderToken instead.",
+      "type": "apiKey",
+      "name": "access_token",
+      "in": "query"
+    },
+    "AuthorizationHeaderToken": {
+      "description": "API tokens must be prepended with \"token\" followed by a space.",
+      "type": "apiKey",
+      "name": "Authorization",
+      "in": "header"
+    },
+    "BasicAuth": {
+      "type": "basic"
+    },
+    "SudoHeader": {
+      "description": "Sudo API request as the user provided as the key. Admin privileges are required.",
+      "type": "apiKey",
+      "name": "Sudo",
+      "in": "header"
+    },
+    "SudoParam": {
+      "description": "Sudo API request as the user provided as the key. Admin privileges are required.",
+      "type": "apiKey",
+      "name": "sudo",
+      "in": "query"
+    },
+    "TOTPHeader": {
+      "description": "Must be used in combination with BasicAuth if two-factor authentication is enabled.",
+      "type": "apiKey",
+      "name": "X-GITEA-OTP",
+      "in": "header"
+    },
+    "Token": {
+      "description": "This authentication option is deprecated for removal in Gitea 1.23. Please use AuthorizationHeaderToken instead.",
+      "type": "apiKey",
+      "name": "token",
+      "in": "query"
+    }
+  },
+  "security": [
+    {
+      "BasicAuth": []
+    },
+    {
+      "Token": []
+    },
+    {
+      "AccessToken": []
+    },
+    {
+      "AuthorizationHeaderToken": []
+    },
+    {
+      "SudoParam": []
+    },
+    {
+      "SudoHeader": []
+    },
+    {
+      "TOTPHeader": []
+    }
+  ]
+}
diff --git a/bots-common/cfg.yaml b/bots-common/cfg.yaml
new file mode 100644
index 0000000..17f0155
--- /dev/null
+++ b/bots-common/cfg.yaml
@@ -0,0 +1,5 @@
+package: client
+output: client.gen.go
+generate:
+  models: true
+  client: true
diff --git a/bots-common/consts.go b/bots-common/consts.go
new file mode 100644
index 0000000..294f53d
--- /dev/null
+++ b/bots-common/consts.go
@@ -0,0 +1,8 @@
+package common;
+
+const (
+	GiteaTokenEnv       = "GITEA_TOKEN"
+	DefaultGitPrj       = "_ObsPrj"
+	GiteaRequestHeader  = "X-Gitea-Event-Type"
+)
+
diff --git a/bots-common/conststring_test.go b/bots-common/conststring_test.go
new file mode 100644
index 0000000..33d25b9
--- /dev/null
+++ b/bots-common/conststring_test.go
@@ -0,0 +1,432 @@
+package common
+
+const examplePushJSON = `{
+  "ref": "refs/heads/main",
+  "before": "9fe6b18fee74f49786c39e062ef02bcfb560a0be6eb7851b81954123e2d55629",
+  "after": "7d0be2432c179873081b715b8d38a563b8469608e110205821ba6a894e63c616",
+  "compare_url": "https://src.opensuse.org/autogits/_ObsPrj/compare/9fe6b18fee74f49786c39e062ef02bcfb560a0be6eb7851b81954123e2d55629...7d0be2432c179873081b715b8d38a563b8469608e110205821ba6a894e63c616",
+  "commits": [
+    {
+      "id": "7d0be2432c179873081b715b8d38a563b8469608e110205821ba6a894e63c616",
+      "message": "Automatic project inclusion\n",
+      "url": "https://src.opensuse.org/autogits/_ObsPrj/commit/7d0be2432c179873081b715b8d38a563b8469608e110205821ba6a894e63c616",
+      "author": {
+        "name": "GiteaBot - AutoDevel",
+        "email": "not-exist@src.opensuse.org",
+        "username": ""
+      },
+      "committer": {
+        "name": "root",
+        "email": "not-exist@src.opensuse.org",
+        "username": ""
+      },
+      "verification": null,
+      "timestamp": "2024-06-25T14:38:31Z",
+      "added": [
+        ".gitmodules",
+        "nodejs22"
+      ],
+      "removed": [],
+      "modified": []
+    }
+  ],
+  "total_commits": 1,
+  "head_commit": {
+    "id": "7d0be2432c179873081b715b8d38a563b8469608e110205821ba6a894e63c616",
+    "message": "Automatic project inclusion\n",
+    "url": "https://src.opensuse.org/autogits/_ObsPrj/commit/7d0be2432c179873081b715b8d38a563b8469608e110205821ba6a894e63c616",
+    "author": {
+      "name": "GiteaBot - AutoDevel",
+      "email": "not-exist@src.opensuse.org",
+      "username": ""
+    },
+    "committer": {
+      "name": "root",
+      "email": "not-exist@src.opensuse.org",
+      "username": ""
+    },
+    "verification": null,
+    "timestamp": "2024-06-25T14:38:31Z",
+    "added": [
+      ".gitmodules",
+      "nodejs22"
+    ],
+    "removed": [],
+    "modified": []
+  },
+  "repository": {
+    "id": 90487,
+    "owner": {
+      "id": 983,
+      "login": "autogits",
+      "login_name": "",
+      "source_id": 0,
+      "full_name": "",
+      "email": "",
+      "avatar_url": "https://src.opensuse.org/avatars/80a61ef3a14c3c22f0b8b1885d1a75d4",
+      "html_url": "https://src.opensuse.org/autogits",
+      "language": "",
+      "is_admin": false,
+      "last_login": "0001-01-01T00:00:00Z",
+      "created": "2024-06-20T09:46:37+02:00",
+      "restricted": false,
+      "active": false,
+      "prohibit_login": false,
+      "location": "",
+      "website": "",
+      "description": "",
+      "visibility": "public",
+      "followers_count": 0,
+      "following_count": 0,
+      "starred_repos_count": 0,
+      "username": "autogits"
+    },
+    "name": "_ObsPrj",
+    "full_name": "autogits/_ObsPrj",
+    "description": "",
+    "empty": false,
+    "private": false,
+    "fork": false,
+    "template": false,
+    "parent": null,
+    "mirror": false,
+    "size": 27,
+    "language": "",
+    "languages_url": "https://src.opensuse.org/api/v1/repos/autogits/_ObsPrj/languages",
+    "html_url": "https://src.opensuse.org/autogits/_ObsPrj",
+    "url": "https://src.opensuse.org/api/v1/repos/autogits/_ObsPrj",
+    "link": "",
+    "ssh_url": "gitea@src.opensuse.org:autogits/_ObsPrj.git",
+    "clone_url": "https://src.opensuse.org/autogits/_ObsPrj.git",
+    "original_url": "",
+    "website": "",
+    "stars_count": 0,
+    "forks_count": 0,
+    "watchers_count": 1,
+    "open_issues_count": 0,
+    "open_pr_counter": 0,
+    "release_counter": 0,
+    "default_branch": "main",
+    "archived": false,
+    "created_at": "2024-06-25T13:52:03+02:00",
+    "updated_at": "2024-06-25T16:20:44+02:00",
+    "archived_at": "1970-01-01T01:00:00+01:00",
+    "permissions": {
+      "admin": true,
+      "push": true,
+      "pull": true
+    },
+    "has_issues": true,
+    "internal_tracker": {
+      "enable_time_tracker": false,
+      "allow_only_contributors_to_track_time": true,
+      "enable_issue_dependencies": true
+    },
+    "has_wiki": true,
+    "has_pull_requests": true,
+    "has_projects": true,
+    "projects_mode": "all",
+    "has_releases": true,
+    "has_packages": true,
+    "has_actions": true,
+    "ignore_whitespace_conflicts": false,
+    "allow_merge_commits": true,
+    "allow_rebase": true,
+    "allow_rebase_explicit": true,
+    "allow_squash_merge": true,
+    "allow_fast_forward_only_merge": true,
+    "allow_rebase_update": true,
+    "default_delete_branch_after_merge": false,
+    "default_merge_style": "merge",
+    "default_allow_maintainer_edit": false,
+    "avatar_url": "https://src.opensuse.org/",
+    "internal": false,
+    "mirror_interval": "",
+    "object_format_name": "sha256",
+    "mirror_updated": "0001-01-01T00:00:00Z",
+    "repo_transfer": null
+  },
+  "pusher": {
+    "id": 129,
+    "login": "adamm",
+    "login_name": "",
+    "source_id": 0,
+    "full_name": "Adam Majer",
+    "email": "adamm@noreply@src.opensuse.org",
+    "avatar_url": "https://src.opensuse.org/avatar/babb6ae054a709c238a4e9b0f2b53d53",
+    "html_url": "https://src.opensuse.org/adamm",
+    "language": "",
+    "is_admin": false,
+    "last_login": "0001-01-01T00:00:00Z",
+    "created": "2023-07-21T16:43:48+02:00",
+    "restricted": false,
+    "active": false,
+    "prohibit_login": false,
+    "location": "",
+    "website": "",
+    "description": "",
+    "visibility": "public",
+    "followers_count": 0,
+    "following_count": 0,
+    "starred_repos_count": 0,
+    "username": "adamm"
+  },
+  "sender": {
+    "id": 129,
+    "login": "adamm",
+    "login_name": "",
+    "source_id": 0,
+    "full_name": "Adam Majer",
+    "email": "adamm@noreply@src.opensuse.org",
+    "avatar_url": "https://src.opensuse.org/avatar/babb6ae054a709c238a4e9b0f2b53d53",
+    "html_url": "https://src.opensuse.org/adamm",
+    "language": "",
+    "is_admin": false,
+    "last_login": "0001-01-01T00:00:00Z",
+    "created": "2023-07-21T16:43:48+02:00",
+    "restricted": false,
+    "active": false,
+    "prohibit_login": false,
+    "location": "",
+    "website": "",
+    "description": "",
+    "visibility": "public",
+    "followers_count": 0,
+    "following_count": 0,
+    "starred_repos_count": 0,
+    "username": "adamm"
+  }
+}
+`
+
+const repoCreateJSON = `{
+ "action": "created",
+ "repository": {
+  "id": 87483,
+  "owner": {
+   "id": 983,
+   "login": "autogits",
+   "login_name": "",
+   "source_id": 0,
+   "full_name": "",
+   "email": "",
+   "avatar_url": "https://src.opensuse.org/avatars/80a61ef3a14c3c22f0b8b1885d1a75d4",
+   "html_url": "https://src.opensuse.org/autogits",
+   "language": "",
+   "is_admin": false,
+   "last_login": "0001-01-01T00:00:00Z",
+   "created": "2024-06-20T09:46:37+02:00",
+   "restricted": false,
+   "active": false,
+   "prohibit_login": false,
+   "location": "",
+   "website": "",
+   "description": "",
+   "visibility": "public",
+   "followers_count": 0,
+   "following_count": 0,
+   "starred_repos_count": 0,
+   "username": "autogits"
+  },
+  "name": "nodejs22",
+  "full_name": "autogits/nodejs22",
+  "description": "",
+  "empty": false,
+  "private": false,
+  "fork": true,
+  "template": false,
+  "parent": {
+   "id": 54598,
+   "owner": {
+    "id": 64,
+    "login": "pool",
+    "login_name": "",
+    "source_id": 0,
+    "full_name": "",
+    "email": "",
+    "avatar_url": "https://src.opensuse.org/avatars/b10a8c0bede9eb4ea771b04db3149f28",
+    "html_url": "https://src.opensuse.org/pool",
+    "language": "",
+    "is_admin": false,
+    "last_login": "0001-01-01T00:00:00Z",
+    "created": "2023-03-01T14:41:17+01:00",
+    "restricted": false,
+    "active": false,
+    "prohibit_login": false,
+    "location": "",
+    "website": "",
+    "description": "",
+    "visibility": "public",
+    "followers_count": 0,
+    "following_count": 0,
+    "starred_repos_count": 0,
+    "username": "pool"
+   },
+   "name": "nodejs22",
+   "full_name": "pool/nodejs22",
+   "description": "",
+   "empty": false,
+   "private": false,
+   "fork": false,
+   "template": false,
+   "parent": null,
+   "mirror": false,
+   "size": 190,
+   "language": "",
+   "languages_url": "https://src.opensuse.org/api/v1/repos/pool/nodejs22/languages",
+   "html_url": "https://src.opensuse.org/pool/nodejs22",
+   "url": "https://src.opensuse.org/api/v1/repos/pool/nodejs22",
+   "link": "",
+   "ssh_url": "gitea@src.opensuse.org:pool/nodejs22.git",
+   "clone_url": "https://src.opensuse.org/pool/nodejs22.git",
+   "original_url": "",
+   "website": "",
+   "stars_count": 0,
+   "forks_count": 3,
+   "watchers_count": 4,
+   "open_issues_count": 0,
+   "open_pr_counter": 1,
+   "release_counter": 0,
+   "default_branch": "factory",
+   "archived": false,
+   "created_at": "2024-05-28T12:47:21+02:00",
+   "updated_at": "2024-06-12T14:54:03+02:00",
+   "archived_at": "1970-01-01T01:00:00+01:00",
+   "permissions": {
+    "admin": true,
+    "push": true,
+    "pull": true
+   },
+   "has_issues": true,
+   "internal_tracker": {
+    "enable_time_tracker": false,
+    "allow_only_contributors_to_track_time": true,
+    "enable_issue_dependencies": true
+   },
+   "has_wiki": true,
+   "has_pull_requests": true,
+   "has_projects": true,
+   "projects_mode": "",
+   "has_releases": true,
+   "has_packages": true,
+   "has_actions": false,
+   "ignore_whitespace_conflicts": false,
+   "allow_merge_commits": true,
+   "allow_rebase": true,
+   "allow_rebase_explicit": true,
+   "allow_squash_merge": true,
+   "allow_fast_forward_only_merge": false,
+   "allow_rebase_update": true,
+   "default_delete_branch_after_merge": false,
+   "default_merge_style": "merge",
+   "default_allow_maintainer_edit": false,
+   "avatar_url": "https://src.opensuse.org/",
+   "internal": false,
+   "mirror_interval": "",
+   "object_format_name": "sha256",
+   "mirror_updated": "0001-01-01T00:00:00Z",
+   "repo_transfer": null
+  },
+  "mirror": false,
+  "size": 0,
+  "language": "",
+  "languages_url": "https://src.opensuse.org/api/v1/repos/autogits/nodejs22/languages",
+  "html_url": "https://src.opensuse.org/autogits/nodejs22",
+  "url": "https://src.opensuse.org/api/v1/repos/autogits/nodejs22",
+  "link": "",
+  "ssh_url": "gitea@src.opensuse.org:autogits/nodejs22.git",
+  "clone_url": "https://src.opensuse.org/autogits/nodejs22.git",
+  "original_url": "",
+  "website": "",
+  "stars_count": 0,
+  "forks_count": 0,
+  "watchers_count": 0,
+  "open_issues_count": 0,
+  "open_pr_counter": 0,
+  "release_counter": 0,
+  "default_branch": "factory",
+  "archived": false,
+  "created_at": "2024-06-20T10:09:12+02:00",
+  "updated_at": "2024-06-20T10:09:12+02:00",
+  "archived_at": "1970-01-01T01:00:00+01:00",
+  "permissions": {
+   "admin": true,
+   "push": true,
+   "pull": true
+  },
+  "has_issues": false,
+  "has_wiki": false,
+  "has_pull_requests": true,
+  "has_projects": false,
+  "projects_mode": "all",
+  "has_releases": false,
+  "has_packages": false,
+  "has_actions": false,
+  "ignore_whitespace_conflicts": false,
+  "allow_merge_commits": true,
+  "allow_rebase": true,
+  "allow_rebase_explicit": true,
+  "allow_squash_merge": true,
+  "allow_fast_forward_only_merge": true,
+  "allow_rebase_update": true,
+  "default_delete_branch_after_merge": false,
+  "default_merge_style": "merge",
+  "default_allow_maintainer_edit": false,
+  "avatar_url": "https://src.opensuse.org/",
+  "internal": false,
+  "mirror_interval": "",
+  "object_format_name": "sha256",
+  "mirror_updated": "0001-01-01T00:00:00Z",
+  "repo_transfer": null
+ },
+ "organization": {
+  "id": 983,
+  "login": "autogits",
+  "login_name": "",
+  "source_id": 0,
+  "full_name": "",
+  "email": "autogits@noreply@src.opensuse.org",
+  "avatar_url": "https://src.opensuse.org/avatars/80a61ef3a14c3c22f0b8b1885d1a75d4",
+  "html_url": "https://src.opensuse.org/autogits",
+  "language": "",
+  "is_admin": false,
+  "last_login": "0001-01-01T00:00:00Z",
+  "created": "2024-06-20T09:46:37+02:00",
+  "restricted": false,
+  "active": false,
+  "prohibit_login": false,
+  "location": "",
+  "website": "",
+  "description": "",
+  "visibility": "public",
+  "followers_count": 0,
+  "following_count": 0,
+  "starred_repos_count": 0,
+  "username": "autogits"
+ },
+ "sender": {
+  "id": 129,
+  "login": "adamm",
+  "login_name": "",
+  "source_id": 0,
+  "full_name": "Adam Majer",
+  "email": "adamm@noreply@src.opensuse.org",
+  "avatar_url": "https://src.opensuse.org/avatar/babb6ae054a709c238a4e9b0f2b53d53",
+  "html_url": "https://src.opensuse.org/adamm",
+  "language": "",
+  "is_admin": false,
+  "last_login": "0001-01-01T00:00:00Z",
+  "created": "2023-07-21T16:43:48+02:00",
+  "restricted": false,
+  "active": false,
+  "prohibit_login": false,
+  "location": "",
+  "website": "",
+  "description": "",
+  "visibility": "public",
+  "followers_count": 0,
+  "following_count": 0,
+  "starred_repos_count": 0,
+  "username": "adamm"
+ }
+}`
diff --git a/bots-common/devtest.sh b/bots-common/devtest.sh
new file mode 100755
index 0000000..ef14b73
--- /dev/null
+++ b/bots-common/devtest.sh
@@ -0,0 +1,8 @@
+#!/bin/sh
+
+while true; do
+    clear
+    go test
+    inotifywait -q -e modify -e create -e delete -r .
+done
+
diff --git a/bots-common/generate.go b/bots-common/generate.go
new file mode 100644
index 0000000..af23475
--- /dev/null
+++ b/bots-common/generate.go
@@ -0,0 +1,5 @@
+package common
+
+//go:generate go run github.com/oapi-codegen/oapi-codegen/v2/cmd/oapi-codegen -config cfg.yaml obs.api.yaml
+
+
diff --git a/bots-common/git_utils.go b/bots-common/git_utils.go
new file mode 100644
index 0000000..7087960
--- /dev/null
+++ b/bots-common/git_utils.go
@@ -0,0 +1,204 @@
+package common
+
+import (
+	"fmt"
+	"os"
+	"os/exec"
+	"path"
+	"path/filepath"
+	"strings"
+)
+
+//func (h *RequestHandler) ProcessBranchList() []string {
+//	if h.HasError() {
+//		return make([]string, 0)
+//	}
+//
+//	trackedBranches, err := os.ReadFile(path.Join(h.GitPath, DefaultGitPrj, TrackedBranchesFile))
+//	if err != nil {
+//		if errors.Is(err, os.ErrNotExist) {
+//			trackedBranches = []byte("factory")
+//		} else {
+//			h.LogError("file error reading '%s' file in repo", TrackedBranchesFile)
+//			h.Error = err
+//			return make([]string, 0)
+//		}
+//	}
+//
+//	return strings.Split(string(trackedBranches), "\n")
+//}
+
+type GitReference struct {
+	Branch string
+	Id     string
+}
+
+type GitReferences struct {
+	refs []GitReference
+}
+
+func (refs *GitReferences) addReference(id, branch string) {
+	for _, ref := range refs.refs {
+		if ref.Id == id && ref.Branch == branch {
+			return
+		}
+	}
+
+	refs.refs = append(refs.refs, GitReference{Branch: branch, Id: id})
+}
+
+func processRefs(gitDir string) ([]GitReference, error) {
+	packedRefsPath := path.Join(gitDir, "packed-refs")
+	stat, err := os.Stat(packedRefsPath)
+	if err != nil {
+		return nil, err
+	}
+
+	if stat.Size() > 10000 || stat.IsDir() {
+		return nil, fmt.Errorf("Funny business with 'packed-refs' in '%s'", gitDir)
+	}
+
+	data, err := os.ReadFile(packedRefsPath)
+	if err != nil {
+		return nil, err
+	}
+
+	var references GitReferences
+	for _, line := range strings.Split(string(data), "\n") {
+		if len(line) < 1 || line[0] == '#' {
+			continue
+		}
+
+		splitLine := strings.Split(line, " ")
+		if len(splitLine) != 2 {
+			return nil, fmt.Errorf("Unexpected packaged-refs entry '%#v' in '%s'", splitLine, packedRefsPath)
+		}
+		id, ref := splitLine[0], splitLine[1]
+		const remoteRefPrefix = "refs/remotes/origin/"
+		if ref[0:len(remoteRefPrefix)] != remoteRefPrefix {
+			continue
+		}
+
+		references.addReference(id, ref[len(remoteRefPrefix):])
+	}
+
+	return references.refs, nil
+}
+
+func findGitDir(p string) (string, error) {
+	gitFile := path.Join(p, ".git")
+	stat, err := os.Stat(gitFile)
+	if err != nil {
+		return "", err
+	}
+
+	if stat.IsDir() {
+		return path.Join(p, ".git"), nil
+	}
+
+	data, err := os.ReadFile(gitFile)
+	if err != nil {
+		return "", err
+	}
+
+	for _, line := range strings.Split(string(data), "\n") {
+		refs := strings.Split(line, ":")
+		if len(refs) != 2 {
+			return "", fmt.Errorf("Unknown format of .git file: '%s'\n", line)
+		}
+
+		if refs[0] != "gitdir" {
+			return "", fmt.Errorf("Unknown header of .git file: '%s'\n", refs[0])
+		}
+
+		return path.Join(p, strings.TrimSpace(refs[1])), nil
+	}
+
+	return "", fmt.Errorf("Can't find git subdirectory in '%s'", p)
+}
+
+func (e *RequestHandler) GitBranchHead(gitDir, branchName string) (string, error) {
+	if e.HasError() {
+		return "", e.Error
+	}
+
+	path, err := findGitDir(path.Join(e.GitPath, gitDir))
+	if err != nil {
+		e.LogError("Error identifying gitdir in `%s`: %#v", gitDir, err)
+		e.Error = err
+	}
+
+	refs, err := processRefs(path)
+	if err != nil {
+		e.LogError("Error finding branches (%s): %#v", branchName, err)
+		e.Error = err
+		return "", e.Error
+	}
+
+	for _, ref := range refs {
+		if ref.Branch == branchName {
+			return ref.Id, nil
+		}
+	}
+
+	e.Error = fmt.Errorf("Can't find default remote branch: %s", branchName)
+	e.LogError("%s", e.Error.Error())
+	return "", e.Error
+}
+
+type ExecStream interface {
+	Close()
+	HasError() bool
+	GitExec(cwd string, param ...string) ExecStream
+}
+
+func (e *RequestHandler) Close() {
+	if e.GitPath == "" {
+		return
+	}
+
+	e.Error = os.RemoveAll(e.GitPath)
+	e.GitPath = ""
+	return
+}
+
+func (e *RequestHandler) HasError() bool {
+	return e.Error != nil
+}
+
+type writeFunc func(data []byte) (int, error)
+
+func (f writeFunc) Write(data []byte) (int, error) {
+	return f(data)
+}
+
+func (e *RequestHandler) GitExec(cwd string, params ...string) ExecStream {
+	if e.Error != nil {
+		return e
+	}
+
+	cmd := exec.Command("/usr/bin/git", params...)
+	cmd.Env = []string{
+		"GIT_CEILING_DIRECTORIES=" + e.GitPath,
+		"GIT_CONFIG_GLOBAL=/dev/null",
+		"GIT_AUTHOR_NAME=" + e.GitCommiter,
+		"EMAIL=not@exist@src.opensuse.org",
+		"GIT_LFS_SKIP_SMUDGE=1",
+		"GIT_SSH_COMMAND=/usr/bin/ssh -o StrictHostKeyChecking=yes",
+	}
+	cmd.Dir = filepath.Join(e.GitPath, cwd)
+	cmd.Stdout = writeFunc(func(data []byte) (int, error) {
+		e.Logger.Log("%s", data)
+		return len(data), nil
+	})
+	cmd.Stderr = writeFunc(func(data []byte) (int, error) {
+		e.Logger.LogError("%s", data)
+		return len(data), nil
+	})
+	cmd.Stdin = nil
+
+	e.Log("git execute: %#v", cmd.Args)
+	e.Error = cmd.Run()
+
+	return e
+}
diff --git a/bots-common/gitea-generated/client/activitypub/activitypub_client.go b/bots-common/gitea-generated/client/activitypub/activitypub_client.go
new file mode 100644
index 0000000..28592dc
--- /dev/null
+++ b/bots-common/gitea-generated/client/activitypub/activitypub_client.go
@@ -0,0 +1,171 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package activitypub
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	httptransport "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// New creates a new activitypub API client.
+func New(transport runtime.ClientTransport, formats strfmt.Registry) ClientService {
+	return &Client{transport: transport, formats: formats}
+}
+
+// New creates a new activitypub API client with basic auth credentials.
+// It takes the following parameters:
+// - host: http host (github.com).
+// - basePath: any base path for the API client ("/v1", "/v3").
+// - scheme: http scheme ("http", "https").
+// - user: user for basic authentication header.
+// - password: password for basic authentication header.
+func NewClientWithBasicAuth(host, basePath, scheme, user, password string) ClientService {
+	transport := httptransport.New(host, basePath, []string{scheme})
+	transport.DefaultAuthentication = httptransport.BasicAuth(user, password)
+	return &Client{transport: transport, formats: strfmt.Default}
+}
+
+// New creates a new activitypub API client with a bearer token for authentication.
+// It takes the following parameters:
+// - host: http host (github.com).
+// - basePath: any base path for the API client ("/v1", "/v3").
+// - scheme: http scheme ("http", "https").
+// - bearerToken: bearer token for Bearer authentication header.
+func NewClientWithBearerToken(host, basePath, scheme, bearerToken string) ClientService {
+	transport := httptransport.New(host, basePath, []string{scheme})
+	transport.DefaultAuthentication = httptransport.BearerToken(bearerToken)
+	return &Client{transport: transport, formats: strfmt.Default}
+}
+
+/*
+Client for activitypub API
+*/
+type Client struct {
+	transport runtime.ClientTransport
+	formats   strfmt.Registry
+}
+
+// ClientOption may be used to customize the behavior of Client methods.
+type ClientOption func(*runtime.ClientOperation)
+
+// This client is generated with a few options you might find useful for your swagger spec.
+//
+// Feel free to add you own set of options.
+
+// WithContentType allows the client to force the Content-Type header
+// to negotiate a specific Consumer from the server.
+//
+// You may use this option to set arbitrary extensions to your MIME media type.
+func WithContentType(mime string) ClientOption {
+	return func(r *runtime.ClientOperation) {
+		r.ConsumesMediaTypes = []string{mime}
+	}
+}
+
+// WithContentTypeApplicationJSON sets the Content-Type header to "application/json".
+func WithContentTypeApplicationJSON(r *runtime.ClientOperation) {
+	r.ConsumesMediaTypes = []string{"application/json"}
+}
+
+// WithContentTypeTextPlain sets the Content-Type header to "text/plain".
+func WithContentTypeTextPlain(r *runtime.ClientOperation) {
+	r.ConsumesMediaTypes = []string{"text/plain"}
+}
+
+// ClientService is the interface for Client methods
+type ClientService interface {
+	ActivitypubPerson(params *ActivitypubPersonParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*ActivitypubPersonOK, error)
+
+	ActivitypubPersonInbox(params *ActivitypubPersonInboxParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*ActivitypubPersonInboxNoContent, error)
+
+	SetTransport(transport runtime.ClientTransport)
+}
+
+/*
+ActivitypubPerson returns the person actor for a user
+*/
+func (a *Client) ActivitypubPerson(params *ActivitypubPersonParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*ActivitypubPersonOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewActivitypubPersonParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "activitypubPerson",
+		Method:             "GET",
+		PathPattern:        "/activitypub/user-id/{user-id}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &ActivitypubPersonReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*ActivitypubPersonOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for activitypubPerson: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+ActivitypubPersonInbox sends to the inbox
+*/
+func (a *Client) ActivitypubPersonInbox(params *ActivitypubPersonInboxParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*ActivitypubPersonInboxNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewActivitypubPersonInboxParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "activitypubPersonInbox",
+		Method:             "POST",
+		PathPattern:        "/activitypub/user-id/{user-id}/inbox",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &ActivitypubPersonInboxReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*ActivitypubPersonInboxNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for activitypubPersonInbox: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+// SetTransport changes the transport on the client
+func (a *Client) SetTransport(transport runtime.ClientTransport) {
+	a.transport = transport
+}
diff --git a/bots-common/gitea-generated/client/activitypub/activitypub_person_inbox_parameters.go b/bots-common/gitea-generated/client/activitypub/activitypub_person_inbox_parameters.go
new file mode 100644
index 0000000..fd0be57
--- /dev/null
+++ b/bots-common/gitea-generated/client/activitypub/activitypub_person_inbox_parameters.go
@@ -0,0 +1,152 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package activitypub
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewActivitypubPersonInboxParams creates a new ActivitypubPersonInboxParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewActivitypubPersonInboxParams() *ActivitypubPersonInboxParams {
+	return &ActivitypubPersonInboxParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewActivitypubPersonInboxParamsWithTimeout creates a new ActivitypubPersonInboxParams object
+// with the ability to set a timeout on a request.
+func NewActivitypubPersonInboxParamsWithTimeout(timeout time.Duration) *ActivitypubPersonInboxParams {
+	return &ActivitypubPersonInboxParams{
+		timeout: timeout,
+	}
+}
+
+// NewActivitypubPersonInboxParamsWithContext creates a new ActivitypubPersonInboxParams object
+// with the ability to set a context for a request.
+func NewActivitypubPersonInboxParamsWithContext(ctx context.Context) *ActivitypubPersonInboxParams {
+	return &ActivitypubPersonInboxParams{
+		Context: ctx,
+	}
+}
+
+// NewActivitypubPersonInboxParamsWithHTTPClient creates a new ActivitypubPersonInboxParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewActivitypubPersonInboxParamsWithHTTPClient(client *http.Client) *ActivitypubPersonInboxParams {
+	return &ActivitypubPersonInboxParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+ActivitypubPersonInboxParams contains all the parameters to send to the API endpoint
+
+	for the activitypub person inbox operation.
+
+	Typically these are written to a http.Request.
+*/
+type ActivitypubPersonInboxParams struct {
+
+	/* UserID.
+
+	   user ID of the user
+	*/
+	UserID int64
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the activitypub person inbox params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *ActivitypubPersonInboxParams) WithDefaults() *ActivitypubPersonInboxParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the activitypub person inbox params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *ActivitypubPersonInboxParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the activitypub person inbox params
+func (o *ActivitypubPersonInboxParams) WithTimeout(timeout time.Duration) *ActivitypubPersonInboxParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the activitypub person inbox params
+func (o *ActivitypubPersonInboxParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the activitypub person inbox params
+func (o *ActivitypubPersonInboxParams) WithContext(ctx context.Context) *ActivitypubPersonInboxParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the activitypub person inbox params
+func (o *ActivitypubPersonInboxParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the activitypub person inbox params
+func (o *ActivitypubPersonInboxParams) WithHTTPClient(client *http.Client) *ActivitypubPersonInboxParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the activitypub person inbox params
+func (o *ActivitypubPersonInboxParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithUserID adds the userID to the activitypub person inbox params
+func (o *ActivitypubPersonInboxParams) WithUserID(userID int64) *ActivitypubPersonInboxParams {
+	o.SetUserID(userID)
+	return o
+}
+
+// SetUserID adds the userId to the activitypub person inbox params
+func (o *ActivitypubPersonInboxParams) SetUserID(userID int64) {
+	o.UserID = userID
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *ActivitypubPersonInboxParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param user-id
+	if err := r.SetPathParam("user-id", swag.FormatInt64(o.UserID)); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/activitypub/activitypub_person_inbox_responses.go b/bots-common/gitea-generated/client/activitypub/activitypub_person_inbox_responses.go
new file mode 100644
index 0000000..a49bdb7
--- /dev/null
+++ b/bots-common/gitea-generated/client/activitypub/activitypub_person_inbox_responses.go
@@ -0,0 +1,88 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package activitypub
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// ActivitypubPersonInboxReader is a Reader for the ActivitypubPersonInbox structure.
+type ActivitypubPersonInboxReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *ActivitypubPersonInboxReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewActivitypubPersonInboxNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	default:
+		return nil, runtime.NewAPIError("[POST /activitypub/user-id/{user-id}/inbox] activitypubPersonInbox", response, response.Code())
+	}
+}
+
+// NewActivitypubPersonInboxNoContent creates a ActivitypubPersonInboxNoContent with default headers values
+func NewActivitypubPersonInboxNoContent() *ActivitypubPersonInboxNoContent {
+	return &ActivitypubPersonInboxNoContent{}
+}
+
+/*
+ActivitypubPersonInboxNoContent describes a response with status code 204, with default header values.
+
+APIEmpty is an empty response
+*/
+type ActivitypubPersonInboxNoContent struct {
+}
+
+// IsSuccess returns true when this activitypub person inbox no content response has a 2xx status code
+func (o *ActivitypubPersonInboxNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this activitypub person inbox no content response has a 3xx status code
+func (o *ActivitypubPersonInboxNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this activitypub person inbox no content response has a 4xx status code
+func (o *ActivitypubPersonInboxNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this activitypub person inbox no content response has a 5xx status code
+func (o *ActivitypubPersonInboxNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this activitypub person inbox no content response a status code equal to that given
+func (o *ActivitypubPersonInboxNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the activitypub person inbox no content response
+func (o *ActivitypubPersonInboxNoContent) Code() int {
+	return 204
+}
+
+func (o *ActivitypubPersonInboxNoContent) Error() string {
+	return fmt.Sprintf("[POST /activitypub/user-id/{user-id}/inbox][%d] activitypubPersonInboxNoContent", 204)
+}
+
+func (o *ActivitypubPersonInboxNoContent) String() string {
+	return fmt.Sprintf("[POST /activitypub/user-id/{user-id}/inbox][%d] activitypubPersonInboxNoContent", 204)
+}
+
+func (o *ActivitypubPersonInboxNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/activitypub/activitypub_person_parameters.go b/bots-common/gitea-generated/client/activitypub/activitypub_person_parameters.go
new file mode 100644
index 0000000..5d3cd18
--- /dev/null
+++ b/bots-common/gitea-generated/client/activitypub/activitypub_person_parameters.go
@@ -0,0 +1,152 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package activitypub
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewActivitypubPersonParams creates a new ActivitypubPersonParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewActivitypubPersonParams() *ActivitypubPersonParams {
+	return &ActivitypubPersonParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewActivitypubPersonParamsWithTimeout creates a new ActivitypubPersonParams object
+// with the ability to set a timeout on a request.
+func NewActivitypubPersonParamsWithTimeout(timeout time.Duration) *ActivitypubPersonParams {
+	return &ActivitypubPersonParams{
+		timeout: timeout,
+	}
+}
+
+// NewActivitypubPersonParamsWithContext creates a new ActivitypubPersonParams object
+// with the ability to set a context for a request.
+func NewActivitypubPersonParamsWithContext(ctx context.Context) *ActivitypubPersonParams {
+	return &ActivitypubPersonParams{
+		Context: ctx,
+	}
+}
+
+// NewActivitypubPersonParamsWithHTTPClient creates a new ActivitypubPersonParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewActivitypubPersonParamsWithHTTPClient(client *http.Client) *ActivitypubPersonParams {
+	return &ActivitypubPersonParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+ActivitypubPersonParams contains all the parameters to send to the API endpoint
+
+	for the activitypub person operation.
+
+	Typically these are written to a http.Request.
+*/
+type ActivitypubPersonParams struct {
+
+	/* UserID.
+
+	   user ID of the user
+	*/
+	UserID int64
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the activitypub person params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *ActivitypubPersonParams) WithDefaults() *ActivitypubPersonParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the activitypub person params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *ActivitypubPersonParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the activitypub person params
+func (o *ActivitypubPersonParams) WithTimeout(timeout time.Duration) *ActivitypubPersonParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the activitypub person params
+func (o *ActivitypubPersonParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the activitypub person params
+func (o *ActivitypubPersonParams) WithContext(ctx context.Context) *ActivitypubPersonParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the activitypub person params
+func (o *ActivitypubPersonParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the activitypub person params
+func (o *ActivitypubPersonParams) WithHTTPClient(client *http.Client) *ActivitypubPersonParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the activitypub person params
+func (o *ActivitypubPersonParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithUserID adds the userID to the activitypub person params
+func (o *ActivitypubPersonParams) WithUserID(userID int64) *ActivitypubPersonParams {
+	o.SetUserID(userID)
+	return o
+}
+
+// SetUserID adds the userId to the activitypub person params
+func (o *ActivitypubPersonParams) SetUserID(userID int64) {
+	o.UserID = userID
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *ActivitypubPersonParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param user-id
+	if err := r.SetPathParam("user-id", swag.FormatInt64(o.UserID)); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/activitypub/activitypub_person_responses.go b/bots-common/gitea-generated/client/activitypub/activitypub_person_responses.go
new file mode 100644
index 0000000..8a58a66
--- /dev/null
+++ b/bots-common/gitea-generated/client/activitypub/activitypub_person_responses.go
@@ -0,0 +1,106 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package activitypub
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// ActivitypubPersonReader is a Reader for the ActivitypubPerson structure.
+type ActivitypubPersonReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *ActivitypubPersonReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewActivitypubPersonOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	default:
+		return nil, runtime.NewAPIError("[GET /activitypub/user-id/{user-id}] activitypubPerson", response, response.Code())
+	}
+}
+
+// NewActivitypubPersonOK creates a ActivitypubPersonOK with default headers values
+func NewActivitypubPersonOK() *ActivitypubPersonOK {
+	return &ActivitypubPersonOK{}
+}
+
+/*
+ActivitypubPersonOK describes a response with status code 200, with default header values.
+
+ActivityPub
+*/
+type ActivitypubPersonOK struct {
+	Payload *models.ActivityPub
+}
+
+// IsSuccess returns true when this activitypub person o k response has a 2xx status code
+func (o *ActivitypubPersonOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this activitypub person o k response has a 3xx status code
+func (o *ActivitypubPersonOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this activitypub person o k response has a 4xx status code
+func (o *ActivitypubPersonOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this activitypub person o k response has a 5xx status code
+func (o *ActivitypubPersonOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this activitypub person o k response a status code equal to that given
+func (o *ActivitypubPersonOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the activitypub person o k response
+func (o *ActivitypubPersonOK) Code() int {
+	return 200
+}
+
+func (o *ActivitypubPersonOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /activitypub/user-id/{user-id}][%d] activitypubPersonOK %s", 200, payload)
+}
+
+func (o *ActivitypubPersonOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /activitypub/user-id/{user-id}][%d] activitypubPersonOK %s", 200, payload)
+}
+
+func (o *ActivitypubPersonOK) GetPayload() *models.ActivityPub {
+	return o.Payload
+}
+
+func (o *ActivitypubPersonOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.ActivityPub)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/admin/admin_add_user_badges_parameters.go b/bots-common/gitea-generated/client/admin/admin_add_user_badges_parameters.go
new file mode 100644
index 0000000..07169eb
--- /dev/null
+++ b/bots-common/gitea-generated/client/admin/admin_add_user_badges_parameters.go
@@ -0,0 +1,172 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package admin
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewAdminAddUserBadgesParams creates a new AdminAddUserBadgesParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewAdminAddUserBadgesParams() *AdminAddUserBadgesParams {
+	return &AdminAddUserBadgesParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewAdminAddUserBadgesParamsWithTimeout creates a new AdminAddUserBadgesParams object
+// with the ability to set a timeout on a request.
+func NewAdminAddUserBadgesParamsWithTimeout(timeout time.Duration) *AdminAddUserBadgesParams {
+	return &AdminAddUserBadgesParams{
+		timeout: timeout,
+	}
+}
+
+// NewAdminAddUserBadgesParamsWithContext creates a new AdminAddUserBadgesParams object
+// with the ability to set a context for a request.
+func NewAdminAddUserBadgesParamsWithContext(ctx context.Context) *AdminAddUserBadgesParams {
+	return &AdminAddUserBadgesParams{
+		Context: ctx,
+	}
+}
+
+// NewAdminAddUserBadgesParamsWithHTTPClient creates a new AdminAddUserBadgesParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewAdminAddUserBadgesParamsWithHTTPClient(client *http.Client) *AdminAddUserBadgesParams {
+	return &AdminAddUserBadgesParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+AdminAddUserBadgesParams contains all the parameters to send to the API endpoint
+
+	for the admin add user badges operation.
+
+	Typically these are written to a http.Request.
+*/
+type AdminAddUserBadgesParams struct {
+
+	// Body.
+	Body *models.UserBadgeOption
+
+	/* Username.
+
+	   username of user
+	*/
+	Username string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the admin add user badges params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *AdminAddUserBadgesParams) WithDefaults() *AdminAddUserBadgesParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the admin add user badges params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *AdminAddUserBadgesParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the admin add user badges params
+func (o *AdminAddUserBadgesParams) WithTimeout(timeout time.Duration) *AdminAddUserBadgesParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the admin add user badges params
+func (o *AdminAddUserBadgesParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the admin add user badges params
+func (o *AdminAddUserBadgesParams) WithContext(ctx context.Context) *AdminAddUserBadgesParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the admin add user badges params
+func (o *AdminAddUserBadgesParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the admin add user badges params
+func (o *AdminAddUserBadgesParams) WithHTTPClient(client *http.Client) *AdminAddUserBadgesParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the admin add user badges params
+func (o *AdminAddUserBadgesParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the admin add user badges params
+func (o *AdminAddUserBadgesParams) WithBody(body *models.UserBadgeOption) *AdminAddUserBadgesParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the admin add user badges params
+func (o *AdminAddUserBadgesParams) SetBody(body *models.UserBadgeOption) {
+	o.Body = body
+}
+
+// WithUsername adds the username to the admin add user badges params
+func (o *AdminAddUserBadgesParams) WithUsername(username string) *AdminAddUserBadgesParams {
+	o.SetUsername(username)
+	return o
+}
+
+// SetUsername adds the username to the admin add user badges params
+func (o *AdminAddUserBadgesParams) SetUsername(username string) {
+	o.Username = username
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *AdminAddUserBadgesParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	// path param username
+	if err := r.SetPathParam("username", o.Username); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/admin/admin_add_user_badges_responses.go b/bots-common/gitea-generated/client/admin/admin_add_user_badges_responses.go
new file mode 100644
index 0000000..5c877de
--- /dev/null
+++ b/bots-common/gitea-generated/client/admin/admin_add_user_badges_responses.go
@@ -0,0 +1,166 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package admin
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// AdminAddUserBadgesReader is a Reader for the AdminAddUserBadges structure.
+type AdminAddUserBadgesReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *AdminAddUserBadgesReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewAdminAddUserBadgesNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 403:
+		result := NewAdminAddUserBadgesForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[POST /admin/users/{username}/badges] adminAddUserBadges", response, response.Code())
+	}
+}
+
+// NewAdminAddUserBadgesNoContent creates a AdminAddUserBadgesNoContent with default headers values
+func NewAdminAddUserBadgesNoContent() *AdminAddUserBadgesNoContent {
+	return &AdminAddUserBadgesNoContent{}
+}
+
+/*
+AdminAddUserBadgesNoContent describes a response with status code 204, with default header values.
+
+APIEmpty is an empty response
+*/
+type AdminAddUserBadgesNoContent struct {
+}
+
+// IsSuccess returns true when this admin add user badges no content response has a 2xx status code
+func (o *AdminAddUserBadgesNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this admin add user badges no content response has a 3xx status code
+func (o *AdminAddUserBadgesNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this admin add user badges no content response has a 4xx status code
+func (o *AdminAddUserBadgesNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this admin add user badges no content response has a 5xx status code
+func (o *AdminAddUserBadgesNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this admin add user badges no content response a status code equal to that given
+func (o *AdminAddUserBadgesNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the admin add user badges no content response
+func (o *AdminAddUserBadgesNoContent) Code() int {
+	return 204
+}
+
+func (o *AdminAddUserBadgesNoContent) Error() string {
+	return fmt.Sprintf("[POST /admin/users/{username}/badges][%d] adminAddUserBadgesNoContent", 204)
+}
+
+func (o *AdminAddUserBadgesNoContent) String() string {
+	return fmt.Sprintf("[POST /admin/users/{username}/badges][%d] adminAddUserBadgesNoContent", 204)
+}
+
+func (o *AdminAddUserBadgesNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewAdminAddUserBadgesForbidden creates a AdminAddUserBadgesForbidden with default headers values
+func NewAdminAddUserBadgesForbidden() *AdminAddUserBadgesForbidden {
+	return &AdminAddUserBadgesForbidden{}
+}
+
+/*
+AdminAddUserBadgesForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type AdminAddUserBadgesForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this admin add user badges forbidden response has a 2xx status code
+func (o *AdminAddUserBadgesForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this admin add user badges forbidden response has a 3xx status code
+func (o *AdminAddUserBadgesForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this admin add user badges forbidden response has a 4xx status code
+func (o *AdminAddUserBadgesForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this admin add user badges forbidden response has a 5xx status code
+func (o *AdminAddUserBadgesForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this admin add user badges forbidden response a status code equal to that given
+func (o *AdminAddUserBadgesForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the admin add user badges forbidden response
+func (o *AdminAddUserBadgesForbidden) Code() int {
+	return 403
+}
+
+func (o *AdminAddUserBadgesForbidden) Error() string {
+	return fmt.Sprintf("[POST /admin/users/{username}/badges][%d] adminAddUserBadgesForbidden", 403)
+}
+
+func (o *AdminAddUserBadgesForbidden) String() string {
+	return fmt.Sprintf("[POST /admin/users/{username}/badges][%d] adminAddUserBadgesForbidden", 403)
+}
+
+func (o *AdminAddUserBadgesForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/admin/admin_adopt_repository_parameters.go b/bots-common/gitea-generated/client/admin/admin_adopt_repository_parameters.go
new file mode 100644
index 0000000..af58629
--- /dev/null
+++ b/bots-common/gitea-generated/client/admin/admin_adopt_repository_parameters.go
@@ -0,0 +1,173 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package admin
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewAdminAdoptRepositoryParams creates a new AdminAdoptRepositoryParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewAdminAdoptRepositoryParams() *AdminAdoptRepositoryParams {
+	return &AdminAdoptRepositoryParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewAdminAdoptRepositoryParamsWithTimeout creates a new AdminAdoptRepositoryParams object
+// with the ability to set a timeout on a request.
+func NewAdminAdoptRepositoryParamsWithTimeout(timeout time.Duration) *AdminAdoptRepositoryParams {
+	return &AdminAdoptRepositoryParams{
+		timeout: timeout,
+	}
+}
+
+// NewAdminAdoptRepositoryParamsWithContext creates a new AdminAdoptRepositoryParams object
+// with the ability to set a context for a request.
+func NewAdminAdoptRepositoryParamsWithContext(ctx context.Context) *AdminAdoptRepositoryParams {
+	return &AdminAdoptRepositoryParams{
+		Context: ctx,
+	}
+}
+
+// NewAdminAdoptRepositoryParamsWithHTTPClient creates a new AdminAdoptRepositoryParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewAdminAdoptRepositoryParamsWithHTTPClient(client *http.Client) *AdminAdoptRepositoryParams {
+	return &AdminAdoptRepositoryParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+AdminAdoptRepositoryParams contains all the parameters to send to the API endpoint
+
+	for the admin adopt repository operation.
+
+	Typically these are written to a http.Request.
+*/
+type AdminAdoptRepositoryParams struct {
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the admin adopt repository params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *AdminAdoptRepositoryParams) WithDefaults() *AdminAdoptRepositoryParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the admin adopt repository params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *AdminAdoptRepositoryParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the admin adopt repository params
+func (o *AdminAdoptRepositoryParams) WithTimeout(timeout time.Duration) *AdminAdoptRepositoryParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the admin adopt repository params
+func (o *AdminAdoptRepositoryParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the admin adopt repository params
+func (o *AdminAdoptRepositoryParams) WithContext(ctx context.Context) *AdminAdoptRepositoryParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the admin adopt repository params
+func (o *AdminAdoptRepositoryParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the admin adopt repository params
+func (o *AdminAdoptRepositoryParams) WithHTTPClient(client *http.Client) *AdminAdoptRepositoryParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the admin adopt repository params
+func (o *AdminAdoptRepositoryParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithOwner adds the owner to the admin adopt repository params
+func (o *AdminAdoptRepositoryParams) WithOwner(owner string) *AdminAdoptRepositoryParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the admin adopt repository params
+func (o *AdminAdoptRepositoryParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the admin adopt repository params
+func (o *AdminAdoptRepositoryParams) WithRepo(repo string) *AdminAdoptRepositoryParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the admin adopt repository params
+func (o *AdminAdoptRepositoryParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *AdminAdoptRepositoryParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/admin/admin_adopt_repository_responses.go b/bots-common/gitea-generated/client/admin/admin_adopt_repository_responses.go
new file mode 100644
index 0000000..454238b
--- /dev/null
+++ b/bots-common/gitea-generated/client/admin/admin_adopt_repository_responses.go
@@ -0,0 +1,228 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package admin
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// AdminAdoptRepositoryReader is a Reader for the AdminAdoptRepository structure.
+type AdminAdoptRepositoryReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *AdminAdoptRepositoryReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewAdminAdoptRepositoryNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 403:
+		result := NewAdminAdoptRepositoryForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewAdminAdoptRepositoryNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[POST /admin/unadopted/{owner}/{repo}] adminAdoptRepository", response, response.Code())
+	}
+}
+
+// NewAdminAdoptRepositoryNoContent creates a AdminAdoptRepositoryNoContent with default headers values
+func NewAdminAdoptRepositoryNoContent() *AdminAdoptRepositoryNoContent {
+	return &AdminAdoptRepositoryNoContent{}
+}
+
+/*
+AdminAdoptRepositoryNoContent describes a response with status code 204, with default header values.
+
+APIEmpty is an empty response
+*/
+type AdminAdoptRepositoryNoContent struct {
+}
+
+// IsSuccess returns true when this admin adopt repository no content response has a 2xx status code
+func (o *AdminAdoptRepositoryNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this admin adopt repository no content response has a 3xx status code
+func (o *AdminAdoptRepositoryNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this admin adopt repository no content response has a 4xx status code
+func (o *AdminAdoptRepositoryNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this admin adopt repository no content response has a 5xx status code
+func (o *AdminAdoptRepositoryNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this admin adopt repository no content response a status code equal to that given
+func (o *AdminAdoptRepositoryNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the admin adopt repository no content response
+func (o *AdminAdoptRepositoryNoContent) Code() int {
+	return 204
+}
+
+func (o *AdminAdoptRepositoryNoContent) Error() string {
+	return fmt.Sprintf("[POST /admin/unadopted/{owner}/{repo}][%d] adminAdoptRepositoryNoContent", 204)
+}
+
+func (o *AdminAdoptRepositoryNoContent) String() string {
+	return fmt.Sprintf("[POST /admin/unadopted/{owner}/{repo}][%d] adminAdoptRepositoryNoContent", 204)
+}
+
+func (o *AdminAdoptRepositoryNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewAdminAdoptRepositoryForbidden creates a AdminAdoptRepositoryForbidden with default headers values
+func NewAdminAdoptRepositoryForbidden() *AdminAdoptRepositoryForbidden {
+	return &AdminAdoptRepositoryForbidden{}
+}
+
+/*
+AdminAdoptRepositoryForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type AdminAdoptRepositoryForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this admin adopt repository forbidden response has a 2xx status code
+func (o *AdminAdoptRepositoryForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this admin adopt repository forbidden response has a 3xx status code
+func (o *AdminAdoptRepositoryForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this admin adopt repository forbidden response has a 4xx status code
+func (o *AdminAdoptRepositoryForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this admin adopt repository forbidden response has a 5xx status code
+func (o *AdminAdoptRepositoryForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this admin adopt repository forbidden response a status code equal to that given
+func (o *AdminAdoptRepositoryForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the admin adopt repository forbidden response
+func (o *AdminAdoptRepositoryForbidden) Code() int {
+	return 403
+}
+
+func (o *AdminAdoptRepositoryForbidden) Error() string {
+	return fmt.Sprintf("[POST /admin/unadopted/{owner}/{repo}][%d] adminAdoptRepositoryForbidden", 403)
+}
+
+func (o *AdminAdoptRepositoryForbidden) String() string {
+	return fmt.Sprintf("[POST /admin/unadopted/{owner}/{repo}][%d] adminAdoptRepositoryForbidden", 403)
+}
+
+func (o *AdminAdoptRepositoryForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewAdminAdoptRepositoryNotFound creates a AdminAdoptRepositoryNotFound with default headers values
+func NewAdminAdoptRepositoryNotFound() *AdminAdoptRepositoryNotFound {
+	return &AdminAdoptRepositoryNotFound{}
+}
+
+/*
+AdminAdoptRepositoryNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type AdminAdoptRepositoryNotFound struct {
+}
+
+// IsSuccess returns true when this admin adopt repository not found response has a 2xx status code
+func (o *AdminAdoptRepositoryNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this admin adopt repository not found response has a 3xx status code
+func (o *AdminAdoptRepositoryNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this admin adopt repository not found response has a 4xx status code
+func (o *AdminAdoptRepositoryNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this admin adopt repository not found response has a 5xx status code
+func (o *AdminAdoptRepositoryNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this admin adopt repository not found response a status code equal to that given
+func (o *AdminAdoptRepositoryNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the admin adopt repository not found response
+func (o *AdminAdoptRepositoryNotFound) Code() int {
+	return 404
+}
+
+func (o *AdminAdoptRepositoryNotFound) Error() string {
+	return fmt.Sprintf("[POST /admin/unadopted/{owner}/{repo}][%d] adminAdoptRepositoryNotFound", 404)
+}
+
+func (o *AdminAdoptRepositoryNotFound) String() string {
+	return fmt.Sprintf("[POST /admin/unadopted/{owner}/{repo}][%d] adminAdoptRepositoryNotFound", 404)
+}
+
+func (o *AdminAdoptRepositoryNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/admin/admin_client.go b/bots-common/gitea-generated/client/admin/admin_client.go
new file mode 100644
index 0000000..675e09e
--- /dev/null
+++ b/bots-common/gitea-generated/client/admin/admin_client.go
@@ -0,0 +1,1155 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package admin
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	httptransport "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// New creates a new admin API client.
+func New(transport runtime.ClientTransport, formats strfmt.Registry) ClientService {
+	return &Client{transport: transport, formats: formats}
+}
+
+// New creates a new admin API client with basic auth credentials.
+// It takes the following parameters:
+// - host: http host (github.com).
+// - basePath: any base path for the API client ("/v1", "/v3").
+// - scheme: http scheme ("http", "https").
+// - user: user for basic authentication header.
+// - password: password for basic authentication header.
+func NewClientWithBasicAuth(host, basePath, scheme, user, password string) ClientService {
+	transport := httptransport.New(host, basePath, []string{scheme})
+	transport.DefaultAuthentication = httptransport.BasicAuth(user, password)
+	return &Client{transport: transport, formats: strfmt.Default}
+}
+
+// New creates a new admin API client with a bearer token for authentication.
+// It takes the following parameters:
+// - host: http host (github.com).
+// - basePath: any base path for the API client ("/v1", "/v3").
+// - scheme: http scheme ("http", "https").
+// - bearerToken: bearer token for Bearer authentication header.
+func NewClientWithBearerToken(host, basePath, scheme, bearerToken string) ClientService {
+	transport := httptransport.New(host, basePath, []string{scheme})
+	transport.DefaultAuthentication = httptransport.BearerToken(bearerToken)
+	return &Client{transport: transport, formats: strfmt.Default}
+}
+
+/*
+Client for admin API
+*/
+type Client struct {
+	transport runtime.ClientTransport
+	formats   strfmt.Registry
+}
+
+// ClientOption may be used to customize the behavior of Client methods.
+type ClientOption func(*runtime.ClientOperation)
+
+// This client is generated with a few options you might find useful for your swagger spec.
+//
+// Feel free to add you own set of options.
+
+// WithContentType allows the client to force the Content-Type header
+// to negotiate a specific Consumer from the server.
+//
+// You may use this option to set arbitrary extensions to your MIME media type.
+func WithContentType(mime string) ClientOption {
+	return func(r *runtime.ClientOperation) {
+		r.ConsumesMediaTypes = []string{mime}
+	}
+}
+
+// WithContentTypeApplicationJSON sets the Content-Type header to "application/json".
+func WithContentTypeApplicationJSON(r *runtime.ClientOperation) {
+	r.ConsumesMediaTypes = []string{"application/json"}
+}
+
+// WithContentTypeTextPlain sets the Content-Type header to "text/plain".
+func WithContentTypeTextPlain(r *runtime.ClientOperation) {
+	r.ConsumesMediaTypes = []string{"text/plain"}
+}
+
+// ClientService is the interface for Client methods
+type ClientService interface {
+	AdminAddUserBadges(params *AdminAddUserBadgesParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*AdminAddUserBadgesNoContent, error)
+
+	AdminAdoptRepository(params *AdminAdoptRepositoryParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*AdminAdoptRepositoryNoContent, error)
+
+	AdminCreateHook(params *AdminCreateHookParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*AdminCreateHookCreated, error)
+
+	AdminCreateOrg(params *AdminCreateOrgParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*AdminCreateOrgCreated, error)
+
+	AdminCreatePublicKey(params *AdminCreatePublicKeyParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*AdminCreatePublicKeyCreated, error)
+
+	AdminCreateRepo(params *AdminCreateRepoParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*AdminCreateRepoCreated, error)
+
+	AdminCreateUser(params *AdminCreateUserParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*AdminCreateUserCreated, error)
+
+	AdminCronList(params *AdminCronListParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*AdminCronListOK, error)
+
+	AdminCronRun(params *AdminCronRunParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*AdminCronRunNoContent, error)
+
+	AdminDeleteHook(params *AdminDeleteHookParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*AdminDeleteHookNoContent, error)
+
+	AdminDeleteUnadoptedRepository(params *AdminDeleteUnadoptedRepositoryParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*AdminDeleteUnadoptedRepositoryNoContent, error)
+
+	AdminDeleteUser(params *AdminDeleteUserParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*AdminDeleteUserNoContent, error)
+
+	AdminDeleteUserBadges(params *AdminDeleteUserBadgesParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*AdminDeleteUserBadgesNoContent, error)
+
+	AdminDeleteUserPublicKey(params *AdminDeleteUserPublicKeyParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*AdminDeleteUserPublicKeyNoContent, error)
+
+	AdminEditHook(params *AdminEditHookParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*AdminEditHookOK, error)
+
+	AdminEditUser(params *AdminEditUserParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*AdminEditUserOK, error)
+
+	AdminGetAllEmails(params *AdminGetAllEmailsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*AdminGetAllEmailsOK, error)
+
+	AdminGetAllOrgs(params *AdminGetAllOrgsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*AdminGetAllOrgsOK, error)
+
+	AdminGetHook(params *AdminGetHookParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*AdminGetHookOK, error)
+
+	AdminGetRunnerRegistrationToken(params *AdminGetRunnerRegistrationTokenParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*AdminGetRunnerRegistrationTokenOK, error)
+
+	AdminListHooks(params *AdminListHooksParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*AdminListHooksOK, error)
+
+	AdminListUserBadges(params *AdminListUserBadgesParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*AdminListUserBadgesOK, error)
+
+	AdminRenameUser(params *AdminRenameUserParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*AdminRenameUserNoContent, error)
+
+	AdminSearchEmails(params *AdminSearchEmailsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*AdminSearchEmailsOK, error)
+
+	AdminSearchUsers(params *AdminSearchUsersParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*AdminSearchUsersOK, error)
+
+	AdminUnadoptedList(params *AdminUnadoptedListParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*AdminUnadoptedListOK, error)
+
+	SetTransport(transport runtime.ClientTransport)
+}
+
+/*
+AdminAddUserBadges adds a badge to a user
+*/
+func (a *Client) AdminAddUserBadges(params *AdminAddUserBadgesParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*AdminAddUserBadgesNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewAdminAddUserBadgesParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "adminAddUserBadges",
+		Method:             "POST",
+		PathPattern:        "/admin/users/{username}/badges",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &AdminAddUserBadgesReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*AdminAddUserBadgesNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for adminAddUserBadges: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+AdminAdoptRepository adopts unadopted files as a repository
+*/
+func (a *Client) AdminAdoptRepository(params *AdminAdoptRepositoryParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*AdminAdoptRepositoryNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewAdminAdoptRepositoryParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "adminAdoptRepository",
+		Method:             "POST",
+		PathPattern:        "/admin/unadopted/{owner}/{repo}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &AdminAdoptRepositoryReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*AdminAdoptRepositoryNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for adminAdoptRepository: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+AdminCreateHook creates a hook
+*/
+func (a *Client) AdminCreateHook(params *AdminCreateHookParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*AdminCreateHookCreated, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewAdminCreateHookParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "adminCreateHook",
+		Method:             "POST",
+		PathPattern:        "/admin/hooks",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &AdminCreateHookReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*AdminCreateHookCreated)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for adminCreateHook: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+AdminCreateOrg creates an organization
+*/
+func (a *Client) AdminCreateOrg(params *AdminCreateOrgParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*AdminCreateOrgCreated, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewAdminCreateOrgParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "adminCreateOrg",
+		Method:             "POST",
+		PathPattern:        "/admin/users/{username}/orgs",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &AdminCreateOrgReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*AdminCreateOrgCreated)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for adminCreateOrg: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+AdminCreatePublicKey adds a public key on behalf of a user
+*/
+func (a *Client) AdminCreatePublicKey(params *AdminCreatePublicKeyParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*AdminCreatePublicKeyCreated, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewAdminCreatePublicKeyParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "adminCreatePublicKey",
+		Method:             "POST",
+		PathPattern:        "/admin/users/{username}/keys",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &AdminCreatePublicKeyReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*AdminCreatePublicKeyCreated)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for adminCreatePublicKey: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+AdminCreateRepo creates a repository on behalf of a user
+*/
+func (a *Client) AdminCreateRepo(params *AdminCreateRepoParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*AdminCreateRepoCreated, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewAdminCreateRepoParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "adminCreateRepo",
+		Method:             "POST",
+		PathPattern:        "/admin/users/{username}/repos",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &AdminCreateRepoReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*AdminCreateRepoCreated)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for adminCreateRepo: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+AdminCreateUser creates a user
+*/
+func (a *Client) AdminCreateUser(params *AdminCreateUserParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*AdminCreateUserCreated, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewAdminCreateUserParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "adminCreateUser",
+		Method:             "POST",
+		PathPattern:        "/admin/users",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &AdminCreateUserReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*AdminCreateUserCreated)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for adminCreateUser: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+AdminCronList lists cron tasks
+*/
+func (a *Client) AdminCronList(params *AdminCronListParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*AdminCronListOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewAdminCronListParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "adminCronList",
+		Method:             "GET",
+		PathPattern:        "/admin/cron",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &AdminCronListReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*AdminCronListOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for adminCronList: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+AdminCronRun runs cron task
+*/
+func (a *Client) AdminCronRun(params *AdminCronRunParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*AdminCronRunNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewAdminCronRunParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "adminCronRun",
+		Method:             "POST",
+		PathPattern:        "/admin/cron/{task}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &AdminCronRunReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*AdminCronRunNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for adminCronRun: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+AdminDeleteHook deletes a hook
+*/
+func (a *Client) AdminDeleteHook(params *AdminDeleteHookParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*AdminDeleteHookNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewAdminDeleteHookParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "adminDeleteHook",
+		Method:             "DELETE",
+		PathPattern:        "/admin/hooks/{id}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &AdminDeleteHookReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*AdminDeleteHookNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for adminDeleteHook: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+AdminDeleteUnadoptedRepository deletes unadopted files
+*/
+func (a *Client) AdminDeleteUnadoptedRepository(params *AdminDeleteUnadoptedRepositoryParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*AdminDeleteUnadoptedRepositoryNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewAdminDeleteUnadoptedRepositoryParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "adminDeleteUnadoptedRepository",
+		Method:             "DELETE",
+		PathPattern:        "/admin/unadopted/{owner}/{repo}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &AdminDeleteUnadoptedRepositoryReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*AdminDeleteUnadoptedRepositoryNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for adminDeleteUnadoptedRepository: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+AdminDeleteUser deletes a user
+*/
+func (a *Client) AdminDeleteUser(params *AdminDeleteUserParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*AdminDeleteUserNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewAdminDeleteUserParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "adminDeleteUser",
+		Method:             "DELETE",
+		PathPattern:        "/admin/users/{username}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &AdminDeleteUserReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*AdminDeleteUserNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for adminDeleteUser: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+AdminDeleteUserBadges removes a badge from a user
+*/
+func (a *Client) AdminDeleteUserBadges(params *AdminDeleteUserBadgesParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*AdminDeleteUserBadgesNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewAdminDeleteUserBadgesParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "adminDeleteUserBadges",
+		Method:             "DELETE",
+		PathPattern:        "/admin/users/{username}/badges",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &AdminDeleteUserBadgesReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*AdminDeleteUserBadgesNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for adminDeleteUserBadges: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+AdminDeleteUserPublicKey deletes a user s public key
+*/
+func (a *Client) AdminDeleteUserPublicKey(params *AdminDeleteUserPublicKeyParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*AdminDeleteUserPublicKeyNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewAdminDeleteUserPublicKeyParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "adminDeleteUserPublicKey",
+		Method:             "DELETE",
+		PathPattern:        "/admin/users/{username}/keys/{id}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &AdminDeleteUserPublicKeyReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*AdminDeleteUserPublicKeyNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for adminDeleteUserPublicKey: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+AdminEditHook updates a hook
+*/
+func (a *Client) AdminEditHook(params *AdminEditHookParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*AdminEditHookOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewAdminEditHookParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "adminEditHook",
+		Method:             "PATCH",
+		PathPattern:        "/admin/hooks/{id}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &AdminEditHookReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*AdminEditHookOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for adminEditHook: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+AdminEditUser edits an existing user
+*/
+func (a *Client) AdminEditUser(params *AdminEditUserParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*AdminEditUserOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewAdminEditUserParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "adminEditUser",
+		Method:             "PATCH",
+		PathPattern:        "/admin/users/{username}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &AdminEditUserReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*AdminEditUserOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for adminEditUser: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+AdminGetAllEmails lists all emails
+*/
+func (a *Client) AdminGetAllEmails(params *AdminGetAllEmailsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*AdminGetAllEmailsOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewAdminGetAllEmailsParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "adminGetAllEmails",
+		Method:             "GET",
+		PathPattern:        "/admin/emails",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &AdminGetAllEmailsReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*AdminGetAllEmailsOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for adminGetAllEmails: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+AdminGetAllOrgs lists all organizations
+*/
+func (a *Client) AdminGetAllOrgs(params *AdminGetAllOrgsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*AdminGetAllOrgsOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewAdminGetAllOrgsParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "adminGetAllOrgs",
+		Method:             "GET",
+		PathPattern:        "/admin/orgs",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &AdminGetAllOrgsReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*AdminGetAllOrgsOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for adminGetAllOrgs: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+AdminGetHook gets a hook
+*/
+func (a *Client) AdminGetHook(params *AdminGetHookParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*AdminGetHookOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewAdminGetHookParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "adminGetHook",
+		Method:             "GET",
+		PathPattern:        "/admin/hooks/{id}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &AdminGetHookReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*AdminGetHookOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for adminGetHook: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+AdminGetRunnerRegistrationToken gets an global actions runner registration token
+*/
+func (a *Client) AdminGetRunnerRegistrationToken(params *AdminGetRunnerRegistrationTokenParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*AdminGetRunnerRegistrationTokenOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewAdminGetRunnerRegistrationTokenParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "adminGetRunnerRegistrationToken",
+		Method:             "GET",
+		PathPattern:        "/admin/runners/registration-token",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &AdminGetRunnerRegistrationTokenReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*AdminGetRunnerRegistrationTokenOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for adminGetRunnerRegistrationToken: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+AdminListHooks lists system s webhooks
+*/
+func (a *Client) AdminListHooks(params *AdminListHooksParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*AdminListHooksOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewAdminListHooksParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "adminListHooks",
+		Method:             "GET",
+		PathPattern:        "/admin/hooks",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &AdminListHooksReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*AdminListHooksOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for adminListHooks: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+AdminListUserBadges lists a user s badges
+*/
+func (a *Client) AdminListUserBadges(params *AdminListUserBadgesParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*AdminListUserBadgesOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewAdminListUserBadgesParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "adminListUserBadges",
+		Method:             "GET",
+		PathPattern:        "/admin/users/{username}/badges",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &AdminListUserBadgesReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*AdminListUserBadgesOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for adminListUserBadges: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+AdminRenameUser renames a user
+*/
+func (a *Client) AdminRenameUser(params *AdminRenameUserParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*AdminRenameUserNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewAdminRenameUserParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "adminRenameUser",
+		Method:             "POST",
+		PathPattern:        "/admin/users/{username}/rename",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &AdminRenameUserReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*AdminRenameUserNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for adminRenameUser: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+AdminSearchEmails searches all emails
+*/
+func (a *Client) AdminSearchEmails(params *AdminSearchEmailsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*AdminSearchEmailsOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewAdminSearchEmailsParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "adminSearchEmails",
+		Method:             "GET",
+		PathPattern:        "/admin/emails/search",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &AdminSearchEmailsReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*AdminSearchEmailsOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for adminSearchEmails: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+AdminSearchUsers searches users according filter conditions
+*/
+func (a *Client) AdminSearchUsers(params *AdminSearchUsersParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*AdminSearchUsersOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewAdminSearchUsersParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "adminSearchUsers",
+		Method:             "GET",
+		PathPattern:        "/admin/users",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &AdminSearchUsersReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*AdminSearchUsersOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for adminSearchUsers: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+AdminUnadoptedList lists unadopted repositories
+*/
+func (a *Client) AdminUnadoptedList(params *AdminUnadoptedListParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*AdminUnadoptedListOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewAdminUnadoptedListParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "adminUnadoptedList",
+		Method:             "GET",
+		PathPattern:        "/admin/unadopted",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &AdminUnadoptedListReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*AdminUnadoptedListOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for adminUnadoptedList: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+// SetTransport changes the transport on the client
+func (a *Client) SetTransport(transport runtime.ClientTransport) {
+	a.transport = transport
+}
diff --git a/bots-common/gitea-generated/client/admin/admin_create_hook_parameters.go b/bots-common/gitea-generated/client/admin/admin_create_hook_parameters.go
new file mode 100644
index 0000000..d01caa9
--- /dev/null
+++ b/bots-common/gitea-generated/client/admin/admin_create_hook_parameters.go
@@ -0,0 +1,150 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package admin
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewAdminCreateHookParams creates a new AdminCreateHookParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewAdminCreateHookParams() *AdminCreateHookParams {
+	return &AdminCreateHookParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewAdminCreateHookParamsWithTimeout creates a new AdminCreateHookParams object
+// with the ability to set a timeout on a request.
+func NewAdminCreateHookParamsWithTimeout(timeout time.Duration) *AdminCreateHookParams {
+	return &AdminCreateHookParams{
+		timeout: timeout,
+	}
+}
+
+// NewAdminCreateHookParamsWithContext creates a new AdminCreateHookParams object
+// with the ability to set a context for a request.
+func NewAdminCreateHookParamsWithContext(ctx context.Context) *AdminCreateHookParams {
+	return &AdminCreateHookParams{
+		Context: ctx,
+	}
+}
+
+// NewAdminCreateHookParamsWithHTTPClient creates a new AdminCreateHookParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewAdminCreateHookParamsWithHTTPClient(client *http.Client) *AdminCreateHookParams {
+	return &AdminCreateHookParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+AdminCreateHookParams contains all the parameters to send to the API endpoint
+
+	for the admin create hook operation.
+
+	Typically these are written to a http.Request.
+*/
+type AdminCreateHookParams struct {
+
+	// Body.
+	Body *models.CreateHookOption
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the admin create hook params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *AdminCreateHookParams) WithDefaults() *AdminCreateHookParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the admin create hook params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *AdminCreateHookParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the admin create hook params
+func (o *AdminCreateHookParams) WithTimeout(timeout time.Duration) *AdminCreateHookParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the admin create hook params
+func (o *AdminCreateHookParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the admin create hook params
+func (o *AdminCreateHookParams) WithContext(ctx context.Context) *AdminCreateHookParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the admin create hook params
+func (o *AdminCreateHookParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the admin create hook params
+func (o *AdminCreateHookParams) WithHTTPClient(client *http.Client) *AdminCreateHookParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the admin create hook params
+func (o *AdminCreateHookParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the admin create hook params
+func (o *AdminCreateHookParams) WithBody(body *models.CreateHookOption) *AdminCreateHookParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the admin create hook params
+func (o *AdminCreateHookParams) SetBody(body *models.CreateHookOption) {
+	o.Body = body
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *AdminCreateHookParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/admin/admin_create_hook_responses.go b/bots-common/gitea-generated/client/admin/admin_create_hook_responses.go
new file mode 100644
index 0000000..dc77173
--- /dev/null
+++ b/bots-common/gitea-generated/client/admin/admin_create_hook_responses.go
@@ -0,0 +1,106 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package admin
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// AdminCreateHookReader is a Reader for the AdminCreateHook structure.
+type AdminCreateHookReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *AdminCreateHookReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 201:
+		result := NewAdminCreateHookCreated()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	default:
+		return nil, runtime.NewAPIError("[POST /admin/hooks] adminCreateHook", response, response.Code())
+	}
+}
+
+// NewAdminCreateHookCreated creates a AdminCreateHookCreated with default headers values
+func NewAdminCreateHookCreated() *AdminCreateHookCreated {
+	return &AdminCreateHookCreated{}
+}
+
+/*
+AdminCreateHookCreated describes a response with status code 201, with default header values.
+
+Hook
+*/
+type AdminCreateHookCreated struct {
+	Payload *models.Hook
+}
+
+// IsSuccess returns true when this admin create hook created response has a 2xx status code
+func (o *AdminCreateHookCreated) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this admin create hook created response has a 3xx status code
+func (o *AdminCreateHookCreated) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this admin create hook created response has a 4xx status code
+func (o *AdminCreateHookCreated) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this admin create hook created response has a 5xx status code
+func (o *AdminCreateHookCreated) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this admin create hook created response a status code equal to that given
+func (o *AdminCreateHookCreated) IsCode(code int) bool {
+	return code == 201
+}
+
+// Code gets the status code for the admin create hook created response
+func (o *AdminCreateHookCreated) Code() int {
+	return 201
+}
+
+func (o *AdminCreateHookCreated) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /admin/hooks][%d] adminCreateHookCreated %s", 201, payload)
+}
+
+func (o *AdminCreateHookCreated) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /admin/hooks][%d] adminCreateHookCreated %s", 201, payload)
+}
+
+func (o *AdminCreateHookCreated) GetPayload() *models.Hook {
+	return o.Payload
+}
+
+func (o *AdminCreateHookCreated) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.Hook)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/admin/admin_create_org_parameters.go b/bots-common/gitea-generated/client/admin/admin_create_org_parameters.go
new file mode 100644
index 0000000..f37fb0e
--- /dev/null
+++ b/bots-common/gitea-generated/client/admin/admin_create_org_parameters.go
@@ -0,0 +1,172 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package admin
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewAdminCreateOrgParams creates a new AdminCreateOrgParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewAdminCreateOrgParams() *AdminCreateOrgParams {
+	return &AdminCreateOrgParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewAdminCreateOrgParamsWithTimeout creates a new AdminCreateOrgParams object
+// with the ability to set a timeout on a request.
+func NewAdminCreateOrgParamsWithTimeout(timeout time.Duration) *AdminCreateOrgParams {
+	return &AdminCreateOrgParams{
+		timeout: timeout,
+	}
+}
+
+// NewAdminCreateOrgParamsWithContext creates a new AdminCreateOrgParams object
+// with the ability to set a context for a request.
+func NewAdminCreateOrgParamsWithContext(ctx context.Context) *AdminCreateOrgParams {
+	return &AdminCreateOrgParams{
+		Context: ctx,
+	}
+}
+
+// NewAdminCreateOrgParamsWithHTTPClient creates a new AdminCreateOrgParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewAdminCreateOrgParamsWithHTTPClient(client *http.Client) *AdminCreateOrgParams {
+	return &AdminCreateOrgParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+AdminCreateOrgParams contains all the parameters to send to the API endpoint
+
+	for the admin create org operation.
+
+	Typically these are written to a http.Request.
+*/
+type AdminCreateOrgParams struct {
+
+	// Organization.
+	Organization *models.CreateOrgOption
+
+	/* Username.
+
+	   username of the user that will own the created organization
+	*/
+	Username string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the admin create org params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *AdminCreateOrgParams) WithDefaults() *AdminCreateOrgParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the admin create org params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *AdminCreateOrgParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the admin create org params
+func (o *AdminCreateOrgParams) WithTimeout(timeout time.Duration) *AdminCreateOrgParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the admin create org params
+func (o *AdminCreateOrgParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the admin create org params
+func (o *AdminCreateOrgParams) WithContext(ctx context.Context) *AdminCreateOrgParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the admin create org params
+func (o *AdminCreateOrgParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the admin create org params
+func (o *AdminCreateOrgParams) WithHTTPClient(client *http.Client) *AdminCreateOrgParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the admin create org params
+func (o *AdminCreateOrgParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithOrganization adds the organization to the admin create org params
+func (o *AdminCreateOrgParams) WithOrganization(organization *models.CreateOrgOption) *AdminCreateOrgParams {
+	o.SetOrganization(organization)
+	return o
+}
+
+// SetOrganization adds the organization to the admin create org params
+func (o *AdminCreateOrgParams) SetOrganization(organization *models.CreateOrgOption) {
+	o.Organization = organization
+}
+
+// WithUsername adds the username to the admin create org params
+func (o *AdminCreateOrgParams) WithUsername(username string) *AdminCreateOrgParams {
+	o.SetUsername(username)
+	return o
+}
+
+// SetUsername adds the username to the admin create org params
+func (o *AdminCreateOrgParams) SetUsername(username string) {
+	o.Username = username
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *AdminCreateOrgParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Organization != nil {
+		if err := r.SetBodyParam(o.Organization); err != nil {
+			return err
+		}
+	}
+
+	// path param username
+	if err := r.SetPathParam("username", o.Username); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/admin/admin_create_org_responses.go b/bots-common/gitea-generated/client/admin/admin_create_org_responses.go
new file mode 100644
index 0000000..df2994e
--- /dev/null
+++ b/bots-common/gitea-generated/client/admin/admin_create_org_responses.go
@@ -0,0 +1,262 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package admin
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// AdminCreateOrgReader is a Reader for the AdminCreateOrg structure.
+type AdminCreateOrgReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *AdminCreateOrgReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 201:
+		result := NewAdminCreateOrgCreated()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 403:
+		result := NewAdminCreateOrgForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 422:
+		result := NewAdminCreateOrgUnprocessableEntity()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[POST /admin/users/{username}/orgs] adminCreateOrg", response, response.Code())
+	}
+}
+
+// NewAdminCreateOrgCreated creates a AdminCreateOrgCreated with default headers values
+func NewAdminCreateOrgCreated() *AdminCreateOrgCreated {
+	return &AdminCreateOrgCreated{}
+}
+
+/*
+AdminCreateOrgCreated describes a response with status code 201, with default header values.
+
+Organization
+*/
+type AdminCreateOrgCreated struct {
+	Payload *models.Organization
+}
+
+// IsSuccess returns true when this admin create org created response has a 2xx status code
+func (o *AdminCreateOrgCreated) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this admin create org created response has a 3xx status code
+func (o *AdminCreateOrgCreated) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this admin create org created response has a 4xx status code
+func (o *AdminCreateOrgCreated) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this admin create org created response has a 5xx status code
+func (o *AdminCreateOrgCreated) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this admin create org created response a status code equal to that given
+func (o *AdminCreateOrgCreated) IsCode(code int) bool {
+	return code == 201
+}
+
+// Code gets the status code for the admin create org created response
+func (o *AdminCreateOrgCreated) Code() int {
+	return 201
+}
+
+func (o *AdminCreateOrgCreated) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /admin/users/{username}/orgs][%d] adminCreateOrgCreated %s", 201, payload)
+}
+
+func (o *AdminCreateOrgCreated) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /admin/users/{username}/orgs][%d] adminCreateOrgCreated %s", 201, payload)
+}
+
+func (o *AdminCreateOrgCreated) GetPayload() *models.Organization {
+	return o.Payload
+}
+
+func (o *AdminCreateOrgCreated) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.Organization)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewAdminCreateOrgForbidden creates a AdminCreateOrgForbidden with default headers values
+func NewAdminCreateOrgForbidden() *AdminCreateOrgForbidden {
+	return &AdminCreateOrgForbidden{}
+}
+
+/*
+AdminCreateOrgForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type AdminCreateOrgForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this admin create org forbidden response has a 2xx status code
+func (o *AdminCreateOrgForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this admin create org forbidden response has a 3xx status code
+func (o *AdminCreateOrgForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this admin create org forbidden response has a 4xx status code
+func (o *AdminCreateOrgForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this admin create org forbidden response has a 5xx status code
+func (o *AdminCreateOrgForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this admin create org forbidden response a status code equal to that given
+func (o *AdminCreateOrgForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the admin create org forbidden response
+func (o *AdminCreateOrgForbidden) Code() int {
+	return 403
+}
+
+func (o *AdminCreateOrgForbidden) Error() string {
+	return fmt.Sprintf("[POST /admin/users/{username}/orgs][%d] adminCreateOrgForbidden", 403)
+}
+
+func (o *AdminCreateOrgForbidden) String() string {
+	return fmt.Sprintf("[POST /admin/users/{username}/orgs][%d] adminCreateOrgForbidden", 403)
+}
+
+func (o *AdminCreateOrgForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewAdminCreateOrgUnprocessableEntity creates a AdminCreateOrgUnprocessableEntity with default headers values
+func NewAdminCreateOrgUnprocessableEntity() *AdminCreateOrgUnprocessableEntity {
+	return &AdminCreateOrgUnprocessableEntity{}
+}
+
+/*
+AdminCreateOrgUnprocessableEntity describes a response with status code 422, with default header values.
+
+APIValidationError is error format response related to input validation
+*/
+type AdminCreateOrgUnprocessableEntity struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this admin create org unprocessable entity response has a 2xx status code
+func (o *AdminCreateOrgUnprocessableEntity) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this admin create org unprocessable entity response has a 3xx status code
+func (o *AdminCreateOrgUnprocessableEntity) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this admin create org unprocessable entity response has a 4xx status code
+func (o *AdminCreateOrgUnprocessableEntity) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this admin create org unprocessable entity response has a 5xx status code
+func (o *AdminCreateOrgUnprocessableEntity) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this admin create org unprocessable entity response a status code equal to that given
+func (o *AdminCreateOrgUnprocessableEntity) IsCode(code int) bool {
+	return code == 422
+}
+
+// Code gets the status code for the admin create org unprocessable entity response
+func (o *AdminCreateOrgUnprocessableEntity) Code() int {
+	return 422
+}
+
+func (o *AdminCreateOrgUnprocessableEntity) Error() string {
+	return fmt.Sprintf("[POST /admin/users/{username}/orgs][%d] adminCreateOrgUnprocessableEntity", 422)
+}
+
+func (o *AdminCreateOrgUnprocessableEntity) String() string {
+	return fmt.Sprintf("[POST /admin/users/{username}/orgs][%d] adminCreateOrgUnprocessableEntity", 422)
+}
+
+func (o *AdminCreateOrgUnprocessableEntity) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/admin/admin_create_public_key_parameters.go b/bots-common/gitea-generated/client/admin/admin_create_public_key_parameters.go
new file mode 100644
index 0000000..37ea715
--- /dev/null
+++ b/bots-common/gitea-generated/client/admin/admin_create_public_key_parameters.go
@@ -0,0 +1,172 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package admin
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewAdminCreatePublicKeyParams creates a new AdminCreatePublicKeyParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewAdminCreatePublicKeyParams() *AdminCreatePublicKeyParams {
+	return &AdminCreatePublicKeyParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewAdminCreatePublicKeyParamsWithTimeout creates a new AdminCreatePublicKeyParams object
+// with the ability to set a timeout on a request.
+func NewAdminCreatePublicKeyParamsWithTimeout(timeout time.Duration) *AdminCreatePublicKeyParams {
+	return &AdminCreatePublicKeyParams{
+		timeout: timeout,
+	}
+}
+
+// NewAdminCreatePublicKeyParamsWithContext creates a new AdminCreatePublicKeyParams object
+// with the ability to set a context for a request.
+func NewAdminCreatePublicKeyParamsWithContext(ctx context.Context) *AdminCreatePublicKeyParams {
+	return &AdminCreatePublicKeyParams{
+		Context: ctx,
+	}
+}
+
+// NewAdminCreatePublicKeyParamsWithHTTPClient creates a new AdminCreatePublicKeyParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewAdminCreatePublicKeyParamsWithHTTPClient(client *http.Client) *AdminCreatePublicKeyParams {
+	return &AdminCreatePublicKeyParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+AdminCreatePublicKeyParams contains all the parameters to send to the API endpoint
+
+	for the admin create public key operation.
+
+	Typically these are written to a http.Request.
+*/
+type AdminCreatePublicKeyParams struct {
+
+	// Key.
+	Key *models.CreateKeyOption
+
+	/* Username.
+
+	   username of the user
+	*/
+	Username string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the admin create public key params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *AdminCreatePublicKeyParams) WithDefaults() *AdminCreatePublicKeyParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the admin create public key params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *AdminCreatePublicKeyParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the admin create public key params
+func (o *AdminCreatePublicKeyParams) WithTimeout(timeout time.Duration) *AdminCreatePublicKeyParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the admin create public key params
+func (o *AdminCreatePublicKeyParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the admin create public key params
+func (o *AdminCreatePublicKeyParams) WithContext(ctx context.Context) *AdminCreatePublicKeyParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the admin create public key params
+func (o *AdminCreatePublicKeyParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the admin create public key params
+func (o *AdminCreatePublicKeyParams) WithHTTPClient(client *http.Client) *AdminCreatePublicKeyParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the admin create public key params
+func (o *AdminCreatePublicKeyParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithKey adds the key to the admin create public key params
+func (o *AdminCreatePublicKeyParams) WithKey(key *models.CreateKeyOption) *AdminCreatePublicKeyParams {
+	o.SetKey(key)
+	return o
+}
+
+// SetKey adds the key to the admin create public key params
+func (o *AdminCreatePublicKeyParams) SetKey(key *models.CreateKeyOption) {
+	o.Key = key
+}
+
+// WithUsername adds the username to the admin create public key params
+func (o *AdminCreatePublicKeyParams) WithUsername(username string) *AdminCreatePublicKeyParams {
+	o.SetUsername(username)
+	return o
+}
+
+// SetUsername adds the username to the admin create public key params
+func (o *AdminCreatePublicKeyParams) SetUsername(username string) {
+	o.Username = username
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *AdminCreatePublicKeyParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Key != nil {
+		if err := r.SetBodyParam(o.Key); err != nil {
+			return err
+		}
+	}
+
+	// path param username
+	if err := r.SetPathParam("username", o.Username); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/admin/admin_create_public_key_responses.go b/bots-common/gitea-generated/client/admin/admin_create_public_key_responses.go
new file mode 100644
index 0000000..d037ee8
--- /dev/null
+++ b/bots-common/gitea-generated/client/admin/admin_create_public_key_responses.go
@@ -0,0 +1,262 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package admin
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// AdminCreatePublicKeyReader is a Reader for the AdminCreatePublicKey structure.
+type AdminCreatePublicKeyReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *AdminCreatePublicKeyReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 201:
+		result := NewAdminCreatePublicKeyCreated()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 403:
+		result := NewAdminCreatePublicKeyForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 422:
+		result := NewAdminCreatePublicKeyUnprocessableEntity()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[POST /admin/users/{username}/keys] adminCreatePublicKey", response, response.Code())
+	}
+}
+
+// NewAdminCreatePublicKeyCreated creates a AdminCreatePublicKeyCreated with default headers values
+func NewAdminCreatePublicKeyCreated() *AdminCreatePublicKeyCreated {
+	return &AdminCreatePublicKeyCreated{}
+}
+
+/*
+AdminCreatePublicKeyCreated describes a response with status code 201, with default header values.
+
+PublicKey
+*/
+type AdminCreatePublicKeyCreated struct {
+	Payload *models.PublicKey
+}
+
+// IsSuccess returns true when this admin create public key created response has a 2xx status code
+func (o *AdminCreatePublicKeyCreated) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this admin create public key created response has a 3xx status code
+func (o *AdminCreatePublicKeyCreated) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this admin create public key created response has a 4xx status code
+func (o *AdminCreatePublicKeyCreated) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this admin create public key created response has a 5xx status code
+func (o *AdminCreatePublicKeyCreated) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this admin create public key created response a status code equal to that given
+func (o *AdminCreatePublicKeyCreated) IsCode(code int) bool {
+	return code == 201
+}
+
+// Code gets the status code for the admin create public key created response
+func (o *AdminCreatePublicKeyCreated) Code() int {
+	return 201
+}
+
+func (o *AdminCreatePublicKeyCreated) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /admin/users/{username}/keys][%d] adminCreatePublicKeyCreated %s", 201, payload)
+}
+
+func (o *AdminCreatePublicKeyCreated) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /admin/users/{username}/keys][%d] adminCreatePublicKeyCreated %s", 201, payload)
+}
+
+func (o *AdminCreatePublicKeyCreated) GetPayload() *models.PublicKey {
+	return o.Payload
+}
+
+func (o *AdminCreatePublicKeyCreated) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.PublicKey)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewAdminCreatePublicKeyForbidden creates a AdminCreatePublicKeyForbidden with default headers values
+func NewAdminCreatePublicKeyForbidden() *AdminCreatePublicKeyForbidden {
+	return &AdminCreatePublicKeyForbidden{}
+}
+
+/*
+AdminCreatePublicKeyForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type AdminCreatePublicKeyForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this admin create public key forbidden response has a 2xx status code
+func (o *AdminCreatePublicKeyForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this admin create public key forbidden response has a 3xx status code
+func (o *AdminCreatePublicKeyForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this admin create public key forbidden response has a 4xx status code
+func (o *AdminCreatePublicKeyForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this admin create public key forbidden response has a 5xx status code
+func (o *AdminCreatePublicKeyForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this admin create public key forbidden response a status code equal to that given
+func (o *AdminCreatePublicKeyForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the admin create public key forbidden response
+func (o *AdminCreatePublicKeyForbidden) Code() int {
+	return 403
+}
+
+func (o *AdminCreatePublicKeyForbidden) Error() string {
+	return fmt.Sprintf("[POST /admin/users/{username}/keys][%d] adminCreatePublicKeyForbidden", 403)
+}
+
+func (o *AdminCreatePublicKeyForbidden) String() string {
+	return fmt.Sprintf("[POST /admin/users/{username}/keys][%d] adminCreatePublicKeyForbidden", 403)
+}
+
+func (o *AdminCreatePublicKeyForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewAdminCreatePublicKeyUnprocessableEntity creates a AdminCreatePublicKeyUnprocessableEntity with default headers values
+func NewAdminCreatePublicKeyUnprocessableEntity() *AdminCreatePublicKeyUnprocessableEntity {
+	return &AdminCreatePublicKeyUnprocessableEntity{}
+}
+
+/*
+AdminCreatePublicKeyUnprocessableEntity describes a response with status code 422, with default header values.
+
+APIValidationError is error format response related to input validation
+*/
+type AdminCreatePublicKeyUnprocessableEntity struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this admin create public key unprocessable entity response has a 2xx status code
+func (o *AdminCreatePublicKeyUnprocessableEntity) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this admin create public key unprocessable entity response has a 3xx status code
+func (o *AdminCreatePublicKeyUnprocessableEntity) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this admin create public key unprocessable entity response has a 4xx status code
+func (o *AdminCreatePublicKeyUnprocessableEntity) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this admin create public key unprocessable entity response has a 5xx status code
+func (o *AdminCreatePublicKeyUnprocessableEntity) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this admin create public key unprocessable entity response a status code equal to that given
+func (o *AdminCreatePublicKeyUnprocessableEntity) IsCode(code int) bool {
+	return code == 422
+}
+
+// Code gets the status code for the admin create public key unprocessable entity response
+func (o *AdminCreatePublicKeyUnprocessableEntity) Code() int {
+	return 422
+}
+
+func (o *AdminCreatePublicKeyUnprocessableEntity) Error() string {
+	return fmt.Sprintf("[POST /admin/users/{username}/keys][%d] adminCreatePublicKeyUnprocessableEntity", 422)
+}
+
+func (o *AdminCreatePublicKeyUnprocessableEntity) String() string {
+	return fmt.Sprintf("[POST /admin/users/{username}/keys][%d] adminCreatePublicKeyUnprocessableEntity", 422)
+}
+
+func (o *AdminCreatePublicKeyUnprocessableEntity) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/admin/admin_create_repo_parameters.go b/bots-common/gitea-generated/client/admin/admin_create_repo_parameters.go
new file mode 100644
index 0000000..aa1976d
--- /dev/null
+++ b/bots-common/gitea-generated/client/admin/admin_create_repo_parameters.go
@@ -0,0 +1,172 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package admin
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewAdminCreateRepoParams creates a new AdminCreateRepoParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewAdminCreateRepoParams() *AdminCreateRepoParams {
+	return &AdminCreateRepoParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewAdminCreateRepoParamsWithTimeout creates a new AdminCreateRepoParams object
+// with the ability to set a timeout on a request.
+func NewAdminCreateRepoParamsWithTimeout(timeout time.Duration) *AdminCreateRepoParams {
+	return &AdminCreateRepoParams{
+		timeout: timeout,
+	}
+}
+
+// NewAdminCreateRepoParamsWithContext creates a new AdminCreateRepoParams object
+// with the ability to set a context for a request.
+func NewAdminCreateRepoParamsWithContext(ctx context.Context) *AdminCreateRepoParams {
+	return &AdminCreateRepoParams{
+		Context: ctx,
+	}
+}
+
+// NewAdminCreateRepoParamsWithHTTPClient creates a new AdminCreateRepoParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewAdminCreateRepoParamsWithHTTPClient(client *http.Client) *AdminCreateRepoParams {
+	return &AdminCreateRepoParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+AdminCreateRepoParams contains all the parameters to send to the API endpoint
+
+	for the admin create repo operation.
+
+	Typically these are written to a http.Request.
+*/
+type AdminCreateRepoParams struct {
+
+	// Repository.
+	Repository *models.CreateRepoOption
+
+	/* Username.
+
+	   username of the user. This user will own the created repository
+	*/
+	Username string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the admin create repo params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *AdminCreateRepoParams) WithDefaults() *AdminCreateRepoParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the admin create repo params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *AdminCreateRepoParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the admin create repo params
+func (o *AdminCreateRepoParams) WithTimeout(timeout time.Duration) *AdminCreateRepoParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the admin create repo params
+func (o *AdminCreateRepoParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the admin create repo params
+func (o *AdminCreateRepoParams) WithContext(ctx context.Context) *AdminCreateRepoParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the admin create repo params
+func (o *AdminCreateRepoParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the admin create repo params
+func (o *AdminCreateRepoParams) WithHTTPClient(client *http.Client) *AdminCreateRepoParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the admin create repo params
+func (o *AdminCreateRepoParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithRepository adds the repository to the admin create repo params
+func (o *AdminCreateRepoParams) WithRepository(repository *models.CreateRepoOption) *AdminCreateRepoParams {
+	o.SetRepository(repository)
+	return o
+}
+
+// SetRepository adds the repository to the admin create repo params
+func (o *AdminCreateRepoParams) SetRepository(repository *models.CreateRepoOption) {
+	o.Repository = repository
+}
+
+// WithUsername adds the username to the admin create repo params
+func (o *AdminCreateRepoParams) WithUsername(username string) *AdminCreateRepoParams {
+	o.SetUsername(username)
+	return o
+}
+
+// SetUsername adds the username to the admin create repo params
+func (o *AdminCreateRepoParams) SetUsername(username string) {
+	o.Username = username
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *AdminCreateRepoParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Repository != nil {
+		if err := r.SetBodyParam(o.Repository); err != nil {
+			return err
+		}
+	}
+
+	// path param username
+	if err := r.SetPathParam("username", o.Username); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/admin/admin_create_repo_responses.go b/bots-common/gitea-generated/client/admin/admin_create_repo_responses.go
new file mode 100644
index 0000000..d07d4bf
--- /dev/null
+++ b/bots-common/gitea-generated/client/admin/admin_create_repo_responses.go
@@ -0,0 +1,480 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package admin
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// AdminCreateRepoReader is a Reader for the AdminCreateRepo structure.
+type AdminCreateRepoReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *AdminCreateRepoReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 201:
+		result := NewAdminCreateRepoCreated()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 400:
+		result := NewAdminCreateRepoBadRequest()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 403:
+		result := NewAdminCreateRepoForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewAdminCreateRepoNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 409:
+		result := NewAdminCreateRepoConflict()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 422:
+		result := NewAdminCreateRepoUnprocessableEntity()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[POST /admin/users/{username}/repos] adminCreateRepo", response, response.Code())
+	}
+}
+
+// NewAdminCreateRepoCreated creates a AdminCreateRepoCreated with default headers values
+func NewAdminCreateRepoCreated() *AdminCreateRepoCreated {
+	return &AdminCreateRepoCreated{}
+}
+
+/*
+AdminCreateRepoCreated describes a response with status code 201, with default header values.
+
+Repository
+*/
+type AdminCreateRepoCreated struct {
+	Payload *models.Repository
+}
+
+// IsSuccess returns true when this admin create repo created response has a 2xx status code
+func (o *AdminCreateRepoCreated) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this admin create repo created response has a 3xx status code
+func (o *AdminCreateRepoCreated) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this admin create repo created response has a 4xx status code
+func (o *AdminCreateRepoCreated) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this admin create repo created response has a 5xx status code
+func (o *AdminCreateRepoCreated) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this admin create repo created response a status code equal to that given
+func (o *AdminCreateRepoCreated) IsCode(code int) bool {
+	return code == 201
+}
+
+// Code gets the status code for the admin create repo created response
+func (o *AdminCreateRepoCreated) Code() int {
+	return 201
+}
+
+func (o *AdminCreateRepoCreated) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /admin/users/{username}/repos][%d] adminCreateRepoCreated %s", 201, payload)
+}
+
+func (o *AdminCreateRepoCreated) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /admin/users/{username}/repos][%d] adminCreateRepoCreated %s", 201, payload)
+}
+
+func (o *AdminCreateRepoCreated) GetPayload() *models.Repository {
+	return o.Payload
+}
+
+func (o *AdminCreateRepoCreated) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.Repository)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewAdminCreateRepoBadRequest creates a AdminCreateRepoBadRequest with default headers values
+func NewAdminCreateRepoBadRequest() *AdminCreateRepoBadRequest {
+	return &AdminCreateRepoBadRequest{}
+}
+
+/*
+AdminCreateRepoBadRequest describes a response with status code 400, with default header values.
+
+APIError is error format response
+*/
+type AdminCreateRepoBadRequest struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this admin create repo bad request response has a 2xx status code
+func (o *AdminCreateRepoBadRequest) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this admin create repo bad request response has a 3xx status code
+func (o *AdminCreateRepoBadRequest) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this admin create repo bad request response has a 4xx status code
+func (o *AdminCreateRepoBadRequest) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this admin create repo bad request response has a 5xx status code
+func (o *AdminCreateRepoBadRequest) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this admin create repo bad request response a status code equal to that given
+func (o *AdminCreateRepoBadRequest) IsCode(code int) bool {
+	return code == 400
+}
+
+// Code gets the status code for the admin create repo bad request response
+func (o *AdminCreateRepoBadRequest) Code() int {
+	return 400
+}
+
+func (o *AdminCreateRepoBadRequest) Error() string {
+	return fmt.Sprintf("[POST /admin/users/{username}/repos][%d] adminCreateRepoBadRequest", 400)
+}
+
+func (o *AdminCreateRepoBadRequest) String() string {
+	return fmt.Sprintf("[POST /admin/users/{username}/repos][%d] adminCreateRepoBadRequest", 400)
+}
+
+func (o *AdminCreateRepoBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewAdminCreateRepoForbidden creates a AdminCreateRepoForbidden with default headers values
+func NewAdminCreateRepoForbidden() *AdminCreateRepoForbidden {
+	return &AdminCreateRepoForbidden{}
+}
+
+/*
+AdminCreateRepoForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type AdminCreateRepoForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this admin create repo forbidden response has a 2xx status code
+func (o *AdminCreateRepoForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this admin create repo forbidden response has a 3xx status code
+func (o *AdminCreateRepoForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this admin create repo forbidden response has a 4xx status code
+func (o *AdminCreateRepoForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this admin create repo forbidden response has a 5xx status code
+func (o *AdminCreateRepoForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this admin create repo forbidden response a status code equal to that given
+func (o *AdminCreateRepoForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the admin create repo forbidden response
+func (o *AdminCreateRepoForbidden) Code() int {
+	return 403
+}
+
+func (o *AdminCreateRepoForbidden) Error() string {
+	return fmt.Sprintf("[POST /admin/users/{username}/repos][%d] adminCreateRepoForbidden", 403)
+}
+
+func (o *AdminCreateRepoForbidden) String() string {
+	return fmt.Sprintf("[POST /admin/users/{username}/repos][%d] adminCreateRepoForbidden", 403)
+}
+
+func (o *AdminCreateRepoForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewAdminCreateRepoNotFound creates a AdminCreateRepoNotFound with default headers values
+func NewAdminCreateRepoNotFound() *AdminCreateRepoNotFound {
+	return &AdminCreateRepoNotFound{}
+}
+
+/*
+AdminCreateRepoNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type AdminCreateRepoNotFound struct {
+}
+
+// IsSuccess returns true when this admin create repo not found response has a 2xx status code
+func (o *AdminCreateRepoNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this admin create repo not found response has a 3xx status code
+func (o *AdminCreateRepoNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this admin create repo not found response has a 4xx status code
+func (o *AdminCreateRepoNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this admin create repo not found response has a 5xx status code
+func (o *AdminCreateRepoNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this admin create repo not found response a status code equal to that given
+func (o *AdminCreateRepoNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the admin create repo not found response
+func (o *AdminCreateRepoNotFound) Code() int {
+	return 404
+}
+
+func (o *AdminCreateRepoNotFound) Error() string {
+	return fmt.Sprintf("[POST /admin/users/{username}/repos][%d] adminCreateRepoNotFound", 404)
+}
+
+func (o *AdminCreateRepoNotFound) String() string {
+	return fmt.Sprintf("[POST /admin/users/{username}/repos][%d] adminCreateRepoNotFound", 404)
+}
+
+func (o *AdminCreateRepoNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewAdminCreateRepoConflict creates a AdminCreateRepoConflict with default headers values
+func NewAdminCreateRepoConflict() *AdminCreateRepoConflict {
+	return &AdminCreateRepoConflict{}
+}
+
+/*
+AdminCreateRepoConflict describes a response with status code 409, with default header values.
+
+APIError is error format response
+*/
+type AdminCreateRepoConflict struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this admin create repo conflict response has a 2xx status code
+func (o *AdminCreateRepoConflict) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this admin create repo conflict response has a 3xx status code
+func (o *AdminCreateRepoConflict) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this admin create repo conflict response has a 4xx status code
+func (o *AdminCreateRepoConflict) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this admin create repo conflict response has a 5xx status code
+func (o *AdminCreateRepoConflict) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this admin create repo conflict response a status code equal to that given
+func (o *AdminCreateRepoConflict) IsCode(code int) bool {
+	return code == 409
+}
+
+// Code gets the status code for the admin create repo conflict response
+func (o *AdminCreateRepoConflict) Code() int {
+	return 409
+}
+
+func (o *AdminCreateRepoConflict) Error() string {
+	return fmt.Sprintf("[POST /admin/users/{username}/repos][%d] adminCreateRepoConflict", 409)
+}
+
+func (o *AdminCreateRepoConflict) String() string {
+	return fmt.Sprintf("[POST /admin/users/{username}/repos][%d] adminCreateRepoConflict", 409)
+}
+
+func (o *AdminCreateRepoConflict) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewAdminCreateRepoUnprocessableEntity creates a AdminCreateRepoUnprocessableEntity with default headers values
+func NewAdminCreateRepoUnprocessableEntity() *AdminCreateRepoUnprocessableEntity {
+	return &AdminCreateRepoUnprocessableEntity{}
+}
+
+/*
+AdminCreateRepoUnprocessableEntity describes a response with status code 422, with default header values.
+
+APIValidationError is error format response related to input validation
+*/
+type AdminCreateRepoUnprocessableEntity struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this admin create repo unprocessable entity response has a 2xx status code
+func (o *AdminCreateRepoUnprocessableEntity) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this admin create repo unprocessable entity response has a 3xx status code
+func (o *AdminCreateRepoUnprocessableEntity) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this admin create repo unprocessable entity response has a 4xx status code
+func (o *AdminCreateRepoUnprocessableEntity) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this admin create repo unprocessable entity response has a 5xx status code
+func (o *AdminCreateRepoUnprocessableEntity) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this admin create repo unprocessable entity response a status code equal to that given
+func (o *AdminCreateRepoUnprocessableEntity) IsCode(code int) bool {
+	return code == 422
+}
+
+// Code gets the status code for the admin create repo unprocessable entity response
+func (o *AdminCreateRepoUnprocessableEntity) Code() int {
+	return 422
+}
+
+func (o *AdminCreateRepoUnprocessableEntity) Error() string {
+	return fmt.Sprintf("[POST /admin/users/{username}/repos][%d] adminCreateRepoUnprocessableEntity", 422)
+}
+
+func (o *AdminCreateRepoUnprocessableEntity) String() string {
+	return fmt.Sprintf("[POST /admin/users/{username}/repos][%d] adminCreateRepoUnprocessableEntity", 422)
+}
+
+func (o *AdminCreateRepoUnprocessableEntity) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/admin/admin_create_user_parameters.go b/bots-common/gitea-generated/client/admin/admin_create_user_parameters.go
new file mode 100644
index 0000000..78122bf
--- /dev/null
+++ b/bots-common/gitea-generated/client/admin/admin_create_user_parameters.go
@@ -0,0 +1,150 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package admin
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewAdminCreateUserParams creates a new AdminCreateUserParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewAdminCreateUserParams() *AdminCreateUserParams {
+	return &AdminCreateUserParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewAdminCreateUserParamsWithTimeout creates a new AdminCreateUserParams object
+// with the ability to set a timeout on a request.
+func NewAdminCreateUserParamsWithTimeout(timeout time.Duration) *AdminCreateUserParams {
+	return &AdminCreateUserParams{
+		timeout: timeout,
+	}
+}
+
+// NewAdminCreateUserParamsWithContext creates a new AdminCreateUserParams object
+// with the ability to set a context for a request.
+func NewAdminCreateUserParamsWithContext(ctx context.Context) *AdminCreateUserParams {
+	return &AdminCreateUserParams{
+		Context: ctx,
+	}
+}
+
+// NewAdminCreateUserParamsWithHTTPClient creates a new AdminCreateUserParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewAdminCreateUserParamsWithHTTPClient(client *http.Client) *AdminCreateUserParams {
+	return &AdminCreateUserParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+AdminCreateUserParams contains all the parameters to send to the API endpoint
+
+	for the admin create user operation.
+
+	Typically these are written to a http.Request.
+*/
+type AdminCreateUserParams struct {
+
+	// Body.
+	Body *models.CreateUserOption
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the admin create user params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *AdminCreateUserParams) WithDefaults() *AdminCreateUserParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the admin create user params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *AdminCreateUserParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the admin create user params
+func (o *AdminCreateUserParams) WithTimeout(timeout time.Duration) *AdminCreateUserParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the admin create user params
+func (o *AdminCreateUserParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the admin create user params
+func (o *AdminCreateUserParams) WithContext(ctx context.Context) *AdminCreateUserParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the admin create user params
+func (o *AdminCreateUserParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the admin create user params
+func (o *AdminCreateUserParams) WithHTTPClient(client *http.Client) *AdminCreateUserParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the admin create user params
+func (o *AdminCreateUserParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the admin create user params
+func (o *AdminCreateUserParams) WithBody(body *models.CreateUserOption) *AdminCreateUserParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the admin create user params
+func (o *AdminCreateUserParams) SetBody(body *models.CreateUserOption) {
+	o.Body = body
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *AdminCreateUserParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/admin/admin_create_user_responses.go b/bots-common/gitea-generated/client/admin/admin_create_user_responses.go
new file mode 100644
index 0000000..c81c82c
--- /dev/null
+++ b/bots-common/gitea-generated/client/admin/admin_create_user_responses.go
@@ -0,0 +1,340 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package admin
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// AdminCreateUserReader is a Reader for the AdminCreateUser structure.
+type AdminCreateUserReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *AdminCreateUserReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 201:
+		result := NewAdminCreateUserCreated()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 400:
+		result := NewAdminCreateUserBadRequest()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 403:
+		result := NewAdminCreateUserForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 422:
+		result := NewAdminCreateUserUnprocessableEntity()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[POST /admin/users] adminCreateUser", response, response.Code())
+	}
+}
+
+// NewAdminCreateUserCreated creates a AdminCreateUserCreated with default headers values
+func NewAdminCreateUserCreated() *AdminCreateUserCreated {
+	return &AdminCreateUserCreated{}
+}
+
+/*
+AdminCreateUserCreated describes a response with status code 201, with default header values.
+
+User
+*/
+type AdminCreateUserCreated struct {
+	Payload *models.User
+}
+
+// IsSuccess returns true when this admin create user created response has a 2xx status code
+func (o *AdminCreateUserCreated) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this admin create user created response has a 3xx status code
+func (o *AdminCreateUserCreated) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this admin create user created response has a 4xx status code
+func (o *AdminCreateUserCreated) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this admin create user created response has a 5xx status code
+func (o *AdminCreateUserCreated) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this admin create user created response a status code equal to that given
+func (o *AdminCreateUserCreated) IsCode(code int) bool {
+	return code == 201
+}
+
+// Code gets the status code for the admin create user created response
+func (o *AdminCreateUserCreated) Code() int {
+	return 201
+}
+
+func (o *AdminCreateUserCreated) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /admin/users][%d] adminCreateUserCreated %s", 201, payload)
+}
+
+func (o *AdminCreateUserCreated) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /admin/users][%d] adminCreateUserCreated %s", 201, payload)
+}
+
+func (o *AdminCreateUserCreated) GetPayload() *models.User {
+	return o.Payload
+}
+
+func (o *AdminCreateUserCreated) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.User)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewAdminCreateUserBadRequest creates a AdminCreateUserBadRequest with default headers values
+func NewAdminCreateUserBadRequest() *AdminCreateUserBadRequest {
+	return &AdminCreateUserBadRequest{}
+}
+
+/*
+AdminCreateUserBadRequest describes a response with status code 400, with default header values.
+
+APIError is error format response
+*/
+type AdminCreateUserBadRequest struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this admin create user bad request response has a 2xx status code
+func (o *AdminCreateUserBadRequest) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this admin create user bad request response has a 3xx status code
+func (o *AdminCreateUserBadRequest) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this admin create user bad request response has a 4xx status code
+func (o *AdminCreateUserBadRequest) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this admin create user bad request response has a 5xx status code
+func (o *AdminCreateUserBadRequest) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this admin create user bad request response a status code equal to that given
+func (o *AdminCreateUserBadRequest) IsCode(code int) bool {
+	return code == 400
+}
+
+// Code gets the status code for the admin create user bad request response
+func (o *AdminCreateUserBadRequest) Code() int {
+	return 400
+}
+
+func (o *AdminCreateUserBadRequest) Error() string {
+	return fmt.Sprintf("[POST /admin/users][%d] adminCreateUserBadRequest", 400)
+}
+
+func (o *AdminCreateUserBadRequest) String() string {
+	return fmt.Sprintf("[POST /admin/users][%d] adminCreateUserBadRequest", 400)
+}
+
+func (o *AdminCreateUserBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewAdminCreateUserForbidden creates a AdminCreateUserForbidden with default headers values
+func NewAdminCreateUserForbidden() *AdminCreateUserForbidden {
+	return &AdminCreateUserForbidden{}
+}
+
+/*
+AdminCreateUserForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type AdminCreateUserForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this admin create user forbidden response has a 2xx status code
+func (o *AdminCreateUserForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this admin create user forbidden response has a 3xx status code
+func (o *AdminCreateUserForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this admin create user forbidden response has a 4xx status code
+func (o *AdminCreateUserForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this admin create user forbidden response has a 5xx status code
+func (o *AdminCreateUserForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this admin create user forbidden response a status code equal to that given
+func (o *AdminCreateUserForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the admin create user forbidden response
+func (o *AdminCreateUserForbidden) Code() int {
+	return 403
+}
+
+func (o *AdminCreateUserForbidden) Error() string {
+	return fmt.Sprintf("[POST /admin/users][%d] adminCreateUserForbidden", 403)
+}
+
+func (o *AdminCreateUserForbidden) String() string {
+	return fmt.Sprintf("[POST /admin/users][%d] adminCreateUserForbidden", 403)
+}
+
+func (o *AdminCreateUserForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewAdminCreateUserUnprocessableEntity creates a AdminCreateUserUnprocessableEntity with default headers values
+func NewAdminCreateUserUnprocessableEntity() *AdminCreateUserUnprocessableEntity {
+	return &AdminCreateUserUnprocessableEntity{}
+}
+
+/*
+AdminCreateUserUnprocessableEntity describes a response with status code 422, with default header values.
+
+APIValidationError is error format response related to input validation
+*/
+type AdminCreateUserUnprocessableEntity struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this admin create user unprocessable entity response has a 2xx status code
+func (o *AdminCreateUserUnprocessableEntity) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this admin create user unprocessable entity response has a 3xx status code
+func (o *AdminCreateUserUnprocessableEntity) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this admin create user unprocessable entity response has a 4xx status code
+func (o *AdminCreateUserUnprocessableEntity) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this admin create user unprocessable entity response has a 5xx status code
+func (o *AdminCreateUserUnprocessableEntity) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this admin create user unprocessable entity response a status code equal to that given
+func (o *AdminCreateUserUnprocessableEntity) IsCode(code int) bool {
+	return code == 422
+}
+
+// Code gets the status code for the admin create user unprocessable entity response
+func (o *AdminCreateUserUnprocessableEntity) Code() int {
+	return 422
+}
+
+func (o *AdminCreateUserUnprocessableEntity) Error() string {
+	return fmt.Sprintf("[POST /admin/users][%d] adminCreateUserUnprocessableEntity", 422)
+}
+
+func (o *AdminCreateUserUnprocessableEntity) String() string {
+	return fmt.Sprintf("[POST /admin/users][%d] adminCreateUserUnprocessableEntity", 422)
+}
+
+func (o *AdminCreateUserUnprocessableEntity) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/admin/admin_cron_list_parameters.go b/bots-common/gitea-generated/client/admin/admin_cron_list_parameters.go
new file mode 100644
index 0000000..c9b2dc1
--- /dev/null
+++ b/bots-common/gitea-generated/client/admin/admin_cron_list_parameters.go
@@ -0,0 +1,198 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package admin
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewAdminCronListParams creates a new AdminCronListParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewAdminCronListParams() *AdminCronListParams {
+	return &AdminCronListParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewAdminCronListParamsWithTimeout creates a new AdminCronListParams object
+// with the ability to set a timeout on a request.
+func NewAdminCronListParamsWithTimeout(timeout time.Duration) *AdminCronListParams {
+	return &AdminCronListParams{
+		timeout: timeout,
+	}
+}
+
+// NewAdminCronListParamsWithContext creates a new AdminCronListParams object
+// with the ability to set a context for a request.
+func NewAdminCronListParamsWithContext(ctx context.Context) *AdminCronListParams {
+	return &AdminCronListParams{
+		Context: ctx,
+	}
+}
+
+// NewAdminCronListParamsWithHTTPClient creates a new AdminCronListParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewAdminCronListParamsWithHTTPClient(client *http.Client) *AdminCronListParams {
+	return &AdminCronListParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+AdminCronListParams contains all the parameters to send to the API endpoint
+
+	for the admin cron list operation.
+
+	Typically these are written to a http.Request.
+*/
+type AdminCronListParams struct {
+
+	/* Limit.
+
+	   page size of results
+	*/
+	Limit *int64
+
+	/* Page.
+
+	   page number of results to return (1-based)
+	*/
+	Page *int64
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the admin cron list params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *AdminCronListParams) WithDefaults() *AdminCronListParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the admin cron list params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *AdminCronListParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the admin cron list params
+func (o *AdminCronListParams) WithTimeout(timeout time.Duration) *AdminCronListParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the admin cron list params
+func (o *AdminCronListParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the admin cron list params
+func (o *AdminCronListParams) WithContext(ctx context.Context) *AdminCronListParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the admin cron list params
+func (o *AdminCronListParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the admin cron list params
+func (o *AdminCronListParams) WithHTTPClient(client *http.Client) *AdminCronListParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the admin cron list params
+func (o *AdminCronListParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithLimit adds the limit to the admin cron list params
+func (o *AdminCronListParams) WithLimit(limit *int64) *AdminCronListParams {
+	o.SetLimit(limit)
+	return o
+}
+
+// SetLimit adds the limit to the admin cron list params
+func (o *AdminCronListParams) SetLimit(limit *int64) {
+	o.Limit = limit
+}
+
+// WithPage adds the page to the admin cron list params
+func (o *AdminCronListParams) WithPage(page *int64) *AdminCronListParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the admin cron list params
+func (o *AdminCronListParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *AdminCronListParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.Limit != nil {
+
+		// query param limit
+		var qrLimit int64
+
+		if o.Limit != nil {
+			qrLimit = *o.Limit
+		}
+		qLimit := swag.FormatInt64(qrLimit)
+		if qLimit != "" {
+
+			if err := r.SetQueryParam("limit", qLimit); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/admin/admin_cron_list_responses.go b/bots-common/gitea-generated/client/admin/admin_cron_list_responses.go
new file mode 100644
index 0000000..7bfa47e
--- /dev/null
+++ b/bots-common/gitea-generated/client/admin/admin_cron_list_responses.go
@@ -0,0 +1,182 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package admin
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// AdminCronListReader is a Reader for the AdminCronList structure.
+type AdminCronListReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *AdminCronListReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewAdminCronListOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 403:
+		result := NewAdminCronListForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /admin/cron] adminCronList", response, response.Code())
+	}
+}
+
+// NewAdminCronListOK creates a AdminCronListOK with default headers values
+func NewAdminCronListOK() *AdminCronListOK {
+	return &AdminCronListOK{}
+}
+
+/*
+AdminCronListOK describes a response with status code 200, with default header values.
+
+CronList
+*/
+type AdminCronListOK struct {
+	Payload []*models.Cron
+}
+
+// IsSuccess returns true when this admin cron list o k response has a 2xx status code
+func (o *AdminCronListOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this admin cron list o k response has a 3xx status code
+func (o *AdminCronListOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this admin cron list o k response has a 4xx status code
+func (o *AdminCronListOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this admin cron list o k response has a 5xx status code
+func (o *AdminCronListOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this admin cron list o k response a status code equal to that given
+func (o *AdminCronListOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the admin cron list o k response
+func (o *AdminCronListOK) Code() int {
+	return 200
+}
+
+func (o *AdminCronListOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /admin/cron][%d] adminCronListOK %s", 200, payload)
+}
+
+func (o *AdminCronListOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /admin/cron][%d] adminCronListOK %s", 200, payload)
+}
+
+func (o *AdminCronListOK) GetPayload() []*models.Cron {
+	return o.Payload
+}
+
+func (o *AdminCronListOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewAdminCronListForbidden creates a AdminCronListForbidden with default headers values
+func NewAdminCronListForbidden() *AdminCronListForbidden {
+	return &AdminCronListForbidden{}
+}
+
+/*
+AdminCronListForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type AdminCronListForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this admin cron list forbidden response has a 2xx status code
+func (o *AdminCronListForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this admin cron list forbidden response has a 3xx status code
+func (o *AdminCronListForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this admin cron list forbidden response has a 4xx status code
+func (o *AdminCronListForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this admin cron list forbidden response has a 5xx status code
+func (o *AdminCronListForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this admin cron list forbidden response a status code equal to that given
+func (o *AdminCronListForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the admin cron list forbidden response
+func (o *AdminCronListForbidden) Code() int {
+	return 403
+}
+
+func (o *AdminCronListForbidden) Error() string {
+	return fmt.Sprintf("[GET /admin/cron][%d] adminCronListForbidden", 403)
+}
+
+func (o *AdminCronListForbidden) String() string {
+	return fmt.Sprintf("[GET /admin/cron][%d] adminCronListForbidden", 403)
+}
+
+func (o *AdminCronListForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/admin/admin_cron_run_parameters.go b/bots-common/gitea-generated/client/admin/admin_cron_run_parameters.go
new file mode 100644
index 0000000..e99018a
--- /dev/null
+++ b/bots-common/gitea-generated/client/admin/admin_cron_run_parameters.go
@@ -0,0 +1,151 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package admin
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewAdminCronRunParams creates a new AdminCronRunParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewAdminCronRunParams() *AdminCronRunParams {
+	return &AdminCronRunParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewAdminCronRunParamsWithTimeout creates a new AdminCronRunParams object
+// with the ability to set a timeout on a request.
+func NewAdminCronRunParamsWithTimeout(timeout time.Duration) *AdminCronRunParams {
+	return &AdminCronRunParams{
+		timeout: timeout,
+	}
+}
+
+// NewAdminCronRunParamsWithContext creates a new AdminCronRunParams object
+// with the ability to set a context for a request.
+func NewAdminCronRunParamsWithContext(ctx context.Context) *AdminCronRunParams {
+	return &AdminCronRunParams{
+		Context: ctx,
+	}
+}
+
+// NewAdminCronRunParamsWithHTTPClient creates a new AdminCronRunParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewAdminCronRunParamsWithHTTPClient(client *http.Client) *AdminCronRunParams {
+	return &AdminCronRunParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+AdminCronRunParams contains all the parameters to send to the API endpoint
+
+	for the admin cron run operation.
+
+	Typically these are written to a http.Request.
+*/
+type AdminCronRunParams struct {
+
+	/* Task.
+
+	   task to run
+	*/
+	Task string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the admin cron run params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *AdminCronRunParams) WithDefaults() *AdminCronRunParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the admin cron run params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *AdminCronRunParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the admin cron run params
+func (o *AdminCronRunParams) WithTimeout(timeout time.Duration) *AdminCronRunParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the admin cron run params
+func (o *AdminCronRunParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the admin cron run params
+func (o *AdminCronRunParams) WithContext(ctx context.Context) *AdminCronRunParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the admin cron run params
+func (o *AdminCronRunParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the admin cron run params
+func (o *AdminCronRunParams) WithHTTPClient(client *http.Client) *AdminCronRunParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the admin cron run params
+func (o *AdminCronRunParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithTask adds the task to the admin cron run params
+func (o *AdminCronRunParams) WithTask(task string) *AdminCronRunParams {
+	o.SetTask(task)
+	return o
+}
+
+// SetTask adds the task to the admin cron run params
+func (o *AdminCronRunParams) SetTask(task string) {
+	o.Task = task
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *AdminCronRunParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param task
+	if err := r.SetPathParam("task", o.Task); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/admin/admin_cron_run_responses.go b/bots-common/gitea-generated/client/admin/admin_cron_run_responses.go
new file mode 100644
index 0000000..bc84c4f
--- /dev/null
+++ b/bots-common/gitea-generated/client/admin/admin_cron_run_responses.go
@@ -0,0 +1,150 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package admin
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// AdminCronRunReader is a Reader for the AdminCronRun structure.
+type AdminCronRunReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *AdminCronRunReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewAdminCronRunNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewAdminCronRunNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[POST /admin/cron/{task}] adminCronRun", response, response.Code())
+	}
+}
+
+// NewAdminCronRunNoContent creates a AdminCronRunNoContent with default headers values
+func NewAdminCronRunNoContent() *AdminCronRunNoContent {
+	return &AdminCronRunNoContent{}
+}
+
+/*
+AdminCronRunNoContent describes a response with status code 204, with default header values.
+
+APIEmpty is an empty response
+*/
+type AdminCronRunNoContent struct {
+}
+
+// IsSuccess returns true when this admin cron run no content response has a 2xx status code
+func (o *AdminCronRunNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this admin cron run no content response has a 3xx status code
+func (o *AdminCronRunNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this admin cron run no content response has a 4xx status code
+func (o *AdminCronRunNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this admin cron run no content response has a 5xx status code
+func (o *AdminCronRunNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this admin cron run no content response a status code equal to that given
+func (o *AdminCronRunNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the admin cron run no content response
+func (o *AdminCronRunNoContent) Code() int {
+	return 204
+}
+
+func (o *AdminCronRunNoContent) Error() string {
+	return fmt.Sprintf("[POST /admin/cron/{task}][%d] adminCronRunNoContent", 204)
+}
+
+func (o *AdminCronRunNoContent) String() string {
+	return fmt.Sprintf("[POST /admin/cron/{task}][%d] adminCronRunNoContent", 204)
+}
+
+func (o *AdminCronRunNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewAdminCronRunNotFound creates a AdminCronRunNotFound with default headers values
+func NewAdminCronRunNotFound() *AdminCronRunNotFound {
+	return &AdminCronRunNotFound{}
+}
+
+/*
+AdminCronRunNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type AdminCronRunNotFound struct {
+}
+
+// IsSuccess returns true when this admin cron run not found response has a 2xx status code
+func (o *AdminCronRunNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this admin cron run not found response has a 3xx status code
+func (o *AdminCronRunNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this admin cron run not found response has a 4xx status code
+func (o *AdminCronRunNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this admin cron run not found response has a 5xx status code
+func (o *AdminCronRunNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this admin cron run not found response a status code equal to that given
+func (o *AdminCronRunNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the admin cron run not found response
+func (o *AdminCronRunNotFound) Code() int {
+	return 404
+}
+
+func (o *AdminCronRunNotFound) Error() string {
+	return fmt.Sprintf("[POST /admin/cron/{task}][%d] adminCronRunNotFound", 404)
+}
+
+func (o *AdminCronRunNotFound) String() string {
+	return fmt.Sprintf("[POST /admin/cron/{task}][%d] adminCronRunNotFound", 404)
+}
+
+func (o *AdminCronRunNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/admin/admin_delete_hook_parameters.go b/bots-common/gitea-generated/client/admin/admin_delete_hook_parameters.go
new file mode 100644
index 0000000..862f7d3
--- /dev/null
+++ b/bots-common/gitea-generated/client/admin/admin_delete_hook_parameters.go
@@ -0,0 +1,154 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package admin
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewAdminDeleteHookParams creates a new AdminDeleteHookParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewAdminDeleteHookParams() *AdminDeleteHookParams {
+	return &AdminDeleteHookParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewAdminDeleteHookParamsWithTimeout creates a new AdminDeleteHookParams object
+// with the ability to set a timeout on a request.
+func NewAdminDeleteHookParamsWithTimeout(timeout time.Duration) *AdminDeleteHookParams {
+	return &AdminDeleteHookParams{
+		timeout: timeout,
+	}
+}
+
+// NewAdminDeleteHookParamsWithContext creates a new AdminDeleteHookParams object
+// with the ability to set a context for a request.
+func NewAdminDeleteHookParamsWithContext(ctx context.Context) *AdminDeleteHookParams {
+	return &AdminDeleteHookParams{
+		Context: ctx,
+	}
+}
+
+// NewAdminDeleteHookParamsWithHTTPClient creates a new AdminDeleteHookParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewAdminDeleteHookParamsWithHTTPClient(client *http.Client) *AdminDeleteHookParams {
+	return &AdminDeleteHookParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+AdminDeleteHookParams contains all the parameters to send to the API endpoint
+
+	for the admin delete hook operation.
+
+	Typically these are written to a http.Request.
+*/
+type AdminDeleteHookParams struct {
+
+	/* ID.
+
+	   id of the hook to delete
+
+	   Format: int64
+	*/
+	ID int64
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the admin delete hook params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *AdminDeleteHookParams) WithDefaults() *AdminDeleteHookParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the admin delete hook params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *AdminDeleteHookParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the admin delete hook params
+func (o *AdminDeleteHookParams) WithTimeout(timeout time.Duration) *AdminDeleteHookParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the admin delete hook params
+func (o *AdminDeleteHookParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the admin delete hook params
+func (o *AdminDeleteHookParams) WithContext(ctx context.Context) *AdminDeleteHookParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the admin delete hook params
+func (o *AdminDeleteHookParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the admin delete hook params
+func (o *AdminDeleteHookParams) WithHTTPClient(client *http.Client) *AdminDeleteHookParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the admin delete hook params
+func (o *AdminDeleteHookParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithID adds the id to the admin delete hook params
+func (o *AdminDeleteHookParams) WithID(id int64) *AdminDeleteHookParams {
+	o.SetID(id)
+	return o
+}
+
+// SetID adds the id to the admin delete hook params
+func (o *AdminDeleteHookParams) SetID(id int64) {
+	o.ID = id
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *AdminDeleteHookParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param id
+	if err := r.SetPathParam("id", swag.FormatInt64(o.ID)); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/admin/admin_delete_hook_responses.go b/bots-common/gitea-generated/client/admin/admin_delete_hook_responses.go
new file mode 100644
index 0000000..6035ac6
--- /dev/null
+++ b/bots-common/gitea-generated/client/admin/admin_delete_hook_responses.go
@@ -0,0 +1,88 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package admin
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// AdminDeleteHookReader is a Reader for the AdminDeleteHook structure.
+type AdminDeleteHookReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *AdminDeleteHookReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewAdminDeleteHookNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	default:
+		return nil, runtime.NewAPIError("[DELETE /admin/hooks/{id}] adminDeleteHook", response, response.Code())
+	}
+}
+
+// NewAdminDeleteHookNoContent creates a AdminDeleteHookNoContent with default headers values
+func NewAdminDeleteHookNoContent() *AdminDeleteHookNoContent {
+	return &AdminDeleteHookNoContent{}
+}
+
+/*
+AdminDeleteHookNoContent describes a response with status code 204, with default header values.
+
+APIEmpty is an empty response
+*/
+type AdminDeleteHookNoContent struct {
+}
+
+// IsSuccess returns true when this admin delete hook no content response has a 2xx status code
+func (o *AdminDeleteHookNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this admin delete hook no content response has a 3xx status code
+func (o *AdminDeleteHookNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this admin delete hook no content response has a 4xx status code
+func (o *AdminDeleteHookNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this admin delete hook no content response has a 5xx status code
+func (o *AdminDeleteHookNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this admin delete hook no content response a status code equal to that given
+func (o *AdminDeleteHookNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the admin delete hook no content response
+func (o *AdminDeleteHookNoContent) Code() int {
+	return 204
+}
+
+func (o *AdminDeleteHookNoContent) Error() string {
+	return fmt.Sprintf("[DELETE /admin/hooks/{id}][%d] adminDeleteHookNoContent", 204)
+}
+
+func (o *AdminDeleteHookNoContent) String() string {
+	return fmt.Sprintf("[DELETE /admin/hooks/{id}][%d] adminDeleteHookNoContent", 204)
+}
+
+func (o *AdminDeleteHookNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/admin/admin_delete_unadopted_repository_parameters.go b/bots-common/gitea-generated/client/admin/admin_delete_unadopted_repository_parameters.go
new file mode 100644
index 0000000..68faf59
--- /dev/null
+++ b/bots-common/gitea-generated/client/admin/admin_delete_unadopted_repository_parameters.go
@@ -0,0 +1,173 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package admin
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewAdminDeleteUnadoptedRepositoryParams creates a new AdminDeleteUnadoptedRepositoryParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewAdminDeleteUnadoptedRepositoryParams() *AdminDeleteUnadoptedRepositoryParams {
+	return &AdminDeleteUnadoptedRepositoryParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewAdminDeleteUnadoptedRepositoryParamsWithTimeout creates a new AdminDeleteUnadoptedRepositoryParams object
+// with the ability to set a timeout on a request.
+func NewAdminDeleteUnadoptedRepositoryParamsWithTimeout(timeout time.Duration) *AdminDeleteUnadoptedRepositoryParams {
+	return &AdminDeleteUnadoptedRepositoryParams{
+		timeout: timeout,
+	}
+}
+
+// NewAdminDeleteUnadoptedRepositoryParamsWithContext creates a new AdminDeleteUnadoptedRepositoryParams object
+// with the ability to set a context for a request.
+func NewAdminDeleteUnadoptedRepositoryParamsWithContext(ctx context.Context) *AdminDeleteUnadoptedRepositoryParams {
+	return &AdminDeleteUnadoptedRepositoryParams{
+		Context: ctx,
+	}
+}
+
+// NewAdminDeleteUnadoptedRepositoryParamsWithHTTPClient creates a new AdminDeleteUnadoptedRepositoryParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewAdminDeleteUnadoptedRepositoryParamsWithHTTPClient(client *http.Client) *AdminDeleteUnadoptedRepositoryParams {
+	return &AdminDeleteUnadoptedRepositoryParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+AdminDeleteUnadoptedRepositoryParams contains all the parameters to send to the API endpoint
+
+	for the admin delete unadopted repository operation.
+
+	Typically these are written to a http.Request.
+*/
+type AdminDeleteUnadoptedRepositoryParams struct {
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the admin delete unadopted repository params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *AdminDeleteUnadoptedRepositoryParams) WithDefaults() *AdminDeleteUnadoptedRepositoryParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the admin delete unadopted repository params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *AdminDeleteUnadoptedRepositoryParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the admin delete unadopted repository params
+func (o *AdminDeleteUnadoptedRepositoryParams) WithTimeout(timeout time.Duration) *AdminDeleteUnadoptedRepositoryParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the admin delete unadopted repository params
+func (o *AdminDeleteUnadoptedRepositoryParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the admin delete unadopted repository params
+func (o *AdminDeleteUnadoptedRepositoryParams) WithContext(ctx context.Context) *AdminDeleteUnadoptedRepositoryParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the admin delete unadopted repository params
+func (o *AdminDeleteUnadoptedRepositoryParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the admin delete unadopted repository params
+func (o *AdminDeleteUnadoptedRepositoryParams) WithHTTPClient(client *http.Client) *AdminDeleteUnadoptedRepositoryParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the admin delete unadopted repository params
+func (o *AdminDeleteUnadoptedRepositoryParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithOwner adds the owner to the admin delete unadopted repository params
+func (o *AdminDeleteUnadoptedRepositoryParams) WithOwner(owner string) *AdminDeleteUnadoptedRepositoryParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the admin delete unadopted repository params
+func (o *AdminDeleteUnadoptedRepositoryParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the admin delete unadopted repository params
+func (o *AdminDeleteUnadoptedRepositoryParams) WithRepo(repo string) *AdminDeleteUnadoptedRepositoryParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the admin delete unadopted repository params
+func (o *AdminDeleteUnadoptedRepositoryParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *AdminDeleteUnadoptedRepositoryParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/admin/admin_delete_unadopted_repository_responses.go b/bots-common/gitea-generated/client/admin/admin_delete_unadopted_repository_responses.go
new file mode 100644
index 0000000..db6411c
--- /dev/null
+++ b/bots-common/gitea-generated/client/admin/admin_delete_unadopted_repository_responses.go
@@ -0,0 +1,166 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package admin
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// AdminDeleteUnadoptedRepositoryReader is a Reader for the AdminDeleteUnadoptedRepository structure.
+type AdminDeleteUnadoptedRepositoryReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *AdminDeleteUnadoptedRepositoryReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewAdminDeleteUnadoptedRepositoryNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 403:
+		result := NewAdminDeleteUnadoptedRepositoryForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[DELETE /admin/unadopted/{owner}/{repo}] adminDeleteUnadoptedRepository", response, response.Code())
+	}
+}
+
+// NewAdminDeleteUnadoptedRepositoryNoContent creates a AdminDeleteUnadoptedRepositoryNoContent with default headers values
+func NewAdminDeleteUnadoptedRepositoryNoContent() *AdminDeleteUnadoptedRepositoryNoContent {
+	return &AdminDeleteUnadoptedRepositoryNoContent{}
+}
+
+/*
+AdminDeleteUnadoptedRepositoryNoContent describes a response with status code 204, with default header values.
+
+APIEmpty is an empty response
+*/
+type AdminDeleteUnadoptedRepositoryNoContent struct {
+}
+
+// IsSuccess returns true when this admin delete unadopted repository no content response has a 2xx status code
+func (o *AdminDeleteUnadoptedRepositoryNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this admin delete unadopted repository no content response has a 3xx status code
+func (o *AdminDeleteUnadoptedRepositoryNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this admin delete unadopted repository no content response has a 4xx status code
+func (o *AdminDeleteUnadoptedRepositoryNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this admin delete unadopted repository no content response has a 5xx status code
+func (o *AdminDeleteUnadoptedRepositoryNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this admin delete unadopted repository no content response a status code equal to that given
+func (o *AdminDeleteUnadoptedRepositoryNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the admin delete unadopted repository no content response
+func (o *AdminDeleteUnadoptedRepositoryNoContent) Code() int {
+	return 204
+}
+
+func (o *AdminDeleteUnadoptedRepositoryNoContent) Error() string {
+	return fmt.Sprintf("[DELETE /admin/unadopted/{owner}/{repo}][%d] adminDeleteUnadoptedRepositoryNoContent", 204)
+}
+
+func (o *AdminDeleteUnadoptedRepositoryNoContent) String() string {
+	return fmt.Sprintf("[DELETE /admin/unadopted/{owner}/{repo}][%d] adminDeleteUnadoptedRepositoryNoContent", 204)
+}
+
+func (o *AdminDeleteUnadoptedRepositoryNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewAdminDeleteUnadoptedRepositoryForbidden creates a AdminDeleteUnadoptedRepositoryForbidden with default headers values
+func NewAdminDeleteUnadoptedRepositoryForbidden() *AdminDeleteUnadoptedRepositoryForbidden {
+	return &AdminDeleteUnadoptedRepositoryForbidden{}
+}
+
+/*
+AdminDeleteUnadoptedRepositoryForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type AdminDeleteUnadoptedRepositoryForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this admin delete unadopted repository forbidden response has a 2xx status code
+func (o *AdminDeleteUnadoptedRepositoryForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this admin delete unadopted repository forbidden response has a 3xx status code
+func (o *AdminDeleteUnadoptedRepositoryForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this admin delete unadopted repository forbidden response has a 4xx status code
+func (o *AdminDeleteUnadoptedRepositoryForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this admin delete unadopted repository forbidden response has a 5xx status code
+func (o *AdminDeleteUnadoptedRepositoryForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this admin delete unadopted repository forbidden response a status code equal to that given
+func (o *AdminDeleteUnadoptedRepositoryForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the admin delete unadopted repository forbidden response
+func (o *AdminDeleteUnadoptedRepositoryForbidden) Code() int {
+	return 403
+}
+
+func (o *AdminDeleteUnadoptedRepositoryForbidden) Error() string {
+	return fmt.Sprintf("[DELETE /admin/unadopted/{owner}/{repo}][%d] adminDeleteUnadoptedRepositoryForbidden", 403)
+}
+
+func (o *AdminDeleteUnadoptedRepositoryForbidden) String() string {
+	return fmt.Sprintf("[DELETE /admin/unadopted/{owner}/{repo}][%d] adminDeleteUnadoptedRepositoryForbidden", 403)
+}
+
+func (o *AdminDeleteUnadoptedRepositoryForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/admin/admin_delete_user_badges_parameters.go b/bots-common/gitea-generated/client/admin/admin_delete_user_badges_parameters.go
new file mode 100644
index 0000000..d7ac7c4
--- /dev/null
+++ b/bots-common/gitea-generated/client/admin/admin_delete_user_badges_parameters.go
@@ -0,0 +1,172 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package admin
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewAdminDeleteUserBadgesParams creates a new AdminDeleteUserBadgesParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewAdminDeleteUserBadgesParams() *AdminDeleteUserBadgesParams {
+	return &AdminDeleteUserBadgesParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewAdminDeleteUserBadgesParamsWithTimeout creates a new AdminDeleteUserBadgesParams object
+// with the ability to set a timeout on a request.
+func NewAdminDeleteUserBadgesParamsWithTimeout(timeout time.Duration) *AdminDeleteUserBadgesParams {
+	return &AdminDeleteUserBadgesParams{
+		timeout: timeout,
+	}
+}
+
+// NewAdminDeleteUserBadgesParamsWithContext creates a new AdminDeleteUserBadgesParams object
+// with the ability to set a context for a request.
+func NewAdminDeleteUserBadgesParamsWithContext(ctx context.Context) *AdminDeleteUserBadgesParams {
+	return &AdminDeleteUserBadgesParams{
+		Context: ctx,
+	}
+}
+
+// NewAdminDeleteUserBadgesParamsWithHTTPClient creates a new AdminDeleteUserBadgesParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewAdminDeleteUserBadgesParamsWithHTTPClient(client *http.Client) *AdminDeleteUserBadgesParams {
+	return &AdminDeleteUserBadgesParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+AdminDeleteUserBadgesParams contains all the parameters to send to the API endpoint
+
+	for the admin delete user badges operation.
+
+	Typically these are written to a http.Request.
+*/
+type AdminDeleteUserBadgesParams struct {
+
+	// Body.
+	Body *models.UserBadgeOption
+
+	/* Username.
+
+	   username of user
+	*/
+	Username string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the admin delete user badges params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *AdminDeleteUserBadgesParams) WithDefaults() *AdminDeleteUserBadgesParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the admin delete user badges params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *AdminDeleteUserBadgesParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the admin delete user badges params
+func (o *AdminDeleteUserBadgesParams) WithTimeout(timeout time.Duration) *AdminDeleteUserBadgesParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the admin delete user badges params
+func (o *AdminDeleteUserBadgesParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the admin delete user badges params
+func (o *AdminDeleteUserBadgesParams) WithContext(ctx context.Context) *AdminDeleteUserBadgesParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the admin delete user badges params
+func (o *AdminDeleteUserBadgesParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the admin delete user badges params
+func (o *AdminDeleteUserBadgesParams) WithHTTPClient(client *http.Client) *AdminDeleteUserBadgesParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the admin delete user badges params
+func (o *AdminDeleteUserBadgesParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the admin delete user badges params
+func (o *AdminDeleteUserBadgesParams) WithBody(body *models.UserBadgeOption) *AdminDeleteUserBadgesParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the admin delete user badges params
+func (o *AdminDeleteUserBadgesParams) SetBody(body *models.UserBadgeOption) {
+	o.Body = body
+}
+
+// WithUsername adds the username to the admin delete user badges params
+func (o *AdminDeleteUserBadgesParams) WithUsername(username string) *AdminDeleteUserBadgesParams {
+	o.SetUsername(username)
+	return o
+}
+
+// SetUsername adds the username to the admin delete user badges params
+func (o *AdminDeleteUserBadgesParams) SetUsername(username string) {
+	o.Username = username
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *AdminDeleteUserBadgesParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	// path param username
+	if err := r.SetPathParam("username", o.Username); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/admin/admin_delete_user_badges_responses.go b/bots-common/gitea-generated/client/admin/admin_delete_user_badges_responses.go
new file mode 100644
index 0000000..358a0da
--- /dev/null
+++ b/bots-common/gitea-generated/client/admin/admin_delete_user_badges_responses.go
@@ -0,0 +1,244 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package admin
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// AdminDeleteUserBadgesReader is a Reader for the AdminDeleteUserBadges structure.
+type AdminDeleteUserBadgesReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *AdminDeleteUserBadgesReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewAdminDeleteUserBadgesNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 403:
+		result := NewAdminDeleteUserBadgesForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 422:
+		result := NewAdminDeleteUserBadgesUnprocessableEntity()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[DELETE /admin/users/{username}/badges] adminDeleteUserBadges", response, response.Code())
+	}
+}
+
+// NewAdminDeleteUserBadgesNoContent creates a AdminDeleteUserBadgesNoContent with default headers values
+func NewAdminDeleteUserBadgesNoContent() *AdminDeleteUserBadgesNoContent {
+	return &AdminDeleteUserBadgesNoContent{}
+}
+
+/*
+AdminDeleteUserBadgesNoContent describes a response with status code 204, with default header values.
+
+APIEmpty is an empty response
+*/
+type AdminDeleteUserBadgesNoContent struct {
+}
+
+// IsSuccess returns true when this admin delete user badges no content response has a 2xx status code
+func (o *AdminDeleteUserBadgesNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this admin delete user badges no content response has a 3xx status code
+func (o *AdminDeleteUserBadgesNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this admin delete user badges no content response has a 4xx status code
+func (o *AdminDeleteUserBadgesNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this admin delete user badges no content response has a 5xx status code
+func (o *AdminDeleteUserBadgesNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this admin delete user badges no content response a status code equal to that given
+func (o *AdminDeleteUserBadgesNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the admin delete user badges no content response
+func (o *AdminDeleteUserBadgesNoContent) Code() int {
+	return 204
+}
+
+func (o *AdminDeleteUserBadgesNoContent) Error() string {
+	return fmt.Sprintf("[DELETE /admin/users/{username}/badges][%d] adminDeleteUserBadgesNoContent", 204)
+}
+
+func (o *AdminDeleteUserBadgesNoContent) String() string {
+	return fmt.Sprintf("[DELETE /admin/users/{username}/badges][%d] adminDeleteUserBadgesNoContent", 204)
+}
+
+func (o *AdminDeleteUserBadgesNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewAdminDeleteUserBadgesForbidden creates a AdminDeleteUserBadgesForbidden with default headers values
+func NewAdminDeleteUserBadgesForbidden() *AdminDeleteUserBadgesForbidden {
+	return &AdminDeleteUserBadgesForbidden{}
+}
+
+/*
+AdminDeleteUserBadgesForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type AdminDeleteUserBadgesForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this admin delete user badges forbidden response has a 2xx status code
+func (o *AdminDeleteUserBadgesForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this admin delete user badges forbidden response has a 3xx status code
+func (o *AdminDeleteUserBadgesForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this admin delete user badges forbidden response has a 4xx status code
+func (o *AdminDeleteUserBadgesForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this admin delete user badges forbidden response has a 5xx status code
+func (o *AdminDeleteUserBadgesForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this admin delete user badges forbidden response a status code equal to that given
+func (o *AdminDeleteUserBadgesForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the admin delete user badges forbidden response
+func (o *AdminDeleteUserBadgesForbidden) Code() int {
+	return 403
+}
+
+func (o *AdminDeleteUserBadgesForbidden) Error() string {
+	return fmt.Sprintf("[DELETE /admin/users/{username}/badges][%d] adminDeleteUserBadgesForbidden", 403)
+}
+
+func (o *AdminDeleteUserBadgesForbidden) String() string {
+	return fmt.Sprintf("[DELETE /admin/users/{username}/badges][%d] adminDeleteUserBadgesForbidden", 403)
+}
+
+func (o *AdminDeleteUserBadgesForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewAdminDeleteUserBadgesUnprocessableEntity creates a AdminDeleteUserBadgesUnprocessableEntity with default headers values
+func NewAdminDeleteUserBadgesUnprocessableEntity() *AdminDeleteUserBadgesUnprocessableEntity {
+	return &AdminDeleteUserBadgesUnprocessableEntity{}
+}
+
+/*
+AdminDeleteUserBadgesUnprocessableEntity describes a response with status code 422, with default header values.
+
+APIValidationError is error format response related to input validation
+*/
+type AdminDeleteUserBadgesUnprocessableEntity struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this admin delete user badges unprocessable entity response has a 2xx status code
+func (o *AdminDeleteUserBadgesUnprocessableEntity) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this admin delete user badges unprocessable entity response has a 3xx status code
+func (o *AdminDeleteUserBadgesUnprocessableEntity) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this admin delete user badges unprocessable entity response has a 4xx status code
+func (o *AdminDeleteUserBadgesUnprocessableEntity) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this admin delete user badges unprocessable entity response has a 5xx status code
+func (o *AdminDeleteUserBadgesUnprocessableEntity) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this admin delete user badges unprocessable entity response a status code equal to that given
+func (o *AdminDeleteUserBadgesUnprocessableEntity) IsCode(code int) bool {
+	return code == 422
+}
+
+// Code gets the status code for the admin delete user badges unprocessable entity response
+func (o *AdminDeleteUserBadgesUnprocessableEntity) Code() int {
+	return 422
+}
+
+func (o *AdminDeleteUserBadgesUnprocessableEntity) Error() string {
+	return fmt.Sprintf("[DELETE /admin/users/{username}/badges][%d] adminDeleteUserBadgesUnprocessableEntity", 422)
+}
+
+func (o *AdminDeleteUserBadgesUnprocessableEntity) String() string {
+	return fmt.Sprintf("[DELETE /admin/users/{username}/badges][%d] adminDeleteUserBadgesUnprocessableEntity", 422)
+}
+
+func (o *AdminDeleteUserBadgesUnprocessableEntity) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/admin/admin_delete_user_parameters.go b/bots-common/gitea-generated/client/admin/admin_delete_user_parameters.go
new file mode 100644
index 0000000..444af81
--- /dev/null
+++ b/bots-common/gitea-generated/client/admin/admin_delete_user_parameters.go
@@ -0,0 +1,186 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package admin
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewAdminDeleteUserParams creates a new AdminDeleteUserParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewAdminDeleteUserParams() *AdminDeleteUserParams {
+	return &AdminDeleteUserParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewAdminDeleteUserParamsWithTimeout creates a new AdminDeleteUserParams object
+// with the ability to set a timeout on a request.
+func NewAdminDeleteUserParamsWithTimeout(timeout time.Duration) *AdminDeleteUserParams {
+	return &AdminDeleteUserParams{
+		timeout: timeout,
+	}
+}
+
+// NewAdminDeleteUserParamsWithContext creates a new AdminDeleteUserParams object
+// with the ability to set a context for a request.
+func NewAdminDeleteUserParamsWithContext(ctx context.Context) *AdminDeleteUserParams {
+	return &AdminDeleteUserParams{
+		Context: ctx,
+	}
+}
+
+// NewAdminDeleteUserParamsWithHTTPClient creates a new AdminDeleteUserParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewAdminDeleteUserParamsWithHTTPClient(client *http.Client) *AdminDeleteUserParams {
+	return &AdminDeleteUserParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+AdminDeleteUserParams contains all the parameters to send to the API endpoint
+
+	for the admin delete user operation.
+
+	Typically these are written to a http.Request.
+*/
+type AdminDeleteUserParams struct {
+
+	/* Purge.
+
+	   purge the user from the system completely
+	*/
+	Purge *bool
+
+	/* Username.
+
+	   username of user to delete
+	*/
+	Username string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the admin delete user params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *AdminDeleteUserParams) WithDefaults() *AdminDeleteUserParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the admin delete user params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *AdminDeleteUserParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the admin delete user params
+func (o *AdminDeleteUserParams) WithTimeout(timeout time.Duration) *AdminDeleteUserParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the admin delete user params
+func (o *AdminDeleteUserParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the admin delete user params
+func (o *AdminDeleteUserParams) WithContext(ctx context.Context) *AdminDeleteUserParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the admin delete user params
+func (o *AdminDeleteUserParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the admin delete user params
+func (o *AdminDeleteUserParams) WithHTTPClient(client *http.Client) *AdminDeleteUserParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the admin delete user params
+func (o *AdminDeleteUserParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithPurge adds the purge to the admin delete user params
+func (o *AdminDeleteUserParams) WithPurge(purge *bool) *AdminDeleteUserParams {
+	o.SetPurge(purge)
+	return o
+}
+
+// SetPurge adds the purge to the admin delete user params
+func (o *AdminDeleteUserParams) SetPurge(purge *bool) {
+	o.Purge = purge
+}
+
+// WithUsername adds the username to the admin delete user params
+func (o *AdminDeleteUserParams) WithUsername(username string) *AdminDeleteUserParams {
+	o.SetUsername(username)
+	return o
+}
+
+// SetUsername adds the username to the admin delete user params
+func (o *AdminDeleteUserParams) SetUsername(username string) {
+	o.Username = username
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *AdminDeleteUserParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.Purge != nil {
+
+		// query param purge
+		var qrPurge bool
+
+		if o.Purge != nil {
+			qrPurge = *o.Purge
+		}
+		qPurge := swag.FormatBool(qrPurge)
+		if qPurge != "" {
+
+			if err := r.SetQueryParam("purge", qPurge); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param username
+	if err := r.SetPathParam("username", o.Username); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/admin/admin_delete_user_public_key_parameters.go b/bots-common/gitea-generated/client/admin/admin_delete_user_public_key_parameters.go
new file mode 100644
index 0000000..0574ae9
--- /dev/null
+++ b/bots-common/gitea-generated/client/admin/admin_delete_user_public_key_parameters.go
@@ -0,0 +1,176 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package admin
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewAdminDeleteUserPublicKeyParams creates a new AdminDeleteUserPublicKeyParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewAdminDeleteUserPublicKeyParams() *AdminDeleteUserPublicKeyParams {
+	return &AdminDeleteUserPublicKeyParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewAdminDeleteUserPublicKeyParamsWithTimeout creates a new AdminDeleteUserPublicKeyParams object
+// with the ability to set a timeout on a request.
+func NewAdminDeleteUserPublicKeyParamsWithTimeout(timeout time.Duration) *AdminDeleteUserPublicKeyParams {
+	return &AdminDeleteUserPublicKeyParams{
+		timeout: timeout,
+	}
+}
+
+// NewAdminDeleteUserPublicKeyParamsWithContext creates a new AdminDeleteUserPublicKeyParams object
+// with the ability to set a context for a request.
+func NewAdminDeleteUserPublicKeyParamsWithContext(ctx context.Context) *AdminDeleteUserPublicKeyParams {
+	return &AdminDeleteUserPublicKeyParams{
+		Context: ctx,
+	}
+}
+
+// NewAdminDeleteUserPublicKeyParamsWithHTTPClient creates a new AdminDeleteUserPublicKeyParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewAdminDeleteUserPublicKeyParamsWithHTTPClient(client *http.Client) *AdminDeleteUserPublicKeyParams {
+	return &AdminDeleteUserPublicKeyParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+AdminDeleteUserPublicKeyParams contains all the parameters to send to the API endpoint
+
+	for the admin delete user public key operation.
+
+	Typically these are written to a http.Request.
+*/
+type AdminDeleteUserPublicKeyParams struct {
+
+	/* ID.
+
+	   id of the key to delete
+
+	   Format: int64
+	*/
+	ID int64
+
+	/* Username.
+
+	   username of user
+	*/
+	Username string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the admin delete user public key params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *AdminDeleteUserPublicKeyParams) WithDefaults() *AdminDeleteUserPublicKeyParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the admin delete user public key params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *AdminDeleteUserPublicKeyParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the admin delete user public key params
+func (o *AdminDeleteUserPublicKeyParams) WithTimeout(timeout time.Duration) *AdminDeleteUserPublicKeyParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the admin delete user public key params
+func (o *AdminDeleteUserPublicKeyParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the admin delete user public key params
+func (o *AdminDeleteUserPublicKeyParams) WithContext(ctx context.Context) *AdminDeleteUserPublicKeyParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the admin delete user public key params
+func (o *AdminDeleteUserPublicKeyParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the admin delete user public key params
+func (o *AdminDeleteUserPublicKeyParams) WithHTTPClient(client *http.Client) *AdminDeleteUserPublicKeyParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the admin delete user public key params
+func (o *AdminDeleteUserPublicKeyParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithID adds the id to the admin delete user public key params
+func (o *AdminDeleteUserPublicKeyParams) WithID(id int64) *AdminDeleteUserPublicKeyParams {
+	o.SetID(id)
+	return o
+}
+
+// SetID adds the id to the admin delete user public key params
+func (o *AdminDeleteUserPublicKeyParams) SetID(id int64) {
+	o.ID = id
+}
+
+// WithUsername adds the username to the admin delete user public key params
+func (o *AdminDeleteUserPublicKeyParams) WithUsername(username string) *AdminDeleteUserPublicKeyParams {
+	o.SetUsername(username)
+	return o
+}
+
+// SetUsername adds the username to the admin delete user public key params
+func (o *AdminDeleteUserPublicKeyParams) SetUsername(username string) {
+	o.Username = username
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *AdminDeleteUserPublicKeyParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param id
+	if err := r.SetPathParam("id", swag.FormatInt64(o.ID)); err != nil {
+		return err
+	}
+
+	// path param username
+	if err := r.SetPathParam("username", o.Username); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/admin/admin_delete_user_public_key_responses.go b/bots-common/gitea-generated/client/admin/admin_delete_user_public_key_responses.go
new file mode 100644
index 0000000..fc9c04a
--- /dev/null
+++ b/bots-common/gitea-generated/client/admin/admin_delete_user_public_key_responses.go
@@ -0,0 +1,228 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package admin
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// AdminDeleteUserPublicKeyReader is a Reader for the AdminDeleteUserPublicKey structure.
+type AdminDeleteUserPublicKeyReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *AdminDeleteUserPublicKeyReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewAdminDeleteUserPublicKeyNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 403:
+		result := NewAdminDeleteUserPublicKeyForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewAdminDeleteUserPublicKeyNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[DELETE /admin/users/{username}/keys/{id}] adminDeleteUserPublicKey", response, response.Code())
+	}
+}
+
+// NewAdminDeleteUserPublicKeyNoContent creates a AdminDeleteUserPublicKeyNoContent with default headers values
+func NewAdminDeleteUserPublicKeyNoContent() *AdminDeleteUserPublicKeyNoContent {
+	return &AdminDeleteUserPublicKeyNoContent{}
+}
+
+/*
+AdminDeleteUserPublicKeyNoContent describes a response with status code 204, with default header values.
+
+APIEmpty is an empty response
+*/
+type AdminDeleteUserPublicKeyNoContent struct {
+}
+
+// IsSuccess returns true when this admin delete user public key no content response has a 2xx status code
+func (o *AdminDeleteUserPublicKeyNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this admin delete user public key no content response has a 3xx status code
+func (o *AdminDeleteUserPublicKeyNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this admin delete user public key no content response has a 4xx status code
+func (o *AdminDeleteUserPublicKeyNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this admin delete user public key no content response has a 5xx status code
+func (o *AdminDeleteUserPublicKeyNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this admin delete user public key no content response a status code equal to that given
+func (o *AdminDeleteUserPublicKeyNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the admin delete user public key no content response
+func (o *AdminDeleteUserPublicKeyNoContent) Code() int {
+	return 204
+}
+
+func (o *AdminDeleteUserPublicKeyNoContent) Error() string {
+	return fmt.Sprintf("[DELETE /admin/users/{username}/keys/{id}][%d] adminDeleteUserPublicKeyNoContent", 204)
+}
+
+func (o *AdminDeleteUserPublicKeyNoContent) String() string {
+	return fmt.Sprintf("[DELETE /admin/users/{username}/keys/{id}][%d] adminDeleteUserPublicKeyNoContent", 204)
+}
+
+func (o *AdminDeleteUserPublicKeyNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewAdminDeleteUserPublicKeyForbidden creates a AdminDeleteUserPublicKeyForbidden with default headers values
+func NewAdminDeleteUserPublicKeyForbidden() *AdminDeleteUserPublicKeyForbidden {
+	return &AdminDeleteUserPublicKeyForbidden{}
+}
+
+/*
+AdminDeleteUserPublicKeyForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type AdminDeleteUserPublicKeyForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this admin delete user public key forbidden response has a 2xx status code
+func (o *AdminDeleteUserPublicKeyForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this admin delete user public key forbidden response has a 3xx status code
+func (o *AdminDeleteUserPublicKeyForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this admin delete user public key forbidden response has a 4xx status code
+func (o *AdminDeleteUserPublicKeyForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this admin delete user public key forbidden response has a 5xx status code
+func (o *AdminDeleteUserPublicKeyForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this admin delete user public key forbidden response a status code equal to that given
+func (o *AdminDeleteUserPublicKeyForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the admin delete user public key forbidden response
+func (o *AdminDeleteUserPublicKeyForbidden) Code() int {
+	return 403
+}
+
+func (o *AdminDeleteUserPublicKeyForbidden) Error() string {
+	return fmt.Sprintf("[DELETE /admin/users/{username}/keys/{id}][%d] adminDeleteUserPublicKeyForbidden", 403)
+}
+
+func (o *AdminDeleteUserPublicKeyForbidden) String() string {
+	return fmt.Sprintf("[DELETE /admin/users/{username}/keys/{id}][%d] adminDeleteUserPublicKeyForbidden", 403)
+}
+
+func (o *AdminDeleteUserPublicKeyForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewAdminDeleteUserPublicKeyNotFound creates a AdminDeleteUserPublicKeyNotFound with default headers values
+func NewAdminDeleteUserPublicKeyNotFound() *AdminDeleteUserPublicKeyNotFound {
+	return &AdminDeleteUserPublicKeyNotFound{}
+}
+
+/*
+AdminDeleteUserPublicKeyNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type AdminDeleteUserPublicKeyNotFound struct {
+}
+
+// IsSuccess returns true when this admin delete user public key not found response has a 2xx status code
+func (o *AdminDeleteUserPublicKeyNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this admin delete user public key not found response has a 3xx status code
+func (o *AdminDeleteUserPublicKeyNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this admin delete user public key not found response has a 4xx status code
+func (o *AdminDeleteUserPublicKeyNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this admin delete user public key not found response has a 5xx status code
+func (o *AdminDeleteUserPublicKeyNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this admin delete user public key not found response a status code equal to that given
+func (o *AdminDeleteUserPublicKeyNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the admin delete user public key not found response
+func (o *AdminDeleteUserPublicKeyNotFound) Code() int {
+	return 404
+}
+
+func (o *AdminDeleteUserPublicKeyNotFound) Error() string {
+	return fmt.Sprintf("[DELETE /admin/users/{username}/keys/{id}][%d] adminDeleteUserPublicKeyNotFound", 404)
+}
+
+func (o *AdminDeleteUserPublicKeyNotFound) String() string {
+	return fmt.Sprintf("[DELETE /admin/users/{username}/keys/{id}][%d] adminDeleteUserPublicKeyNotFound", 404)
+}
+
+func (o *AdminDeleteUserPublicKeyNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/admin/admin_delete_user_responses.go b/bots-common/gitea-generated/client/admin/admin_delete_user_responses.go
new file mode 100644
index 0000000..eb4fd1f
--- /dev/null
+++ b/bots-common/gitea-generated/client/admin/admin_delete_user_responses.go
@@ -0,0 +1,306 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package admin
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// AdminDeleteUserReader is a Reader for the AdminDeleteUser structure.
+type AdminDeleteUserReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *AdminDeleteUserReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewAdminDeleteUserNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 403:
+		result := NewAdminDeleteUserForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewAdminDeleteUserNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 422:
+		result := NewAdminDeleteUserUnprocessableEntity()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[DELETE /admin/users/{username}] adminDeleteUser", response, response.Code())
+	}
+}
+
+// NewAdminDeleteUserNoContent creates a AdminDeleteUserNoContent with default headers values
+func NewAdminDeleteUserNoContent() *AdminDeleteUserNoContent {
+	return &AdminDeleteUserNoContent{}
+}
+
+/*
+AdminDeleteUserNoContent describes a response with status code 204, with default header values.
+
+APIEmpty is an empty response
+*/
+type AdminDeleteUserNoContent struct {
+}
+
+// IsSuccess returns true when this admin delete user no content response has a 2xx status code
+func (o *AdminDeleteUserNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this admin delete user no content response has a 3xx status code
+func (o *AdminDeleteUserNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this admin delete user no content response has a 4xx status code
+func (o *AdminDeleteUserNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this admin delete user no content response has a 5xx status code
+func (o *AdminDeleteUserNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this admin delete user no content response a status code equal to that given
+func (o *AdminDeleteUserNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the admin delete user no content response
+func (o *AdminDeleteUserNoContent) Code() int {
+	return 204
+}
+
+func (o *AdminDeleteUserNoContent) Error() string {
+	return fmt.Sprintf("[DELETE /admin/users/{username}][%d] adminDeleteUserNoContent", 204)
+}
+
+func (o *AdminDeleteUserNoContent) String() string {
+	return fmt.Sprintf("[DELETE /admin/users/{username}][%d] adminDeleteUserNoContent", 204)
+}
+
+func (o *AdminDeleteUserNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewAdminDeleteUserForbidden creates a AdminDeleteUserForbidden with default headers values
+func NewAdminDeleteUserForbidden() *AdminDeleteUserForbidden {
+	return &AdminDeleteUserForbidden{}
+}
+
+/*
+AdminDeleteUserForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type AdminDeleteUserForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this admin delete user forbidden response has a 2xx status code
+func (o *AdminDeleteUserForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this admin delete user forbidden response has a 3xx status code
+func (o *AdminDeleteUserForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this admin delete user forbidden response has a 4xx status code
+func (o *AdminDeleteUserForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this admin delete user forbidden response has a 5xx status code
+func (o *AdminDeleteUserForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this admin delete user forbidden response a status code equal to that given
+func (o *AdminDeleteUserForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the admin delete user forbidden response
+func (o *AdminDeleteUserForbidden) Code() int {
+	return 403
+}
+
+func (o *AdminDeleteUserForbidden) Error() string {
+	return fmt.Sprintf("[DELETE /admin/users/{username}][%d] adminDeleteUserForbidden", 403)
+}
+
+func (o *AdminDeleteUserForbidden) String() string {
+	return fmt.Sprintf("[DELETE /admin/users/{username}][%d] adminDeleteUserForbidden", 403)
+}
+
+func (o *AdminDeleteUserForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewAdminDeleteUserNotFound creates a AdminDeleteUserNotFound with default headers values
+func NewAdminDeleteUserNotFound() *AdminDeleteUserNotFound {
+	return &AdminDeleteUserNotFound{}
+}
+
+/*
+AdminDeleteUserNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type AdminDeleteUserNotFound struct {
+}
+
+// IsSuccess returns true when this admin delete user not found response has a 2xx status code
+func (o *AdminDeleteUserNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this admin delete user not found response has a 3xx status code
+func (o *AdminDeleteUserNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this admin delete user not found response has a 4xx status code
+func (o *AdminDeleteUserNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this admin delete user not found response has a 5xx status code
+func (o *AdminDeleteUserNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this admin delete user not found response a status code equal to that given
+func (o *AdminDeleteUserNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the admin delete user not found response
+func (o *AdminDeleteUserNotFound) Code() int {
+	return 404
+}
+
+func (o *AdminDeleteUserNotFound) Error() string {
+	return fmt.Sprintf("[DELETE /admin/users/{username}][%d] adminDeleteUserNotFound", 404)
+}
+
+func (o *AdminDeleteUserNotFound) String() string {
+	return fmt.Sprintf("[DELETE /admin/users/{username}][%d] adminDeleteUserNotFound", 404)
+}
+
+func (o *AdminDeleteUserNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewAdminDeleteUserUnprocessableEntity creates a AdminDeleteUserUnprocessableEntity with default headers values
+func NewAdminDeleteUserUnprocessableEntity() *AdminDeleteUserUnprocessableEntity {
+	return &AdminDeleteUserUnprocessableEntity{}
+}
+
+/*
+AdminDeleteUserUnprocessableEntity describes a response with status code 422, with default header values.
+
+APIValidationError is error format response related to input validation
+*/
+type AdminDeleteUserUnprocessableEntity struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this admin delete user unprocessable entity response has a 2xx status code
+func (o *AdminDeleteUserUnprocessableEntity) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this admin delete user unprocessable entity response has a 3xx status code
+func (o *AdminDeleteUserUnprocessableEntity) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this admin delete user unprocessable entity response has a 4xx status code
+func (o *AdminDeleteUserUnprocessableEntity) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this admin delete user unprocessable entity response has a 5xx status code
+func (o *AdminDeleteUserUnprocessableEntity) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this admin delete user unprocessable entity response a status code equal to that given
+func (o *AdminDeleteUserUnprocessableEntity) IsCode(code int) bool {
+	return code == 422
+}
+
+// Code gets the status code for the admin delete user unprocessable entity response
+func (o *AdminDeleteUserUnprocessableEntity) Code() int {
+	return 422
+}
+
+func (o *AdminDeleteUserUnprocessableEntity) Error() string {
+	return fmt.Sprintf("[DELETE /admin/users/{username}][%d] adminDeleteUserUnprocessableEntity", 422)
+}
+
+func (o *AdminDeleteUserUnprocessableEntity) String() string {
+	return fmt.Sprintf("[DELETE /admin/users/{username}][%d] adminDeleteUserUnprocessableEntity", 422)
+}
+
+func (o *AdminDeleteUserUnprocessableEntity) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/admin/admin_edit_hook_parameters.go b/bots-common/gitea-generated/client/admin/admin_edit_hook_parameters.go
new file mode 100644
index 0000000..a1f3371
--- /dev/null
+++ b/bots-common/gitea-generated/client/admin/admin_edit_hook_parameters.go
@@ -0,0 +1,175 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package admin
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewAdminEditHookParams creates a new AdminEditHookParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewAdminEditHookParams() *AdminEditHookParams {
+	return &AdminEditHookParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewAdminEditHookParamsWithTimeout creates a new AdminEditHookParams object
+// with the ability to set a timeout on a request.
+func NewAdminEditHookParamsWithTimeout(timeout time.Duration) *AdminEditHookParams {
+	return &AdminEditHookParams{
+		timeout: timeout,
+	}
+}
+
+// NewAdminEditHookParamsWithContext creates a new AdminEditHookParams object
+// with the ability to set a context for a request.
+func NewAdminEditHookParamsWithContext(ctx context.Context) *AdminEditHookParams {
+	return &AdminEditHookParams{
+		Context: ctx,
+	}
+}
+
+// NewAdminEditHookParamsWithHTTPClient creates a new AdminEditHookParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewAdminEditHookParamsWithHTTPClient(client *http.Client) *AdminEditHookParams {
+	return &AdminEditHookParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+AdminEditHookParams contains all the parameters to send to the API endpoint
+
+	for the admin edit hook operation.
+
+	Typically these are written to a http.Request.
+*/
+type AdminEditHookParams struct {
+
+	// Body.
+	Body *models.EditHookOption
+
+	/* ID.
+
+	   id of the hook to update
+
+	   Format: int64
+	*/
+	ID int64
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the admin edit hook params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *AdminEditHookParams) WithDefaults() *AdminEditHookParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the admin edit hook params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *AdminEditHookParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the admin edit hook params
+func (o *AdminEditHookParams) WithTimeout(timeout time.Duration) *AdminEditHookParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the admin edit hook params
+func (o *AdminEditHookParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the admin edit hook params
+func (o *AdminEditHookParams) WithContext(ctx context.Context) *AdminEditHookParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the admin edit hook params
+func (o *AdminEditHookParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the admin edit hook params
+func (o *AdminEditHookParams) WithHTTPClient(client *http.Client) *AdminEditHookParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the admin edit hook params
+func (o *AdminEditHookParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the admin edit hook params
+func (o *AdminEditHookParams) WithBody(body *models.EditHookOption) *AdminEditHookParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the admin edit hook params
+func (o *AdminEditHookParams) SetBody(body *models.EditHookOption) {
+	o.Body = body
+}
+
+// WithID adds the id to the admin edit hook params
+func (o *AdminEditHookParams) WithID(id int64) *AdminEditHookParams {
+	o.SetID(id)
+	return o
+}
+
+// SetID adds the id to the admin edit hook params
+func (o *AdminEditHookParams) SetID(id int64) {
+	o.ID = id
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *AdminEditHookParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	// path param id
+	if err := r.SetPathParam("id", swag.FormatInt64(o.ID)); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/admin/admin_edit_hook_responses.go b/bots-common/gitea-generated/client/admin/admin_edit_hook_responses.go
new file mode 100644
index 0000000..437a778
--- /dev/null
+++ b/bots-common/gitea-generated/client/admin/admin_edit_hook_responses.go
@@ -0,0 +1,106 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package admin
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// AdminEditHookReader is a Reader for the AdminEditHook structure.
+type AdminEditHookReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *AdminEditHookReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewAdminEditHookOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	default:
+		return nil, runtime.NewAPIError("[PATCH /admin/hooks/{id}] adminEditHook", response, response.Code())
+	}
+}
+
+// NewAdminEditHookOK creates a AdminEditHookOK with default headers values
+func NewAdminEditHookOK() *AdminEditHookOK {
+	return &AdminEditHookOK{}
+}
+
+/*
+AdminEditHookOK describes a response with status code 200, with default header values.
+
+Hook
+*/
+type AdminEditHookOK struct {
+	Payload *models.Hook
+}
+
+// IsSuccess returns true when this admin edit hook o k response has a 2xx status code
+func (o *AdminEditHookOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this admin edit hook o k response has a 3xx status code
+func (o *AdminEditHookOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this admin edit hook o k response has a 4xx status code
+func (o *AdminEditHookOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this admin edit hook o k response has a 5xx status code
+func (o *AdminEditHookOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this admin edit hook o k response a status code equal to that given
+func (o *AdminEditHookOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the admin edit hook o k response
+func (o *AdminEditHookOK) Code() int {
+	return 200
+}
+
+func (o *AdminEditHookOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[PATCH /admin/hooks/{id}][%d] adminEditHookOK %s", 200, payload)
+}
+
+func (o *AdminEditHookOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[PATCH /admin/hooks/{id}][%d] adminEditHookOK %s", 200, payload)
+}
+
+func (o *AdminEditHookOK) GetPayload() *models.Hook {
+	return o.Payload
+}
+
+func (o *AdminEditHookOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.Hook)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/admin/admin_edit_user_parameters.go b/bots-common/gitea-generated/client/admin/admin_edit_user_parameters.go
new file mode 100644
index 0000000..fb60d2b
--- /dev/null
+++ b/bots-common/gitea-generated/client/admin/admin_edit_user_parameters.go
@@ -0,0 +1,172 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package admin
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewAdminEditUserParams creates a new AdminEditUserParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewAdminEditUserParams() *AdminEditUserParams {
+	return &AdminEditUserParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewAdminEditUserParamsWithTimeout creates a new AdminEditUserParams object
+// with the ability to set a timeout on a request.
+func NewAdminEditUserParamsWithTimeout(timeout time.Duration) *AdminEditUserParams {
+	return &AdminEditUserParams{
+		timeout: timeout,
+	}
+}
+
+// NewAdminEditUserParamsWithContext creates a new AdminEditUserParams object
+// with the ability to set a context for a request.
+func NewAdminEditUserParamsWithContext(ctx context.Context) *AdminEditUserParams {
+	return &AdminEditUserParams{
+		Context: ctx,
+	}
+}
+
+// NewAdminEditUserParamsWithHTTPClient creates a new AdminEditUserParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewAdminEditUserParamsWithHTTPClient(client *http.Client) *AdminEditUserParams {
+	return &AdminEditUserParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+AdminEditUserParams contains all the parameters to send to the API endpoint
+
+	for the admin edit user operation.
+
+	Typically these are written to a http.Request.
+*/
+type AdminEditUserParams struct {
+
+	// Body.
+	Body *models.EditUserOption
+
+	/* Username.
+
+	   username of user to edit
+	*/
+	Username string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the admin edit user params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *AdminEditUserParams) WithDefaults() *AdminEditUserParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the admin edit user params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *AdminEditUserParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the admin edit user params
+func (o *AdminEditUserParams) WithTimeout(timeout time.Duration) *AdminEditUserParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the admin edit user params
+func (o *AdminEditUserParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the admin edit user params
+func (o *AdminEditUserParams) WithContext(ctx context.Context) *AdminEditUserParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the admin edit user params
+func (o *AdminEditUserParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the admin edit user params
+func (o *AdminEditUserParams) WithHTTPClient(client *http.Client) *AdminEditUserParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the admin edit user params
+func (o *AdminEditUserParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the admin edit user params
+func (o *AdminEditUserParams) WithBody(body *models.EditUserOption) *AdminEditUserParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the admin edit user params
+func (o *AdminEditUserParams) SetBody(body *models.EditUserOption) {
+	o.Body = body
+}
+
+// WithUsername adds the username to the admin edit user params
+func (o *AdminEditUserParams) WithUsername(username string) *AdminEditUserParams {
+	o.SetUsername(username)
+	return o
+}
+
+// SetUsername adds the username to the admin edit user params
+func (o *AdminEditUserParams) SetUsername(username string) {
+	o.Username = username
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *AdminEditUserParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	// path param username
+	if err := r.SetPathParam("username", o.Username); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/admin/admin_edit_user_responses.go b/bots-common/gitea-generated/client/admin/admin_edit_user_responses.go
new file mode 100644
index 0000000..24b8433
--- /dev/null
+++ b/bots-common/gitea-generated/client/admin/admin_edit_user_responses.go
@@ -0,0 +1,340 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package admin
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// AdminEditUserReader is a Reader for the AdminEditUser structure.
+type AdminEditUserReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *AdminEditUserReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewAdminEditUserOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 400:
+		result := NewAdminEditUserBadRequest()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 403:
+		result := NewAdminEditUserForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 422:
+		result := NewAdminEditUserUnprocessableEntity()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[PATCH /admin/users/{username}] adminEditUser", response, response.Code())
+	}
+}
+
+// NewAdminEditUserOK creates a AdminEditUserOK with default headers values
+func NewAdminEditUserOK() *AdminEditUserOK {
+	return &AdminEditUserOK{}
+}
+
+/*
+AdminEditUserOK describes a response with status code 200, with default header values.
+
+User
+*/
+type AdminEditUserOK struct {
+	Payload *models.User
+}
+
+// IsSuccess returns true when this admin edit user o k response has a 2xx status code
+func (o *AdminEditUserOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this admin edit user o k response has a 3xx status code
+func (o *AdminEditUserOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this admin edit user o k response has a 4xx status code
+func (o *AdminEditUserOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this admin edit user o k response has a 5xx status code
+func (o *AdminEditUserOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this admin edit user o k response a status code equal to that given
+func (o *AdminEditUserOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the admin edit user o k response
+func (o *AdminEditUserOK) Code() int {
+	return 200
+}
+
+func (o *AdminEditUserOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[PATCH /admin/users/{username}][%d] adminEditUserOK %s", 200, payload)
+}
+
+func (o *AdminEditUserOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[PATCH /admin/users/{username}][%d] adminEditUserOK %s", 200, payload)
+}
+
+func (o *AdminEditUserOK) GetPayload() *models.User {
+	return o.Payload
+}
+
+func (o *AdminEditUserOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.User)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewAdminEditUserBadRequest creates a AdminEditUserBadRequest with default headers values
+func NewAdminEditUserBadRequest() *AdminEditUserBadRequest {
+	return &AdminEditUserBadRequest{}
+}
+
+/*
+AdminEditUserBadRequest describes a response with status code 400, with default header values.
+
+APIError is error format response
+*/
+type AdminEditUserBadRequest struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this admin edit user bad request response has a 2xx status code
+func (o *AdminEditUserBadRequest) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this admin edit user bad request response has a 3xx status code
+func (o *AdminEditUserBadRequest) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this admin edit user bad request response has a 4xx status code
+func (o *AdminEditUserBadRequest) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this admin edit user bad request response has a 5xx status code
+func (o *AdminEditUserBadRequest) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this admin edit user bad request response a status code equal to that given
+func (o *AdminEditUserBadRequest) IsCode(code int) bool {
+	return code == 400
+}
+
+// Code gets the status code for the admin edit user bad request response
+func (o *AdminEditUserBadRequest) Code() int {
+	return 400
+}
+
+func (o *AdminEditUserBadRequest) Error() string {
+	return fmt.Sprintf("[PATCH /admin/users/{username}][%d] adminEditUserBadRequest", 400)
+}
+
+func (o *AdminEditUserBadRequest) String() string {
+	return fmt.Sprintf("[PATCH /admin/users/{username}][%d] adminEditUserBadRequest", 400)
+}
+
+func (o *AdminEditUserBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewAdminEditUserForbidden creates a AdminEditUserForbidden with default headers values
+func NewAdminEditUserForbidden() *AdminEditUserForbidden {
+	return &AdminEditUserForbidden{}
+}
+
+/*
+AdminEditUserForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type AdminEditUserForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this admin edit user forbidden response has a 2xx status code
+func (o *AdminEditUserForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this admin edit user forbidden response has a 3xx status code
+func (o *AdminEditUserForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this admin edit user forbidden response has a 4xx status code
+func (o *AdminEditUserForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this admin edit user forbidden response has a 5xx status code
+func (o *AdminEditUserForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this admin edit user forbidden response a status code equal to that given
+func (o *AdminEditUserForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the admin edit user forbidden response
+func (o *AdminEditUserForbidden) Code() int {
+	return 403
+}
+
+func (o *AdminEditUserForbidden) Error() string {
+	return fmt.Sprintf("[PATCH /admin/users/{username}][%d] adminEditUserForbidden", 403)
+}
+
+func (o *AdminEditUserForbidden) String() string {
+	return fmt.Sprintf("[PATCH /admin/users/{username}][%d] adminEditUserForbidden", 403)
+}
+
+func (o *AdminEditUserForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewAdminEditUserUnprocessableEntity creates a AdminEditUserUnprocessableEntity with default headers values
+func NewAdminEditUserUnprocessableEntity() *AdminEditUserUnprocessableEntity {
+	return &AdminEditUserUnprocessableEntity{}
+}
+
+/*
+AdminEditUserUnprocessableEntity describes a response with status code 422, with default header values.
+
+APIValidationError is error format response related to input validation
+*/
+type AdminEditUserUnprocessableEntity struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this admin edit user unprocessable entity response has a 2xx status code
+func (o *AdminEditUserUnprocessableEntity) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this admin edit user unprocessable entity response has a 3xx status code
+func (o *AdminEditUserUnprocessableEntity) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this admin edit user unprocessable entity response has a 4xx status code
+func (o *AdminEditUserUnprocessableEntity) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this admin edit user unprocessable entity response has a 5xx status code
+func (o *AdminEditUserUnprocessableEntity) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this admin edit user unprocessable entity response a status code equal to that given
+func (o *AdminEditUserUnprocessableEntity) IsCode(code int) bool {
+	return code == 422
+}
+
+// Code gets the status code for the admin edit user unprocessable entity response
+func (o *AdminEditUserUnprocessableEntity) Code() int {
+	return 422
+}
+
+func (o *AdminEditUserUnprocessableEntity) Error() string {
+	return fmt.Sprintf("[PATCH /admin/users/{username}][%d] adminEditUserUnprocessableEntity", 422)
+}
+
+func (o *AdminEditUserUnprocessableEntity) String() string {
+	return fmt.Sprintf("[PATCH /admin/users/{username}][%d] adminEditUserUnprocessableEntity", 422)
+}
+
+func (o *AdminEditUserUnprocessableEntity) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/admin/admin_get_all_emails_parameters.go b/bots-common/gitea-generated/client/admin/admin_get_all_emails_parameters.go
new file mode 100644
index 0000000..2127406
--- /dev/null
+++ b/bots-common/gitea-generated/client/admin/admin_get_all_emails_parameters.go
@@ -0,0 +1,198 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package admin
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewAdminGetAllEmailsParams creates a new AdminGetAllEmailsParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewAdminGetAllEmailsParams() *AdminGetAllEmailsParams {
+	return &AdminGetAllEmailsParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewAdminGetAllEmailsParamsWithTimeout creates a new AdminGetAllEmailsParams object
+// with the ability to set a timeout on a request.
+func NewAdminGetAllEmailsParamsWithTimeout(timeout time.Duration) *AdminGetAllEmailsParams {
+	return &AdminGetAllEmailsParams{
+		timeout: timeout,
+	}
+}
+
+// NewAdminGetAllEmailsParamsWithContext creates a new AdminGetAllEmailsParams object
+// with the ability to set a context for a request.
+func NewAdminGetAllEmailsParamsWithContext(ctx context.Context) *AdminGetAllEmailsParams {
+	return &AdminGetAllEmailsParams{
+		Context: ctx,
+	}
+}
+
+// NewAdminGetAllEmailsParamsWithHTTPClient creates a new AdminGetAllEmailsParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewAdminGetAllEmailsParamsWithHTTPClient(client *http.Client) *AdminGetAllEmailsParams {
+	return &AdminGetAllEmailsParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+AdminGetAllEmailsParams contains all the parameters to send to the API endpoint
+
+	for the admin get all emails operation.
+
+	Typically these are written to a http.Request.
+*/
+type AdminGetAllEmailsParams struct {
+
+	/* Limit.
+
+	   page size of results
+	*/
+	Limit *int64
+
+	/* Page.
+
+	   page number of results to return (1-based)
+	*/
+	Page *int64
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the admin get all emails params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *AdminGetAllEmailsParams) WithDefaults() *AdminGetAllEmailsParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the admin get all emails params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *AdminGetAllEmailsParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the admin get all emails params
+func (o *AdminGetAllEmailsParams) WithTimeout(timeout time.Duration) *AdminGetAllEmailsParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the admin get all emails params
+func (o *AdminGetAllEmailsParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the admin get all emails params
+func (o *AdminGetAllEmailsParams) WithContext(ctx context.Context) *AdminGetAllEmailsParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the admin get all emails params
+func (o *AdminGetAllEmailsParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the admin get all emails params
+func (o *AdminGetAllEmailsParams) WithHTTPClient(client *http.Client) *AdminGetAllEmailsParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the admin get all emails params
+func (o *AdminGetAllEmailsParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithLimit adds the limit to the admin get all emails params
+func (o *AdminGetAllEmailsParams) WithLimit(limit *int64) *AdminGetAllEmailsParams {
+	o.SetLimit(limit)
+	return o
+}
+
+// SetLimit adds the limit to the admin get all emails params
+func (o *AdminGetAllEmailsParams) SetLimit(limit *int64) {
+	o.Limit = limit
+}
+
+// WithPage adds the page to the admin get all emails params
+func (o *AdminGetAllEmailsParams) WithPage(page *int64) *AdminGetAllEmailsParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the admin get all emails params
+func (o *AdminGetAllEmailsParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *AdminGetAllEmailsParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.Limit != nil {
+
+		// query param limit
+		var qrLimit int64
+
+		if o.Limit != nil {
+			qrLimit = *o.Limit
+		}
+		qLimit := swag.FormatInt64(qrLimit)
+		if qLimit != "" {
+
+			if err := r.SetQueryParam("limit", qLimit); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/admin/admin_get_all_emails_responses.go b/bots-common/gitea-generated/client/admin/admin_get_all_emails_responses.go
new file mode 100644
index 0000000..d29c766
--- /dev/null
+++ b/bots-common/gitea-generated/client/admin/admin_get_all_emails_responses.go
@@ -0,0 +1,182 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package admin
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// AdminGetAllEmailsReader is a Reader for the AdminGetAllEmails structure.
+type AdminGetAllEmailsReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *AdminGetAllEmailsReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewAdminGetAllEmailsOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 403:
+		result := NewAdminGetAllEmailsForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /admin/emails] adminGetAllEmails", response, response.Code())
+	}
+}
+
+// NewAdminGetAllEmailsOK creates a AdminGetAllEmailsOK with default headers values
+func NewAdminGetAllEmailsOK() *AdminGetAllEmailsOK {
+	return &AdminGetAllEmailsOK{}
+}
+
+/*
+AdminGetAllEmailsOK describes a response with status code 200, with default header values.
+
+EmailList
+*/
+type AdminGetAllEmailsOK struct {
+	Payload []*models.Email
+}
+
+// IsSuccess returns true when this admin get all emails o k response has a 2xx status code
+func (o *AdminGetAllEmailsOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this admin get all emails o k response has a 3xx status code
+func (o *AdminGetAllEmailsOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this admin get all emails o k response has a 4xx status code
+func (o *AdminGetAllEmailsOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this admin get all emails o k response has a 5xx status code
+func (o *AdminGetAllEmailsOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this admin get all emails o k response a status code equal to that given
+func (o *AdminGetAllEmailsOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the admin get all emails o k response
+func (o *AdminGetAllEmailsOK) Code() int {
+	return 200
+}
+
+func (o *AdminGetAllEmailsOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /admin/emails][%d] adminGetAllEmailsOK %s", 200, payload)
+}
+
+func (o *AdminGetAllEmailsOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /admin/emails][%d] adminGetAllEmailsOK %s", 200, payload)
+}
+
+func (o *AdminGetAllEmailsOK) GetPayload() []*models.Email {
+	return o.Payload
+}
+
+func (o *AdminGetAllEmailsOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewAdminGetAllEmailsForbidden creates a AdminGetAllEmailsForbidden with default headers values
+func NewAdminGetAllEmailsForbidden() *AdminGetAllEmailsForbidden {
+	return &AdminGetAllEmailsForbidden{}
+}
+
+/*
+AdminGetAllEmailsForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type AdminGetAllEmailsForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this admin get all emails forbidden response has a 2xx status code
+func (o *AdminGetAllEmailsForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this admin get all emails forbidden response has a 3xx status code
+func (o *AdminGetAllEmailsForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this admin get all emails forbidden response has a 4xx status code
+func (o *AdminGetAllEmailsForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this admin get all emails forbidden response has a 5xx status code
+func (o *AdminGetAllEmailsForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this admin get all emails forbidden response a status code equal to that given
+func (o *AdminGetAllEmailsForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the admin get all emails forbidden response
+func (o *AdminGetAllEmailsForbidden) Code() int {
+	return 403
+}
+
+func (o *AdminGetAllEmailsForbidden) Error() string {
+	return fmt.Sprintf("[GET /admin/emails][%d] adminGetAllEmailsForbidden", 403)
+}
+
+func (o *AdminGetAllEmailsForbidden) String() string {
+	return fmt.Sprintf("[GET /admin/emails][%d] adminGetAllEmailsForbidden", 403)
+}
+
+func (o *AdminGetAllEmailsForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/admin/admin_get_all_orgs_parameters.go b/bots-common/gitea-generated/client/admin/admin_get_all_orgs_parameters.go
new file mode 100644
index 0000000..9703835
--- /dev/null
+++ b/bots-common/gitea-generated/client/admin/admin_get_all_orgs_parameters.go
@@ -0,0 +1,198 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package admin
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewAdminGetAllOrgsParams creates a new AdminGetAllOrgsParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewAdminGetAllOrgsParams() *AdminGetAllOrgsParams {
+	return &AdminGetAllOrgsParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewAdminGetAllOrgsParamsWithTimeout creates a new AdminGetAllOrgsParams object
+// with the ability to set a timeout on a request.
+func NewAdminGetAllOrgsParamsWithTimeout(timeout time.Duration) *AdminGetAllOrgsParams {
+	return &AdminGetAllOrgsParams{
+		timeout: timeout,
+	}
+}
+
+// NewAdminGetAllOrgsParamsWithContext creates a new AdminGetAllOrgsParams object
+// with the ability to set a context for a request.
+func NewAdminGetAllOrgsParamsWithContext(ctx context.Context) *AdminGetAllOrgsParams {
+	return &AdminGetAllOrgsParams{
+		Context: ctx,
+	}
+}
+
+// NewAdminGetAllOrgsParamsWithHTTPClient creates a new AdminGetAllOrgsParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewAdminGetAllOrgsParamsWithHTTPClient(client *http.Client) *AdminGetAllOrgsParams {
+	return &AdminGetAllOrgsParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+AdminGetAllOrgsParams contains all the parameters to send to the API endpoint
+
+	for the admin get all orgs operation.
+
+	Typically these are written to a http.Request.
+*/
+type AdminGetAllOrgsParams struct {
+
+	/* Limit.
+
+	   page size of results
+	*/
+	Limit *int64
+
+	/* Page.
+
+	   page number of results to return (1-based)
+	*/
+	Page *int64
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the admin get all orgs params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *AdminGetAllOrgsParams) WithDefaults() *AdminGetAllOrgsParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the admin get all orgs params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *AdminGetAllOrgsParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the admin get all orgs params
+func (o *AdminGetAllOrgsParams) WithTimeout(timeout time.Duration) *AdminGetAllOrgsParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the admin get all orgs params
+func (o *AdminGetAllOrgsParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the admin get all orgs params
+func (o *AdminGetAllOrgsParams) WithContext(ctx context.Context) *AdminGetAllOrgsParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the admin get all orgs params
+func (o *AdminGetAllOrgsParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the admin get all orgs params
+func (o *AdminGetAllOrgsParams) WithHTTPClient(client *http.Client) *AdminGetAllOrgsParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the admin get all orgs params
+func (o *AdminGetAllOrgsParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithLimit adds the limit to the admin get all orgs params
+func (o *AdminGetAllOrgsParams) WithLimit(limit *int64) *AdminGetAllOrgsParams {
+	o.SetLimit(limit)
+	return o
+}
+
+// SetLimit adds the limit to the admin get all orgs params
+func (o *AdminGetAllOrgsParams) SetLimit(limit *int64) {
+	o.Limit = limit
+}
+
+// WithPage adds the page to the admin get all orgs params
+func (o *AdminGetAllOrgsParams) WithPage(page *int64) *AdminGetAllOrgsParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the admin get all orgs params
+func (o *AdminGetAllOrgsParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *AdminGetAllOrgsParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.Limit != nil {
+
+		// query param limit
+		var qrLimit int64
+
+		if o.Limit != nil {
+			qrLimit = *o.Limit
+		}
+		qLimit := swag.FormatInt64(qrLimit)
+		if qLimit != "" {
+
+			if err := r.SetQueryParam("limit", qLimit); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/admin/admin_get_all_orgs_responses.go b/bots-common/gitea-generated/client/admin/admin_get_all_orgs_responses.go
new file mode 100644
index 0000000..65c6182
--- /dev/null
+++ b/bots-common/gitea-generated/client/admin/admin_get_all_orgs_responses.go
@@ -0,0 +1,182 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package admin
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// AdminGetAllOrgsReader is a Reader for the AdminGetAllOrgs structure.
+type AdminGetAllOrgsReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *AdminGetAllOrgsReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewAdminGetAllOrgsOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 403:
+		result := NewAdminGetAllOrgsForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /admin/orgs] adminGetAllOrgs", response, response.Code())
+	}
+}
+
+// NewAdminGetAllOrgsOK creates a AdminGetAllOrgsOK with default headers values
+func NewAdminGetAllOrgsOK() *AdminGetAllOrgsOK {
+	return &AdminGetAllOrgsOK{}
+}
+
+/*
+AdminGetAllOrgsOK describes a response with status code 200, with default header values.
+
+OrganizationList
+*/
+type AdminGetAllOrgsOK struct {
+	Payload []*models.Organization
+}
+
+// IsSuccess returns true when this admin get all orgs o k response has a 2xx status code
+func (o *AdminGetAllOrgsOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this admin get all orgs o k response has a 3xx status code
+func (o *AdminGetAllOrgsOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this admin get all orgs o k response has a 4xx status code
+func (o *AdminGetAllOrgsOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this admin get all orgs o k response has a 5xx status code
+func (o *AdminGetAllOrgsOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this admin get all orgs o k response a status code equal to that given
+func (o *AdminGetAllOrgsOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the admin get all orgs o k response
+func (o *AdminGetAllOrgsOK) Code() int {
+	return 200
+}
+
+func (o *AdminGetAllOrgsOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /admin/orgs][%d] adminGetAllOrgsOK %s", 200, payload)
+}
+
+func (o *AdminGetAllOrgsOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /admin/orgs][%d] adminGetAllOrgsOK %s", 200, payload)
+}
+
+func (o *AdminGetAllOrgsOK) GetPayload() []*models.Organization {
+	return o.Payload
+}
+
+func (o *AdminGetAllOrgsOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewAdminGetAllOrgsForbidden creates a AdminGetAllOrgsForbidden with default headers values
+func NewAdminGetAllOrgsForbidden() *AdminGetAllOrgsForbidden {
+	return &AdminGetAllOrgsForbidden{}
+}
+
+/*
+AdminGetAllOrgsForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type AdminGetAllOrgsForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this admin get all orgs forbidden response has a 2xx status code
+func (o *AdminGetAllOrgsForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this admin get all orgs forbidden response has a 3xx status code
+func (o *AdminGetAllOrgsForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this admin get all orgs forbidden response has a 4xx status code
+func (o *AdminGetAllOrgsForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this admin get all orgs forbidden response has a 5xx status code
+func (o *AdminGetAllOrgsForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this admin get all orgs forbidden response a status code equal to that given
+func (o *AdminGetAllOrgsForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the admin get all orgs forbidden response
+func (o *AdminGetAllOrgsForbidden) Code() int {
+	return 403
+}
+
+func (o *AdminGetAllOrgsForbidden) Error() string {
+	return fmt.Sprintf("[GET /admin/orgs][%d] adminGetAllOrgsForbidden", 403)
+}
+
+func (o *AdminGetAllOrgsForbidden) String() string {
+	return fmt.Sprintf("[GET /admin/orgs][%d] adminGetAllOrgsForbidden", 403)
+}
+
+func (o *AdminGetAllOrgsForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/admin/admin_get_hook_parameters.go b/bots-common/gitea-generated/client/admin/admin_get_hook_parameters.go
new file mode 100644
index 0000000..ec631f8
--- /dev/null
+++ b/bots-common/gitea-generated/client/admin/admin_get_hook_parameters.go
@@ -0,0 +1,154 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package admin
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewAdminGetHookParams creates a new AdminGetHookParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewAdminGetHookParams() *AdminGetHookParams {
+	return &AdminGetHookParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewAdminGetHookParamsWithTimeout creates a new AdminGetHookParams object
+// with the ability to set a timeout on a request.
+func NewAdminGetHookParamsWithTimeout(timeout time.Duration) *AdminGetHookParams {
+	return &AdminGetHookParams{
+		timeout: timeout,
+	}
+}
+
+// NewAdminGetHookParamsWithContext creates a new AdminGetHookParams object
+// with the ability to set a context for a request.
+func NewAdminGetHookParamsWithContext(ctx context.Context) *AdminGetHookParams {
+	return &AdminGetHookParams{
+		Context: ctx,
+	}
+}
+
+// NewAdminGetHookParamsWithHTTPClient creates a new AdminGetHookParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewAdminGetHookParamsWithHTTPClient(client *http.Client) *AdminGetHookParams {
+	return &AdminGetHookParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+AdminGetHookParams contains all the parameters to send to the API endpoint
+
+	for the admin get hook operation.
+
+	Typically these are written to a http.Request.
+*/
+type AdminGetHookParams struct {
+
+	/* ID.
+
+	   id of the hook to get
+
+	   Format: int64
+	*/
+	ID int64
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the admin get hook params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *AdminGetHookParams) WithDefaults() *AdminGetHookParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the admin get hook params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *AdminGetHookParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the admin get hook params
+func (o *AdminGetHookParams) WithTimeout(timeout time.Duration) *AdminGetHookParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the admin get hook params
+func (o *AdminGetHookParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the admin get hook params
+func (o *AdminGetHookParams) WithContext(ctx context.Context) *AdminGetHookParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the admin get hook params
+func (o *AdminGetHookParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the admin get hook params
+func (o *AdminGetHookParams) WithHTTPClient(client *http.Client) *AdminGetHookParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the admin get hook params
+func (o *AdminGetHookParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithID adds the id to the admin get hook params
+func (o *AdminGetHookParams) WithID(id int64) *AdminGetHookParams {
+	o.SetID(id)
+	return o
+}
+
+// SetID adds the id to the admin get hook params
+func (o *AdminGetHookParams) SetID(id int64) {
+	o.ID = id
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *AdminGetHookParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param id
+	if err := r.SetPathParam("id", swag.FormatInt64(o.ID)); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/admin/admin_get_hook_responses.go b/bots-common/gitea-generated/client/admin/admin_get_hook_responses.go
new file mode 100644
index 0000000..5512fe3
--- /dev/null
+++ b/bots-common/gitea-generated/client/admin/admin_get_hook_responses.go
@@ -0,0 +1,106 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package admin
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// AdminGetHookReader is a Reader for the AdminGetHook structure.
+type AdminGetHookReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *AdminGetHookReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewAdminGetHookOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	default:
+		return nil, runtime.NewAPIError("[GET /admin/hooks/{id}] adminGetHook", response, response.Code())
+	}
+}
+
+// NewAdminGetHookOK creates a AdminGetHookOK with default headers values
+func NewAdminGetHookOK() *AdminGetHookOK {
+	return &AdminGetHookOK{}
+}
+
+/*
+AdminGetHookOK describes a response with status code 200, with default header values.
+
+Hook
+*/
+type AdminGetHookOK struct {
+	Payload *models.Hook
+}
+
+// IsSuccess returns true when this admin get hook o k response has a 2xx status code
+func (o *AdminGetHookOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this admin get hook o k response has a 3xx status code
+func (o *AdminGetHookOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this admin get hook o k response has a 4xx status code
+func (o *AdminGetHookOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this admin get hook o k response has a 5xx status code
+func (o *AdminGetHookOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this admin get hook o k response a status code equal to that given
+func (o *AdminGetHookOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the admin get hook o k response
+func (o *AdminGetHookOK) Code() int {
+	return 200
+}
+
+func (o *AdminGetHookOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /admin/hooks/{id}][%d] adminGetHookOK %s", 200, payload)
+}
+
+func (o *AdminGetHookOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /admin/hooks/{id}][%d] adminGetHookOK %s", 200, payload)
+}
+
+func (o *AdminGetHookOK) GetPayload() *models.Hook {
+	return o.Payload
+}
+
+func (o *AdminGetHookOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.Hook)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/admin/admin_get_runner_registration_token_parameters.go b/bots-common/gitea-generated/client/admin/admin_get_runner_registration_token_parameters.go
new file mode 100644
index 0000000..dcc72e8
--- /dev/null
+++ b/bots-common/gitea-generated/client/admin/admin_get_runner_registration_token_parameters.go
@@ -0,0 +1,128 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package admin
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewAdminGetRunnerRegistrationTokenParams creates a new AdminGetRunnerRegistrationTokenParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewAdminGetRunnerRegistrationTokenParams() *AdminGetRunnerRegistrationTokenParams {
+	return &AdminGetRunnerRegistrationTokenParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewAdminGetRunnerRegistrationTokenParamsWithTimeout creates a new AdminGetRunnerRegistrationTokenParams object
+// with the ability to set a timeout on a request.
+func NewAdminGetRunnerRegistrationTokenParamsWithTimeout(timeout time.Duration) *AdminGetRunnerRegistrationTokenParams {
+	return &AdminGetRunnerRegistrationTokenParams{
+		timeout: timeout,
+	}
+}
+
+// NewAdminGetRunnerRegistrationTokenParamsWithContext creates a new AdminGetRunnerRegistrationTokenParams object
+// with the ability to set a context for a request.
+func NewAdminGetRunnerRegistrationTokenParamsWithContext(ctx context.Context) *AdminGetRunnerRegistrationTokenParams {
+	return &AdminGetRunnerRegistrationTokenParams{
+		Context: ctx,
+	}
+}
+
+// NewAdminGetRunnerRegistrationTokenParamsWithHTTPClient creates a new AdminGetRunnerRegistrationTokenParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewAdminGetRunnerRegistrationTokenParamsWithHTTPClient(client *http.Client) *AdminGetRunnerRegistrationTokenParams {
+	return &AdminGetRunnerRegistrationTokenParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+AdminGetRunnerRegistrationTokenParams contains all the parameters to send to the API endpoint
+
+	for the admin get runner registration token operation.
+
+	Typically these are written to a http.Request.
+*/
+type AdminGetRunnerRegistrationTokenParams struct {
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the admin get runner registration token params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *AdminGetRunnerRegistrationTokenParams) WithDefaults() *AdminGetRunnerRegistrationTokenParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the admin get runner registration token params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *AdminGetRunnerRegistrationTokenParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the admin get runner registration token params
+func (o *AdminGetRunnerRegistrationTokenParams) WithTimeout(timeout time.Duration) *AdminGetRunnerRegistrationTokenParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the admin get runner registration token params
+func (o *AdminGetRunnerRegistrationTokenParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the admin get runner registration token params
+func (o *AdminGetRunnerRegistrationTokenParams) WithContext(ctx context.Context) *AdminGetRunnerRegistrationTokenParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the admin get runner registration token params
+func (o *AdminGetRunnerRegistrationTokenParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the admin get runner registration token params
+func (o *AdminGetRunnerRegistrationTokenParams) WithHTTPClient(client *http.Client) *AdminGetRunnerRegistrationTokenParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the admin get runner registration token params
+func (o *AdminGetRunnerRegistrationTokenParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *AdminGetRunnerRegistrationTokenParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/admin/admin_get_runner_registration_token_responses.go b/bots-common/gitea-generated/client/admin/admin_get_runner_registration_token_responses.go
new file mode 100644
index 0000000..cfaf6c7
--- /dev/null
+++ b/bots-common/gitea-generated/client/admin/admin_get_runner_registration_token_responses.go
@@ -0,0 +1,96 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package admin
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// AdminGetRunnerRegistrationTokenReader is a Reader for the AdminGetRunnerRegistrationToken structure.
+type AdminGetRunnerRegistrationTokenReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *AdminGetRunnerRegistrationTokenReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewAdminGetRunnerRegistrationTokenOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	default:
+		return nil, runtime.NewAPIError("[GET /admin/runners/registration-token] adminGetRunnerRegistrationToken", response, response.Code())
+	}
+}
+
+// NewAdminGetRunnerRegistrationTokenOK creates a AdminGetRunnerRegistrationTokenOK with default headers values
+func NewAdminGetRunnerRegistrationTokenOK() *AdminGetRunnerRegistrationTokenOK {
+	return &AdminGetRunnerRegistrationTokenOK{}
+}
+
+/*
+AdminGetRunnerRegistrationTokenOK describes a response with status code 200, with default header values.
+
+RegistrationToken is response related to registration token
+*/
+type AdminGetRunnerRegistrationTokenOK struct {
+	Token string
+}
+
+// IsSuccess returns true when this admin get runner registration token o k response has a 2xx status code
+func (o *AdminGetRunnerRegistrationTokenOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this admin get runner registration token o k response has a 3xx status code
+func (o *AdminGetRunnerRegistrationTokenOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this admin get runner registration token o k response has a 4xx status code
+func (o *AdminGetRunnerRegistrationTokenOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this admin get runner registration token o k response has a 5xx status code
+func (o *AdminGetRunnerRegistrationTokenOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this admin get runner registration token o k response a status code equal to that given
+func (o *AdminGetRunnerRegistrationTokenOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the admin get runner registration token o k response
+func (o *AdminGetRunnerRegistrationTokenOK) Code() int {
+	return 200
+}
+
+func (o *AdminGetRunnerRegistrationTokenOK) Error() string {
+	return fmt.Sprintf("[GET /admin/runners/registration-token][%d] adminGetRunnerRegistrationTokenOK", 200)
+}
+
+func (o *AdminGetRunnerRegistrationTokenOK) String() string {
+	return fmt.Sprintf("[GET /admin/runners/registration-token][%d] adminGetRunnerRegistrationTokenOK", 200)
+}
+
+func (o *AdminGetRunnerRegistrationTokenOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header token
+	hdrToken := response.GetHeader("token")
+
+	if hdrToken != "" {
+		o.Token = hdrToken
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/admin/admin_list_hooks_parameters.go b/bots-common/gitea-generated/client/admin/admin_list_hooks_parameters.go
new file mode 100644
index 0000000..2f214dd
--- /dev/null
+++ b/bots-common/gitea-generated/client/admin/admin_list_hooks_parameters.go
@@ -0,0 +1,198 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package admin
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewAdminListHooksParams creates a new AdminListHooksParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewAdminListHooksParams() *AdminListHooksParams {
+	return &AdminListHooksParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewAdminListHooksParamsWithTimeout creates a new AdminListHooksParams object
+// with the ability to set a timeout on a request.
+func NewAdminListHooksParamsWithTimeout(timeout time.Duration) *AdminListHooksParams {
+	return &AdminListHooksParams{
+		timeout: timeout,
+	}
+}
+
+// NewAdminListHooksParamsWithContext creates a new AdminListHooksParams object
+// with the ability to set a context for a request.
+func NewAdminListHooksParamsWithContext(ctx context.Context) *AdminListHooksParams {
+	return &AdminListHooksParams{
+		Context: ctx,
+	}
+}
+
+// NewAdminListHooksParamsWithHTTPClient creates a new AdminListHooksParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewAdminListHooksParamsWithHTTPClient(client *http.Client) *AdminListHooksParams {
+	return &AdminListHooksParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+AdminListHooksParams contains all the parameters to send to the API endpoint
+
+	for the admin list hooks operation.
+
+	Typically these are written to a http.Request.
+*/
+type AdminListHooksParams struct {
+
+	/* Limit.
+
+	   page size of results
+	*/
+	Limit *int64
+
+	/* Page.
+
+	   page number of results to return (1-based)
+	*/
+	Page *int64
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the admin list hooks params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *AdminListHooksParams) WithDefaults() *AdminListHooksParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the admin list hooks params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *AdminListHooksParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the admin list hooks params
+func (o *AdminListHooksParams) WithTimeout(timeout time.Duration) *AdminListHooksParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the admin list hooks params
+func (o *AdminListHooksParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the admin list hooks params
+func (o *AdminListHooksParams) WithContext(ctx context.Context) *AdminListHooksParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the admin list hooks params
+func (o *AdminListHooksParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the admin list hooks params
+func (o *AdminListHooksParams) WithHTTPClient(client *http.Client) *AdminListHooksParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the admin list hooks params
+func (o *AdminListHooksParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithLimit adds the limit to the admin list hooks params
+func (o *AdminListHooksParams) WithLimit(limit *int64) *AdminListHooksParams {
+	o.SetLimit(limit)
+	return o
+}
+
+// SetLimit adds the limit to the admin list hooks params
+func (o *AdminListHooksParams) SetLimit(limit *int64) {
+	o.Limit = limit
+}
+
+// WithPage adds the page to the admin list hooks params
+func (o *AdminListHooksParams) WithPage(page *int64) *AdminListHooksParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the admin list hooks params
+func (o *AdminListHooksParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *AdminListHooksParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.Limit != nil {
+
+		// query param limit
+		var qrLimit int64
+
+		if o.Limit != nil {
+			qrLimit = *o.Limit
+		}
+		qLimit := swag.FormatInt64(qrLimit)
+		if qLimit != "" {
+
+			if err := r.SetQueryParam("limit", qLimit); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/admin/admin_list_hooks_responses.go b/bots-common/gitea-generated/client/admin/admin_list_hooks_responses.go
new file mode 100644
index 0000000..aca4595
--- /dev/null
+++ b/bots-common/gitea-generated/client/admin/admin_list_hooks_responses.go
@@ -0,0 +1,104 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package admin
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// AdminListHooksReader is a Reader for the AdminListHooks structure.
+type AdminListHooksReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *AdminListHooksReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewAdminListHooksOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	default:
+		return nil, runtime.NewAPIError("[GET /admin/hooks] adminListHooks", response, response.Code())
+	}
+}
+
+// NewAdminListHooksOK creates a AdminListHooksOK with default headers values
+func NewAdminListHooksOK() *AdminListHooksOK {
+	return &AdminListHooksOK{}
+}
+
+/*
+AdminListHooksOK describes a response with status code 200, with default header values.
+
+HookList
+*/
+type AdminListHooksOK struct {
+	Payload []*models.Hook
+}
+
+// IsSuccess returns true when this admin list hooks o k response has a 2xx status code
+func (o *AdminListHooksOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this admin list hooks o k response has a 3xx status code
+func (o *AdminListHooksOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this admin list hooks o k response has a 4xx status code
+func (o *AdminListHooksOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this admin list hooks o k response has a 5xx status code
+func (o *AdminListHooksOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this admin list hooks o k response a status code equal to that given
+func (o *AdminListHooksOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the admin list hooks o k response
+func (o *AdminListHooksOK) Code() int {
+	return 200
+}
+
+func (o *AdminListHooksOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /admin/hooks][%d] adminListHooksOK %s", 200, payload)
+}
+
+func (o *AdminListHooksOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /admin/hooks][%d] adminListHooksOK %s", 200, payload)
+}
+
+func (o *AdminListHooksOK) GetPayload() []*models.Hook {
+	return o.Payload
+}
+
+func (o *AdminListHooksOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/admin/admin_list_user_badges_parameters.go b/bots-common/gitea-generated/client/admin/admin_list_user_badges_parameters.go
new file mode 100644
index 0000000..66697ba
--- /dev/null
+++ b/bots-common/gitea-generated/client/admin/admin_list_user_badges_parameters.go
@@ -0,0 +1,151 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package admin
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewAdminListUserBadgesParams creates a new AdminListUserBadgesParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewAdminListUserBadgesParams() *AdminListUserBadgesParams {
+	return &AdminListUserBadgesParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewAdminListUserBadgesParamsWithTimeout creates a new AdminListUserBadgesParams object
+// with the ability to set a timeout on a request.
+func NewAdminListUserBadgesParamsWithTimeout(timeout time.Duration) *AdminListUserBadgesParams {
+	return &AdminListUserBadgesParams{
+		timeout: timeout,
+	}
+}
+
+// NewAdminListUserBadgesParamsWithContext creates a new AdminListUserBadgesParams object
+// with the ability to set a context for a request.
+func NewAdminListUserBadgesParamsWithContext(ctx context.Context) *AdminListUserBadgesParams {
+	return &AdminListUserBadgesParams{
+		Context: ctx,
+	}
+}
+
+// NewAdminListUserBadgesParamsWithHTTPClient creates a new AdminListUserBadgesParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewAdminListUserBadgesParamsWithHTTPClient(client *http.Client) *AdminListUserBadgesParams {
+	return &AdminListUserBadgesParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+AdminListUserBadgesParams contains all the parameters to send to the API endpoint
+
+	for the admin list user badges operation.
+
+	Typically these are written to a http.Request.
+*/
+type AdminListUserBadgesParams struct {
+
+	/* Username.
+
+	   username of user
+	*/
+	Username string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the admin list user badges params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *AdminListUserBadgesParams) WithDefaults() *AdminListUserBadgesParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the admin list user badges params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *AdminListUserBadgesParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the admin list user badges params
+func (o *AdminListUserBadgesParams) WithTimeout(timeout time.Duration) *AdminListUserBadgesParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the admin list user badges params
+func (o *AdminListUserBadgesParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the admin list user badges params
+func (o *AdminListUserBadgesParams) WithContext(ctx context.Context) *AdminListUserBadgesParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the admin list user badges params
+func (o *AdminListUserBadgesParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the admin list user badges params
+func (o *AdminListUserBadgesParams) WithHTTPClient(client *http.Client) *AdminListUserBadgesParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the admin list user badges params
+func (o *AdminListUserBadgesParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithUsername adds the username to the admin list user badges params
+func (o *AdminListUserBadgesParams) WithUsername(username string) *AdminListUserBadgesParams {
+	o.SetUsername(username)
+	return o
+}
+
+// SetUsername adds the username to the admin list user badges params
+func (o *AdminListUserBadgesParams) SetUsername(username string) {
+	o.Username = username
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *AdminListUserBadgesParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param username
+	if err := r.SetPathParam("username", o.Username); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/admin/admin_list_user_badges_responses.go b/bots-common/gitea-generated/client/admin/admin_list_user_badges_responses.go
new file mode 100644
index 0000000..912289e
--- /dev/null
+++ b/bots-common/gitea-generated/client/admin/admin_list_user_badges_responses.go
@@ -0,0 +1,166 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package admin
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// AdminListUserBadgesReader is a Reader for the AdminListUserBadges structure.
+type AdminListUserBadgesReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *AdminListUserBadgesReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewAdminListUserBadgesOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewAdminListUserBadgesNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /admin/users/{username}/badges] adminListUserBadges", response, response.Code())
+	}
+}
+
+// NewAdminListUserBadgesOK creates a AdminListUserBadgesOK with default headers values
+func NewAdminListUserBadgesOK() *AdminListUserBadgesOK {
+	return &AdminListUserBadgesOK{}
+}
+
+/*
+AdminListUserBadgesOK describes a response with status code 200, with default header values.
+
+BadgeList
+*/
+type AdminListUserBadgesOK struct {
+	Payload []*models.Badge
+}
+
+// IsSuccess returns true when this admin list user badges o k response has a 2xx status code
+func (o *AdminListUserBadgesOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this admin list user badges o k response has a 3xx status code
+func (o *AdminListUserBadgesOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this admin list user badges o k response has a 4xx status code
+func (o *AdminListUserBadgesOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this admin list user badges o k response has a 5xx status code
+func (o *AdminListUserBadgesOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this admin list user badges o k response a status code equal to that given
+func (o *AdminListUserBadgesOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the admin list user badges o k response
+func (o *AdminListUserBadgesOK) Code() int {
+	return 200
+}
+
+func (o *AdminListUserBadgesOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /admin/users/{username}/badges][%d] adminListUserBadgesOK %s", 200, payload)
+}
+
+func (o *AdminListUserBadgesOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /admin/users/{username}/badges][%d] adminListUserBadgesOK %s", 200, payload)
+}
+
+func (o *AdminListUserBadgesOK) GetPayload() []*models.Badge {
+	return o.Payload
+}
+
+func (o *AdminListUserBadgesOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewAdminListUserBadgesNotFound creates a AdminListUserBadgesNotFound with default headers values
+func NewAdminListUserBadgesNotFound() *AdminListUserBadgesNotFound {
+	return &AdminListUserBadgesNotFound{}
+}
+
+/*
+AdminListUserBadgesNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type AdminListUserBadgesNotFound struct {
+}
+
+// IsSuccess returns true when this admin list user badges not found response has a 2xx status code
+func (o *AdminListUserBadgesNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this admin list user badges not found response has a 3xx status code
+func (o *AdminListUserBadgesNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this admin list user badges not found response has a 4xx status code
+func (o *AdminListUserBadgesNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this admin list user badges not found response has a 5xx status code
+func (o *AdminListUserBadgesNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this admin list user badges not found response a status code equal to that given
+func (o *AdminListUserBadgesNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the admin list user badges not found response
+func (o *AdminListUserBadgesNotFound) Code() int {
+	return 404
+}
+
+func (o *AdminListUserBadgesNotFound) Error() string {
+	return fmt.Sprintf("[GET /admin/users/{username}/badges][%d] adminListUserBadgesNotFound", 404)
+}
+
+func (o *AdminListUserBadgesNotFound) String() string {
+	return fmt.Sprintf("[GET /admin/users/{username}/badges][%d] adminListUserBadgesNotFound", 404)
+}
+
+func (o *AdminListUserBadgesNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/admin/admin_rename_user_parameters.go b/bots-common/gitea-generated/client/admin/admin_rename_user_parameters.go
new file mode 100644
index 0000000..ce427ff
--- /dev/null
+++ b/bots-common/gitea-generated/client/admin/admin_rename_user_parameters.go
@@ -0,0 +1,172 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package admin
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewAdminRenameUserParams creates a new AdminRenameUserParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewAdminRenameUserParams() *AdminRenameUserParams {
+	return &AdminRenameUserParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewAdminRenameUserParamsWithTimeout creates a new AdminRenameUserParams object
+// with the ability to set a timeout on a request.
+func NewAdminRenameUserParamsWithTimeout(timeout time.Duration) *AdminRenameUserParams {
+	return &AdminRenameUserParams{
+		timeout: timeout,
+	}
+}
+
+// NewAdminRenameUserParamsWithContext creates a new AdminRenameUserParams object
+// with the ability to set a context for a request.
+func NewAdminRenameUserParamsWithContext(ctx context.Context) *AdminRenameUserParams {
+	return &AdminRenameUserParams{
+		Context: ctx,
+	}
+}
+
+// NewAdminRenameUserParamsWithHTTPClient creates a new AdminRenameUserParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewAdminRenameUserParamsWithHTTPClient(client *http.Client) *AdminRenameUserParams {
+	return &AdminRenameUserParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+AdminRenameUserParams contains all the parameters to send to the API endpoint
+
+	for the admin rename user operation.
+
+	Typically these are written to a http.Request.
+*/
+type AdminRenameUserParams struct {
+
+	// Body.
+	Body *models.RenameUserOption
+
+	/* Username.
+
+	   existing username of user
+	*/
+	Username string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the admin rename user params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *AdminRenameUserParams) WithDefaults() *AdminRenameUserParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the admin rename user params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *AdminRenameUserParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the admin rename user params
+func (o *AdminRenameUserParams) WithTimeout(timeout time.Duration) *AdminRenameUserParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the admin rename user params
+func (o *AdminRenameUserParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the admin rename user params
+func (o *AdminRenameUserParams) WithContext(ctx context.Context) *AdminRenameUserParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the admin rename user params
+func (o *AdminRenameUserParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the admin rename user params
+func (o *AdminRenameUserParams) WithHTTPClient(client *http.Client) *AdminRenameUserParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the admin rename user params
+func (o *AdminRenameUserParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the admin rename user params
+func (o *AdminRenameUserParams) WithBody(body *models.RenameUserOption) *AdminRenameUserParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the admin rename user params
+func (o *AdminRenameUserParams) SetBody(body *models.RenameUserOption) {
+	o.Body = body
+}
+
+// WithUsername adds the username to the admin rename user params
+func (o *AdminRenameUserParams) WithUsername(username string) *AdminRenameUserParams {
+	o.SetUsername(username)
+	return o
+}
+
+// SetUsername adds the username to the admin rename user params
+func (o *AdminRenameUserParams) SetUsername(username string) {
+	o.Username = username
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *AdminRenameUserParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	// path param username
+	if err := r.SetPathParam("username", o.Username); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/admin/admin_rename_user_responses.go b/bots-common/gitea-generated/client/admin/admin_rename_user_responses.go
new file mode 100644
index 0000000..ef12cd0
--- /dev/null
+++ b/bots-common/gitea-generated/client/admin/admin_rename_user_responses.go
@@ -0,0 +1,244 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package admin
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// AdminRenameUserReader is a Reader for the AdminRenameUser structure.
+type AdminRenameUserReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *AdminRenameUserReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewAdminRenameUserNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 403:
+		result := NewAdminRenameUserForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 422:
+		result := NewAdminRenameUserUnprocessableEntity()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[POST /admin/users/{username}/rename] adminRenameUser", response, response.Code())
+	}
+}
+
+// NewAdminRenameUserNoContent creates a AdminRenameUserNoContent with default headers values
+func NewAdminRenameUserNoContent() *AdminRenameUserNoContent {
+	return &AdminRenameUserNoContent{}
+}
+
+/*
+AdminRenameUserNoContent describes a response with status code 204, with default header values.
+
+APIEmpty is an empty response
+*/
+type AdminRenameUserNoContent struct {
+}
+
+// IsSuccess returns true when this admin rename user no content response has a 2xx status code
+func (o *AdminRenameUserNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this admin rename user no content response has a 3xx status code
+func (o *AdminRenameUserNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this admin rename user no content response has a 4xx status code
+func (o *AdminRenameUserNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this admin rename user no content response has a 5xx status code
+func (o *AdminRenameUserNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this admin rename user no content response a status code equal to that given
+func (o *AdminRenameUserNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the admin rename user no content response
+func (o *AdminRenameUserNoContent) Code() int {
+	return 204
+}
+
+func (o *AdminRenameUserNoContent) Error() string {
+	return fmt.Sprintf("[POST /admin/users/{username}/rename][%d] adminRenameUserNoContent", 204)
+}
+
+func (o *AdminRenameUserNoContent) String() string {
+	return fmt.Sprintf("[POST /admin/users/{username}/rename][%d] adminRenameUserNoContent", 204)
+}
+
+func (o *AdminRenameUserNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewAdminRenameUserForbidden creates a AdminRenameUserForbidden with default headers values
+func NewAdminRenameUserForbidden() *AdminRenameUserForbidden {
+	return &AdminRenameUserForbidden{}
+}
+
+/*
+AdminRenameUserForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type AdminRenameUserForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this admin rename user forbidden response has a 2xx status code
+func (o *AdminRenameUserForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this admin rename user forbidden response has a 3xx status code
+func (o *AdminRenameUserForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this admin rename user forbidden response has a 4xx status code
+func (o *AdminRenameUserForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this admin rename user forbidden response has a 5xx status code
+func (o *AdminRenameUserForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this admin rename user forbidden response a status code equal to that given
+func (o *AdminRenameUserForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the admin rename user forbidden response
+func (o *AdminRenameUserForbidden) Code() int {
+	return 403
+}
+
+func (o *AdminRenameUserForbidden) Error() string {
+	return fmt.Sprintf("[POST /admin/users/{username}/rename][%d] adminRenameUserForbidden", 403)
+}
+
+func (o *AdminRenameUserForbidden) String() string {
+	return fmt.Sprintf("[POST /admin/users/{username}/rename][%d] adminRenameUserForbidden", 403)
+}
+
+func (o *AdminRenameUserForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewAdminRenameUserUnprocessableEntity creates a AdminRenameUserUnprocessableEntity with default headers values
+func NewAdminRenameUserUnprocessableEntity() *AdminRenameUserUnprocessableEntity {
+	return &AdminRenameUserUnprocessableEntity{}
+}
+
+/*
+AdminRenameUserUnprocessableEntity describes a response with status code 422, with default header values.
+
+APIValidationError is error format response related to input validation
+*/
+type AdminRenameUserUnprocessableEntity struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this admin rename user unprocessable entity response has a 2xx status code
+func (o *AdminRenameUserUnprocessableEntity) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this admin rename user unprocessable entity response has a 3xx status code
+func (o *AdminRenameUserUnprocessableEntity) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this admin rename user unprocessable entity response has a 4xx status code
+func (o *AdminRenameUserUnprocessableEntity) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this admin rename user unprocessable entity response has a 5xx status code
+func (o *AdminRenameUserUnprocessableEntity) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this admin rename user unprocessable entity response a status code equal to that given
+func (o *AdminRenameUserUnprocessableEntity) IsCode(code int) bool {
+	return code == 422
+}
+
+// Code gets the status code for the admin rename user unprocessable entity response
+func (o *AdminRenameUserUnprocessableEntity) Code() int {
+	return 422
+}
+
+func (o *AdminRenameUserUnprocessableEntity) Error() string {
+	return fmt.Sprintf("[POST /admin/users/{username}/rename][%d] adminRenameUserUnprocessableEntity", 422)
+}
+
+func (o *AdminRenameUserUnprocessableEntity) String() string {
+	return fmt.Sprintf("[POST /admin/users/{username}/rename][%d] adminRenameUserUnprocessableEntity", 422)
+}
+
+func (o *AdminRenameUserUnprocessableEntity) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/admin/admin_search_emails_parameters.go b/bots-common/gitea-generated/client/admin/admin_search_emails_parameters.go
new file mode 100644
index 0000000..caa4745
--- /dev/null
+++ b/bots-common/gitea-generated/client/admin/admin_search_emails_parameters.go
@@ -0,0 +1,232 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package admin
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewAdminSearchEmailsParams creates a new AdminSearchEmailsParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewAdminSearchEmailsParams() *AdminSearchEmailsParams {
+	return &AdminSearchEmailsParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewAdminSearchEmailsParamsWithTimeout creates a new AdminSearchEmailsParams object
+// with the ability to set a timeout on a request.
+func NewAdminSearchEmailsParamsWithTimeout(timeout time.Duration) *AdminSearchEmailsParams {
+	return &AdminSearchEmailsParams{
+		timeout: timeout,
+	}
+}
+
+// NewAdminSearchEmailsParamsWithContext creates a new AdminSearchEmailsParams object
+// with the ability to set a context for a request.
+func NewAdminSearchEmailsParamsWithContext(ctx context.Context) *AdminSearchEmailsParams {
+	return &AdminSearchEmailsParams{
+		Context: ctx,
+	}
+}
+
+// NewAdminSearchEmailsParamsWithHTTPClient creates a new AdminSearchEmailsParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewAdminSearchEmailsParamsWithHTTPClient(client *http.Client) *AdminSearchEmailsParams {
+	return &AdminSearchEmailsParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+AdminSearchEmailsParams contains all the parameters to send to the API endpoint
+
+	for the admin search emails operation.
+
+	Typically these are written to a http.Request.
+*/
+type AdminSearchEmailsParams struct {
+
+	/* Limit.
+
+	   page size of results
+	*/
+	Limit *int64
+
+	/* Page.
+
+	   page number of results to return (1-based)
+	*/
+	Page *int64
+
+	/* Q.
+
+	   keyword
+	*/
+	Q *string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the admin search emails params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *AdminSearchEmailsParams) WithDefaults() *AdminSearchEmailsParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the admin search emails params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *AdminSearchEmailsParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the admin search emails params
+func (o *AdminSearchEmailsParams) WithTimeout(timeout time.Duration) *AdminSearchEmailsParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the admin search emails params
+func (o *AdminSearchEmailsParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the admin search emails params
+func (o *AdminSearchEmailsParams) WithContext(ctx context.Context) *AdminSearchEmailsParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the admin search emails params
+func (o *AdminSearchEmailsParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the admin search emails params
+func (o *AdminSearchEmailsParams) WithHTTPClient(client *http.Client) *AdminSearchEmailsParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the admin search emails params
+func (o *AdminSearchEmailsParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithLimit adds the limit to the admin search emails params
+func (o *AdminSearchEmailsParams) WithLimit(limit *int64) *AdminSearchEmailsParams {
+	o.SetLimit(limit)
+	return o
+}
+
+// SetLimit adds the limit to the admin search emails params
+func (o *AdminSearchEmailsParams) SetLimit(limit *int64) {
+	o.Limit = limit
+}
+
+// WithPage adds the page to the admin search emails params
+func (o *AdminSearchEmailsParams) WithPage(page *int64) *AdminSearchEmailsParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the admin search emails params
+func (o *AdminSearchEmailsParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WithQ adds the q to the admin search emails params
+func (o *AdminSearchEmailsParams) WithQ(q *string) *AdminSearchEmailsParams {
+	o.SetQ(q)
+	return o
+}
+
+// SetQ adds the q to the admin search emails params
+func (o *AdminSearchEmailsParams) SetQ(q *string) {
+	o.Q = q
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *AdminSearchEmailsParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.Limit != nil {
+
+		// query param limit
+		var qrLimit int64
+
+		if o.Limit != nil {
+			qrLimit = *o.Limit
+		}
+		qLimit := swag.FormatInt64(qrLimit)
+		if qLimit != "" {
+
+			if err := r.SetQueryParam("limit", qLimit); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Q != nil {
+
+		// query param q
+		var qrQ string
+
+		if o.Q != nil {
+			qrQ = *o.Q
+		}
+		qQ := qrQ
+		if qQ != "" {
+
+			if err := r.SetQueryParam("q", qQ); err != nil {
+				return err
+			}
+		}
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/admin/admin_search_emails_responses.go b/bots-common/gitea-generated/client/admin/admin_search_emails_responses.go
new file mode 100644
index 0000000..c9ced44
--- /dev/null
+++ b/bots-common/gitea-generated/client/admin/admin_search_emails_responses.go
@@ -0,0 +1,182 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package admin
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// AdminSearchEmailsReader is a Reader for the AdminSearchEmails structure.
+type AdminSearchEmailsReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *AdminSearchEmailsReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewAdminSearchEmailsOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 403:
+		result := NewAdminSearchEmailsForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /admin/emails/search] adminSearchEmails", response, response.Code())
+	}
+}
+
+// NewAdminSearchEmailsOK creates a AdminSearchEmailsOK with default headers values
+func NewAdminSearchEmailsOK() *AdminSearchEmailsOK {
+	return &AdminSearchEmailsOK{}
+}
+
+/*
+AdminSearchEmailsOK describes a response with status code 200, with default header values.
+
+EmailList
+*/
+type AdminSearchEmailsOK struct {
+	Payload []*models.Email
+}
+
+// IsSuccess returns true when this admin search emails o k response has a 2xx status code
+func (o *AdminSearchEmailsOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this admin search emails o k response has a 3xx status code
+func (o *AdminSearchEmailsOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this admin search emails o k response has a 4xx status code
+func (o *AdminSearchEmailsOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this admin search emails o k response has a 5xx status code
+func (o *AdminSearchEmailsOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this admin search emails o k response a status code equal to that given
+func (o *AdminSearchEmailsOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the admin search emails o k response
+func (o *AdminSearchEmailsOK) Code() int {
+	return 200
+}
+
+func (o *AdminSearchEmailsOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /admin/emails/search][%d] adminSearchEmailsOK %s", 200, payload)
+}
+
+func (o *AdminSearchEmailsOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /admin/emails/search][%d] adminSearchEmailsOK %s", 200, payload)
+}
+
+func (o *AdminSearchEmailsOK) GetPayload() []*models.Email {
+	return o.Payload
+}
+
+func (o *AdminSearchEmailsOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewAdminSearchEmailsForbidden creates a AdminSearchEmailsForbidden with default headers values
+func NewAdminSearchEmailsForbidden() *AdminSearchEmailsForbidden {
+	return &AdminSearchEmailsForbidden{}
+}
+
+/*
+AdminSearchEmailsForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type AdminSearchEmailsForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this admin search emails forbidden response has a 2xx status code
+func (o *AdminSearchEmailsForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this admin search emails forbidden response has a 3xx status code
+func (o *AdminSearchEmailsForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this admin search emails forbidden response has a 4xx status code
+func (o *AdminSearchEmailsForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this admin search emails forbidden response has a 5xx status code
+func (o *AdminSearchEmailsForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this admin search emails forbidden response a status code equal to that given
+func (o *AdminSearchEmailsForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the admin search emails forbidden response
+func (o *AdminSearchEmailsForbidden) Code() int {
+	return 403
+}
+
+func (o *AdminSearchEmailsForbidden) Error() string {
+	return fmt.Sprintf("[GET /admin/emails/search][%d] adminSearchEmailsForbidden", 403)
+}
+
+func (o *AdminSearchEmailsForbidden) String() string {
+	return fmt.Sprintf("[GET /admin/emails/search][%d] adminSearchEmailsForbidden", 403)
+}
+
+func (o *AdminSearchEmailsForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/admin/admin_search_users_parameters.go b/bots-common/gitea-generated/client/admin/admin_search_users_parameters.go
new file mode 100644
index 0000000..f0630d4
--- /dev/null
+++ b/bots-common/gitea-generated/client/admin/admin_search_users_parameters.go
@@ -0,0 +1,268 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package admin
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewAdminSearchUsersParams creates a new AdminSearchUsersParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewAdminSearchUsersParams() *AdminSearchUsersParams {
+	return &AdminSearchUsersParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewAdminSearchUsersParamsWithTimeout creates a new AdminSearchUsersParams object
+// with the ability to set a timeout on a request.
+func NewAdminSearchUsersParamsWithTimeout(timeout time.Duration) *AdminSearchUsersParams {
+	return &AdminSearchUsersParams{
+		timeout: timeout,
+	}
+}
+
+// NewAdminSearchUsersParamsWithContext creates a new AdminSearchUsersParams object
+// with the ability to set a context for a request.
+func NewAdminSearchUsersParamsWithContext(ctx context.Context) *AdminSearchUsersParams {
+	return &AdminSearchUsersParams{
+		Context: ctx,
+	}
+}
+
+// NewAdminSearchUsersParamsWithHTTPClient creates a new AdminSearchUsersParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewAdminSearchUsersParamsWithHTTPClient(client *http.Client) *AdminSearchUsersParams {
+	return &AdminSearchUsersParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+AdminSearchUsersParams contains all the parameters to send to the API endpoint
+
+	for the admin search users operation.
+
+	Typically these are written to a http.Request.
+*/
+type AdminSearchUsersParams struct {
+
+	/* Limit.
+
+	   page size of results
+	*/
+	Limit *int64
+
+	/* LoginName.
+
+	   user's login name to search for
+	*/
+	LoginName *string
+
+	/* Page.
+
+	   page number of results to return (1-based)
+	*/
+	Page *int64
+
+	/* SourceID.
+
+	   ID of the user's login source to search for
+
+	   Format: int64
+	*/
+	SourceID *int64
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the admin search users params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *AdminSearchUsersParams) WithDefaults() *AdminSearchUsersParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the admin search users params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *AdminSearchUsersParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the admin search users params
+func (o *AdminSearchUsersParams) WithTimeout(timeout time.Duration) *AdminSearchUsersParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the admin search users params
+func (o *AdminSearchUsersParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the admin search users params
+func (o *AdminSearchUsersParams) WithContext(ctx context.Context) *AdminSearchUsersParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the admin search users params
+func (o *AdminSearchUsersParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the admin search users params
+func (o *AdminSearchUsersParams) WithHTTPClient(client *http.Client) *AdminSearchUsersParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the admin search users params
+func (o *AdminSearchUsersParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithLimit adds the limit to the admin search users params
+func (o *AdminSearchUsersParams) WithLimit(limit *int64) *AdminSearchUsersParams {
+	o.SetLimit(limit)
+	return o
+}
+
+// SetLimit adds the limit to the admin search users params
+func (o *AdminSearchUsersParams) SetLimit(limit *int64) {
+	o.Limit = limit
+}
+
+// WithLoginName adds the loginName to the admin search users params
+func (o *AdminSearchUsersParams) WithLoginName(loginName *string) *AdminSearchUsersParams {
+	o.SetLoginName(loginName)
+	return o
+}
+
+// SetLoginName adds the loginName to the admin search users params
+func (o *AdminSearchUsersParams) SetLoginName(loginName *string) {
+	o.LoginName = loginName
+}
+
+// WithPage adds the page to the admin search users params
+func (o *AdminSearchUsersParams) WithPage(page *int64) *AdminSearchUsersParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the admin search users params
+func (o *AdminSearchUsersParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WithSourceID adds the sourceID to the admin search users params
+func (o *AdminSearchUsersParams) WithSourceID(sourceID *int64) *AdminSearchUsersParams {
+	o.SetSourceID(sourceID)
+	return o
+}
+
+// SetSourceID adds the sourceId to the admin search users params
+func (o *AdminSearchUsersParams) SetSourceID(sourceID *int64) {
+	o.SourceID = sourceID
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *AdminSearchUsersParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.Limit != nil {
+
+		// query param limit
+		var qrLimit int64
+
+		if o.Limit != nil {
+			qrLimit = *o.Limit
+		}
+		qLimit := swag.FormatInt64(qrLimit)
+		if qLimit != "" {
+
+			if err := r.SetQueryParam("limit", qLimit); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.LoginName != nil {
+
+		// query param login_name
+		var qrLoginName string
+
+		if o.LoginName != nil {
+			qrLoginName = *o.LoginName
+		}
+		qLoginName := qrLoginName
+		if qLoginName != "" {
+
+			if err := r.SetQueryParam("login_name", qLoginName); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.SourceID != nil {
+
+		// query param source_id
+		var qrSourceID int64
+
+		if o.SourceID != nil {
+			qrSourceID = *o.SourceID
+		}
+		qSourceID := swag.FormatInt64(qrSourceID)
+		if qSourceID != "" {
+
+			if err := r.SetQueryParam("source_id", qSourceID); err != nil {
+				return err
+			}
+		}
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/admin/admin_search_users_responses.go b/bots-common/gitea-generated/client/admin/admin_search_users_responses.go
new file mode 100644
index 0000000..bf57455
--- /dev/null
+++ b/bots-common/gitea-generated/client/admin/admin_search_users_responses.go
@@ -0,0 +1,182 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package admin
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// AdminSearchUsersReader is a Reader for the AdminSearchUsers structure.
+type AdminSearchUsersReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *AdminSearchUsersReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewAdminSearchUsersOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 403:
+		result := NewAdminSearchUsersForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /admin/users] adminSearchUsers", response, response.Code())
+	}
+}
+
+// NewAdminSearchUsersOK creates a AdminSearchUsersOK with default headers values
+func NewAdminSearchUsersOK() *AdminSearchUsersOK {
+	return &AdminSearchUsersOK{}
+}
+
+/*
+AdminSearchUsersOK describes a response with status code 200, with default header values.
+
+UserList
+*/
+type AdminSearchUsersOK struct {
+	Payload []*models.User
+}
+
+// IsSuccess returns true when this admin search users o k response has a 2xx status code
+func (o *AdminSearchUsersOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this admin search users o k response has a 3xx status code
+func (o *AdminSearchUsersOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this admin search users o k response has a 4xx status code
+func (o *AdminSearchUsersOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this admin search users o k response has a 5xx status code
+func (o *AdminSearchUsersOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this admin search users o k response a status code equal to that given
+func (o *AdminSearchUsersOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the admin search users o k response
+func (o *AdminSearchUsersOK) Code() int {
+	return 200
+}
+
+func (o *AdminSearchUsersOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /admin/users][%d] adminSearchUsersOK %s", 200, payload)
+}
+
+func (o *AdminSearchUsersOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /admin/users][%d] adminSearchUsersOK %s", 200, payload)
+}
+
+func (o *AdminSearchUsersOK) GetPayload() []*models.User {
+	return o.Payload
+}
+
+func (o *AdminSearchUsersOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewAdminSearchUsersForbidden creates a AdminSearchUsersForbidden with default headers values
+func NewAdminSearchUsersForbidden() *AdminSearchUsersForbidden {
+	return &AdminSearchUsersForbidden{}
+}
+
+/*
+AdminSearchUsersForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type AdminSearchUsersForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this admin search users forbidden response has a 2xx status code
+func (o *AdminSearchUsersForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this admin search users forbidden response has a 3xx status code
+func (o *AdminSearchUsersForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this admin search users forbidden response has a 4xx status code
+func (o *AdminSearchUsersForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this admin search users forbidden response has a 5xx status code
+func (o *AdminSearchUsersForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this admin search users forbidden response a status code equal to that given
+func (o *AdminSearchUsersForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the admin search users forbidden response
+func (o *AdminSearchUsersForbidden) Code() int {
+	return 403
+}
+
+func (o *AdminSearchUsersForbidden) Error() string {
+	return fmt.Sprintf("[GET /admin/users][%d] adminSearchUsersForbidden", 403)
+}
+
+func (o *AdminSearchUsersForbidden) String() string {
+	return fmt.Sprintf("[GET /admin/users][%d] adminSearchUsersForbidden", 403)
+}
+
+func (o *AdminSearchUsersForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/admin/admin_unadopted_list_parameters.go b/bots-common/gitea-generated/client/admin/admin_unadopted_list_parameters.go
new file mode 100644
index 0000000..2bef6e0
--- /dev/null
+++ b/bots-common/gitea-generated/client/admin/admin_unadopted_list_parameters.go
@@ -0,0 +1,232 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package admin
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewAdminUnadoptedListParams creates a new AdminUnadoptedListParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewAdminUnadoptedListParams() *AdminUnadoptedListParams {
+	return &AdminUnadoptedListParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewAdminUnadoptedListParamsWithTimeout creates a new AdminUnadoptedListParams object
+// with the ability to set a timeout on a request.
+func NewAdminUnadoptedListParamsWithTimeout(timeout time.Duration) *AdminUnadoptedListParams {
+	return &AdminUnadoptedListParams{
+		timeout: timeout,
+	}
+}
+
+// NewAdminUnadoptedListParamsWithContext creates a new AdminUnadoptedListParams object
+// with the ability to set a context for a request.
+func NewAdminUnadoptedListParamsWithContext(ctx context.Context) *AdminUnadoptedListParams {
+	return &AdminUnadoptedListParams{
+		Context: ctx,
+	}
+}
+
+// NewAdminUnadoptedListParamsWithHTTPClient creates a new AdminUnadoptedListParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewAdminUnadoptedListParamsWithHTTPClient(client *http.Client) *AdminUnadoptedListParams {
+	return &AdminUnadoptedListParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+AdminUnadoptedListParams contains all the parameters to send to the API endpoint
+
+	for the admin unadopted list operation.
+
+	Typically these are written to a http.Request.
+*/
+type AdminUnadoptedListParams struct {
+
+	/* Limit.
+
+	   page size of results
+	*/
+	Limit *int64
+
+	/* Page.
+
+	   page number of results to return (1-based)
+	*/
+	Page *int64
+
+	/* Pattern.
+
+	   pattern of repositories to search for
+	*/
+	Pattern *string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the admin unadopted list params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *AdminUnadoptedListParams) WithDefaults() *AdminUnadoptedListParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the admin unadopted list params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *AdminUnadoptedListParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the admin unadopted list params
+func (o *AdminUnadoptedListParams) WithTimeout(timeout time.Duration) *AdminUnadoptedListParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the admin unadopted list params
+func (o *AdminUnadoptedListParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the admin unadopted list params
+func (o *AdminUnadoptedListParams) WithContext(ctx context.Context) *AdminUnadoptedListParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the admin unadopted list params
+func (o *AdminUnadoptedListParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the admin unadopted list params
+func (o *AdminUnadoptedListParams) WithHTTPClient(client *http.Client) *AdminUnadoptedListParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the admin unadopted list params
+func (o *AdminUnadoptedListParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithLimit adds the limit to the admin unadopted list params
+func (o *AdminUnadoptedListParams) WithLimit(limit *int64) *AdminUnadoptedListParams {
+	o.SetLimit(limit)
+	return o
+}
+
+// SetLimit adds the limit to the admin unadopted list params
+func (o *AdminUnadoptedListParams) SetLimit(limit *int64) {
+	o.Limit = limit
+}
+
+// WithPage adds the page to the admin unadopted list params
+func (o *AdminUnadoptedListParams) WithPage(page *int64) *AdminUnadoptedListParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the admin unadopted list params
+func (o *AdminUnadoptedListParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WithPattern adds the pattern to the admin unadopted list params
+func (o *AdminUnadoptedListParams) WithPattern(pattern *string) *AdminUnadoptedListParams {
+	o.SetPattern(pattern)
+	return o
+}
+
+// SetPattern adds the pattern to the admin unadopted list params
+func (o *AdminUnadoptedListParams) SetPattern(pattern *string) {
+	o.Pattern = pattern
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *AdminUnadoptedListParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.Limit != nil {
+
+		// query param limit
+		var qrLimit int64
+
+		if o.Limit != nil {
+			qrLimit = *o.Limit
+		}
+		qLimit := swag.FormatInt64(qrLimit)
+		if qLimit != "" {
+
+			if err := r.SetQueryParam("limit", qLimit); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Pattern != nil {
+
+		// query param pattern
+		var qrPattern string
+
+		if o.Pattern != nil {
+			qrPattern = *o.Pattern
+		}
+		qPattern := qrPattern
+		if qPattern != "" {
+
+			if err := r.SetQueryParam("pattern", qPattern); err != nil {
+				return err
+			}
+		}
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/admin/admin_unadopted_list_responses.go b/bots-common/gitea-generated/client/admin/admin_unadopted_list_responses.go
new file mode 100644
index 0000000..3ce2c4e
--- /dev/null
+++ b/bots-common/gitea-generated/client/admin/admin_unadopted_list_responses.go
@@ -0,0 +1,180 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package admin
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// AdminUnadoptedListReader is a Reader for the AdminUnadoptedList structure.
+type AdminUnadoptedListReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *AdminUnadoptedListReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewAdminUnadoptedListOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 403:
+		result := NewAdminUnadoptedListForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /admin/unadopted] adminUnadoptedList", response, response.Code())
+	}
+}
+
+// NewAdminUnadoptedListOK creates a AdminUnadoptedListOK with default headers values
+func NewAdminUnadoptedListOK() *AdminUnadoptedListOK {
+	return &AdminUnadoptedListOK{}
+}
+
+/*
+AdminUnadoptedListOK describes a response with status code 200, with default header values.
+
+StringSlice
+*/
+type AdminUnadoptedListOK struct {
+	Payload []string
+}
+
+// IsSuccess returns true when this admin unadopted list o k response has a 2xx status code
+func (o *AdminUnadoptedListOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this admin unadopted list o k response has a 3xx status code
+func (o *AdminUnadoptedListOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this admin unadopted list o k response has a 4xx status code
+func (o *AdminUnadoptedListOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this admin unadopted list o k response has a 5xx status code
+func (o *AdminUnadoptedListOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this admin unadopted list o k response a status code equal to that given
+func (o *AdminUnadoptedListOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the admin unadopted list o k response
+func (o *AdminUnadoptedListOK) Code() int {
+	return 200
+}
+
+func (o *AdminUnadoptedListOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /admin/unadopted][%d] adminUnadoptedListOK %s", 200, payload)
+}
+
+func (o *AdminUnadoptedListOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /admin/unadopted][%d] adminUnadoptedListOK %s", 200, payload)
+}
+
+func (o *AdminUnadoptedListOK) GetPayload() []string {
+	return o.Payload
+}
+
+func (o *AdminUnadoptedListOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewAdminUnadoptedListForbidden creates a AdminUnadoptedListForbidden with default headers values
+func NewAdminUnadoptedListForbidden() *AdminUnadoptedListForbidden {
+	return &AdminUnadoptedListForbidden{}
+}
+
+/*
+AdminUnadoptedListForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type AdminUnadoptedListForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this admin unadopted list forbidden response has a 2xx status code
+func (o *AdminUnadoptedListForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this admin unadopted list forbidden response has a 3xx status code
+func (o *AdminUnadoptedListForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this admin unadopted list forbidden response has a 4xx status code
+func (o *AdminUnadoptedListForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this admin unadopted list forbidden response has a 5xx status code
+func (o *AdminUnadoptedListForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this admin unadopted list forbidden response a status code equal to that given
+func (o *AdminUnadoptedListForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the admin unadopted list forbidden response
+func (o *AdminUnadoptedListForbidden) Code() int {
+	return 403
+}
+
+func (o *AdminUnadoptedListForbidden) Error() string {
+	return fmt.Sprintf("[GET /admin/unadopted][%d] adminUnadoptedListForbidden", 403)
+}
+
+func (o *AdminUnadoptedListForbidden) String() string {
+	return fmt.Sprintf("[GET /admin/unadopted][%d] adminUnadoptedListForbidden", 403)
+}
+
+func (o *AdminUnadoptedListForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/gitea_api_client.go b/bots-common/gitea-generated/client/gitea_api_client.go
new file mode 100644
index 0000000..6f55f85
--- /dev/null
+++ b/bots-common/gitea-generated/client/gitea_api_client.go
@@ -0,0 +1,157 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package client
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"github.com/go-openapi/runtime"
+	httptransport "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/client/activitypub"
+	"src.opensuse.org/autogits/common/gitea-generated/client/admin"
+	"src.opensuse.org/autogits/common/gitea-generated/client/issue"
+	"src.opensuse.org/autogits/common/gitea-generated/client/miscellaneous"
+	"src.opensuse.org/autogits/common/gitea-generated/client/notification"
+	"src.opensuse.org/autogits/common/gitea-generated/client/organization"
+	"src.opensuse.org/autogits/common/gitea-generated/client/package_operations"
+	"src.opensuse.org/autogits/common/gitea-generated/client/repository"
+	"src.opensuse.org/autogits/common/gitea-generated/client/settings"
+	"src.opensuse.org/autogits/common/gitea-generated/client/user"
+)
+
+// Default gitea API HTTP client.
+var Default = NewHTTPClient(nil)
+
+const (
+	// DefaultHost is the default Host
+	// found in Meta (info) section of spec file
+	DefaultHost string = "localhost"
+	// DefaultBasePath is the default BasePath
+	// found in Meta (info) section of spec file
+	DefaultBasePath string = "/api/v1"
+)
+
+// DefaultSchemes are the default schemes found in Meta (info) section of spec file
+var DefaultSchemes = []string{"http", "https"}
+
+// NewHTTPClient creates a new gitea API HTTP client.
+func NewHTTPClient(formats strfmt.Registry) *GiteaAPI {
+	return NewHTTPClientWithConfig(formats, nil)
+}
+
+// NewHTTPClientWithConfig creates a new gitea API HTTP client,
+// using a customizable transport config.
+func NewHTTPClientWithConfig(formats strfmt.Registry, cfg *TransportConfig) *GiteaAPI {
+	// ensure nullable parameters have default
+	if cfg == nil {
+		cfg = DefaultTransportConfig()
+	}
+
+	// create transport and client
+	transport := httptransport.New(cfg.Host, cfg.BasePath, cfg.Schemes)
+	return New(transport, formats)
+}
+
+// New creates a new gitea API client
+func New(transport runtime.ClientTransport, formats strfmt.Registry) *GiteaAPI {
+	// ensure nullable parameters have default
+	if formats == nil {
+		formats = strfmt.Default
+	}
+
+	cli := new(GiteaAPI)
+	cli.Transport = transport
+	cli.Activitypub = activitypub.New(transport, formats)
+	cli.Admin = admin.New(transport, formats)
+	cli.Issue = issue.New(transport, formats)
+	cli.Miscellaneous = miscellaneous.New(transport, formats)
+	cli.Notification = notification.New(transport, formats)
+	cli.Organization = organization.New(transport, formats)
+	cli.PackageOperations = package_operations.New(transport, formats)
+	cli.Repository = repository.New(transport, formats)
+	cli.Settings = settings.New(transport, formats)
+	cli.User = user.New(transport, formats)
+	return cli
+}
+
+// DefaultTransportConfig creates a TransportConfig with the
+// default settings taken from the meta section of the spec file.
+func DefaultTransportConfig() *TransportConfig {
+	return &TransportConfig{
+		Host:     DefaultHost,
+		BasePath: DefaultBasePath,
+		Schemes:  DefaultSchemes,
+	}
+}
+
+// TransportConfig contains the transport related info,
+// found in the meta section of the spec file.
+type TransportConfig struct {
+	Host     string
+	BasePath string
+	Schemes  []string
+}
+
+// WithHost overrides the default host,
+// provided by the meta section of the spec file.
+func (cfg *TransportConfig) WithHost(host string) *TransportConfig {
+	cfg.Host = host
+	return cfg
+}
+
+// WithBasePath overrides the default basePath,
+// provided by the meta section of the spec file.
+func (cfg *TransportConfig) WithBasePath(basePath string) *TransportConfig {
+	cfg.BasePath = basePath
+	return cfg
+}
+
+// WithSchemes overrides the default schemes,
+// provided by the meta section of the spec file.
+func (cfg *TransportConfig) WithSchemes(schemes []string) *TransportConfig {
+	cfg.Schemes = schemes
+	return cfg
+}
+
+// GiteaAPI is a client for gitea API
+type GiteaAPI struct {
+	Activitypub activitypub.ClientService
+
+	Admin admin.ClientService
+
+	Issue issue.ClientService
+
+	Miscellaneous miscellaneous.ClientService
+
+	Notification notification.ClientService
+
+	Organization organization.ClientService
+
+	PackageOperations package_operations.ClientService
+
+	Repository repository.ClientService
+
+	Settings settings.ClientService
+
+	User user.ClientService
+
+	Transport runtime.ClientTransport
+}
+
+// SetTransport changes the transport on the client and all its subresources
+func (c *GiteaAPI) SetTransport(transport runtime.ClientTransport) {
+	c.Transport = transport
+	c.Activitypub.SetTransport(transport)
+	c.Admin.SetTransport(transport)
+	c.Issue.SetTransport(transport)
+	c.Miscellaneous.SetTransport(transport)
+	c.Notification.SetTransport(transport)
+	c.Organization.SetTransport(transport)
+	c.PackageOperations.SetTransport(transport)
+	c.Repository.SetTransport(transport)
+	c.Settings.SetTransport(transport)
+	c.User.SetTransport(transport)
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_add_label_parameters.go b/bots-common/gitea-generated/client/issue/issue_add_label_parameters.go
new file mode 100644
index 0000000..04e20b9
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_add_label_parameters.go
@@ -0,0 +1,219 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewIssueAddLabelParams creates a new IssueAddLabelParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewIssueAddLabelParams() *IssueAddLabelParams {
+	return &IssueAddLabelParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewIssueAddLabelParamsWithTimeout creates a new IssueAddLabelParams object
+// with the ability to set a timeout on a request.
+func NewIssueAddLabelParamsWithTimeout(timeout time.Duration) *IssueAddLabelParams {
+	return &IssueAddLabelParams{
+		timeout: timeout,
+	}
+}
+
+// NewIssueAddLabelParamsWithContext creates a new IssueAddLabelParams object
+// with the ability to set a context for a request.
+func NewIssueAddLabelParamsWithContext(ctx context.Context) *IssueAddLabelParams {
+	return &IssueAddLabelParams{
+		Context: ctx,
+	}
+}
+
+// NewIssueAddLabelParamsWithHTTPClient creates a new IssueAddLabelParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewIssueAddLabelParamsWithHTTPClient(client *http.Client) *IssueAddLabelParams {
+	return &IssueAddLabelParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+IssueAddLabelParams contains all the parameters to send to the API endpoint
+
+	for the issue add label operation.
+
+	Typically these are written to a http.Request.
+*/
+type IssueAddLabelParams struct {
+
+	// Body.
+	Body *models.IssueLabelsOption
+
+	/* Index.
+
+	   index of the issue
+
+	   Format: int64
+	*/
+	Index int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the issue add label params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueAddLabelParams) WithDefaults() *IssueAddLabelParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the issue add label params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueAddLabelParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the issue add label params
+func (o *IssueAddLabelParams) WithTimeout(timeout time.Duration) *IssueAddLabelParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the issue add label params
+func (o *IssueAddLabelParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the issue add label params
+func (o *IssueAddLabelParams) WithContext(ctx context.Context) *IssueAddLabelParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the issue add label params
+func (o *IssueAddLabelParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the issue add label params
+func (o *IssueAddLabelParams) WithHTTPClient(client *http.Client) *IssueAddLabelParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the issue add label params
+func (o *IssueAddLabelParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the issue add label params
+func (o *IssueAddLabelParams) WithBody(body *models.IssueLabelsOption) *IssueAddLabelParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the issue add label params
+func (o *IssueAddLabelParams) SetBody(body *models.IssueLabelsOption) {
+	o.Body = body
+}
+
+// WithIndex adds the index to the issue add label params
+func (o *IssueAddLabelParams) WithIndex(index int64) *IssueAddLabelParams {
+	o.SetIndex(index)
+	return o
+}
+
+// SetIndex adds the index to the issue add label params
+func (o *IssueAddLabelParams) SetIndex(index int64) {
+	o.Index = index
+}
+
+// WithOwner adds the owner to the issue add label params
+func (o *IssueAddLabelParams) WithOwner(owner string) *IssueAddLabelParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the issue add label params
+func (o *IssueAddLabelParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the issue add label params
+func (o *IssueAddLabelParams) WithRepo(repo string) *IssueAddLabelParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the issue add label params
+func (o *IssueAddLabelParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *IssueAddLabelParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	// path param index
+	if err := r.SetPathParam("index", swag.FormatInt64(o.Index)); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_add_label_responses.go b/bots-common/gitea-generated/client/issue/issue_add_label_responses.go
new file mode 100644
index 0000000..4c7fd85
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_add_label_responses.go
@@ -0,0 +1,244 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// IssueAddLabelReader is a Reader for the IssueAddLabel structure.
+type IssueAddLabelReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *IssueAddLabelReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewIssueAddLabelOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 403:
+		result := NewIssueAddLabelForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewIssueAddLabelNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[POST /repos/{owner}/{repo}/issues/{index}/labels] issueAddLabel", response, response.Code())
+	}
+}
+
+// NewIssueAddLabelOK creates a IssueAddLabelOK with default headers values
+func NewIssueAddLabelOK() *IssueAddLabelOK {
+	return &IssueAddLabelOK{}
+}
+
+/*
+IssueAddLabelOK describes a response with status code 200, with default header values.
+
+LabelList
+*/
+type IssueAddLabelOK struct {
+	Payload []*models.Label
+}
+
+// IsSuccess returns true when this issue add label o k response has a 2xx status code
+func (o *IssueAddLabelOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this issue add label o k response has a 3xx status code
+func (o *IssueAddLabelOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue add label o k response has a 4xx status code
+func (o *IssueAddLabelOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this issue add label o k response has a 5xx status code
+func (o *IssueAddLabelOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue add label o k response a status code equal to that given
+func (o *IssueAddLabelOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the issue add label o k response
+func (o *IssueAddLabelOK) Code() int {
+	return 200
+}
+
+func (o *IssueAddLabelOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/{index}/labels][%d] issueAddLabelOK %s", 200, payload)
+}
+
+func (o *IssueAddLabelOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/{index}/labels][%d] issueAddLabelOK %s", 200, payload)
+}
+
+func (o *IssueAddLabelOK) GetPayload() []*models.Label {
+	return o.Payload
+}
+
+func (o *IssueAddLabelOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewIssueAddLabelForbidden creates a IssueAddLabelForbidden with default headers values
+func NewIssueAddLabelForbidden() *IssueAddLabelForbidden {
+	return &IssueAddLabelForbidden{}
+}
+
+/*
+IssueAddLabelForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type IssueAddLabelForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this issue add label forbidden response has a 2xx status code
+func (o *IssueAddLabelForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue add label forbidden response has a 3xx status code
+func (o *IssueAddLabelForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue add label forbidden response has a 4xx status code
+func (o *IssueAddLabelForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue add label forbidden response has a 5xx status code
+func (o *IssueAddLabelForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue add label forbidden response a status code equal to that given
+func (o *IssueAddLabelForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the issue add label forbidden response
+func (o *IssueAddLabelForbidden) Code() int {
+	return 403
+}
+
+func (o *IssueAddLabelForbidden) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/{index}/labels][%d] issueAddLabelForbidden", 403)
+}
+
+func (o *IssueAddLabelForbidden) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/{index}/labels][%d] issueAddLabelForbidden", 403)
+}
+
+func (o *IssueAddLabelForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewIssueAddLabelNotFound creates a IssueAddLabelNotFound with default headers values
+func NewIssueAddLabelNotFound() *IssueAddLabelNotFound {
+	return &IssueAddLabelNotFound{}
+}
+
+/*
+IssueAddLabelNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type IssueAddLabelNotFound struct {
+}
+
+// IsSuccess returns true when this issue add label not found response has a 2xx status code
+func (o *IssueAddLabelNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue add label not found response has a 3xx status code
+func (o *IssueAddLabelNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue add label not found response has a 4xx status code
+func (o *IssueAddLabelNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue add label not found response has a 5xx status code
+func (o *IssueAddLabelNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue add label not found response a status code equal to that given
+func (o *IssueAddLabelNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the issue add label not found response
+func (o *IssueAddLabelNotFound) Code() int {
+	return 404
+}
+
+func (o *IssueAddLabelNotFound) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/{index}/labels][%d] issueAddLabelNotFound", 404)
+}
+
+func (o *IssueAddLabelNotFound) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/{index}/labels][%d] issueAddLabelNotFound", 404)
+}
+
+func (o *IssueAddLabelNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_add_subscription_parameters.go b/bots-common/gitea-generated/client/issue/issue_add_subscription_parameters.go
new file mode 100644
index 0000000..50667d4
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_add_subscription_parameters.go
@@ -0,0 +1,220 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewIssueAddSubscriptionParams creates a new IssueAddSubscriptionParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewIssueAddSubscriptionParams() *IssueAddSubscriptionParams {
+	return &IssueAddSubscriptionParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewIssueAddSubscriptionParamsWithTimeout creates a new IssueAddSubscriptionParams object
+// with the ability to set a timeout on a request.
+func NewIssueAddSubscriptionParamsWithTimeout(timeout time.Duration) *IssueAddSubscriptionParams {
+	return &IssueAddSubscriptionParams{
+		timeout: timeout,
+	}
+}
+
+// NewIssueAddSubscriptionParamsWithContext creates a new IssueAddSubscriptionParams object
+// with the ability to set a context for a request.
+func NewIssueAddSubscriptionParamsWithContext(ctx context.Context) *IssueAddSubscriptionParams {
+	return &IssueAddSubscriptionParams{
+		Context: ctx,
+	}
+}
+
+// NewIssueAddSubscriptionParamsWithHTTPClient creates a new IssueAddSubscriptionParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewIssueAddSubscriptionParamsWithHTTPClient(client *http.Client) *IssueAddSubscriptionParams {
+	return &IssueAddSubscriptionParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+IssueAddSubscriptionParams contains all the parameters to send to the API endpoint
+
+	for the issue add subscription operation.
+
+	Typically these are written to a http.Request.
+*/
+type IssueAddSubscriptionParams struct {
+
+	/* Index.
+
+	   index of the issue
+
+	   Format: int64
+	*/
+	Index int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	/* User.
+
+	   user to subscribe
+	*/
+	User string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the issue add subscription params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueAddSubscriptionParams) WithDefaults() *IssueAddSubscriptionParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the issue add subscription params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueAddSubscriptionParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the issue add subscription params
+func (o *IssueAddSubscriptionParams) WithTimeout(timeout time.Duration) *IssueAddSubscriptionParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the issue add subscription params
+func (o *IssueAddSubscriptionParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the issue add subscription params
+func (o *IssueAddSubscriptionParams) WithContext(ctx context.Context) *IssueAddSubscriptionParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the issue add subscription params
+func (o *IssueAddSubscriptionParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the issue add subscription params
+func (o *IssueAddSubscriptionParams) WithHTTPClient(client *http.Client) *IssueAddSubscriptionParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the issue add subscription params
+func (o *IssueAddSubscriptionParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithIndex adds the index to the issue add subscription params
+func (o *IssueAddSubscriptionParams) WithIndex(index int64) *IssueAddSubscriptionParams {
+	o.SetIndex(index)
+	return o
+}
+
+// SetIndex adds the index to the issue add subscription params
+func (o *IssueAddSubscriptionParams) SetIndex(index int64) {
+	o.Index = index
+}
+
+// WithOwner adds the owner to the issue add subscription params
+func (o *IssueAddSubscriptionParams) WithOwner(owner string) *IssueAddSubscriptionParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the issue add subscription params
+func (o *IssueAddSubscriptionParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the issue add subscription params
+func (o *IssueAddSubscriptionParams) WithRepo(repo string) *IssueAddSubscriptionParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the issue add subscription params
+func (o *IssueAddSubscriptionParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WithUser adds the user to the issue add subscription params
+func (o *IssueAddSubscriptionParams) WithUser(user string) *IssueAddSubscriptionParams {
+	o.SetUser(user)
+	return o
+}
+
+// SetUser adds the user to the issue add subscription params
+func (o *IssueAddSubscriptionParams) SetUser(user string) {
+	o.User = user
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *IssueAddSubscriptionParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param index
+	if err := r.SetPathParam("index", swag.FormatInt64(o.Index)); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	// path param user
+	if err := r.SetPathParam("user", o.User); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_add_subscription_responses.go b/bots-common/gitea-generated/client/issue/issue_add_subscription_responses.go
new file mode 100644
index 0000000..814fc2b
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_add_subscription_responses.go
@@ -0,0 +1,274 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// IssueAddSubscriptionReader is a Reader for the IssueAddSubscription structure.
+type IssueAddSubscriptionReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *IssueAddSubscriptionReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewIssueAddSubscriptionOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 201:
+		result := NewIssueAddSubscriptionCreated()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 304:
+		result := NewIssueAddSubscriptionNotModified()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewIssueAddSubscriptionNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[PUT /repos/{owner}/{repo}/issues/{index}/subscriptions/{user}] issueAddSubscription", response, response.Code())
+	}
+}
+
+// NewIssueAddSubscriptionOK creates a IssueAddSubscriptionOK with default headers values
+func NewIssueAddSubscriptionOK() *IssueAddSubscriptionOK {
+	return &IssueAddSubscriptionOK{}
+}
+
+/*
+IssueAddSubscriptionOK describes a response with status code 200, with default header values.
+
+Already subscribed
+*/
+type IssueAddSubscriptionOK struct {
+}
+
+// IsSuccess returns true when this issue add subscription o k response has a 2xx status code
+func (o *IssueAddSubscriptionOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this issue add subscription o k response has a 3xx status code
+func (o *IssueAddSubscriptionOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue add subscription o k response has a 4xx status code
+func (o *IssueAddSubscriptionOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this issue add subscription o k response has a 5xx status code
+func (o *IssueAddSubscriptionOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue add subscription o k response a status code equal to that given
+func (o *IssueAddSubscriptionOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the issue add subscription o k response
+func (o *IssueAddSubscriptionOK) Code() int {
+	return 200
+}
+
+func (o *IssueAddSubscriptionOK) Error() string {
+	return fmt.Sprintf("[PUT /repos/{owner}/{repo}/issues/{index}/subscriptions/{user}][%d] issueAddSubscriptionOK", 200)
+}
+
+func (o *IssueAddSubscriptionOK) String() string {
+	return fmt.Sprintf("[PUT /repos/{owner}/{repo}/issues/{index}/subscriptions/{user}][%d] issueAddSubscriptionOK", 200)
+}
+
+func (o *IssueAddSubscriptionOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewIssueAddSubscriptionCreated creates a IssueAddSubscriptionCreated with default headers values
+func NewIssueAddSubscriptionCreated() *IssueAddSubscriptionCreated {
+	return &IssueAddSubscriptionCreated{}
+}
+
+/*
+IssueAddSubscriptionCreated describes a response with status code 201, with default header values.
+
+Successfully Subscribed
+*/
+type IssueAddSubscriptionCreated struct {
+}
+
+// IsSuccess returns true when this issue add subscription created response has a 2xx status code
+func (o *IssueAddSubscriptionCreated) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this issue add subscription created response has a 3xx status code
+func (o *IssueAddSubscriptionCreated) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue add subscription created response has a 4xx status code
+func (o *IssueAddSubscriptionCreated) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this issue add subscription created response has a 5xx status code
+func (o *IssueAddSubscriptionCreated) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue add subscription created response a status code equal to that given
+func (o *IssueAddSubscriptionCreated) IsCode(code int) bool {
+	return code == 201
+}
+
+// Code gets the status code for the issue add subscription created response
+func (o *IssueAddSubscriptionCreated) Code() int {
+	return 201
+}
+
+func (o *IssueAddSubscriptionCreated) Error() string {
+	return fmt.Sprintf("[PUT /repos/{owner}/{repo}/issues/{index}/subscriptions/{user}][%d] issueAddSubscriptionCreated", 201)
+}
+
+func (o *IssueAddSubscriptionCreated) String() string {
+	return fmt.Sprintf("[PUT /repos/{owner}/{repo}/issues/{index}/subscriptions/{user}][%d] issueAddSubscriptionCreated", 201)
+}
+
+func (o *IssueAddSubscriptionCreated) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewIssueAddSubscriptionNotModified creates a IssueAddSubscriptionNotModified with default headers values
+func NewIssueAddSubscriptionNotModified() *IssueAddSubscriptionNotModified {
+	return &IssueAddSubscriptionNotModified{}
+}
+
+/*
+IssueAddSubscriptionNotModified describes a response with status code 304, with default header values.
+
+User can only subscribe itself if he is no admin
+*/
+type IssueAddSubscriptionNotModified struct {
+}
+
+// IsSuccess returns true when this issue add subscription not modified response has a 2xx status code
+func (o *IssueAddSubscriptionNotModified) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue add subscription not modified response has a 3xx status code
+func (o *IssueAddSubscriptionNotModified) IsRedirect() bool {
+	return true
+}
+
+// IsClientError returns true when this issue add subscription not modified response has a 4xx status code
+func (o *IssueAddSubscriptionNotModified) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this issue add subscription not modified response has a 5xx status code
+func (o *IssueAddSubscriptionNotModified) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue add subscription not modified response a status code equal to that given
+func (o *IssueAddSubscriptionNotModified) IsCode(code int) bool {
+	return code == 304
+}
+
+// Code gets the status code for the issue add subscription not modified response
+func (o *IssueAddSubscriptionNotModified) Code() int {
+	return 304
+}
+
+func (o *IssueAddSubscriptionNotModified) Error() string {
+	return fmt.Sprintf("[PUT /repos/{owner}/{repo}/issues/{index}/subscriptions/{user}][%d] issueAddSubscriptionNotModified", 304)
+}
+
+func (o *IssueAddSubscriptionNotModified) String() string {
+	return fmt.Sprintf("[PUT /repos/{owner}/{repo}/issues/{index}/subscriptions/{user}][%d] issueAddSubscriptionNotModified", 304)
+}
+
+func (o *IssueAddSubscriptionNotModified) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewIssueAddSubscriptionNotFound creates a IssueAddSubscriptionNotFound with default headers values
+func NewIssueAddSubscriptionNotFound() *IssueAddSubscriptionNotFound {
+	return &IssueAddSubscriptionNotFound{}
+}
+
+/*
+IssueAddSubscriptionNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type IssueAddSubscriptionNotFound struct {
+}
+
+// IsSuccess returns true when this issue add subscription not found response has a 2xx status code
+func (o *IssueAddSubscriptionNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue add subscription not found response has a 3xx status code
+func (o *IssueAddSubscriptionNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue add subscription not found response has a 4xx status code
+func (o *IssueAddSubscriptionNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue add subscription not found response has a 5xx status code
+func (o *IssueAddSubscriptionNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue add subscription not found response a status code equal to that given
+func (o *IssueAddSubscriptionNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the issue add subscription not found response
+func (o *IssueAddSubscriptionNotFound) Code() int {
+	return 404
+}
+
+func (o *IssueAddSubscriptionNotFound) Error() string {
+	return fmt.Sprintf("[PUT /repos/{owner}/{repo}/issues/{index}/subscriptions/{user}][%d] issueAddSubscriptionNotFound", 404)
+}
+
+func (o *IssueAddSubscriptionNotFound) String() string {
+	return fmt.Sprintf("[PUT /repos/{owner}/{repo}/issues/{index}/subscriptions/{user}][%d] issueAddSubscriptionNotFound", 404)
+}
+
+func (o *IssueAddSubscriptionNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_add_time_parameters.go b/bots-common/gitea-generated/client/issue/issue_add_time_parameters.go
new file mode 100644
index 0000000..5df3ceb
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_add_time_parameters.go
@@ -0,0 +1,219 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewIssueAddTimeParams creates a new IssueAddTimeParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewIssueAddTimeParams() *IssueAddTimeParams {
+	return &IssueAddTimeParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewIssueAddTimeParamsWithTimeout creates a new IssueAddTimeParams object
+// with the ability to set a timeout on a request.
+func NewIssueAddTimeParamsWithTimeout(timeout time.Duration) *IssueAddTimeParams {
+	return &IssueAddTimeParams{
+		timeout: timeout,
+	}
+}
+
+// NewIssueAddTimeParamsWithContext creates a new IssueAddTimeParams object
+// with the ability to set a context for a request.
+func NewIssueAddTimeParamsWithContext(ctx context.Context) *IssueAddTimeParams {
+	return &IssueAddTimeParams{
+		Context: ctx,
+	}
+}
+
+// NewIssueAddTimeParamsWithHTTPClient creates a new IssueAddTimeParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewIssueAddTimeParamsWithHTTPClient(client *http.Client) *IssueAddTimeParams {
+	return &IssueAddTimeParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+IssueAddTimeParams contains all the parameters to send to the API endpoint
+
+	for the issue add time operation.
+
+	Typically these are written to a http.Request.
+*/
+type IssueAddTimeParams struct {
+
+	// Body.
+	Body *models.AddTimeOption
+
+	/* Index.
+
+	   index of the issue
+
+	   Format: int64
+	*/
+	Index int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the issue add time params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueAddTimeParams) WithDefaults() *IssueAddTimeParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the issue add time params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueAddTimeParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the issue add time params
+func (o *IssueAddTimeParams) WithTimeout(timeout time.Duration) *IssueAddTimeParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the issue add time params
+func (o *IssueAddTimeParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the issue add time params
+func (o *IssueAddTimeParams) WithContext(ctx context.Context) *IssueAddTimeParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the issue add time params
+func (o *IssueAddTimeParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the issue add time params
+func (o *IssueAddTimeParams) WithHTTPClient(client *http.Client) *IssueAddTimeParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the issue add time params
+func (o *IssueAddTimeParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the issue add time params
+func (o *IssueAddTimeParams) WithBody(body *models.AddTimeOption) *IssueAddTimeParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the issue add time params
+func (o *IssueAddTimeParams) SetBody(body *models.AddTimeOption) {
+	o.Body = body
+}
+
+// WithIndex adds the index to the issue add time params
+func (o *IssueAddTimeParams) WithIndex(index int64) *IssueAddTimeParams {
+	o.SetIndex(index)
+	return o
+}
+
+// SetIndex adds the index to the issue add time params
+func (o *IssueAddTimeParams) SetIndex(index int64) {
+	o.Index = index
+}
+
+// WithOwner adds the owner to the issue add time params
+func (o *IssueAddTimeParams) WithOwner(owner string) *IssueAddTimeParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the issue add time params
+func (o *IssueAddTimeParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the issue add time params
+func (o *IssueAddTimeParams) WithRepo(repo string) *IssueAddTimeParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the issue add time params
+func (o *IssueAddTimeParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *IssueAddTimeParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	// path param index
+	if err := r.SetPathParam("index", swag.FormatInt64(o.Index)); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_add_time_responses.go b/bots-common/gitea-generated/client/issue/issue_add_time_responses.go
new file mode 100644
index 0000000..dd4c784
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_add_time_responses.go
@@ -0,0 +1,324 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// IssueAddTimeReader is a Reader for the IssueAddTime structure.
+type IssueAddTimeReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *IssueAddTimeReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewIssueAddTimeOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 400:
+		result := NewIssueAddTimeBadRequest()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 403:
+		result := NewIssueAddTimeForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewIssueAddTimeNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[POST /repos/{owner}/{repo}/issues/{index}/times] issueAddTime", response, response.Code())
+	}
+}
+
+// NewIssueAddTimeOK creates a IssueAddTimeOK with default headers values
+func NewIssueAddTimeOK() *IssueAddTimeOK {
+	return &IssueAddTimeOK{}
+}
+
+/*
+IssueAddTimeOK describes a response with status code 200, with default header values.
+
+TrackedTime
+*/
+type IssueAddTimeOK struct {
+	Payload *models.TrackedTime
+}
+
+// IsSuccess returns true when this issue add time o k response has a 2xx status code
+func (o *IssueAddTimeOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this issue add time o k response has a 3xx status code
+func (o *IssueAddTimeOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue add time o k response has a 4xx status code
+func (o *IssueAddTimeOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this issue add time o k response has a 5xx status code
+func (o *IssueAddTimeOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue add time o k response a status code equal to that given
+func (o *IssueAddTimeOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the issue add time o k response
+func (o *IssueAddTimeOK) Code() int {
+	return 200
+}
+
+func (o *IssueAddTimeOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/{index}/times][%d] issueAddTimeOK %s", 200, payload)
+}
+
+func (o *IssueAddTimeOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/{index}/times][%d] issueAddTimeOK %s", 200, payload)
+}
+
+func (o *IssueAddTimeOK) GetPayload() *models.TrackedTime {
+	return o.Payload
+}
+
+func (o *IssueAddTimeOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.TrackedTime)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewIssueAddTimeBadRequest creates a IssueAddTimeBadRequest with default headers values
+func NewIssueAddTimeBadRequest() *IssueAddTimeBadRequest {
+	return &IssueAddTimeBadRequest{}
+}
+
+/*
+IssueAddTimeBadRequest describes a response with status code 400, with default header values.
+
+APIError is error format response
+*/
+type IssueAddTimeBadRequest struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this issue add time bad request response has a 2xx status code
+func (o *IssueAddTimeBadRequest) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue add time bad request response has a 3xx status code
+func (o *IssueAddTimeBadRequest) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue add time bad request response has a 4xx status code
+func (o *IssueAddTimeBadRequest) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue add time bad request response has a 5xx status code
+func (o *IssueAddTimeBadRequest) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue add time bad request response a status code equal to that given
+func (o *IssueAddTimeBadRequest) IsCode(code int) bool {
+	return code == 400
+}
+
+// Code gets the status code for the issue add time bad request response
+func (o *IssueAddTimeBadRequest) Code() int {
+	return 400
+}
+
+func (o *IssueAddTimeBadRequest) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/{index}/times][%d] issueAddTimeBadRequest", 400)
+}
+
+func (o *IssueAddTimeBadRequest) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/{index}/times][%d] issueAddTimeBadRequest", 400)
+}
+
+func (o *IssueAddTimeBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewIssueAddTimeForbidden creates a IssueAddTimeForbidden with default headers values
+func NewIssueAddTimeForbidden() *IssueAddTimeForbidden {
+	return &IssueAddTimeForbidden{}
+}
+
+/*
+IssueAddTimeForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type IssueAddTimeForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this issue add time forbidden response has a 2xx status code
+func (o *IssueAddTimeForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue add time forbidden response has a 3xx status code
+func (o *IssueAddTimeForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue add time forbidden response has a 4xx status code
+func (o *IssueAddTimeForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue add time forbidden response has a 5xx status code
+func (o *IssueAddTimeForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue add time forbidden response a status code equal to that given
+func (o *IssueAddTimeForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the issue add time forbidden response
+func (o *IssueAddTimeForbidden) Code() int {
+	return 403
+}
+
+func (o *IssueAddTimeForbidden) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/{index}/times][%d] issueAddTimeForbidden", 403)
+}
+
+func (o *IssueAddTimeForbidden) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/{index}/times][%d] issueAddTimeForbidden", 403)
+}
+
+func (o *IssueAddTimeForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewIssueAddTimeNotFound creates a IssueAddTimeNotFound with default headers values
+func NewIssueAddTimeNotFound() *IssueAddTimeNotFound {
+	return &IssueAddTimeNotFound{}
+}
+
+/*
+IssueAddTimeNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type IssueAddTimeNotFound struct {
+}
+
+// IsSuccess returns true when this issue add time not found response has a 2xx status code
+func (o *IssueAddTimeNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue add time not found response has a 3xx status code
+func (o *IssueAddTimeNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue add time not found response has a 4xx status code
+func (o *IssueAddTimeNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue add time not found response has a 5xx status code
+func (o *IssueAddTimeNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue add time not found response a status code equal to that given
+func (o *IssueAddTimeNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the issue add time not found response
+func (o *IssueAddTimeNotFound) Code() int {
+	return 404
+}
+
+func (o *IssueAddTimeNotFound) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/{index}/times][%d] issueAddTimeNotFound", 404)
+}
+
+func (o *IssueAddTimeNotFound) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/{index}/times][%d] issueAddTimeNotFound", 404)
+}
+
+func (o *IssueAddTimeNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_check_subscription_parameters.go b/bots-common/gitea-generated/client/issue/issue_check_subscription_parameters.go
new file mode 100644
index 0000000..bfcae3d
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_check_subscription_parameters.go
@@ -0,0 +1,198 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewIssueCheckSubscriptionParams creates a new IssueCheckSubscriptionParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewIssueCheckSubscriptionParams() *IssueCheckSubscriptionParams {
+	return &IssueCheckSubscriptionParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewIssueCheckSubscriptionParamsWithTimeout creates a new IssueCheckSubscriptionParams object
+// with the ability to set a timeout on a request.
+func NewIssueCheckSubscriptionParamsWithTimeout(timeout time.Duration) *IssueCheckSubscriptionParams {
+	return &IssueCheckSubscriptionParams{
+		timeout: timeout,
+	}
+}
+
+// NewIssueCheckSubscriptionParamsWithContext creates a new IssueCheckSubscriptionParams object
+// with the ability to set a context for a request.
+func NewIssueCheckSubscriptionParamsWithContext(ctx context.Context) *IssueCheckSubscriptionParams {
+	return &IssueCheckSubscriptionParams{
+		Context: ctx,
+	}
+}
+
+// NewIssueCheckSubscriptionParamsWithHTTPClient creates a new IssueCheckSubscriptionParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewIssueCheckSubscriptionParamsWithHTTPClient(client *http.Client) *IssueCheckSubscriptionParams {
+	return &IssueCheckSubscriptionParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+IssueCheckSubscriptionParams contains all the parameters to send to the API endpoint
+
+	for the issue check subscription operation.
+
+	Typically these are written to a http.Request.
+*/
+type IssueCheckSubscriptionParams struct {
+
+	/* Index.
+
+	   index of the issue
+
+	   Format: int64
+	*/
+	Index int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the issue check subscription params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueCheckSubscriptionParams) WithDefaults() *IssueCheckSubscriptionParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the issue check subscription params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueCheckSubscriptionParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the issue check subscription params
+func (o *IssueCheckSubscriptionParams) WithTimeout(timeout time.Duration) *IssueCheckSubscriptionParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the issue check subscription params
+func (o *IssueCheckSubscriptionParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the issue check subscription params
+func (o *IssueCheckSubscriptionParams) WithContext(ctx context.Context) *IssueCheckSubscriptionParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the issue check subscription params
+func (o *IssueCheckSubscriptionParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the issue check subscription params
+func (o *IssueCheckSubscriptionParams) WithHTTPClient(client *http.Client) *IssueCheckSubscriptionParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the issue check subscription params
+func (o *IssueCheckSubscriptionParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithIndex adds the index to the issue check subscription params
+func (o *IssueCheckSubscriptionParams) WithIndex(index int64) *IssueCheckSubscriptionParams {
+	o.SetIndex(index)
+	return o
+}
+
+// SetIndex adds the index to the issue check subscription params
+func (o *IssueCheckSubscriptionParams) SetIndex(index int64) {
+	o.Index = index
+}
+
+// WithOwner adds the owner to the issue check subscription params
+func (o *IssueCheckSubscriptionParams) WithOwner(owner string) *IssueCheckSubscriptionParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the issue check subscription params
+func (o *IssueCheckSubscriptionParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the issue check subscription params
+func (o *IssueCheckSubscriptionParams) WithRepo(repo string) *IssueCheckSubscriptionParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the issue check subscription params
+func (o *IssueCheckSubscriptionParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *IssueCheckSubscriptionParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param index
+	if err := r.SetPathParam("index", swag.FormatInt64(o.Index)); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_check_subscription_responses.go b/bots-common/gitea-generated/client/issue/issue_check_subscription_responses.go
new file mode 100644
index 0000000..c7aa253
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_check_subscription_responses.go
@@ -0,0 +1,168 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// IssueCheckSubscriptionReader is a Reader for the IssueCheckSubscription structure.
+type IssueCheckSubscriptionReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *IssueCheckSubscriptionReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewIssueCheckSubscriptionOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewIssueCheckSubscriptionNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/issues/{index}/subscriptions/check] issueCheckSubscription", response, response.Code())
+	}
+}
+
+// NewIssueCheckSubscriptionOK creates a IssueCheckSubscriptionOK with default headers values
+func NewIssueCheckSubscriptionOK() *IssueCheckSubscriptionOK {
+	return &IssueCheckSubscriptionOK{}
+}
+
+/*
+IssueCheckSubscriptionOK describes a response with status code 200, with default header values.
+
+WatchInfo
+*/
+type IssueCheckSubscriptionOK struct {
+	Payload *models.WatchInfo
+}
+
+// IsSuccess returns true when this issue check subscription o k response has a 2xx status code
+func (o *IssueCheckSubscriptionOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this issue check subscription o k response has a 3xx status code
+func (o *IssueCheckSubscriptionOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue check subscription o k response has a 4xx status code
+func (o *IssueCheckSubscriptionOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this issue check subscription o k response has a 5xx status code
+func (o *IssueCheckSubscriptionOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue check subscription o k response a status code equal to that given
+func (o *IssueCheckSubscriptionOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the issue check subscription o k response
+func (o *IssueCheckSubscriptionOK) Code() int {
+	return 200
+}
+
+func (o *IssueCheckSubscriptionOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issues/{index}/subscriptions/check][%d] issueCheckSubscriptionOK %s", 200, payload)
+}
+
+func (o *IssueCheckSubscriptionOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issues/{index}/subscriptions/check][%d] issueCheckSubscriptionOK %s", 200, payload)
+}
+
+func (o *IssueCheckSubscriptionOK) GetPayload() *models.WatchInfo {
+	return o.Payload
+}
+
+func (o *IssueCheckSubscriptionOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.WatchInfo)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewIssueCheckSubscriptionNotFound creates a IssueCheckSubscriptionNotFound with default headers values
+func NewIssueCheckSubscriptionNotFound() *IssueCheckSubscriptionNotFound {
+	return &IssueCheckSubscriptionNotFound{}
+}
+
+/*
+IssueCheckSubscriptionNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type IssueCheckSubscriptionNotFound struct {
+}
+
+// IsSuccess returns true when this issue check subscription not found response has a 2xx status code
+func (o *IssueCheckSubscriptionNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue check subscription not found response has a 3xx status code
+func (o *IssueCheckSubscriptionNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue check subscription not found response has a 4xx status code
+func (o *IssueCheckSubscriptionNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue check subscription not found response has a 5xx status code
+func (o *IssueCheckSubscriptionNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue check subscription not found response a status code equal to that given
+func (o *IssueCheckSubscriptionNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the issue check subscription not found response
+func (o *IssueCheckSubscriptionNotFound) Code() int {
+	return 404
+}
+
+func (o *IssueCheckSubscriptionNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issues/{index}/subscriptions/check][%d] issueCheckSubscriptionNotFound", 404)
+}
+
+func (o *IssueCheckSubscriptionNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issues/{index}/subscriptions/check][%d] issueCheckSubscriptionNotFound", 404)
+}
+
+func (o *IssueCheckSubscriptionNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_clear_labels_parameters.go b/bots-common/gitea-generated/client/issue/issue_clear_labels_parameters.go
new file mode 100644
index 0000000..a399041
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_clear_labels_parameters.go
@@ -0,0 +1,198 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewIssueClearLabelsParams creates a new IssueClearLabelsParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewIssueClearLabelsParams() *IssueClearLabelsParams {
+	return &IssueClearLabelsParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewIssueClearLabelsParamsWithTimeout creates a new IssueClearLabelsParams object
+// with the ability to set a timeout on a request.
+func NewIssueClearLabelsParamsWithTimeout(timeout time.Duration) *IssueClearLabelsParams {
+	return &IssueClearLabelsParams{
+		timeout: timeout,
+	}
+}
+
+// NewIssueClearLabelsParamsWithContext creates a new IssueClearLabelsParams object
+// with the ability to set a context for a request.
+func NewIssueClearLabelsParamsWithContext(ctx context.Context) *IssueClearLabelsParams {
+	return &IssueClearLabelsParams{
+		Context: ctx,
+	}
+}
+
+// NewIssueClearLabelsParamsWithHTTPClient creates a new IssueClearLabelsParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewIssueClearLabelsParamsWithHTTPClient(client *http.Client) *IssueClearLabelsParams {
+	return &IssueClearLabelsParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+IssueClearLabelsParams contains all the parameters to send to the API endpoint
+
+	for the issue clear labels operation.
+
+	Typically these are written to a http.Request.
+*/
+type IssueClearLabelsParams struct {
+
+	/* Index.
+
+	   index of the issue
+
+	   Format: int64
+	*/
+	Index int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the issue clear labels params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueClearLabelsParams) WithDefaults() *IssueClearLabelsParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the issue clear labels params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueClearLabelsParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the issue clear labels params
+func (o *IssueClearLabelsParams) WithTimeout(timeout time.Duration) *IssueClearLabelsParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the issue clear labels params
+func (o *IssueClearLabelsParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the issue clear labels params
+func (o *IssueClearLabelsParams) WithContext(ctx context.Context) *IssueClearLabelsParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the issue clear labels params
+func (o *IssueClearLabelsParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the issue clear labels params
+func (o *IssueClearLabelsParams) WithHTTPClient(client *http.Client) *IssueClearLabelsParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the issue clear labels params
+func (o *IssueClearLabelsParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithIndex adds the index to the issue clear labels params
+func (o *IssueClearLabelsParams) WithIndex(index int64) *IssueClearLabelsParams {
+	o.SetIndex(index)
+	return o
+}
+
+// SetIndex adds the index to the issue clear labels params
+func (o *IssueClearLabelsParams) SetIndex(index int64) {
+	o.Index = index
+}
+
+// WithOwner adds the owner to the issue clear labels params
+func (o *IssueClearLabelsParams) WithOwner(owner string) *IssueClearLabelsParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the issue clear labels params
+func (o *IssueClearLabelsParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the issue clear labels params
+func (o *IssueClearLabelsParams) WithRepo(repo string) *IssueClearLabelsParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the issue clear labels params
+func (o *IssueClearLabelsParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *IssueClearLabelsParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param index
+	if err := r.SetPathParam("index", swag.FormatInt64(o.Index)); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_clear_labels_responses.go b/bots-common/gitea-generated/client/issue/issue_clear_labels_responses.go
new file mode 100644
index 0000000..bee972f
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_clear_labels_responses.go
@@ -0,0 +1,228 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// IssueClearLabelsReader is a Reader for the IssueClearLabels structure.
+type IssueClearLabelsReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *IssueClearLabelsReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewIssueClearLabelsNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 403:
+		result := NewIssueClearLabelsForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewIssueClearLabelsNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[DELETE /repos/{owner}/{repo}/issues/{index}/labels] issueClearLabels", response, response.Code())
+	}
+}
+
+// NewIssueClearLabelsNoContent creates a IssueClearLabelsNoContent with default headers values
+func NewIssueClearLabelsNoContent() *IssueClearLabelsNoContent {
+	return &IssueClearLabelsNoContent{}
+}
+
+/*
+IssueClearLabelsNoContent describes a response with status code 204, with default header values.
+
+APIEmpty is an empty response
+*/
+type IssueClearLabelsNoContent struct {
+}
+
+// IsSuccess returns true when this issue clear labels no content response has a 2xx status code
+func (o *IssueClearLabelsNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this issue clear labels no content response has a 3xx status code
+func (o *IssueClearLabelsNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue clear labels no content response has a 4xx status code
+func (o *IssueClearLabelsNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this issue clear labels no content response has a 5xx status code
+func (o *IssueClearLabelsNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue clear labels no content response a status code equal to that given
+func (o *IssueClearLabelsNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the issue clear labels no content response
+func (o *IssueClearLabelsNoContent) Code() int {
+	return 204
+}
+
+func (o *IssueClearLabelsNoContent) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/{index}/labels][%d] issueClearLabelsNoContent", 204)
+}
+
+func (o *IssueClearLabelsNoContent) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/{index}/labels][%d] issueClearLabelsNoContent", 204)
+}
+
+func (o *IssueClearLabelsNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewIssueClearLabelsForbidden creates a IssueClearLabelsForbidden with default headers values
+func NewIssueClearLabelsForbidden() *IssueClearLabelsForbidden {
+	return &IssueClearLabelsForbidden{}
+}
+
+/*
+IssueClearLabelsForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type IssueClearLabelsForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this issue clear labels forbidden response has a 2xx status code
+func (o *IssueClearLabelsForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue clear labels forbidden response has a 3xx status code
+func (o *IssueClearLabelsForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue clear labels forbidden response has a 4xx status code
+func (o *IssueClearLabelsForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue clear labels forbidden response has a 5xx status code
+func (o *IssueClearLabelsForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue clear labels forbidden response a status code equal to that given
+func (o *IssueClearLabelsForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the issue clear labels forbidden response
+func (o *IssueClearLabelsForbidden) Code() int {
+	return 403
+}
+
+func (o *IssueClearLabelsForbidden) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/{index}/labels][%d] issueClearLabelsForbidden", 403)
+}
+
+func (o *IssueClearLabelsForbidden) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/{index}/labels][%d] issueClearLabelsForbidden", 403)
+}
+
+func (o *IssueClearLabelsForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewIssueClearLabelsNotFound creates a IssueClearLabelsNotFound with default headers values
+func NewIssueClearLabelsNotFound() *IssueClearLabelsNotFound {
+	return &IssueClearLabelsNotFound{}
+}
+
+/*
+IssueClearLabelsNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type IssueClearLabelsNotFound struct {
+}
+
+// IsSuccess returns true when this issue clear labels not found response has a 2xx status code
+func (o *IssueClearLabelsNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue clear labels not found response has a 3xx status code
+func (o *IssueClearLabelsNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue clear labels not found response has a 4xx status code
+func (o *IssueClearLabelsNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue clear labels not found response has a 5xx status code
+func (o *IssueClearLabelsNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue clear labels not found response a status code equal to that given
+func (o *IssueClearLabelsNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the issue clear labels not found response
+func (o *IssueClearLabelsNotFound) Code() int {
+	return 404
+}
+
+func (o *IssueClearLabelsNotFound) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/{index}/labels][%d] issueClearLabelsNotFound", 404)
+}
+
+func (o *IssueClearLabelsNotFound) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/{index}/labels][%d] issueClearLabelsNotFound", 404)
+}
+
+func (o *IssueClearLabelsNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_client.go b/bots-common/gitea-generated/client/issue/issue_client.go
new file mode 100644
index 0000000..57efd82
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_client.go
@@ -0,0 +1,2868 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	httptransport "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// New creates a new issue API client.
+func New(transport runtime.ClientTransport, formats strfmt.Registry) ClientService {
+	return &Client{transport: transport, formats: formats}
+}
+
+// New creates a new issue API client with basic auth credentials.
+// It takes the following parameters:
+// - host: http host (github.com).
+// - basePath: any base path for the API client ("/v1", "/v3").
+// - scheme: http scheme ("http", "https").
+// - user: user for basic authentication header.
+// - password: password for basic authentication header.
+func NewClientWithBasicAuth(host, basePath, scheme, user, password string) ClientService {
+	transport := httptransport.New(host, basePath, []string{scheme})
+	transport.DefaultAuthentication = httptransport.BasicAuth(user, password)
+	return &Client{transport: transport, formats: strfmt.Default}
+}
+
+// New creates a new issue API client with a bearer token for authentication.
+// It takes the following parameters:
+// - host: http host (github.com).
+// - basePath: any base path for the API client ("/v1", "/v3").
+// - scheme: http scheme ("http", "https").
+// - bearerToken: bearer token for Bearer authentication header.
+func NewClientWithBearerToken(host, basePath, scheme, bearerToken string) ClientService {
+	transport := httptransport.New(host, basePath, []string{scheme})
+	transport.DefaultAuthentication = httptransport.BearerToken(bearerToken)
+	return &Client{transport: transport, formats: strfmt.Default}
+}
+
+/*
+Client for issue API
+*/
+type Client struct {
+	transport runtime.ClientTransport
+	formats   strfmt.Registry
+}
+
+// ClientOption may be used to customize the behavior of Client methods.
+type ClientOption func(*runtime.ClientOperation)
+
+// This client is generated with a few options you might find useful for your swagger spec.
+//
+// Feel free to add you own set of options.
+
+// WithContentType allows the client to force the Content-Type header
+// to negotiate a specific Consumer from the server.
+//
+// You may use this option to set arbitrary extensions to your MIME media type.
+func WithContentType(mime string) ClientOption {
+	return func(r *runtime.ClientOperation) {
+		r.ConsumesMediaTypes = []string{mime}
+	}
+}
+
+// WithContentTypeApplicationJSON sets the Content-Type header to "application/json".
+func WithContentTypeApplicationJSON(r *runtime.ClientOperation) {
+	r.ConsumesMediaTypes = []string{"application/json"}
+}
+
+// WithContentTypeMultipartFormData sets the Content-Type header to "multipart/form-data".
+func WithContentTypeMultipartFormData(r *runtime.ClientOperation) {
+	r.ConsumesMediaTypes = []string{"multipart/form-data"}
+}
+
+// WithContentTypeTextPlain sets the Content-Type header to "text/plain".
+func WithContentTypeTextPlain(r *runtime.ClientOperation) {
+	r.ConsumesMediaTypes = []string{"text/plain"}
+}
+
+// WithAccept allows the client to force the Accept header
+// to negotiate a specific Producer from the server.
+//
+// You may use this option to set arbitrary extensions to your MIME media type.
+func WithAccept(mime string) ClientOption {
+	return func(r *runtime.ClientOperation) {
+		r.ProducesMediaTypes = []string{mime}
+	}
+}
+
+// WithAcceptApplicationJSON sets the Accept header to "application/json".
+func WithAcceptApplicationJSON(r *runtime.ClientOperation) {
+	r.ProducesMediaTypes = []string{"application/json"}
+}
+
+// WithAcceptTextHTML sets the Accept header to "text/html".
+func WithAcceptTextHTML(r *runtime.ClientOperation) {
+	r.ProducesMediaTypes = []string{"text/html"}
+}
+
+// ClientService is the interface for Client methods
+type ClientService interface {
+	IssueAddLabel(params *IssueAddLabelParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueAddLabelOK, error)
+
+	IssueAddSubscription(params *IssueAddSubscriptionParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueAddSubscriptionOK, *IssueAddSubscriptionCreated, error)
+
+	IssueAddTime(params *IssueAddTimeParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueAddTimeOK, error)
+
+	IssueCheckSubscription(params *IssueCheckSubscriptionParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueCheckSubscriptionOK, error)
+
+	IssueClearLabels(params *IssueClearLabelsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueClearLabelsNoContent, error)
+
+	IssueCreateComment(params *IssueCreateCommentParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueCreateCommentCreated, error)
+
+	IssueCreateIssue(params *IssueCreateIssueParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueCreateIssueCreated, error)
+
+	IssueCreateIssueAttachment(params *IssueCreateIssueAttachmentParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueCreateIssueAttachmentCreated, error)
+
+	IssueCreateIssueBlocking(params *IssueCreateIssueBlockingParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueCreateIssueBlockingCreated, error)
+
+	IssueCreateIssueCommentAttachment(params *IssueCreateIssueCommentAttachmentParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueCreateIssueCommentAttachmentCreated, error)
+
+	IssueCreateIssueDependencies(params *IssueCreateIssueDependenciesParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueCreateIssueDependenciesCreated, error)
+
+	IssueCreateLabel(params *IssueCreateLabelParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueCreateLabelCreated, error)
+
+	IssueCreateMilestone(params *IssueCreateMilestoneParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueCreateMilestoneCreated, error)
+
+	IssueDelete(params *IssueDeleteParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueDeleteNoContent, error)
+
+	IssueDeleteComment(params *IssueDeleteCommentParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueDeleteCommentNoContent, error)
+
+	IssueDeleteCommentDeprecated(params *IssueDeleteCommentDeprecatedParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueDeleteCommentDeprecatedNoContent, error)
+
+	IssueDeleteCommentReaction(params *IssueDeleteCommentReactionParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueDeleteCommentReactionOK, error)
+
+	IssueDeleteIssueAttachment(params *IssueDeleteIssueAttachmentParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueDeleteIssueAttachmentNoContent, error)
+
+	IssueDeleteIssueCommentAttachment(params *IssueDeleteIssueCommentAttachmentParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueDeleteIssueCommentAttachmentNoContent, error)
+
+	IssueDeleteIssueReaction(params *IssueDeleteIssueReactionParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueDeleteIssueReactionOK, error)
+
+	IssueDeleteLabel(params *IssueDeleteLabelParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueDeleteLabelNoContent, error)
+
+	IssueDeleteMilestone(params *IssueDeleteMilestoneParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueDeleteMilestoneNoContent, error)
+
+	IssueDeleteStopWatch(params *IssueDeleteStopWatchParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueDeleteStopWatchNoContent, error)
+
+	IssueDeleteSubscription(params *IssueDeleteSubscriptionParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueDeleteSubscriptionOK, *IssueDeleteSubscriptionCreated, error)
+
+	IssueDeleteTime(params *IssueDeleteTimeParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueDeleteTimeNoContent, error)
+
+	IssueEditComment(params *IssueEditCommentParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueEditCommentOK, *IssueEditCommentNoContent, error)
+
+	IssueEditCommentDeprecated(params *IssueEditCommentDeprecatedParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueEditCommentDeprecatedOK, *IssueEditCommentDeprecatedNoContent, error)
+
+	IssueEditIssue(params *IssueEditIssueParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueEditIssueCreated, error)
+
+	IssueEditIssueAttachment(params *IssueEditIssueAttachmentParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueEditIssueAttachmentCreated, error)
+
+	IssueEditIssueCommentAttachment(params *IssueEditIssueCommentAttachmentParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueEditIssueCommentAttachmentCreated, error)
+
+	IssueEditIssueDeadline(params *IssueEditIssueDeadlineParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueEditIssueDeadlineCreated, error)
+
+	IssueEditLabel(params *IssueEditLabelParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueEditLabelOK, error)
+
+	IssueEditMilestone(params *IssueEditMilestoneParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueEditMilestoneOK, error)
+
+	IssueGetComment(params *IssueGetCommentParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueGetCommentOK, *IssueGetCommentNoContent, error)
+
+	IssueGetCommentReactions(params *IssueGetCommentReactionsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueGetCommentReactionsOK, error)
+
+	IssueGetComments(params *IssueGetCommentsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueGetCommentsOK, error)
+
+	IssueGetCommentsAndTimeline(params *IssueGetCommentsAndTimelineParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueGetCommentsAndTimelineOK, error)
+
+	IssueGetIssue(params *IssueGetIssueParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueGetIssueOK, error)
+
+	IssueGetIssueAttachment(params *IssueGetIssueAttachmentParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueGetIssueAttachmentOK, error)
+
+	IssueGetIssueCommentAttachment(params *IssueGetIssueCommentAttachmentParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueGetIssueCommentAttachmentOK, error)
+
+	IssueGetIssueReactions(params *IssueGetIssueReactionsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueGetIssueReactionsOK, error)
+
+	IssueGetLabel(params *IssueGetLabelParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueGetLabelOK, error)
+
+	IssueGetLabels(params *IssueGetLabelsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueGetLabelsOK, error)
+
+	IssueGetMilestone(params *IssueGetMilestoneParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueGetMilestoneOK, error)
+
+	IssueGetMilestonesList(params *IssueGetMilestonesListParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueGetMilestonesListOK, error)
+
+	IssueGetRepoComments(params *IssueGetRepoCommentsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueGetRepoCommentsOK, error)
+
+	IssueListBlocks(params *IssueListBlocksParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueListBlocksOK, error)
+
+	IssueListIssueAttachments(params *IssueListIssueAttachmentsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueListIssueAttachmentsOK, error)
+
+	IssueListIssueCommentAttachments(params *IssueListIssueCommentAttachmentsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueListIssueCommentAttachmentsOK, error)
+
+	IssueListIssueDependencies(params *IssueListIssueDependenciesParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueListIssueDependenciesOK, error)
+
+	IssueListIssues(params *IssueListIssuesParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueListIssuesOK, error)
+
+	IssueListLabels(params *IssueListLabelsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueListLabelsOK, error)
+
+	IssuePostCommentReaction(params *IssuePostCommentReactionParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssuePostCommentReactionOK, *IssuePostCommentReactionCreated, error)
+
+	IssuePostIssueReaction(params *IssuePostIssueReactionParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssuePostIssueReactionOK, *IssuePostIssueReactionCreated, error)
+
+	IssueRemoveIssueBlocking(params *IssueRemoveIssueBlockingParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueRemoveIssueBlockingOK, error)
+
+	IssueRemoveIssueDependencies(params *IssueRemoveIssueDependenciesParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueRemoveIssueDependenciesOK, error)
+
+	IssueRemoveLabel(params *IssueRemoveLabelParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueRemoveLabelNoContent, error)
+
+	IssueReplaceLabels(params *IssueReplaceLabelsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueReplaceLabelsOK, error)
+
+	IssueResetTime(params *IssueResetTimeParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueResetTimeNoContent, error)
+
+	IssueSearchIssues(params *IssueSearchIssuesParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueSearchIssuesOK, error)
+
+	IssueStartStopWatch(params *IssueStartStopWatchParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueStartStopWatchCreated, error)
+
+	IssueStopStopWatch(params *IssueStopStopWatchParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueStopStopWatchCreated, error)
+
+	IssueSubscriptions(params *IssueSubscriptionsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueSubscriptionsOK, error)
+
+	IssueTrackedTimes(params *IssueTrackedTimesParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueTrackedTimesOK, error)
+
+	MoveIssuePin(params *MoveIssuePinParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*MoveIssuePinNoContent, error)
+
+	PinIssue(params *PinIssueParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*PinIssueNoContent, error)
+
+	UnpinIssue(params *UnpinIssueParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UnpinIssueNoContent, error)
+
+	SetTransport(transport runtime.ClientTransport)
+}
+
+/*
+IssueAddLabel adds a label to an issue
+*/
+func (a *Client) IssueAddLabel(params *IssueAddLabelParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueAddLabelOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewIssueAddLabelParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "issueAddLabel",
+		Method:             "POST",
+		PathPattern:        "/repos/{owner}/{repo}/issues/{index}/labels",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &IssueAddLabelReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*IssueAddLabelOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for issueAddLabel: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+IssueAddSubscription subscribes user to issue
+*/
+func (a *Client) IssueAddSubscription(params *IssueAddSubscriptionParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueAddSubscriptionOK, *IssueAddSubscriptionCreated, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewIssueAddSubscriptionParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "issueAddSubscription",
+		Method:             "PUT",
+		PathPattern:        "/repos/{owner}/{repo}/issues/{index}/subscriptions/{user}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &IssueAddSubscriptionReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, nil, err
+	}
+	switch value := result.(type) {
+	case *IssueAddSubscriptionOK:
+		return value, nil, nil
+	case *IssueAddSubscriptionCreated:
+		return nil, value, nil
+	}
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for issue: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+IssueAddTime adds tracked time to a issue
+*/
+func (a *Client) IssueAddTime(params *IssueAddTimeParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueAddTimeOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewIssueAddTimeParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "issueAddTime",
+		Method:             "POST",
+		PathPattern:        "/repos/{owner}/{repo}/issues/{index}/times",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &IssueAddTimeReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*IssueAddTimeOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for issueAddTime: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+IssueCheckSubscription checks if user is subscribed to an issue
+*/
+func (a *Client) IssueCheckSubscription(params *IssueCheckSubscriptionParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueCheckSubscriptionOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewIssueCheckSubscriptionParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "issueCheckSubscription",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/issues/{index}/subscriptions/check",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &IssueCheckSubscriptionReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*IssueCheckSubscriptionOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for issueCheckSubscription: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+IssueClearLabels removes all labels from an issue
+*/
+func (a *Client) IssueClearLabels(params *IssueClearLabelsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueClearLabelsNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewIssueClearLabelsParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "issueClearLabels",
+		Method:             "DELETE",
+		PathPattern:        "/repos/{owner}/{repo}/issues/{index}/labels",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &IssueClearLabelsReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*IssueClearLabelsNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for issueClearLabels: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+IssueCreateComment adds a comment to an issue
+*/
+func (a *Client) IssueCreateComment(params *IssueCreateCommentParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueCreateCommentCreated, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewIssueCreateCommentParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "issueCreateComment",
+		Method:             "POST",
+		PathPattern:        "/repos/{owner}/{repo}/issues/{index}/comments",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &IssueCreateCommentReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*IssueCreateCommentCreated)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for issueCreateComment: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+IssueCreateIssue creates an issue if using deadline only the date will be taken into account and time of day ignored
+*/
+func (a *Client) IssueCreateIssue(params *IssueCreateIssueParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueCreateIssueCreated, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewIssueCreateIssueParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "issueCreateIssue",
+		Method:             "POST",
+		PathPattern:        "/repos/{owner}/{repo}/issues",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &IssueCreateIssueReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*IssueCreateIssueCreated)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for issueCreateIssue: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+IssueCreateIssueAttachment creates an issue attachment
+*/
+func (a *Client) IssueCreateIssueAttachment(params *IssueCreateIssueAttachmentParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueCreateIssueAttachmentCreated, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewIssueCreateIssueAttachmentParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "issueCreateIssueAttachment",
+		Method:             "POST",
+		PathPattern:        "/repos/{owner}/{repo}/issues/{index}/assets",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"multipart/form-data"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &IssueCreateIssueAttachmentReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*IssueCreateIssueAttachmentCreated)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for issueCreateIssueAttachment: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+IssueCreateIssueBlocking blocks the issue given in the body by the issue in path
+*/
+func (a *Client) IssueCreateIssueBlocking(params *IssueCreateIssueBlockingParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueCreateIssueBlockingCreated, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewIssueCreateIssueBlockingParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "issueCreateIssueBlocking",
+		Method:             "POST",
+		PathPattern:        "/repos/{owner}/{repo}/issues/{index}/blocks",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &IssueCreateIssueBlockingReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*IssueCreateIssueBlockingCreated)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for issueCreateIssueBlocking: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+IssueCreateIssueCommentAttachment creates a comment attachment
+*/
+func (a *Client) IssueCreateIssueCommentAttachment(params *IssueCreateIssueCommentAttachmentParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueCreateIssueCommentAttachmentCreated, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewIssueCreateIssueCommentAttachmentParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "issueCreateIssueCommentAttachment",
+		Method:             "POST",
+		PathPattern:        "/repos/{owner}/{repo}/issues/comments/{id}/assets",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"multipart/form-data"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &IssueCreateIssueCommentAttachmentReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*IssueCreateIssueCommentAttachmentCreated)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for issueCreateIssueCommentAttachment: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+IssueCreateIssueDependencies makes the issue in the url depend on the issue in the form
+*/
+func (a *Client) IssueCreateIssueDependencies(params *IssueCreateIssueDependenciesParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueCreateIssueDependenciesCreated, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewIssueCreateIssueDependenciesParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "issueCreateIssueDependencies",
+		Method:             "POST",
+		PathPattern:        "/repos/{owner}/{repo}/issues/{index}/dependencies",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &IssueCreateIssueDependenciesReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*IssueCreateIssueDependenciesCreated)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for issueCreateIssueDependencies: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+IssueCreateLabel creates a label
+*/
+func (a *Client) IssueCreateLabel(params *IssueCreateLabelParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueCreateLabelCreated, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewIssueCreateLabelParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "issueCreateLabel",
+		Method:             "POST",
+		PathPattern:        "/repos/{owner}/{repo}/labels",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &IssueCreateLabelReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*IssueCreateLabelCreated)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for issueCreateLabel: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+IssueCreateMilestone creates a milestone
+*/
+func (a *Client) IssueCreateMilestone(params *IssueCreateMilestoneParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueCreateMilestoneCreated, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewIssueCreateMilestoneParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "issueCreateMilestone",
+		Method:             "POST",
+		PathPattern:        "/repos/{owner}/{repo}/milestones",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &IssueCreateMilestoneReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*IssueCreateMilestoneCreated)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for issueCreateMilestone: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+IssueDelete deletes an issue
+*/
+func (a *Client) IssueDelete(params *IssueDeleteParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueDeleteNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewIssueDeleteParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "issueDelete",
+		Method:             "DELETE",
+		PathPattern:        "/repos/{owner}/{repo}/issues/{index}",
+		ProducesMediaTypes: []string{"application/json", "text/html"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &IssueDeleteReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*IssueDeleteNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for issueDelete: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+IssueDeleteComment deletes a comment
+*/
+func (a *Client) IssueDeleteComment(params *IssueDeleteCommentParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueDeleteCommentNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewIssueDeleteCommentParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "issueDeleteComment",
+		Method:             "DELETE",
+		PathPattern:        "/repos/{owner}/{repo}/issues/comments/{id}",
+		ProducesMediaTypes: []string{"application/json", "text/html"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &IssueDeleteCommentReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*IssueDeleteCommentNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for issueDeleteComment: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+IssueDeleteCommentDeprecated deletes a comment
+*/
+func (a *Client) IssueDeleteCommentDeprecated(params *IssueDeleteCommentDeprecatedParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueDeleteCommentDeprecatedNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewIssueDeleteCommentDeprecatedParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "issueDeleteCommentDeprecated",
+		Method:             "DELETE",
+		PathPattern:        "/repos/{owner}/{repo}/issues/{index}/comments/{id}",
+		ProducesMediaTypes: []string{"application/json", "text/html"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &IssueDeleteCommentDeprecatedReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*IssueDeleteCommentDeprecatedNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for issueDeleteCommentDeprecated: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+IssueDeleteCommentReaction removes a reaction from a comment of an issue
+*/
+func (a *Client) IssueDeleteCommentReaction(params *IssueDeleteCommentReactionParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueDeleteCommentReactionOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewIssueDeleteCommentReactionParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "issueDeleteCommentReaction",
+		Method:             "DELETE",
+		PathPattern:        "/repos/{owner}/{repo}/issues/comments/{id}/reactions",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &IssueDeleteCommentReactionReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*IssueDeleteCommentReactionOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for issueDeleteCommentReaction: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+IssueDeleteIssueAttachment deletes an issue attachment
+*/
+func (a *Client) IssueDeleteIssueAttachment(params *IssueDeleteIssueAttachmentParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueDeleteIssueAttachmentNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewIssueDeleteIssueAttachmentParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "issueDeleteIssueAttachment",
+		Method:             "DELETE",
+		PathPattern:        "/repos/{owner}/{repo}/issues/{index}/assets/{attachment_id}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &IssueDeleteIssueAttachmentReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*IssueDeleteIssueAttachmentNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for issueDeleteIssueAttachment: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+IssueDeleteIssueCommentAttachment deletes a comment attachment
+*/
+func (a *Client) IssueDeleteIssueCommentAttachment(params *IssueDeleteIssueCommentAttachmentParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueDeleteIssueCommentAttachmentNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewIssueDeleteIssueCommentAttachmentParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "issueDeleteIssueCommentAttachment",
+		Method:             "DELETE",
+		PathPattern:        "/repos/{owner}/{repo}/issues/comments/{id}/assets/{attachment_id}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &IssueDeleteIssueCommentAttachmentReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*IssueDeleteIssueCommentAttachmentNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for issueDeleteIssueCommentAttachment: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+IssueDeleteIssueReaction removes a reaction from an issue
+*/
+func (a *Client) IssueDeleteIssueReaction(params *IssueDeleteIssueReactionParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueDeleteIssueReactionOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewIssueDeleteIssueReactionParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "issueDeleteIssueReaction",
+		Method:             "DELETE",
+		PathPattern:        "/repos/{owner}/{repo}/issues/{index}/reactions",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &IssueDeleteIssueReactionReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*IssueDeleteIssueReactionOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for issueDeleteIssueReaction: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+IssueDeleteLabel deletes a label
+*/
+func (a *Client) IssueDeleteLabel(params *IssueDeleteLabelParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueDeleteLabelNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewIssueDeleteLabelParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "issueDeleteLabel",
+		Method:             "DELETE",
+		PathPattern:        "/repos/{owner}/{repo}/labels/{id}",
+		ProducesMediaTypes: []string{"application/json", "text/html"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &IssueDeleteLabelReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*IssueDeleteLabelNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for issueDeleteLabel: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+IssueDeleteMilestone deletes a milestone
+*/
+func (a *Client) IssueDeleteMilestone(params *IssueDeleteMilestoneParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueDeleteMilestoneNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewIssueDeleteMilestoneParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "issueDeleteMilestone",
+		Method:             "DELETE",
+		PathPattern:        "/repos/{owner}/{repo}/milestones/{id}",
+		ProducesMediaTypes: []string{"application/json", "text/html"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &IssueDeleteMilestoneReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*IssueDeleteMilestoneNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for issueDeleteMilestone: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+IssueDeleteStopWatch deletes an issue s existing stopwatch
+*/
+func (a *Client) IssueDeleteStopWatch(params *IssueDeleteStopWatchParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueDeleteStopWatchNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewIssueDeleteStopWatchParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "issueDeleteStopWatch",
+		Method:             "DELETE",
+		PathPattern:        "/repos/{owner}/{repo}/issues/{index}/stopwatch/delete",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &IssueDeleteStopWatchReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*IssueDeleteStopWatchNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for issueDeleteStopWatch: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+IssueDeleteSubscription unsubscribes user from issue
+*/
+func (a *Client) IssueDeleteSubscription(params *IssueDeleteSubscriptionParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueDeleteSubscriptionOK, *IssueDeleteSubscriptionCreated, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewIssueDeleteSubscriptionParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "issueDeleteSubscription",
+		Method:             "DELETE",
+		PathPattern:        "/repos/{owner}/{repo}/issues/{index}/subscriptions/{user}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &IssueDeleteSubscriptionReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, nil, err
+	}
+	switch value := result.(type) {
+	case *IssueDeleteSubscriptionOK:
+		return value, nil, nil
+	case *IssueDeleteSubscriptionCreated:
+		return nil, value, nil
+	}
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for issue: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+IssueDeleteTime deletes specific tracked time
+*/
+func (a *Client) IssueDeleteTime(params *IssueDeleteTimeParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueDeleteTimeNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewIssueDeleteTimeParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "issueDeleteTime",
+		Method:             "DELETE",
+		PathPattern:        "/repos/{owner}/{repo}/issues/{index}/times/{id}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &IssueDeleteTimeReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*IssueDeleteTimeNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for issueDeleteTime: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+IssueEditComment edits a comment
+*/
+func (a *Client) IssueEditComment(params *IssueEditCommentParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueEditCommentOK, *IssueEditCommentNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewIssueEditCommentParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "issueEditComment",
+		Method:             "PATCH",
+		PathPattern:        "/repos/{owner}/{repo}/issues/comments/{id}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &IssueEditCommentReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, nil, err
+	}
+	switch value := result.(type) {
+	case *IssueEditCommentOK:
+		return value, nil, nil
+	case *IssueEditCommentNoContent:
+		return nil, value, nil
+	}
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for issue: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+IssueEditCommentDeprecated edits a comment
+*/
+func (a *Client) IssueEditCommentDeprecated(params *IssueEditCommentDeprecatedParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueEditCommentDeprecatedOK, *IssueEditCommentDeprecatedNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewIssueEditCommentDeprecatedParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "issueEditCommentDeprecated",
+		Method:             "PATCH",
+		PathPattern:        "/repos/{owner}/{repo}/issues/{index}/comments/{id}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &IssueEditCommentDeprecatedReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, nil, err
+	}
+	switch value := result.(type) {
+	case *IssueEditCommentDeprecatedOK:
+		return value, nil, nil
+	case *IssueEditCommentDeprecatedNoContent:
+		return nil, value, nil
+	}
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for issue: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+IssueEditIssue edits an issue if using deadline only the date will be taken into account and time of day ignored
+*/
+func (a *Client) IssueEditIssue(params *IssueEditIssueParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueEditIssueCreated, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewIssueEditIssueParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "issueEditIssue",
+		Method:             "PATCH",
+		PathPattern:        "/repos/{owner}/{repo}/issues/{index}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &IssueEditIssueReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*IssueEditIssueCreated)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for issueEditIssue: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+IssueEditIssueAttachment edits an issue attachment
+*/
+func (a *Client) IssueEditIssueAttachment(params *IssueEditIssueAttachmentParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueEditIssueAttachmentCreated, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewIssueEditIssueAttachmentParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "issueEditIssueAttachment",
+		Method:             "PATCH",
+		PathPattern:        "/repos/{owner}/{repo}/issues/{index}/assets/{attachment_id}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &IssueEditIssueAttachmentReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*IssueEditIssueAttachmentCreated)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for issueEditIssueAttachment: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+IssueEditIssueCommentAttachment edits a comment attachment
+*/
+func (a *Client) IssueEditIssueCommentAttachment(params *IssueEditIssueCommentAttachmentParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueEditIssueCommentAttachmentCreated, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewIssueEditIssueCommentAttachmentParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "issueEditIssueCommentAttachment",
+		Method:             "PATCH",
+		PathPattern:        "/repos/{owner}/{repo}/issues/comments/{id}/assets/{attachment_id}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &IssueEditIssueCommentAttachmentReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*IssueEditIssueCommentAttachmentCreated)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for issueEditIssueCommentAttachment: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+IssueEditIssueDeadline sets an issue deadline if set to null the deadline is deleted if using deadline only the date will be taken into account and time of day ignored
+*/
+func (a *Client) IssueEditIssueDeadline(params *IssueEditIssueDeadlineParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueEditIssueDeadlineCreated, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewIssueEditIssueDeadlineParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "issueEditIssueDeadline",
+		Method:             "POST",
+		PathPattern:        "/repos/{owner}/{repo}/issues/{index}/deadline",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &IssueEditIssueDeadlineReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*IssueEditIssueDeadlineCreated)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for issueEditIssueDeadline: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+IssueEditLabel updates a label
+*/
+func (a *Client) IssueEditLabel(params *IssueEditLabelParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueEditLabelOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewIssueEditLabelParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "issueEditLabel",
+		Method:             "PATCH",
+		PathPattern:        "/repos/{owner}/{repo}/labels/{id}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &IssueEditLabelReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*IssueEditLabelOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for issueEditLabel: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+IssueEditMilestone updates a milestone
+*/
+func (a *Client) IssueEditMilestone(params *IssueEditMilestoneParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueEditMilestoneOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewIssueEditMilestoneParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "issueEditMilestone",
+		Method:             "PATCH",
+		PathPattern:        "/repos/{owner}/{repo}/milestones/{id}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &IssueEditMilestoneReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*IssueEditMilestoneOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for issueEditMilestone: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+IssueGetComment gets a comment
+*/
+func (a *Client) IssueGetComment(params *IssueGetCommentParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueGetCommentOK, *IssueGetCommentNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewIssueGetCommentParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "issueGetComment",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/issues/comments/{id}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &IssueGetCommentReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, nil, err
+	}
+	switch value := result.(type) {
+	case *IssueGetCommentOK:
+		return value, nil, nil
+	case *IssueGetCommentNoContent:
+		return nil, value, nil
+	}
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for issue: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+IssueGetCommentReactions gets a list of reactions from a comment of an issue
+*/
+func (a *Client) IssueGetCommentReactions(params *IssueGetCommentReactionsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueGetCommentReactionsOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewIssueGetCommentReactionsParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "issueGetCommentReactions",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/issues/comments/{id}/reactions",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &IssueGetCommentReactionsReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*IssueGetCommentReactionsOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for issueGetCommentReactions: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+IssueGetComments lists all comments on an issue
+*/
+func (a *Client) IssueGetComments(params *IssueGetCommentsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueGetCommentsOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewIssueGetCommentsParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "issueGetComments",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/issues/{index}/comments",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &IssueGetCommentsReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*IssueGetCommentsOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for issueGetComments: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+IssueGetCommentsAndTimeline lists all comments and events on an issue
+*/
+func (a *Client) IssueGetCommentsAndTimeline(params *IssueGetCommentsAndTimelineParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueGetCommentsAndTimelineOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewIssueGetCommentsAndTimelineParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "issueGetCommentsAndTimeline",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/issues/{index}/timeline",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &IssueGetCommentsAndTimelineReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*IssueGetCommentsAndTimelineOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for issueGetCommentsAndTimeline: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+IssueGetIssue gets an issue
+*/
+func (a *Client) IssueGetIssue(params *IssueGetIssueParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueGetIssueOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewIssueGetIssueParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "issueGetIssue",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/issues/{index}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &IssueGetIssueReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*IssueGetIssueOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for issueGetIssue: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+IssueGetIssueAttachment gets an issue attachment
+*/
+func (a *Client) IssueGetIssueAttachment(params *IssueGetIssueAttachmentParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueGetIssueAttachmentOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewIssueGetIssueAttachmentParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "issueGetIssueAttachment",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/issues/{index}/assets/{attachment_id}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &IssueGetIssueAttachmentReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*IssueGetIssueAttachmentOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for issueGetIssueAttachment: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+IssueGetIssueCommentAttachment gets a comment attachment
+*/
+func (a *Client) IssueGetIssueCommentAttachment(params *IssueGetIssueCommentAttachmentParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueGetIssueCommentAttachmentOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewIssueGetIssueCommentAttachmentParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "issueGetIssueCommentAttachment",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/issues/comments/{id}/assets/{attachment_id}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &IssueGetIssueCommentAttachmentReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*IssueGetIssueCommentAttachmentOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for issueGetIssueCommentAttachment: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+IssueGetIssueReactions gets a list reactions of an issue
+*/
+func (a *Client) IssueGetIssueReactions(params *IssueGetIssueReactionsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueGetIssueReactionsOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewIssueGetIssueReactionsParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "issueGetIssueReactions",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/issues/{index}/reactions",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &IssueGetIssueReactionsReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*IssueGetIssueReactionsOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for issueGetIssueReactions: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+IssueGetLabel gets a single label
+*/
+func (a *Client) IssueGetLabel(params *IssueGetLabelParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueGetLabelOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewIssueGetLabelParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "issueGetLabel",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/labels/{id}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &IssueGetLabelReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*IssueGetLabelOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for issueGetLabel: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+IssueGetLabels gets an issue s labels
+*/
+func (a *Client) IssueGetLabels(params *IssueGetLabelsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueGetLabelsOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewIssueGetLabelsParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "issueGetLabels",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/issues/{index}/labels",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &IssueGetLabelsReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*IssueGetLabelsOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for issueGetLabels: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+IssueGetMilestone gets a milestone
+*/
+func (a *Client) IssueGetMilestone(params *IssueGetMilestoneParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueGetMilestoneOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewIssueGetMilestoneParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "issueGetMilestone",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/milestones/{id}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &IssueGetMilestoneReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*IssueGetMilestoneOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for issueGetMilestone: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+IssueGetMilestonesList gets all of a repository s opened milestones
+*/
+func (a *Client) IssueGetMilestonesList(params *IssueGetMilestonesListParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueGetMilestonesListOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewIssueGetMilestonesListParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "issueGetMilestonesList",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/milestones",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &IssueGetMilestonesListReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*IssueGetMilestonesListOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for issueGetMilestonesList: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+IssueGetRepoComments lists all comments in a repository
+*/
+func (a *Client) IssueGetRepoComments(params *IssueGetRepoCommentsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueGetRepoCommentsOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewIssueGetRepoCommentsParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "issueGetRepoComments",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/issues/comments",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &IssueGetRepoCommentsReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*IssueGetRepoCommentsOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for issueGetRepoComments: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+IssueListBlocks lists issues that are blocked by this issue
+*/
+func (a *Client) IssueListBlocks(params *IssueListBlocksParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueListBlocksOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewIssueListBlocksParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "issueListBlocks",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/issues/{index}/blocks",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &IssueListBlocksReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*IssueListBlocksOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for issueListBlocks: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+IssueListIssueAttachments lists issue s attachments
+*/
+func (a *Client) IssueListIssueAttachments(params *IssueListIssueAttachmentsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueListIssueAttachmentsOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewIssueListIssueAttachmentsParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "issueListIssueAttachments",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/issues/{index}/assets",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &IssueListIssueAttachmentsReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*IssueListIssueAttachmentsOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for issueListIssueAttachments: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+IssueListIssueCommentAttachments lists comment s attachments
+*/
+func (a *Client) IssueListIssueCommentAttachments(params *IssueListIssueCommentAttachmentsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueListIssueCommentAttachmentsOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewIssueListIssueCommentAttachmentsParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "issueListIssueCommentAttachments",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/issues/comments/{id}/assets",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &IssueListIssueCommentAttachmentsReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*IssueListIssueCommentAttachmentsOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for issueListIssueCommentAttachments: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+IssueListIssueDependencies lists an issue s dependencies i e all issues that block this issue
+*/
+func (a *Client) IssueListIssueDependencies(params *IssueListIssueDependenciesParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueListIssueDependenciesOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewIssueListIssueDependenciesParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "issueListIssueDependencies",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/issues/{index}/dependencies",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &IssueListIssueDependenciesReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*IssueListIssueDependenciesOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for issueListIssueDependencies: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+IssueListIssues lists a repository s issues
+*/
+func (a *Client) IssueListIssues(params *IssueListIssuesParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueListIssuesOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewIssueListIssuesParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "issueListIssues",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/issues",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &IssueListIssuesReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*IssueListIssuesOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for issueListIssues: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+IssueListLabels gets all of a repository s labels
+*/
+func (a *Client) IssueListLabels(params *IssueListLabelsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueListLabelsOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewIssueListLabelsParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "issueListLabels",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/labels",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &IssueListLabelsReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*IssueListLabelsOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for issueListLabels: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+IssuePostCommentReaction adds a reaction to a comment of an issue
+*/
+func (a *Client) IssuePostCommentReaction(params *IssuePostCommentReactionParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssuePostCommentReactionOK, *IssuePostCommentReactionCreated, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewIssuePostCommentReactionParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "issuePostCommentReaction",
+		Method:             "POST",
+		PathPattern:        "/repos/{owner}/{repo}/issues/comments/{id}/reactions",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &IssuePostCommentReactionReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, nil, err
+	}
+	switch value := result.(type) {
+	case *IssuePostCommentReactionOK:
+		return value, nil, nil
+	case *IssuePostCommentReactionCreated:
+		return nil, value, nil
+	}
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for issue: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+IssuePostIssueReaction adds a reaction to an issue
+*/
+func (a *Client) IssuePostIssueReaction(params *IssuePostIssueReactionParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssuePostIssueReactionOK, *IssuePostIssueReactionCreated, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewIssuePostIssueReactionParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "issuePostIssueReaction",
+		Method:             "POST",
+		PathPattern:        "/repos/{owner}/{repo}/issues/{index}/reactions",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &IssuePostIssueReactionReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, nil, err
+	}
+	switch value := result.(type) {
+	case *IssuePostIssueReactionOK:
+		return value, nil, nil
+	case *IssuePostIssueReactionCreated:
+		return nil, value, nil
+	}
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for issue: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+IssueRemoveIssueBlocking unblocks the issue given in the body by the issue in path
+*/
+func (a *Client) IssueRemoveIssueBlocking(params *IssueRemoveIssueBlockingParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueRemoveIssueBlockingOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewIssueRemoveIssueBlockingParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "issueRemoveIssueBlocking",
+		Method:             "DELETE",
+		PathPattern:        "/repos/{owner}/{repo}/issues/{index}/blocks",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &IssueRemoveIssueBlockingReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*IssueRemoveIssueBlockingOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for issueRemoveIssueBlocking: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+IssueRemoveIssueDependencies removes an issue dependency
+*/
+func (a *Client) IssueRemoveIssueDependencies(params *IssueRemoveIssueDependenciesParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueRemoveIssueDependenciesOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewIssueRemoveIssueDependenciesParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "issueRemoveIssueDependencies",
+		Method:             "DELETE",
+		PathPattern:        "/repos/{owner}/{repo}/issues/{index}/dependencies",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &IssueRemoveIssueDependenciesReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*IssueRemoveIssueDependenciesOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for issueRemoveIssueDependencies: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+IssueRemoveLabel removes a label from an issue
+*/
+func (a *Client) IssueRemoveLabel(params *IssueRemoveLabelParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueRemoveLabelNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewIssueRemoveLabelParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "issueRemoveLabel",
+		Method:             "DELETE",
+		PathPattern:        "/repos/{owner}/{repo}/issues/{index}/labels/{id}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &IssueRemoveLabelReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*IssueRemoveLabelNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for issueRemoveLabel: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+IssueReplaceLabels replaces an issue s labels
+*/
+func (a *Client) IssueReplaceLabels(params *IssueReplaceLabelsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueReplaceLabelsOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewIssueReplaceLabelsParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "issueReplaceLabels",
+		Method:             "PUT",
+		PathPattern:        "/repos/{owner}/{repo}/issues/{index}/labels",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &IssueReplaceLabelsReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*IssueReplaceLabelsOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for issueReplaceLabels: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+IssueResetTime resets a tracked time of an issue
+*/
+func (a *Client) IssueResetTime(params *IssueResetTimeParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueResetTimeNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewIssueResetTimeParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "issueResetTime",
+		Method:             "DELETE",
+		PathPattern:        "/repos/{owner}/{repo}/issues/{index}/times",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &IssueResetTimeReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*IssueResetTimeNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for issueResetTime: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+IssueSearchIssues searches for issues across the repositories that the user has access to
+*/
+func (a *Client) IssueSearchIssues(params *IssueSearchIssuesParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueSearchIssuesOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewIssueSearchIssuesParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "issueSearchIssues",
+		Method:             "GET",
+		PathPattern:        "/repos/issues/search",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &IssueSearchIssuesReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*IssueSearchIssuesOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for issueSearchIssues: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+IssueStartStopWatch starts stopwatch on an issue
+*/
+func (a *Client) IssueStartStopWatch(params *IssueStartStopWatchParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueStartStopWatchCreated, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewIssueStartStopWatchParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "issueStartStopWatch",
+		Method:             "POST",
+		PathPattern:        "/repos/{owner}/{repo}/issues/{index}/stopwatch/start",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &IssueStartStopWatchReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*IssueStartStopWatchCreated)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for issueStartStopWatch: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+IssueStopStopWatch stops an issue s existing stopwatch
+*/
+func (a *Client) IssueStopStopWatch(params *IssueStopStopWatchParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueStopStopWatchCreated, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewIssueStopStopWatchParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "issueStopStopWatch",
+		Method:             "POST",
+		PathPattern:        "/repos/{owner}/{repo}/issues/{index}/stopwatch/stop",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &IssueStopStopWatchReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*IssueStopStopWatchCreated)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for issueStopStopWatch: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+IssueSubscriptions gets users who subscribed on an issue
+*/
+func (a *Client) IssueSubscriptions(params *IssueSubscriptionsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueSubscriptionsOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewIssueSubscriptionsParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "issueSubscriptions",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/issues/{index}/subscriptions",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &IssueSubscriptionsReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*IssueSubscriptionsOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for issueSubscriptions: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+IssueTrackedTimes lists an issue s tracked times
+*/
+func (a *Client) IssueTrackedTimes(params *IssueTrackedTimesParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*IssueTrackedTimesOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewIssueTrackedTimesParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "issueTrackedTimes",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/issues/{index}/times",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &IssueTrackedTimesReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*IssueTrackedTimesOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for issueTrackedTimes: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+MoveIssuePin moves the pin to the given position
+*/
+func (a *Client) MoveIssuePin(params *MoveIssuePinParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*MoveIssuePinNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewMoveIssuePinParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "moveIssuePin",
+		Method:             "PATCH",
+		PathPattern:        "/repos/{owner}/{repo}/issues/{index}/pin/{position}",
+		ProducesMediaTypes: []string{"application/json", "text/html"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &MoveIssuePinReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*MoveIssuePinNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for moveIssuePin: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+PinIssue pins an issue
+*/
+func (a *Client) PinIssue(params *PinIssueParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*PinIssueNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewPinIssueParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "pinIssue",
+		Method:             "POST",
+		PathPattern:        "/repos/{owner}/{repo}/issues/{index}/pin",
+		ProducesMediaTypes: []string{"application/json", "text/html"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &PinIssueReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*PinIssueNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for pinIssue: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+UnpinIssue unpins an issue
+*/
+func (a *Client) UnpinIssue(params *UnpinIssueParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UnpinIssueNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewUnpinIssueParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "unpinIssue",
+		Method:             "DELETE",
+		PathPattern:        "/repos/{owner}/{repo}/issues/{index}/pin",
+		ProducesMediaTypes: []string{"application/json", "text/html"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &UnpinIssueReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*UnpinIssueNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for unpinIssue: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+// SetTransport changes the transport on the client
+func (a *Client) SetTransport(transport runtime.ClientTransport) {
+	a.transport = transport
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_create_comment_parameters.go b/bots-common/gitea-generated/client/issue/issue_create_comment_parameters.go
new file mode 100644
index 0000000..14c4d80
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_create_comment_parameters.go
@@ -0,0 +1,219 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewIssueCreateCommentParams creates a new IssueCreateCommentParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewIssueCreateCommentParams() *IssueCreateCommentParams {
+	return &IssueCreateCommentParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewIssueCreateCommentParamsWithTimeout creates a new IssueCreateCommentParams object
+// with the ability to set a timeout on a request.
+func NewIssueCreateCommentParamsWithTimeout(timeout time.Duration) *IssueCreateCommentParams {
+	return &IssueCreateCommentParams{
+		timeout: timeout,
+	}
+}
+
+// NewIssueCreateCommentParamsWithContext creates a new IssueCreateCommentParams object
+// with the ability to set a context for a request.
+func NewIssueCreateCommentParamsWithContext(ctx context.Context) *IssueCreateCommentParams {
+	return &IssueCreateCommentParams{
+		Context: ctx,
+	}
+}
+
+// NewIssueCreateCommentParamsWithHTTPClient creates a new IssueCreateCommentParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewIssueCreateCommentParamsWithHTTPClient(client *http.Client) *IssueCreateCommentParams {
+	return &IssueCreateCommentParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+IssueCreateCommentParams contains all the parameters to send to the API endpoint
+
+	for the issue create comment operation.
+
+	Typically these are written to a http.Request.
+*/
+type IssueCreateCommentParams struct {
+
+	// Body.
+	Body *models.CreateIssueCommentOption
+
+	/* Index.
+
+	   index of the issue
+
+	   Format: int64
+	*/
+	Index int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the issue create comment params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueCreateCommentParams) WithDefaults() *IssueCreateCommentParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the issue create comment params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueCreateCommentParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the issue create comment params
+func (o *IssueCreateCommentParams) WithTimeout(timeout time.Duration) *IssueCreateCommentParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the issue create comment params
+func (o *IssueCreateCommentParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the issue create comment params
+func (o *IssueCreateCommentParams) WithContext(ctx context.Context) *IssueCreateCommentParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the issue create comment params
+func (o *IssueCreateCommentParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the issue create comment params
+func (o *IssueCreateCommentParams) WithHTTPClient(client *http.Client) *IssueCreateCommentParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the issue create comment params
+func (o *IssueCreateCommentParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the issue create comment params
+func (o *IssueCreateCommentParams) WithBody(body *models.CreateIssueCommentOption) *IssueCreateCommentParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the issue create comment params
+func (o *IssueCreateCommentParams) SetBody(body *models.CreateIssueCommentOption) {
+	o.Body = body
+}
+
+// WithIndex adds the index to the issue create comment params
+func (o *IssueCreateCommentParams) WithIndex(index int64) *IssueCreateCommentParams {
+	o.SetIndex(index)
+	return o
+}
+
+// SetIndex adds the index to the issue create comment params
+func (o *IssueCreateCommentParams) SetIndex(index int64) {
+	o.Index = index
+}
+
+// WithOwner adds the owner to the issue create comment params
+func (o *IssueCreateCommentParams) WithOwner(owner string) *IssueCreateCommentParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the issue create comment params
+func (o *IssueCreateCommentParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the issue create comment params
+func (o *IssueCreateCommentParams) WithRepo(repo string) *IssueCreateCommentParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the issue create comment params
+func (o *IssueCreateCommentParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *IssueCreateCommentParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	// path param index
+	if err := r.SetPathParam("index", swag.FormatInt64(o.Index)); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_create_comment_responses.go b/bots-common/gitea-generated/client/issue/issue_create_comment_responses.go
new file mode 100644
index 0000000..4468964
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_create_comment_responses.go
@@ -0,0 +1,324 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// IssueCreateCommentReader is a Reader for the IssueCreateComment structure.
+type IssueCreateCommentReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *IssueCreateCommentReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 201:
+		result := NewIssueCreateCommentCreated()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 403:
+		result := NewIssueCreateCommentForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewIssueCreateCommentNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 423:
+		result := NewIssueCreateCommentLocked()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[POST /repos/{owner}/{repo}/issues/{index}/comments] issueCreateComment", response, response.Code())
+	}
+}
+
+// NewIssueCreateCommentCreated creates a IssueCreateCommentCreated with default headers values
+func NewIssueCreateCommentCreated() *IssueCreateCommentCreated {
+	return &IssueCreateCommentCreated{}
+}
+
+/*
+IssueCreateCommentCreated describes a response with status code 201, with default header values.
+
+Comment
+*/
+type IssueCreateCommentCreated struct {
+	Payload *models.Comment
+}
+
+// IsSuccess returns true when this issue create comment created response has a 2xx status code
+func (o *IssueCreateCommentCreated) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this issue create comment created response has a 3xx status code
+func (o *IssueCreateCommentCreated) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue create comment created response has a 4xx status code
+func (o *IssueCreateCommentCreated) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this issue create comment created response has a 5xx status code
+func (o *IssueCreateCommentCreated) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue create comment created response a status code equal to that given
+func (o *IssueCreateCommentCreated) IsCode(code int) bool {
+	return code == 201
+}
+
+// Code gets the status code for the issue create comment created response
+func (o *IssueCreateCommentCreated) Code() int {
+	return 201
+}
+
+func (o *IssueCreateCommentCreated) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/{index}/comments][%d] issueCreateCommentCreated %s", 201, payload)
+}
+
+func (o *IssueCreateCommentCreated) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/{index}/comments][%d] issueCreateCommentCreated %s", 201, payload)
+}
+
+func (o *IssueCreateCommentCreated) GetPayload() *models.Comment {
+	return o.Payload
+}
+
+func (o *IssueCreateCommentCreated) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.Comment)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewIssueCreateCommentForbidden creates a IssueCreateCommentForbidden with default headers values
+func NewIssueCreateCommentForbidden() *IssueCreateCommentForbidden {
+	return &IssueCreateCommentForbidden{}
+}
+
+/*
+IssueCreateCommentForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type IssueCreateCommentForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this issue create comment forbidden response has a 2xx status code
+func (o *IssueCreateCommentForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue create comment forbidden response has a 3xx status code
+func (o *IssueCreateCommentForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue create comment forbidden response has a 4xx status code
+func (o *IssueCreateCommentForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue create comment forbidden response has a 5xx status code
+func (o *IssueCreateCommentForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue create comment forbidden response a status code equal to that given
+func (o *IssueCreateCommentForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the issue create comment forbidden response
+func (o *IssueCreateCommentForbidden) Code() int {
+	return 403
+}
+
+func (o *IssueCreateCommentForbidden) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/{index}/comments][%d] issueCreateCommentForbidden", 403)
+}
+
+func (o *IssueCreateCommentForbidden) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/{index}/comments][%d] issueCreateCommentForbidden", 403)
+}
+
+func (o *IssueCreateCommentForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewIssueCreateCommentNotFound creates a IssueCreateCommentNotFound with default headers values
+func NewIssueCreateCommentNotFound() *IssueCreateCommentNotFound {
+	return &IssueCreateCommentNotFound{}
+}
+
+/*
+IssueCreateCommentNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type IssueCreateCommentNotFound struct {
+}
+
+// IsSuccess returns true when this issue create comment not found response has a 2xx status code
+func (o *IssueCreateCommentNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue create comment not found response has a 3xx status code
+func (o *IssueCreateCommentNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue create comment not found response has a 4xx status code
+func (o *IssueCreateCommentNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue create comment not found response has a 5xx status code
+func (o *IssueCreateCommentNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue create comment not found response a status code equal to that given
+func (o *IssueCreateCommentNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the issue create comment not found response
+func (o *IssueCreateCommentNotFound) Code() int {
+	return 404
+}
+
+func (o *IssueCreateCommentNotFound) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/{index}/comments][%d] issueCreateCommentNotFound", 404)
+}
+
+func (o *IssueCreateCommentNotFound) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/{index}/comments][%d] issueCreateCommentNotFound", 404)
+}
+
+func (o *IssueCreateCommentNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewIssueCreateCommentLocked creates a IssueCreateCommentLocked with default headers values
+func NewIssueCreateCommentLocked() *IssueCreateCommentLocked {
+	return &IssueCreateCommentLocked{}
+}
+
+/*
+IssueCreateCommentLocked describes a response with status code 423, with default header values.
+
+APIRepoArchivedError is an error that is raised when an archived repo should be modified
+*/
+type IssueCreateCommentLocked struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this issue create comment locked response has a 2xx status code
+func (o *IssueCreateCommentLocked) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue create comment locked response has a 3xx status code
+func (o *IssueCreateCommentLocked) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue create comment locked response has a 4xx status code
+func (o *IssueCreateCommentLocked) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue create comment locked response has a 5xx status code
+func (o *IssueCreateCommentLocked) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue create comment locked response a status code equal to that given
+func (o *IssueCreateCommentLocked) IsCode(code int) bool {
+	return code == 423
+}
+
+// Code gets the status code for the issue create comment locked response
+func (o *IssueCreateCommentLocked) Code() int {
+	return 423
+}
+
+func (o *IssueCreateCommentLocked) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/{index}/comments][%d] issueCreateCommentLocked", 423)
+}
+
+func (o *IssueCreateCommentLocked) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/{index}/comments][%d] issueCreateCommentLocked", 423)
+}
+
+func (o *IssueCreateCommentLocked) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_create_issue_attachment_parameters.go b/bots-common/gitea-generated/client/issue/issue_create_issue_attachment_parameters.go
new file mode 100644
index 0000000..6566c05
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_create_issue_attachment_parameters.go
@@ -0,0 +1,253 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewIssueCreateIssueAttachmentParams creates a new IssueCreateIssueAttachmentParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewIssueCreateIssueAttachmentParams() *IssueCreateIssueAttachmentParams {
+	return &IssueCreateIssueAttachmentParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewIssueCreateIssueAttachmentParamsWithTimeout creates a new IssueCreateIssueAttachmentParams object
+// with the ability to set a timeout on a request.
+func NewIssueCreateIssueAttachmentParamsWithTimeout(timeout time.Duration) *IssueCreateIssueAttachmentParams {
+	return &IssueCreateIssueAttachmentParams{
+		timeout: timeout,
+	}
+}
+
+// NewIssueCreateIssueAttachmentParamsWithContext creates a new IssueCreateIssueAttachmentParams object
+// with the ability to set a context for a request.
+func NewIssueCreateIssueAttachmentParamsWithContext(ctx context.Context) *IssueCreateIssueAttachmentParams {
+	return &IssueCreateIssueAttachmentParams{
+		Context: ctx,
+	}
+}
+
+// NewIssueCreateIssueAttachmentParamsWithHTTPClient creates a new IssueCreateIssueAttachmentParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewIssueCreateIssueAttachmentParamsWithHTTPClient(client *http.Client) *IssueCreateIssueAttachmentParams {
+	return &IssueCreateIssueAttachmentParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+IssueCreateIssueAttachmentParams contains all the parameters to send to the API endpoint
+
+	for the issue create issue attachment operation.
+
+	Typically these are written to a http.Request.
+*/
+type IssueCreateIssueAttachmentParams struct {
+
+	/* Attachment.
+
+	   attachment to upload
+	*/
+	Attachment runtime.NamedReadCloser
+
+	/* Index.
+
+	   index of the issue
+
+	   Format: int64
+	*/
+	Index int64
+
+	/* Name.
+
+	   name of the attachment
+	*/
+	Name *string
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the issue create issue attachment params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueCreateIssueAttachmentParams) WithDefaults() *IssueCreateIssueAttachmentParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the issue create issue attachment params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueCreateIssueAttachmentParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the issue create issue attachment params
+func (o *IssueCreateIssueAttachmentParams) WithTimeout(timeout time.Duration) *IssueCreateIssueAttachmentParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the issue create issue attachment params
+func (o *IssueCreateIssueAttachmentParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the issue create issue attachment params
+func (o *IssueCreateIssueAttachmentParams) WithContext(ctx context.Context) *IssueCreateIssueAttachmentParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the issue create issue attachment params
+func (o *IssueCreateIssueAttachmentParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the issue create issue attachment params
+func (o *IssueCreateIssueAttachmentParams) WithHTTPClient(client *http.Client) *IssueCreateIssueAttachmentParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the issue create issue attachment params
+func (o *IssueCreateIssueAttachmentParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithAttachment adds the attachment to the issue create issue attachment params
+func (o *IssueCreateIssueAttachmentParams) WithAttachment(attachment runtime.NamedReadCloser) *IssueCreateIssueAttachmentParams {
+	o.SetAttachment(attachment)
+	return o
+}
+
+// SetAttachment adds the attachment to the issue create issue attachment params
+func (o *IssueCreateIssueAttachmentParams) SetAttachment(attachment runtime.NamedReadCloser) {
+	o.Attachment = attachment
+}
+
+// WithIndex adds the index to the issue create issue attachment params
+func (o *IssueCreateIssueAttachmentParams) WithIndex(index int64) *IssueCreateIssueAttachmentParams {
+	o.SetIndex(index)
+	return o
+}
+
+// SetIndex adds the index to the issue create issue attachment params
+func (o *IssueCreateIssueAttachmentParams) SetIndex(index int64) {
+	o.Index = index
+}
+
+// WithName adds the name to the issue create issue attachment params
+func (o *IssueCreateIssueAttachmentParams) WithName(name *string) *IssueCreateIssueAttachmentParams {
+	o.SetName(name)
+	return o
+}
+
+// SetName adds the name to the issue create issue attachment params
+func (o *IssueCreateIssueAttachmentParams) SetName(name *string) {
+	o.Name = name
+}
+
+// WithOwner adds the owner to the issue create issue attachment params
+func (o *IssueCreateIssueAttachmentParams) WithOwner(owner string) *IssueCreateIssueAttachmentParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the issue create issue attachment params
+func (o *IssueCreateIssueAttachmentParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the issue create issue attachment params
+func (o *IssueCreateIssueAttachmentParams) WithRepo(repo string) *IssueCreateIssueAttachmentParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the issue create issue attachment params
+func (o *IssueCreateIssueAttachmentParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *IssueCreateIssueAttachmentParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	// form file param attachment
+	if err := r.SetFileParam("attachment", o.Attachment); err != nil {
+		return err
+	}
+
+	// path param index
+	if err := r.SetPathParam("index", swag.FormatInt64(o.Index)); err != nil {
+		return err
+	}
+
+	if o.Name != nil {
+
+		// query param name
+		var qrName string
+
+		if o.Name != nil {
+			qrName = *o.Name
+		}
+		qName := qrName
+		if qName != "" {
+
+			if err := r.SetQueryParam("name", qName); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_create_issue_attachment_responses.go b/bots-common/gitea-generated/client/issue/issue_create_issue_attachment_responses.go
new file mode 100644
index 0000000..b19d9d9
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_create_issue_attachment_responses.go
@@ -0,0 +1,418 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// IssueCreateIssueAttachmentReader is a Reader for the IssueCreateIssueAttachment structure.
+type IssueCreateIssueAttachmentReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *IssueCreateIssueAttachmentReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 201:
+		result := NewIssueCreateIssueAttachmentCreated()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 400:
+		result := NewIssueCreateIssueAttachmentBadRequest()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewIssueCreateIssueAttachmentNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 422:
+		result := NewIssueCreateIssueAttachmentUnprocessableEntity()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 423:
+		result := NewIssueCreateIssueAttachmentLocked()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[POST /repos/{owner}/{repo}/issues/{index}/assets] issueCreateIssueAttachment", response, response.Code())
+	}
+}
+
+// NewIssueCreateIssueAttachmentCreated creates a IssueCreateIssueAttachmentCreated with default headers values
+func NewIssueCreateIssueAttachmentCreated() *IssueCreateIssueAttachmentCreated {
+	return &IssueCreateIssueAttachmentCreated{}
+}
+
+/*
+IssueCreateIssueAttachmentCreated describes a response with status code 201, with default header values.
+
+Attachment
+*/
+type IssueCreateIssueAttachmentCreated struct {
+	Payload *models.Attachment
+}
+
+// IsSuccess returns true when this issue create issue attachment created response has a 2xx status code
+func (o *IssueCreateIssueAttachmentCreated) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this issue create issue attachment created response has a 3xx status code
+func (o *IssueCreateIssueAttachmentCreated) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue create issue attachment created response has a 4xx status code
+func (o *IssueCreateIssueAttachmentCreated) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this issue create issue attachment created response has a 5xx status code
+func (o *IssueCreateIssueAttachmentCreated) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue create issue attachment created response a status code equal to that given
+func (o *IssueCreateIssueAttachmentCreated) IsCode(code int) bool {
+	return code == 201
+}
+
+// Code gets the status code for the issue create issue attachment created response
+func (o *IssueCreateIssueAttachmentCreated) Code() int {
+	return 201
+}
+
+func (o *IssueCreateIssueAttachmentCreated) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/{index}/assets][%d] issueCreateIssueAttachmentCreated %s", 201, payload)
+}
+
+func (o *IssueCreateIssueAttachmentCreated) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/{index}/assets][%d] issueCreateIssueAttachmentCreated %s", 201, payload)
+}
+
+func (o *IssueCreateIssueAttachmentCreated) GetPayload() *models.Attachment {
+	return o.Payload
+}
+
+func (o *IssueCreateIssueAttachmentCreated) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.Attachment)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewIssueCreateIssueAttachmentBadRequest creates a IssueCreateIssueAttachmentBadRequest with default headers values
+func NewIssueCreateIssueAttachmentBadRequest() *IssueCreateIssueAttachmentBadRequest {
+	return &IssueCreateIssueAttachmentBadRequest{}
+}
+
+/*
+IssueCreateIssueAttachmentBadRequest describes a response with status code 400, with default header values.
+
+APIError is error format response
+*/
+type IssueCreateIssueAttachmentBadRequest struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this issue create issue attachment bad request response has a 2xx status code
+func (o *IssueCreateIssueAttachmentBadRequest) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue create issue attachment bad request response has a 3xx status code
+func (o *IssueCreateIssueAttachmentBadRequest) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue create issue attachment bad request response has a 4xx status code
+func (o *IssueCreateIssueAttachmentBadRequest) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue create issue attachment bad request response has a 5xx status code
+func (o *IssueCreateIssueAttachmentBadRequest) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue create issue attachment bad request response a status code equal to that given
+func (o *IssueCreateIssueAttachmentBadRequest) IsCode(code int) bool {
+	return code == 400
+}
+
+// Code gets the status code for the issue create issue attachment bad request response
+func (o *IssueCreateIssueAttachmentBadRequest) Code() int {
+	return 400
+}
+
+func (o *IssueCreateIssueAttachmentBadRequest) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/{index}/assets][%d] issueCreateIssueAttachmentBadRequest", 400)
+}
+
+func (o *IssueCreateIssueAttachmentBadRequest) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/{index}/assets][%d] issueCreateIssueAttachmentBadRequest", 400)
+}
+
+func (o *IssueCreateIssueAttachmentBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewIssueCreateIssueAttachmentNotFound creates a IssueCreateIssueAttachmentNotFound with default headers values
+func NewIssueCreateIssueAttachmentNotFound() *IssueCreateIssueAttachmentNotFound {
+	return &IssueCreateIssueAttachmentNotFound{}
+}
+
+/*
+IssueCreateIssueAttachmentNotFound describes a response with status code 404, with default header values.
+
+APIError is error format response
+*/
+type IssueCreateIssueAttachmentNotFound struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this issue create issue attachment not found response has a 2xx status code
+func (o *IssueCreateIssueAttachmentNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue create issue attachment not found response has a 3xx status code
+func (o *IssueCreateIssueAttachmentNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue create issue attachment not found response has a 4xx status code
+func (o *IssueCreateIssueAttachmentNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue create issue attachment not found response has a 5xx status code
+func (o *IssueCreateIssueAttachmentNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue create issue attachment not found response a status code equal to that given
+func (o *IssueCreateIssueAttachmentNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the issue create issue attachment not found response
+func (o *IssueCreateIssueAttachmentNotFound) Code() int {
+	return 404
+}
+
+func (o *IssueCreateIssueAttachmentNotFound) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/{index}/assets][%d] issueCreateIssueAttachmentNotFound", 404)
+}
+
+func (o *IssueCreateIssueAttachmentNotFound) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/{index}/assets][%d] issueCreateIssueAttachmentNotFound", 404)
+}
+
+func (o *IssueCreateIssueAttachmentNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewIssueCreateIssueAttachmentUnprocessableEntity creates a IssueCreateIssueAttachmentUnprocessableEntity with default headers values
+func NewIssueCreateIssueAttachmentUnprocessableEntity() *IssueCreateIssueAttachmentUnprocessableEntity {
+	return &IssueCreateIssueAttachmentUnprocessableEntity{}
+}
+
+/*
+IssueCreateIssueAttachmentUnprocessableEntity describes a response with status code 422, with default header values.
+
+APIValidationError is error format response related to input validation
+*/
+type IssueCreateIssueAttachmentUnprocessableEntity struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this issue create issue attachment unprocessable entity response has a 2xx status code
+func (o *IssueCreateIssueAttachmentUnprocessableEntity) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue create issue attachment unprocessable entity response has a 3xx status code
+func (o *IssueCreateIssueAttachmentUnprocessableEntity) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue create issue attachment unprocessable entity response has a 4xx status code
+func (o *IssueCreateIssueAttachmentUnprocessableEntity) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue create issue attachment unprocessable entity response has a 5xx status code
+func (o *IssueCreateIssueAttachmentUnprocessableEntity) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue create issue attachment unprocessable entity response a status code equal to that given
+func (o *IssueCreateIssueAttachmentUnprocessableEntity) IsCode(code int) bool {
+	return code == 422
+}
+
+// Code gets the status code for the issue create issue attachment unprocessable entity response
+func (o *IssueCreateIssueAttachmentUnprocessableEntity) Code() int {
+	return 422
+}
+
+func (o *IssueCreateIssueAttachmentUnprocessableEntity) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/{index}/assets][%d] issueCreateIssueAttachmentUnprocessableEntity", 422)
+}
+
+func (o *IssueCreateIssueAttachmentUnprocessableEntity) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/{index}/assets][%d] issueCreateIssueAttachmentUnprocessableEntity", 422)
+}
+
+func (o *IssueCreateIssueAttachmentUnprocessableEntity) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewIssueCreateIssueAttachmentLocked creates a IssueCreateIssueAttachmentLocked with default headers values
+func NewIssueCreateIssueAttachmentLocked() *IssueCreateIssueAttachmentLocked {
+	return &IssueCreateIssueAttachmentLocked{}
+}
+
+/*
+IssueCreateIssueAttachmentLocked describes a response with status code 423, with default header values.
+
+APIRepoArchivedError is an error that is raised when an archived repo should be modified
+*/
+type IssueCreateIssueAttachmentLocked struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this issue create issue attachment locked response has a 2xx status code
+func (o *IssueCreateIssueAttachmentLocked) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue create issue attachment locked response has a 3xx status code
+func (o *IssueCreateIssueAttachmentLocked) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue create issue attachment locked response has a 4xx status code
+func (o *IssueCreateIssueAttachmentLocked) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue create issue attachment locked response has a 5xx status code
+func (o *IssueCreateIssueAttachmentLocked) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue create issue attachment locked response a status code equal to that given
+func (o *IssueCreateIssueAttachmentLocked) IsCode(code int) bool {
+	return code == 423
+}
+
+// Code gets the status code for the issue create issue attachment locked response
+func (o *IssueCreateIssueAttachmentLocked) Code() int {
+	return 423
+}
+
+func (o *IssueCreateIssueAttachmentLocked) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/{index}/assets][%d] issueCreateIssueAttachmentLocked", 423)
+}
+
+func (o *IssueCreateIssueAttachmentLocked) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/{index}/assets][%d] issueCreateIssueAttachmentLocked", 423)
+}
+
+func (o *IssueCreateIssueAttachmentLocked) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_create_issue_blocking_parameters.go b/bots-common/gitea-generated/client/issue/issue_create_issue_blocking_parameters.go
new file mode 100644
index 0000000..3dc14f2
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_create_issue_blocking_parameters.go
@@ -0,0 +1,216 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewIssueCreateIssueBlockingParams creates a new IssueCreateIssueBlockingParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewIssueCreateIssueBlockingParams() *IssueCreateIssueBlockingParams {
+	return &IssueCreateIssueBlockingParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewIssueCreateIssueBlockingParamsWithTimeout creates a new IssueCreateIssueBlockingParams object
+// with the ability to set a timeout on a request.
+func NewIssueCreateIssueBlockingParamsWithTimeout(timeout time.Duration) *IssueCreateIssueBlockingParams {
+	return &IssueCreateIssueBlockingParams{
+		timeout: timeout,
+	}
+}
+
+// NewIssueCreateIssueBlockingParamsWithContext creates a new IssueCreateIssueBlockingParams object
+// with the ability to set a context for a request.
+func NewIssueCreateIssueBlockingParamsWithContext(ctx context.Context) *IssueCreateIssueBlockingParams {
+	return &IssueCreateIssueBlockingParams{
+		Context: ctx,
+	}
+}
+
+// NewIssueCreateIssueBlockingParamsWithHTTPClient creates a new IssueCreateIssueBlockingParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewIssueCreateIssueBlockingParamsWithHTTPClient(client *http.Client) *IssueCreateIssueBlockingParams {
+	return &IssueCreateIssueBlockingParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+IssueCreateIssueBlockingParams contains all the parameters to send to the API endpoint
+
+	for the issue create issue blocking operation.
+
+	Typically these are written to a http.Request.
+*/
+type IssueCreateIssueBlockingParams struct {
+
+	// Body.
+	Body *models.IssueMeta
+
+	/* Index.
+
+	   index of the issue
+	*/
+	Index string
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the issue create issue blocking params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueCreateIssueBlockingParams) WithDefaults() *IssueCreateIssueBlockingParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the issue create issue blocking params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueCreateIssueBlockingParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the issue create issue blocking params
+func (o *IssueCreateIssueBlockingParams) WithTimeout(timeout time.Duration) *IssueCreateIssueBlockingParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the issue create issue blocking params
+func (o *IssueCreateIssueBlockingParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the issue create issue blocking params
+func (o *IssueCreateIssueBlockingParams) WithContext(ctx context.Context) *IssueCreateIssueBlockingParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the issue create issue blocking params
+func (o *IssueCreateIssueBlockingParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the issue create issue blocking params
+func (o *IssueCreateIssueBlockingParams) WithHTTPClient(client *http.Client) *IssueCreateIssueBlockingParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the issue create issue blocking params
+func (o *IssueCreateIssueBlockingParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the issue create issue blocking params
+func (o *IssueCreateIssueBlockingParams) WithBody(body *models.IssueMeta) *IssueCreateIssueBlockingParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the issue create issue blocking params
+func (o *IssueCreateIssueBlockingParams) SetBody(body *models.IssueMeta) {
+	o.Body = body
+}
+
+// WithIndex adds the index to the issue create issue blocking params
+func (o *IssueCreateIssueBlockingParams) WithIndex(index string) *IssueCreateIssueBlockingParams {
+	o.SetIndex(index)
+	return o
+}
+
+// SetIndex adds the index to the issue create issue blocking params
+func (o *IssueCreateIssueBlockingParams) SetIndex(index string) {
+	o.Index = index
+}
+
+// WithOwner adds the owner to the issue create issue blocking params
+func (o *IssueCreateIssueBlockingParams) WithOwner(owner string) *IssueCreateIssueBlockingParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the issue create issue blocking params
+func (o *IssueCreateIssueBlockingParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the issue create issue blocking params
+func (o *IssueCreateIssueBlockingParams) WithRepo(repo string) *IssueCreateIssueBlockingParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the issue create issue blocking params
+func (o *IssueCreateIssueBlockingParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *IssueCreateIssueBlockingParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	// path param index
+	if err := r.SetPathParam("index", o.Index); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_create_issue_blocking_responses.go b/bots-common/gitea-generated/client/issue/issue_create_issue_blocking_responses.go
new file mode 100644
index 0000000..12c494c
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_create_issue_blocking_responses.go
@@ -0,0 +1,168 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// IssueCreateIssueBlockingReader is a Reader for the IssueCreateIssueBlocking structure.
+type IssueCreateIssueBlockingReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *IssueCreateIssueBlockingReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 201:
+		result := NewIssueCreateIssueBlockingCreated()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewIssueCreateIssueBlockingNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[POST /repos/{owner}/{repo}/issues/{index}/blocks] issueCreateIssueBlocking", response, response.Code())
+	}
+}
+
+// NewIssueCreateIssueBlockingCreated creates a IssueCreateIssueBlockingCreated with default headers values
+func NewIssueCreateIssueBlockingCreated() *IssueCreateIssueBlockingCreated {
+	return &IssueCreateIssueBlockingCreated{}
+}
+
+/*
+IssueCreateIssueBlockingCreated describes a response with status code 201, with default header values.
+
+Issue
+*/
+type IssueCreateIssueBlockingCreated struct {
+	Payload *models.Issue
+}
+
+// IsSuccess returns true when this issue create issue blocking created response has a 2xx status code
+func (o *IssueCreateIssueBlockingCreated) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this issue create issue blocking created response has a 3xx status code
+func (o *IssueCreateIssueBlockingCreated) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue create issue blocking created response has a 4xx status code
+func (o *IssueCreateIssueBlockingCreated) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this issue create issue blocking created response has a 5xx status code
+func (o *IssueCreateIssueBlockingCreated) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue create issue blocking created response a status code equal to that given
+func (o *IssueCreateIssueBlockingCreated) IsCode(code int) bool {
+	return code == 201
+}
+
+// Code gets the status code for the issue create issue blocking created response
+func (o *IssueCreateIssueBlockingCreated) Code() int {
+	return 201
+}
+
+func (o *IssueCreateIssueBlockingCreated) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/{index}/blocks][%d] issueCreateIssueBlockingCreated %s", 201, payload)
+}
+
+func (o *IssueCreateIssueBlockingCreated) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/{index}/blocks][%d] issueCreateIssueBlockingCreated %s", 201, payload)
+}
+
+func (o *IssueCreateIssueBlockingCreated) GetPayload() *models.Issue {
+	return o.Payload
+}
+
+func (o *IssueCreateIssueBlockingCreated) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.Issue)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewIssueCreateIssueBlockingNotFound creates a IssueCreateIssueBlockingNotFound with default headers values
+func NewIssueCreateIssueBlockingNotFound() *IssueCreateIssueBlockingNotFound {
+	return &IssueCreateIssueBlockingNotFound{}
+}
+
+/*
+IssueCreateIssueBlockingNotFound describes a response with status code 404, with default header values.
+
+the issue does not exist
+*/
+type IssueCreateIssueBlockingNotFound struct {
+}
+
+// IsSuccess returns true when this issue create issue blocking not found response has a 2xx status code
+func (o *IssueCreateIssueBlockingNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue create issue blocking not found response has a 3xx status code
+func (o *IssueCreateIssueBlockingNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue create issue blocking not found response has a 4xx status code
+func (o *IssueCreateIssueBlockingNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue create issue blocking not found response has a 5xx status code
+func (o *IssueCreateIssueBlockingNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue create issue blocking not found response a status code equal to that given
+func (o *IssueCreateIssueBlockingNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the issue create issue blocking not found response
+func (o *IssueCreateIssueBlockingNotFound) Code() int {
+	return 404
+}
+
+func (o *IssueCreateIssueBlockingNotFound) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/{index}/blocks][%d] issueCreateIssueBlockingNotFound", 404)
+}
+
+func (o *IssueCreateIssueBlockingNotFound) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/{index}/blocks][%d] issueCreateIssueBlockingNotFound", 404)
+}
+
+func (o *IssueCreateIssueBlockingNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_create_issue_comment_attachment_parameters.go b/bots-common/gitea-generated/client/issue/issue_create_issue_comment_attachment_parameters.go
new file mode 100644
index 0000000..5d2c4f7
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_create_issue_comment_attachment_parameters.go
@@ -0,0 +1,253 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewIssueCreateIssueCommentAttachmentParams creates a new IssueCreateIssueCommentAttachmentParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewIssueCreateIssueCommentAttachmentParams() *IssueCreateIssueCommentAttachmentParams {
+	return &IssueCreateIssueCommentAttachmentParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewIssueCreateIssueCommentAttachmentParamsWithTimeout creates a new IssueCreateIssueCommentAttachmentParams object
+// with the ability to set a timeout on a request.
+func NewIssueCreateIssueCommentAttachmentParamsWithTimeout(timeout time.Duration) *IssueCreateIssueCommentAttachmentParams {
+	return &IssueCreateIssueCommentAttachmentParams{
+		timeout: timeout,
+	}
+}
+
+// NewIssueCreateIssueCommentAttachmentParamsWithContext creates a new IssueCreateIssueCommentAttachmentParams object
+// with the ability to set a context for a request.
+func NewIssueCreateIssueCommentAttachmentParamsWithContext(ctx context.Context) *IssueCreateIssueCommentAttachmentParams {
+	return &IssueCreateIssueCommentAttachmentParams{
+		Context: ctx,
+	}
+}
+
+// NewIssueCreateIssueCommentAttachmentParamsWithHTTPClient creates a new IssueCreateIssueCommentAttachmentParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewIssueCreateIssueCommentAttachmentParamsWithHTTPClient(client *http.Client) *IssueCreateIssueCommentAttachmentParams {
+	return &IssueCreateIssueCommentAttachmentParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+IssueCreateIssueCommentAttachmentParams contains all the parameters to send to the API endpoint
+
+	for the issue create issue comment attachment operation.
+
+	Typically these are written to a http.Request.
+*/
+type IssueCreateIssueCommentAttachmentParams struct {
+
+	/* Attachment.
+
+	   attachment to upload
+	*/
+	Attachment runtime.NamedReadCloser
+
+	/* ID.
+
+	   id of the comment
+
+	   Format: int64
+	*/
+	ID int64
+
+	/* Name.
+
+	   name of the attachment
+	*/
+	Name *string
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the issue create issue comment attachment params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueCreateIssueCommentAttachmentParams) WithDefaults() *IssueCreateIssueCommentAttachmentParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the issue create issue comment attachment params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueCreateIssueCommentAttachmentParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the issue create issue comment attachment params
+func (o *IssueCreateIssueCommentAttachmentParams) WithTimeout(timeout time.Duration) *IssueCreateIssueCommentAttachmentParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the issue create issue comment attachment params
+func (o *IssueCreateIssueCommentAttachmentParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the issue create issue comment attachment params
+func (o *IssueCreateIssueCommentAttachmentParams) WithContext(ctx context.Context) *IssueCreateIssueCommentAttachmentParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the issue create issue comment attachment params
+func (o *IssueCreateIssueCommentAttachmentParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the issue create issue comment attachment params
+func (o *IssueCreateIssueCommentAttachmentParams) WithHTTPClient(client *http.Client) *IssueCreateIssueCommentAttachmentParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the issue create issue comment attachment params
+func (o *IssueCreateIssueCommentAttachmentParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithAttachment adds the attachment to the issue create issue comment attachment params
+func (o *IssueCreateIssueCommentAttachmentParams) WithAttachment(attachment runtime.NamedReadCloser) *IssueCreateIssueCommentAttachmentParams {
+	o.SetAttachment(attachment)
+	return o
+}
+
+// SetAttachment adds the attachment to the issue create issue comment attachment params
+func (o *IssueCreateIssueCommentAttachmentParams) SetAttachment(attachment runtime.NamedReadCloser) {
+	o.Attachment = attachment
+}
+
+// WithID adds the id to the issue create issue comment attachment params
+func (o *IssueCreateIssueCommentAttachmentParams) WithID(id int64) *IssueCreateIssueCommentAttachmentParams {
+	o.SetID(id)
+	return o
+}
+
+// SetID adds the id to the issue create issue comment attachment params
+func (o *IssueCreateIssueCommentAttachmentParams) SetID(id int64) {
+	o.ID = id
+}
+
+// WithName adds the name to the issue create issue comment attachment params
+func (o *IssueCreateIssueCommentAttachmentParams) WithName(name *string) *IssueCreateIssueCommentAttachmentParams {
+	o.SetName(name)
+	return o
+}
+
+// SetName adds the name to the issue create issue comment attachment params
+func (o *IssueCreateIssueCommentAttachmentParams) SetName(name *string) {
+	o.Name = name
+}
+
+// WithOwner adds the owner to the issue create issue comment attachment params
+func (o *IssueCreateIssueCommentAttachmentParams) WithOwner(owner string) *IssueCreateIssueCommentAttachmentParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the issue create issue comment attachment params
+func (o *IssueCreateIssueCommentAttachmentParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the issue create issue comment attachment params
+func (o *IssueCreateIssueCommentAttachmentParams) WithRepo(repo string) *IssueCreateIssueCommentAttachmentParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the issue create issue comment attachment params
+func (o *IssueCreateIssueCommentAttachmentParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *IssueCreateIssueCommentAttachmentParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	// form file param attachment
+	if err := r.SetFileParam("attachment", o.Attachment); err != nil {
+		return err
+	}
+
+	// path param id
+	if err := r.SetPathParam("id", swag.FormatInt64(o.ID)); err != nil {
+		return err
+	}
+
+	if o.Name != nil {
+
+		// query param name
+		var qrName string
+
+		if o.Name != nil {
+			qrName = *o.Name
+		}
+		qName := qrName
+		if qName != "" {
+
+			if err := r.SetQueryParam("name", qName); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_create_issue_comment_attachment_responses.go b/bots-common/gitea-generated/client/issue/issue_create_issue_comment_attachment_responses.go
new file mode 100644
index 0000000..07c5296
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_create_issue_comment_attachment_responses.go
@@ -0,0 +1,496 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// IssueCreateIssueCommentAttachmentReader is a Reader for the IssueCreateIssueCommentAttachment structure.
+type IssueCreateIssueCommentAttachmentReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *IssueCreateIssueCommentAttachmentReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 201:
+		result := NewIssueCreateIssueCommentAttachmentCreated()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 400:
+		result := NewIssueCreateIssueCommentAttachmentBadRequest()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 403:
+		result := NewIssueCreateIssueCommentAttachmentForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewIssueCreateIssueCommentAttachmentNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 422:
+		result := NewIssueCreateIssueCommentAttachmentUnprocessableEntity()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 423:
+		result := NewIssueCreateIssueCommentAttachmentLocked()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[POST /repos/{owner}/{repo}/issues/comments/{id}/assets] issueCreateIssueCommentAttachment", response, response.Code())
+	}
+}
+
+// NewIssueCreateIssueCommentAttachmentCreated creates a IssueCreateIssueCommentAttachmentCreated with default headers values
+func NewIssueCreateIssueCommentAttachmentCreated() *IssueCreateIssueCommentAttachmentCreated {
+	return &IssueCreateIssueCommentAttachmentCreated{}
+}
+
+/*
+IssueCreateIssueCommentAttachmentCreated describes a response with status code 201, with default header values.
+
+Attachment
+*/
+type IssueCreateIssueCommentAttachmentCreated struct {
+	Payload *models.Attachment
+}
+
+// IsSuccess returns true when this issue create issue comment attachment created response has a 2xx status code
+func (o *IssueCreateIssueCommentAttachmentCreated) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this issue create issue comment attachment created response has a 3xx status code
+func (o *IssueCreateIssueCommentAttachmentCreated) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue create issue comment attachment created response has a 4xx status code
+func (o *IssueCreateIssueCommentAttachmentCreated) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this issue create issue comment attachment created response has a 5xx status code
+func (o *IssueCreateIssueCommentAttachmentCreated) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue create issue comment attachment created response a status code equal to that given
+func (o *IssueCreateIssueCommentAttachmentCreated) IsCode(code int) bool {
+	return code == 201
+}
+
+// Code gets the status code for the issue create issue comment attachment created response
+func (o *IssueCreateIssueCommentAttachmentCreated) Code() int {
+	return 201
+}
+
+func (o *IssueCreateIssueCommentAttachmentCreated) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/comments/{id}/assets][%d] issueCreateIssueCommentAttachmentCreated %s", 201, payload)
+}
+
+func (o *IssueCreateIssueCommentAttachmentCreated) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/comments/{id}/assets][%d] issueCreateIssueCommentAttachmentCreated %s", 201, payload)
+}
+
+func (o *IssueCreateIssueCommentAttachmentCreated) GetPayload() *models.Attachment {
+	return o.Payload
+}
+
+func (o *IssueCreateIssueCommentAttachmentCreated) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.Attachment)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewIssueCreateIssueCommentAttachmentBadRequest creates a IssueCreateIssueCommentAttachmentBadRequest with default headers values
+func NewIssueCreateIssueCommentAttachmentBadRequest() *IssueCreateIssueCommentAttachmentBadRequest {
+	return &IssueCreateIssueCommentAttachmentBadRequest{}
+}
+
+/*
+IssueCreateIssueCommentAttachmentBadRequest describes a response with status code 400, with default header values.
+
+APIError is error format response
+*/
+type IssueCreateIssueCommentAttachmentBadRequest struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this issue create issue comment attachment bad request response has a 2xx status code
+func (o *IssueCreateIssueCommentAttachmentBadRequest) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue create issue comment attachment bad request response has a 3xx status code
+func (o *IssueCreateIssueCommentAttachmentBadRequest) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue create issue comment attachment bad request response has a 4xx status code
+func (o *IssueCreateIssueCommentAttachmentBadRequest) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue create issue comment attachment bad request response has a 5xx status code
+func (o *IssueCreateIssueCommentAttachmentBadRequest) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue create issue comment attachment bad request response a status code equal to that given
+func (o *IssueCreateIssueCommentAttachmentBadRequest) IsCode(code int) bool {
+	return code == 400
+}
+
+// Code gets the status code for the issue create issue comment attachment bad request response
+func (o *IssueCreateIssueCommentAttachmentBadRequest) Code() int {
+	return 400
+}
+
+func (o *IssueCreateIssueCommentAttachmentBadRequest) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/comments/{id}/assets][%d] issueCreateIssueCommentAttachmentBadRequest", 400)
+}
+
+func (o *IssueCreateIssueCommentAttachmentBadRequest) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/comments/{id}/assets][%d] issueCreateIssueCommentAttachmentBadRequest", 400)
+}
+
+func (o *IssueCreateIssueCommentAttachmentBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewIssueCreateIssueCommentAttachmentForbidden creates a IssueCreateIssueCommentAttachmentForbidden with default headers values
+func NewIssueCreateIssueCommentAttachmentForbidden() *IssueCreateIssueCommentAttachmentForbidden {
+	return &IssueCreateIssueCommentAttachmentForbidden{}
+}
+
+/*
+IssueCreateIssueCommentAttachmentForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type IssueCreateIssueCommentAttachmentForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this issue create issue comment attachment forbidden response has a 2xx status code
+func (o *IssueCreateIssueCommentAttachmentForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue create issue comment attachment forbidden response has a 3xx status code
+func (o *IssueCreateIssueCommentAttachmentForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue create issue comment attachment forbidden response has a 4xx status code
+func (o *IssueCreateIssueCommentAttachmentForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue create issue comment attachment forbidden response has a 5xx status code
+func (o *IssueCreateIssueCommentAttachmentForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue create issue comment attachment forbidden response a status code equal to that given
+func (o *IssueCreateIssueCommentAttachmentForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the issue create issue comment attachment forbidden response
+func (o *IssueCreateIssueCommentAttachmentForbidden) Code() int {
+	return 403
+}
+
+func (o *IssueCreateIssueCommentAttachmentForbidden) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/comments/{id}/assets][%d] issueCreateIssueCommentAttachmentForbidden", 403)
+}
+
+func (o *IssueCreateIssueCommentAttachmentForbidden) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/comments/{id}/assets][%d] issueCreateIssueCommentAttachmentForbidden", 403)
+}
+
+func (o *IssueCreateIssueCommentAttachmentForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewIssueCreateIssueCommentAttachmentNotFound creates a IssueCreateIssueCommentAttachmentNotFound with default headers values
+func NewIssueCreateIssueCommentAttachmentNotFound() *IssueCreateIssueCommentAttachmentNotFound {
+	return &IssueCreateIssueCommentAttachmentNotFound{}
+}
+
+/*
+IssueCreateIssueCommentAttachmentNotFound describes a response with status code 404, with default header values.
+
+APIError is error format response
+*/
+type IssueCreateIssueCommentAttachmentNotFound struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this issue create issue comment attachment not found response has a 2xx status code
+func (o *IssueCreateIssueCommentAttachmentNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue create issue comment attachment not found response has a 3xx status code
+func (o *IssueCreateIssueCommentAttachmentNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue create issue comment attachment not found response has a 4xx status code
+func (o *IssueCreateIssueCommentAttachmentNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue create issue comment attachment not found response has a 5xx status code
+func (o *IssueCreateIssueCommentAttachmentNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue create issue comment attachment not found response a status code equal to that given
+func (o *IssueCreateIssueCommentAttachmentNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the issue create issue comment attachment not found response
+func (o *IssueCreateIssueCommentAttachmentNotFound) Code() int {
+	return 404
+}
+
+func (o *IssueCreateIssueCommentAttachmentNotFound) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/comments/{id}/assets][%d] issueCreateIssueCommentAttachmentNotFound", 404)
+}
+
+func (o *IssueCreateIssueCommentAttachmentNotFound) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/comments/{id}/assets][%d] issueCreateIssueCommentAttachmentNotFound", 404)
+}
+
+func (o *IssueCreateIssueCommentAttachmentNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewIssueCreateIssueCommentAttachmentUnprocessableEntity creates a IssueCreateIssueCommentAttachmentUnprocessableEntity with default headers values
+func NewIssueCreateIssueCommentAttachmentUnprocessableEntity() *IssueCreateIssueCommentAttachmentUnprocessableEntity {
+	return &IssueCreateIssueCommentAttachmentUnprocessableEntity{}
+}
+
+/*
+IssueCreateIssueCommentAttachmentUnprocessableEntity describes a response with status code 422, with default header values.
+
+APIValidationError is error format response related to input validation
+*/
+type IssueCreateIssueCommentAttachmentUnprocessableEntity struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this issue create issue comment attachment unprocessable entity response has a 2xx status code
+func (o *IssueCreateIssueCommentAttachmentUnprocessableEntity) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue create issue comment attachment unprocessable entity response has a 3xx status code
+func (o *IssueCreateIssueCommentAttachmentUnprocessableEntity) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue create issue comment attachment unprocessable entity response has a 4xx status code
+func (o *IssueCreateIssueCommentAttachmentUnprocessableEntity) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue create issue comment attachment unprocessable entity response has a 5xx status code
+func (o *IssueCreateIssueCommentAttachmentUnprocessableEntity) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue create issue comment attachment unprocessable entity response a status code equal to that given
+func (o *IssueCreateIssueCommentAttachmentUnprocessableEntity) IsCode(code int) bool {
+	return code == 422
+}
+
+// Code gets the status code for the issue create issue comment attachment unprocessable entity response
+func (o *IssueCreateIssueCommentAttachmentUnprocessableEntity) Code() int {
+	return 422
+}
+
+func (o *IssueCreateIssueCommentAttachmentUnprocessableEntity) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/comments/{id}/assets][%d] issueCreateIssueCommentAttachmentUnprocessableEntity", 422)
+}
+
+func (o *IssueCreateIssueCommentAttachmentUnprocessableEntity) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/comments/{id}/assets][%d] issueCreateIssueCommentAttachmentUnprocessableEntity", 422)
+}
+
+func (o *IssueCreateIssueCommentAttachmentUnprocessableEntity) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewIssueCreateIssueCommentAttachmentLocked creates a IssueCreateIssueCommentAttachmentLocked with default headers values
+func NewIssueCreateIssueCommentAttachmentLocked() *IssueCreateIssueCommentAttachmentLocked {
+	return &IssueCreateIssueCommentAttachmentLocked{}
+}
+
+/*
+IssueCreateIssueCommentAttachmentLocked describes a response with status code 423, with default header values.
+
+APIRepoArchivedError is an error that is raised when an archived repo should be modified
+*/
+type IssueCreateIssueCommentAttachmentLocked struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this issue create issue comment attachment locked response has a 2xx status code
+func (o *IssueCreateIssueCommentAttachmentLocked) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue create issue comment attachment locked response has a 3xx status code
+func (o *IssueCreateIssueCommentAttachmentLocked) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue create issue comment attachment locked response has a 4xx status code
+func (o *IssueCreateIssueCommentAttachmentLocked) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue create issue comment attachment locked response has a 5xx status code
+func (o *IssueCreateIssueCommentAttachmentLocked) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue create issue comment attachment locked response a status code equal to that given
+func (o *IssueCreateIssueCommentAttachmentLocked) IsCode(code int) bool {
+	return code == 423
+}
+
+// Code gets the status code for the issue create issue comment attachment locked response
+func (o *IssueCreateIssueCommentAttachmentLocked) Code() int {
+	return 423
+}
+
+func (o *IssueCreateIssueCommentAttachmentLocked) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/comments/{id}/assets][%d] issueCreateIssueCommentAttachmentLocked", 423)
+}
+
+func (o *IssueCreateIssueCommentAttachmentLocked) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/comments/{id}/assets][%d] issueCreateIssueCommentAttachmentLocked", 423)
+}
+
+func (o *IssueCreateIssueCommentAttachmentLocked) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_create_issue_dependencies_parameters.go b/bots-common/gitea-generated/client/issue/issue_create_issue_dependencies_parameters.go
new file mode 100644
index 0000000..f152ffb
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_create_issue_dependencies_parameters.go
@@ -0,0 +1,216 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewIssueCreateIssueDependenciesParams creates a new IssueCreateIssueDependenciesParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewIssueCreateIssueDependenciesParams() *IssueCreateIssueDependenciesParams {
+	return &IssueCreateIssueDependenciesParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewIssueCreateIssueDependenciesParamsWithTimeout creates a new IssueCreateIssueDependenciesParams object
+// with the ability to set a timeout on a request.
+func NewIssueCreateIssueDependenciesParamsWithTimeout(timeout time.Duration) *IssueCreateIssueDependenciesParams {
+	return &IssueCreateIssueDependenciesParams{
+		timeout: timeout,
+	}
+}
+
+// NewIssueCreateIssueDependenciesParamsWithContext creates a new IssueCreateIssueDependenciesParams object
+// with the ability to set a context for a request.
+func NewIssueCreateIssueDependenciesParamsWithContext(ctx context.Context) *IssueCreateIssueDependenciesParams {
+	return &IssueCreateIssueDependenciesParams{
+		Context: ctx,
+	}
+}
+
+// NewIssueCreateIssueDependenciesParamsWithHTTPClient creates a new IssueCreateIssueDependenciesParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewIssueCreateIssueDependenciesParamsWithHTTPClient(client *http.Client) *IssueCreateIssueDependenciesParams {
+	return &IssueCreateIssueDependenciesParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+IssueCreateIssueDependenciesParams contains all the parameters to send to the API endpoint
+
+	for the issue create issue dependencies operation.
+
+	Typically these are written to a http.Request.
+*/
+type IssueCreateIssueDependenciesParams struct {
+
+	// Body.
+	Body *models.IssueMeta
+
+	/* Index.
+
+	   index of the issue
+	*/
+	Index string
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the issue create issue dependencies params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueCreateIssueDependenciesParams) WithDefaults() *IssueCreateIssueDependenciesParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the issue create issue dependencies params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueCreateIssueDependenciesParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the issue create issue dependencies params
+func (o *IssueCreateIssueDependenciesParams) WithTimeout(timeout time.Duration) *IssueCreateIssueDependenciesParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the issue create issue dependencies params
+func (o *IssueCreateIssueDependenciesParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the issue create issue dependencies params
+func (o *IssueCreateIssueDependenciesParams) WithContext(ctx context.Context) *IssueCreateIssueDependenciesParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the issue create issue dependencies params
+func (o *IssueCreateIssueDependenciesParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the issue create issue dependencies params
+func (o *IssueCreateIssueDependenciesParams) WithHTTPClient(client *http.Client) *IssueCreateIssueDependenciesParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the issue create issue dependencies params
+func (o *IssueCreateIssueDependenciesParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the issue create issue dependencies params
+func (o *IssueCreateIssueDependenciesParams) WithBody(body *models.IssueMeta) *IssueCreateIssueDependenciesParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the issue create issue dependencies params
+func (o *IssueCreateIssueDependenciesParams) SetBody(body *models.IssueMeta) {
+	o.Body = body
+}
+
+// WithIndex adds the index to the issue create issue dependencies params
+func (o *IssueCreateIssueDependenciesParams) WithIndex(index string) *IssueCreateIssueDependenciesParams {
+	o.SetIndex(index)
+	return o
+}
+
+// SetIndex adds the index to the issue create issue dependencies params
+func (o *IssueCreateIssueDependenciesParams) SetIndex(index string) {
+	o.Index = index
+}
+
+// WithOwner adds the owner to the issue create issue dependencies params
+func (o *IssueCreateIssueDependenciesParams) WithOwner(owner string) *IssueCreateIssueDependenciesParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the issue create issue dependencies params
+func (o *IssueCreateIssueDependenciesParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the issue create issue dependencies params
+func (o *IssueCreateIssueDependenciesParams) WithRepo(repo string) *IssueCreateIssueDependenciesParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the issue create issue dependencies params
+func (o *IssueCreateIssueDependenciesParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *IssueCreateIssueDependenciesParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	// path param index
+	if err := r.SetPathParam("index", o.Index); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_create_issue_dependencies_responses.go b/bots-common/gitea-generated/client/issue/issue_create_issue_dependencies_responses.go
new file mode 100644
index 0000000..f2a4ea2
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_create_issue_dependencies_responses.go
@@ -0,0 +1,246 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// IssueCreateIssueDependenciesReader is a Reader for the IssueCreateIssueDependencies structure.
+type IssueCreateIssueDependenciesReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *IssueCreateIssueDependenciesReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 201:
+		result := NewIssueCreateIssueDependenciesCreated()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewIssueCreateIssueDependenciesNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 423:
+		result := NewIssueCreateIssueDependenciesLocked()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[POST /repos/{owner}/{repo}/issues/{index}/dependencies] issueCreateIssueDependencies", response, response.Code())
+	}
+}
+
+// NewIssueCreateIssueDependenciesCreated creates a IssueCreateIssueDependenciesCreated with default headers values
+func NewIssueCreateIssueDependenciesCreated() *IssueCreateIssueDependenciesCreated {
+	return &IssueCreateIssueDependenciesCreated{}
+}
+
+/*
+IssueCreateIssueDependenciesCreated describes a response with status code 201, with default header values.
+
+Issue
+*/
+type IssueCreateIssueDependenciesCreated struct {
+	Payload *models.Issue
+}
+
+// IsSuccess returns true when this issue create issue dependencies created response has a 2xx status code
+func (o *IssueCreateIssueDependenciesCreated) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this issue create issue dependencies created response has a 3xx status code
+func (o *IssueCreateIssueDependenciesCreated) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue create issue dependencies created response has a 4xx status code
+func (o *IssueCreateIssueDependenciesCreated) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this issue create issue dependencies created response has a 5xx status code
+func (o *IssueCreateIssueDependenciesCreated) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue create issue dependencies created response a status code equal to that given
+func (o *IssueCreateIssueDependenciesCreated) IsCode(code int) bool {
+	return code == 201
+}
+
+// Code gets the status code for the issue create issue dependencies created response
+func (o *IssueCreateIssueDependenciesCreated) Code() int {
+	return 201
+}
+
+func (o *IssueCreateIssueDependenciesCreated) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/{index}/dependencies][%d] issueCreateIssueDependenciesCreated %s", 201, payload)
+}
+
+func (o *IssueCreateIssueDependenciesCreated) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/{index}/dependencies][%d] issueCreateIssueDependenciesCreated %s", 201, payload)
+}
+
+func (o *IssueCreateIssueDependenciesCreated) GetPayload() *models.Issue {
+	return o.Payload
+}
+
+func (o *IssueCreateIssueDependenciesCreated) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.Issue)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewIssueCreateIssueDependenciesNotFound creates a IssueCreateIssueDependenciesNotFound with default headers values
+func NewIssueCreateIssueDependenciesNotFound() *IssueCreateIssueDependenciesNotFound {
+	return &IssueCreateIssueDependenciesNotFound{}
+}
+
+/*
+IssueCreateIssueDependenciesNotFound describes a response with status code 404, with default header values.
+
+the issue does not exist
+*/
+type IssueCreateIssueDependenciesNotFound struct {
+}
+
+// IsSuccess returns true when this issue create issue dependencies not found response has a 2xx status code
+func (o *IssueCreateIssueDependenciesNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue create issue dependencies not found response has a 3xx status code
+func (o *IssueCreateIssueDependenciesNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue create issue dependencies not found response has a 4xx status code
+func (o *IssueCreateIssueDependenciesNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue create issue dependencies not found response has a 5xx status code
+func (o *IssueCreateIssueDependenciesNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue create issue dependencies not found response a status code equal to that given
+func (o *IssueCreateIssueDependenciesNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the issue create issue dependencies not found response
+func (o *IssueCreateIssueDependenciesNotFound) Code() int {
+	return 404
+}
+
+func (o *IssueCreateIssueDependenciesNotFound) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/{index}/dependencies][%d] issueCreateIssueDependenciesNotFound", 404)
+}
+
+func (o *IssueCreateIssueDependenciesNotFound) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/{index}/dependencies][%d] issueCreateIssueDependenciesNotFound", 404)
+}
+
+func (o *IssueCreateIssueDependenciesNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewIssueCreateIssueDependenciesLocked creates a IssueCreateIssueDependenciesLocked with default headers values
+func NewIssueCreateIssueDependenciesLocked() *IssueCreateIssueDependenciesLocked {
+	return &IssueCreateIssueDependenciesLocked{}
+}
+
+/*
+IssueCreateIssueDependenciesLocked describes a response with status code 423, with default header values.
+
+APIRepoArchivedError is an error that is raised when an archived repo should be modified
+*/
+type IssueCreateIssueDependenciesLocked struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this issue create issue dependencies locked response has a 2xx status code
+func (o *IssueCreateIssueDependenciesLocked) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue create issue dependencies locked response has a 3xx status code
+func (o *IssueCreateIssueDependenciesLocked) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue create issue dependencies locked response has a 4xx status code
+func (o *IssueCreateIssueDependenciesLocked) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue create issue dependencies locked response has a 5xx status code
+func (o *IssueCreateIssueDependenciesLocked) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue create issue dependencies locked response a status code equal to that given
+func (o *IssueCreateIssueDependenciesLocked) IsCode(code int) bool {
+	return code == 423
+}
+
+// Code gets the status code for the issue create issue dependencies locked response
+func (o *IssueCreateIssueDependenciesLocked) Code() int {
+	return 423
+}
+
+func (o *IssueCreateIssueDependenciesLocked) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/{index}/dependencies][%d] issueCreateIssueDependenciesLocked", 423)
+}
+
+func (o *IssueCreateIssueDependenciesLocked) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/{index}/dependencies][%d] issueCreateIssueDependenciesLocked", 423)
+}
+
+func (o *IssueCreateIssueDependenciesLocked) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_create_issue_parameters.go b/bots-common/gitea-generated/client/issue/issue_create_issue_parameters.go
new file mode 100644
index 0000000..4253276
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_create_issue_parameters.go
@@ -0,0 +1,194 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewIssueCreateIssueParams creates a new IssueCreateIssueParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewIssueCreateIssueParams() *IssueCreateIssueParams {
+	return &IssueCreateIssueParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewIssueCreateIssueParamsWithTimeout creates a new IssueCreateIssueParams object
+// with the ability to set a timeout on a request.
+func NewIssueCreateIssueParamsWithTimeout(timeout time.Duration) *IssueCreateIssueParams {
+	return &IssueCreateIssueParams{
+		timeout: timeout,
+	}
+}
+
+// NewIssueCreateIssueParamsWithContext creates a new IssueCreateIssueParams object
+// with the ability to set a context for a request.
+func NewIssueCreateIssueParamsWithContext(ctx context.Context) *IssueCreateIssueParams {
+	return &IssueCreateIssueParams{
+		Context: ctx,
+	}
+}
+
+// NewIssueCreateIssueParamsWithHTTPClient creates a new IssueCreateIssueParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewIssueCreateIssueParamsWithHTTPClient(client *http.Client) *IssueCreateIssueParams {
+	return &IssueCreateIssueParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+IssueCreateIssueParams contains all the parameters to send to the API endpoint
+
+	for the issue create issue operation.
+
+	Typically these are written to a http.Request.
+*/
+type IssueCreateIssueParams struct {
+
+	// Body.
+	Body *models.CreateIssueOption
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the issue create issue params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueCreateIssueParams) WithDefaults() *IssueCreateIssueParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the issue create issue params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueCreateIssueParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the issue create issue params
+func (o *IssueCreateIssueParams) WithTimeout(timeout time.Duration) *IssueCreateIssueParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the issue create issue params
+func (o *IssueCreateIssueParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the issue create issue params
+func (o *IssueCreateIssueParams) WithContext(ctx context.Context) *IssueCreateIssueParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the issue create issue params
+func (o *IssueCreateIssueParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the issue create issue params
+func (o *IssueCreateIssueParams) WithHTTPClient(client *http.Client) *IssueCreateIssueParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the issue create issue params
+func (o *IssueCreateIssueParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the issue create issue params
+func (o *IssueCreateIssueParams) WithBody(body *models.CreateIssueOption) *IssueCreateIssueParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the issue create issue params
+func (o *IssueCreateIssueParams) SetBody(body *models.CreateIssueOption) {
+	o.Body = body
+}
+
+// WithOwner adds the owner to the issue create issue params
+func (o *IssueCreateIssueParams) WithOwner(owner string) *IssueCreateIssueParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the issue create issue params
+func (o *IssueCreateIssueParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the issue create issue params
+func (o *IssueCreateIssueParams) WithRepo(repo string) *IssueCreateIssueParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the issue create issue params
+func (o *IssueCreateIssueParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *IssueCreateIssueParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_create_issue_responses.go b/bots-common/gitea-generated/client/issue/issue_create_issue_responses.go
new file mode 100644
index 0000000..081de1c
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_create_issue_responses.go
@@ -0,0 +1,480 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// IssueCreateIssueReader is a Reader for the IssueCreateIssue structure.
+type IssueCreateIssueReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *IssueCreateIssueReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 201:
+		result := NewIssueCreateIssueCreated()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 403:
+		result := NewIssueCreateIssueForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewIssueCreateIssueNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 412:
+		result := NewIssueCreateIssuePreconditionFailed()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 422:
+		result := NewIssueCreateIssueUnprocessableEntity()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 423:
+		result := NewIssueCreateIssueLocked()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[POST /repos/{owner}/{repo}/issues] issueCreateIssue", response, response.Code())
+	}
+}
+
+// NewIssueCreateIssueCreated creates a IssueCreateIssueCreated with default headers values
+func NewIssueCreateIssueCreated() *IssueCreateIssueCreated {
+	return &IssueCreateIssueCreated{}
+}
+
+/*
+IssueCreateIssueCreated describes a response with status code 201, with default header values.
+
+Issue
+*/
+type IssueCreateIssueCreated struct {
+	Payload *models.Issue
+}
+
+// IsSuccess returns true when this issue create issue created response has a 2xx status code
+func (o *IssueCreateIssueCreated) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this issue create issue created response has a 3xx status code
+func (o *IssueCreateIssueCreated) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue create issue created response has a 4xx status code
+func (o *IssueCreateIssueCreated) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this issue create issue created response has a 5xx status code
+func (o *IssueCreateIssueCreated) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue create issue created response a status code equal to that given
+func (o *IssueCreateIssueCreated) IsCode(code int) bool {
+	return code == 201
+}
+
+// Code gets the status code for the issue create issue created response
+func (o *IssueCreateIssueCreated) Code() int {
+	return 201
+}
+
+func (o *IssueCreateIssueCreated) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues][%d] issueCreateIssueCreated %s", 201, payload)
+}
+
+func (o *IssueCreateIssueCreated) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues][%d] issueCreateIssueCreated %s", 201, payload)
+}
+
+func (o *IssueCreateIssueCreated) GetPayload() *models.Issue {
+	return o.Payload
+}
+
+func (o *IssueCreateIssueCreated) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.Issue)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewIssueCreateIssueForbidden creates a IssueCreateIssueForbidden with default headers values
+func NewIssueCreateIssueForbidden() *IssueCreateIssueForbidden {
+	return &IssueCreateIssueForbidden{}
+}
+
+/*
+IssueCreateIssueForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type IssueCreateIssueForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this issue create issue forbidden response has a 2xx status code
+func (o *IssueCreateIssueForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue create issue forbidden response has a 3xx status code
+func (o *IssueCreateIssueForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue create issue forbidden response has a 4xx status code
+func (o *IssueCreateIssueForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue create issue forbidden response has a 5xx status code
+func (o *IssueCreateIssueForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue create issue forbidden response a status code equal to that given
+func (o *IssueCreateIssueForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the issue create issue forbidden response
+func (o *IssueCreateIssueForbidden) Code() int {
+	return 403
+}
+
+func (o *IssueCreateIssueForbidden) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues][%d] issueCreateIssueForbidden", 403)
+}
+
+func (o *IssueCreateIssueForbidden) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues][%d] issueCreateIssueForbidden", 403)
+}
+
+func (o *IssueCreateIssueForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewIssueCreateIssueNotFound creates a IssueCreateIssueNotFound with default headers values
+func NewIssueCreateIssueNotFound() *IssueCreateIssueNotFound {
+	return &IssueCreateIssueNotFound{}
+}
+
+/*
+IssueCreateIssueNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type IssueCreateIssueNotFound struct {
+}
+
+// IsSuccess returns true when this issue create issue not found response has a 2xx status code
+func (o *IssueCreateIssueNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue create issue not found response has a 3xx status code
+func (o *IssueCreateIssueNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue create issue not found response has a 4xx status code
+func (o *IssueCreateIssueNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue create issue not found response has a 5xx status code
+func (o *IssueCreateIssueNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue create issue not found response a status code equal to that given
+func (o *IssueCreateIssueNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the issue create issue not found response
+func (o *IssueCreateIssueNotFound) Code() int {
+	return 404
+}
+
+func (o *IssueCreateIssueNotFound) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues][%d] issueCreateIssueNotFound", 404)
+}
+
+func (o *IssueCreateIssueNotFound) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues][%d] issueCreateIssueNotFound", 404)
+}
+
+func (o *IssueCreateIssueNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewIssueCreateIssuePreconditionFailed creates a IssueCreateIssuePreconditionFailed with default headers values
+func NewIssueCreateIssuePreconditionFailed() *IssueCreateIssuePreconditionFailed {
+	return &IssueCreateIssuePreconditionFailed{}
+}
+
+/*
+IssueCreateIssuePreconditionFailed describes a response with status code 412, with default header values.
+
+APIError is error format response
+*/
+type IssueCreateIssuePreconditionFailed struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this issue create issue precondition failed response has a 2xx status code
+func (o *IssueCreateIssuePreconditionFailed) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue create issue precondition failed response has a 3xx status code
+func (o *IssueCreateIssuePreconditionFailed) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue create issue precondition failed response has a 4xx status code
+func (o *IssueCreateIssuePreconditionFailed) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue create issue precondition failed response has a 5xx status code
+func (o *IssueCreateIssuePreconditionFailed) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue create issue precondition failed response a status code equal to that given
+func (o *IssueCreateIssuePreconditionFailed) IsCode(code int) bool {
+	return code == 412
+}
+
+// Code gets the status code for the issue create issue precondition failed response
+func (o *IssueCreateIssuePreconditionFailed) Code() int {
+	return 412
+}
+
+func (o *IssueCreateIssuePreconditionFailed) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues][%d] issueCreateIssuePreconditionFailed", 412)
+}
+
+func (o *IssueCreateIssuePreconditionFailed) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues][%d] issueCreateIssuePreconditionFailed", 412)
+}
+
+func (o *IssueCreateIssuePreconditionFailed) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewIssueCreateIssueUnprocessableEntity creates a IssueCreateIssueUnprocessableEntity with default headers values
+func NewIssueCreateIssueUnprocessableEntity() *IssueCreateIssueUnprocessableEntity {
+	return &IssueCreateIssueUnprocessableEntity{}
+}
+
+/*
+IssueCreateIssueUnprocessableEntity describes a response with status code 422, with default header values.
+
+APIValidationError is error format response related to input validation
+*/
+type IssueCreateIssueUnprocessableEntity struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this issue create issue unprocessable entity response has a 2xx status code
+func (o *IssueCreateIssueUnprocessableEntity) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue create issue unprocessable entity response has a 3xx status code
+func (o *IssueCreateIssueUnprocessableEntity) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue create issue unprocessable entity response has a 4xx status code
+func (o *IssueCreateIssueUnprocessableEntity) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue create issue unprocessable entity response has a 5xx status code
+func (o *IssueCreateIssueUnprocessableEntity) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue create issue unprocessable entity response a status code equal to that given
+func (o *IssueCreateIssueUnprocessableEntity) IsCode(code int) bool {
+	return code == 422
+}
+
+// Code gets the status code for the issue create issue unprocessable entity response
+func (o *IssueCreateIssueUnprocessableEntity) Code() int {
+	return 422
+}
+
+func (o *IssueCreateIssueUnprocessableEntity) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues][%d] issueCreateIssueUnprocessableEntity", 422)
+}
+
+func (o *IssueCreateIssueUnprocessableEntity) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues][%d] issueCreateIssueUnprocessableEntity", 422)
+}
+
+func (o *IssueCreateIssueUnprocessableEntity) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewIssueCreateIssueLocked creates a IssueCreateIssueLocked with default headers values
+func NewIssueCreateIssueLocked() *IssueCreateIssueLocked {
+	return &IssueCreateIssueLocked{}
+}
+
+/*
+IssueCreateIssueLocked describes a response with status code 423, with default header values.
+
+APIRepoArchivedError is an error that is raised when an archived repo should be modified
+*/
+type IssueCreateIssueLocked struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this issue create issue locked response has a 2xx status code
+func (o *IssueCreateIssueLocked) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue create issue locked response has a 3xx status code
+func (o *IssueCreateIssueLocked) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue create issue locked response has a 4xx status code
+func (o *IssueCreateIssueLocked) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue create issue locked response has a 5xx status code
+func (o *IssueCreateIssueLocked) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue create issue locked response a status code equal to that given
+func (o *IssueCreateIssueLocked) IsCode(code int) bool {
+	return code == 423
+}
+
+// Code gets the status code for the issue create issue locked response
+func (o *IssueCreateIssueLocked) Code() int {
+	return 423
+}
+
+func (o *IssueCreateIssueLocked) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues][%d] issueCreateIssueLocked", 423)
+}
+
+func (o *IssueCreateIssueLocked) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues][%d] issueCreateIssueLocked", 423)
+}
+
+func (o *IssueCreateIssueLocked) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_create_label_parameters.go b/bots-common/gitea-generated/client/issue/issue_create_label_parameters.go
new file mode 100644
index 0000000..24645a6
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_create_label_parameters.go
@@ -0,0 +1,194 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewIssueCreateLabelParams creates a new IssueCreateLabelParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewIssueCreateLabelParams() *IssueCreateLabelParams {
+	return &IssueCreateLabelParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewIssueCreateLabelParamsWithTimeout creates a new IssueCreateLabelParams object
+// with the ability to set a timeout on a request.
+func NewIssueCreateLabelParamsWithTimeout(timeout time.Duration) *IssueCreateLabelParams {
+	return &IssueCreateLabelParams{
+		timeout: timeout,
+	}
+}
+
+// NewIssueCreateLabelParamsWithContext creates a new IssueCreateLabelParams object
+// with the ability to set a context for a request.
+func NewIssueCreateLabelParamsWithContext(ctx context.Context) *IssueCreateLabelParams {
+	return &IssueCreateLabelParams{
+		Context: ctx,
+	}
+}
+
+// NewIssueCreateLabelParamsWithHTTPClient creates a new IssueCreateLabelParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewIssueCreateLabelParamsWithHTTPClient(client *http.Client) *IssueCreateLabelParams {
+	return &IssueCreateLabelParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+IssueCreateLabelParams contains all the parameters to send to the API endpoint
+
+	for the issue create label operation.
+
+	Typically these are written to a http.Request.
+*/
+type IssueCreateLabelParams struct {
+
+	// Body.
+	Body *models.CreateLabelOption
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the issue create label params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueCreateLabelParams) WithDefaults() *IssueCreateLabelParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the issue create label params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueCreateLabelParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the issue create label params
+func (o *IssueCreateLabelParams) WithTimeout(timeout time.Duration) *IssueCreateLabelParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the issue create label params
+func (o *IssueCreateLabelParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the issue create label params
+func (o *IssueCreateLabelParams) WithContext(ctx context.Context) *IssueCreateLabelParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the issue create label params
+func (o *IssueCreateLabelParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the issue create label params
+func (o *IssueCreateLabelParams) WithHTTPClient(client *http.Client) *IssueCreateLabelParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the issue create label params
+func (o *IssueCreateLabelParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the issue create label params
+func (o *IssueCreateLabelParams) WithBody(body *models.CreateLabelOption) *IssueCreateLabelParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the issue create label params
+func (o *IssueCreateLabelParams) SetBody(body *models.CreateLabelOption) {
+	o.Body = body
+}
+
+// WithOwner adds the owner to the issue create label params
+func (o *IssueCreateLabelParams) WithOwner(owner string) *IssueCreateLabelParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the issue create label params
+func (o *IssueCreateLabelParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the issue create label params
+func (o *IssueCreateLabelParams) WithRepo(repo string) *IssueCreateLabelParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the issue create label params
+func (o *IssueCreateLabelParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *IssueCreateLabelParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_create_label_responses.go b/bots-common/gitea-generated/client/issue/issue_create_label_responses.go
new file mode 100644
index 0000000..40243f0
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_create_label_responses.go
@@ -0,0 +1,246 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// IssueCreateLabelReader is a Reader for the IssueCreateLabel structure.
+type IssueCreateLabelReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *IssueCreateLabelReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 201:
+		result := NewIssueCreateLabelCreated()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewIssueCreateLabelNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 422:
+		result := NewIssueCreateLabelUnprocessableEntity()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[POST /repos/{owner}/{repo}/labels] issueCreateLabel", response, response.Code())
+	}
+}
+
+// NewIssueCreateLabelCreated creates a IssueCreateLabelCreated with default headers values
+func NewIssueCreateLabelCreated() *IssueCreateLabelCreated {
+	return &IssueCreateLabelCreated{}
+}
+
+/*
+IssueCreateLabelCreated describes a response with status code 201, with default header values.
+
+Label
+*/
+type IssueCreateLabelCreated struct {
+	Payload *models.Label
+}
+
+// IsSuccess returns true when this issue create label created response has a 2xx status code
+func (o *IssueCreateLabelCreated) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this issue create label created response has a 3xx status code
+func (o *IssueCreateLabelCreated) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue create label created response has a 4xx status code
+func (o *IssueCreateLabelCreated) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this issue create label created response has a 5xx status code
+func (o *IssueCreateLabelCreated) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue create label created response a status code equal to that given
+func (o *IssueCreateLabelCreated) IsCode(code int) bool {
+	return code == 201
+}
+
+// Code gets the status code for the issue create label created response
+func (o *IssueCreateLabelCreated) Code() int {
+	return 201
+}
+
+func (o *IssueCreateLabelCreated) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/labels][%d] issueCreateLabelCreated %s", 201, payload)
+}
+
+func (o *IssueCreateLabelCreated) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/labels][%d] issueCreateLabelCreated %s", 201, payload)
+}
+
+func (o *IssueCreateLabelCreated) GetPayload() *models.Label {
+	return o.Payload
+}
+
+func (o *IssueCreateLabelCreated) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.Label)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewIssueCreateLabelNotFound creates a IssueCreateLabelNotFound with default headers values
+func NewIssueCreateLabelNotFound() *IssueCreateLabelNotFound {
+	return &IssueCreateLabelNotFound{}
+}
+
+/*
+IssueCreateLabelNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type IssueCreateLabelNotFound struct {
+}
+
+// IsSuccess returns true when this issue create label not found response has a 2xx status code
+func (o *IssueCreateLabelNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue create label not found response has a 3xx status code
+func (o *IssueCreateLabelNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue create label not found response has a 4xx status code
+func (o *IssueCreateLabelNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue create label not found response has a 5xx status code
+func (o *IssueCreateLabelNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue create label not found response a status code equal to that given
+func (o *IssueCreateLabelNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the issue create label not found response
+func (o *IssueCreateLabelNotFound) Code() int {
+	return 404
+}
+
+func (o *IssueCreateLabelNotFound) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/labels][%d] issueCreateLabelNotFound", 404)
+}
+
+func (o *IssueCreateLabelNotFound) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/labels][%d] issueCreateLabelNotFound", 404)
+}
+
+func (o *IssueCreateLabelNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewIssueCreateLabelUnprocessableEntity creates a IssueCreateLabelUnprocessableEntity with default headers values
+func NewIssueCreateLabelUnprocessableEntity() *IssueCreateLabelUnprocessableEntity {
+	return &IssueCreateLabelUnprocessableEntity{}
+}
+
+/*
+IssueCreateLabelUnprocessableEntity describes a response with status code 422, with default header values.
+
+APIValidationError is error format response related to input validation
+*/
+type IssueCreateLabelUnprocessableEntity struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this issue create label unprocessable entity response has a 2xx status code
+func (o *IssueCreateLabelUnprocessableEntity) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue create label unprocessable entity response has a 3xx status code
+func (o *IssueCreateLabelUnprocessableEntity) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue create label unprocessable entity response has a 4xx status code
+func (o *IssueCreateLabelUnprocessableEntity) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue create label unprocessable entity response has a 5xx status code
+func (o *IssueCreateLabelUnprocessableEntity) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue create label unprocessable entity response a status code equal to that given
+func (o *IssueCreateLabelUnprocessableEntity) IsCode(code int) bool {
+	return code == 422
+}
+
+// Code gets the status code for the issue create label unprocessable entity response
+func (o *IssueCreateLabelUnprocessableEntity) Code() int {
+	return 422
+}
+
+func (o *IssueCreateLabelUnprocessableEntity) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/labels][%d] issueCreateLabelUnprocessableEntity", 422)
+}
+
+func (o *IssueCreateLabelUnprocessableEntity) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/labels][%d] issueCreateLabelUnprocessableEntity", 422)
+}
+
+func (o *IssueCreateLabelUnprocessableEntity) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_create_milestone_parameters.go b/bots-common/gitea-generated/client/issue/issue_create_milestone_parameters.go
new file mode 100644
index 0000000..4da8325
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_create_milestone_parameters.go
@@ -0,0 +1,194 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewIssueCreateMilestoneParams creates a new IssueCreateMilestoneParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewIssueCreateMilestoneParams() *IssueCreateMilestoneParams {
+	return &IssueCreateMilestoneParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewIssueCreateMilestoneParamsWithTimeout creates a new IssueCreateMilestoneParams object
+// with the ability to set a timeout on a request.
+func NewIssueCreateMilestoneParamsWithTimeout(timeout time.Duration) *IssueCreateMilestoneParams {
+	return &IssueCreateMilestoneParams{
+		timeout: timeout,
+	}
+}
+
+// NewIssueCreateMilestoneParamsWithContext creates a new IssueCreateMilestoneParams object
+// with the ability to set a context for a request.
+func NewIssueCreateMilestoneParamsWithContext(ctx context.Context) *IssueCreateMilestoneParams {
+	return &IssueCreateMilestoneParams{
+		Context: ctx,
+	}
+}
+
+// NewIssueCreateMilestoneParamsWithHTTPClient creates a new IssueCreateMilestoneParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewIssueCreateMilestoneParamsWithHTTPClient(client *http.Client) *IssueCreateMilestoneParams {
+	return &IssueCreateMilestoneParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+IssueCreateMilestoneParams contains all the parameters to send to the API endpoint
+
+	for the issue create milestone operation.
+
+	Typically these are written to a http.Request.
+*/
+type IssueCreateMilestoneParams struct {
+
+	// Body.
+	Body *models.CreateMilestoneOption
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the issue create milestone params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueCreateMilestoneParams) WithDefaults() *IssueCreateMilestoneParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the issue create milestone params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueCreateMilestoneParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the issue create milestone params
+func (o *IssueCreateMilestoneParams) WithTimeout(timeout time.Duration) *IssueCreateMilestoneParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the issue create milestone params
+func (o *IssueCreateMilestoneParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the issue create milestone params
+func (o *IssueCreateMilestoneParams) WithContext(ctx context.Context) *IssueCreateMilestoneParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the issue create milestone params
+func (o *IssueCreateMilestoneParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the issue create milestone params
+func (o *IssueCreateMilestoneParams) WithHTTPClient(client *http.Client) *IssueCreateMilestoneParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the issue create milestone params
+func (o *IssueCreateMilestoneParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the issue create milestone params
+func (o *IssueCreateMilestoneParams) WithBody(body *models.CreateMilestoneOption) *IssueCreateMilestoneParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the issue create milestone params
+func (o *IssueCreateMilestoneParams) SetBody(body *models.CreateMilestoneOption) {
+	o.Body = body
+}
+
+// WithOwner adds the owner to the issue create milestone params
+func (o *IssueCreateMilestoneParams) WithOwner(owner string) *IssueCreateMilestoneParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the issue create milestone params
+func (o *IssueCreateMilestoneParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the issue create milestone params
+func (o *IssueCreateMilestoneParams) WithRepo(repo string) *IssueCreateMilestoneParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the issue create milestone params
+func (o *IssueCreateMilestoneParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *IssueCreateMilestoneParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_create_milestone_responses.go b/bots-common/gitea-generated/client/issue/issue_create_milestone_responses.go
new file mode 100644
index 0000000..f626539
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_create_milestone_responses.go
@@ -0,0 +1,168 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// IssueCreateMilestoneReader is a Reader for the IssueCreateMilestone structure.
+type IssueCreateMilestoneReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *IssueCreateMilestoneReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 201:
+		result := NewIssueCreateMilestoneCreated()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewIssueCreateMilestoneNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[POST /repos/{owner}/{repo}/milestones] issueCreateMilestone", response, response.Code())
+	}
+}
+
+// NewIssueCreateMilestoneCreated creates a IssueCreateMilestoneCreated with default headers values
+func NewIssueCreateMilestoneCreated() *IssueCreateMilestoneCreated {
+	return &IssueCreateMilestoneCreated{}
+}
+
+/*
+IssueCreateMilestoneCreated describes a response with status code 201, with default header values.
+
+Milestone
+*/
+type IssueCreateMilestoneCreated struct {
+	Payload *models.Milestone
+}
+
+// IsSuccess returns true when this issue create milestone created response has a 2xx status code
+func (o *IssueCreateMilestoneCreated) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this issue create milestone created response has a 3xx status code
+func (o *IssueCreateMilestoneCreated) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue create milestone created response has a 4xx status code
+func (o *IssueCreateMilestoneCreated) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this issue create milestone created response has a 5xx status code
+func (o *IssueCreateMilestoneCreated) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue create milestone created response a status code equal to that given
+func (o *IssueCreateMilestoneCreated) IsCode(code int) bool {
+	return code == 201
+}
+
+// Code gets the status code for the issue create milestone created response
+func (o *IssueCreateMilestoneCreated) Code() int {
+	return 201
+}
+
+func (o *IssueCreateMilestoneCreated) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/milestones][%d] issueCreateMilestoneCreated %s", 201, payload)
+}
+
+func (o *IssueCreateMilestoneCreated) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/milestones][%d] issueCreateMilestoneCreated %s", 201, payload)
+}
+
+func (o *IssueCreateMilestoneCreated) GetPayload() *models.Milestone {
+	return o.Payload
+}
+
+func (o *IssueCreateMilestoneCreated) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.Milestone)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewIssueCreateMilestoneNotFound creates a IssueCreateMilestoneNotFound with default headers values
+func NewIssueCreateMilestoneNotFound() *IssueCreateMilestoneNotFound {
+	return &IssueCreateMilestoneNotFound{}
+}
+
+/*
+IssueCreateMilestoneNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type IssueCreateMilestoneNotFound struct {
+}
+
+// IsSuccess returns true when this issue create milestone not found response has a 2xx status code
+func (o *IssueCreateMilestoneNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue create milestone not found response has a 3xx status code
+func (o *IssueCreateMilestoneNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue create milestone not found response has a 4xx status code
+func (o *IssueCreateMilestoneNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue create milestone not found response has a 5xx status code
+func (o *IssueCreateMilestoneNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue create milestone not found response a status code equal to that given
+func (o *IssueCreateMilestoneNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the issue create milestone not found response
+func (o *IssueCreateMilestoneNotFound) Code() int {
+	return 404
+}
+
+func (o *IssueCreateMilestoneNotFound) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/milestones][%d] issueCreateMilestoneNotFound", 404)
+}
+
+func (o *IssueCreateMilestoneNotFound) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/milestones][%d] issueCreateMilestoneNotFound", 404)
+}
+
+func (o *IssueCreateMilestoneNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_delete_comment_deprecated_parameters.go b/bots-common/gitea-generated/client/issue/issue_delete_comment_deprecated_parameters.go
new file mode 100644
index 0000000..fde4c44
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_delete_comment_deprecated_parameters.go
@@ -0,0 +1,220 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewIssueDeleteCommentDeprecatedParams creates a new IssueDeleteCommentDeprecatedParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewIssueDeleteCommentDeprecatedParams() *IssueDeleteCommentDeprecatedParams {
+	return &IssueDeleteCommentDeprecatedParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewIssueDeleteCommentDeprecatedParamsWithTimeout creates a new IssueDeleteCommentDeprecatedParams object
+// with the ability to set a timeout on a request.
+func NewIssueDeleteCommentDeprecatedParamsWithTimeout(timeout time.Duration) *IssueDeleteCommentDeprecatedParams {
+	return &IssueDeleteCommentDeprecatedParams{
+		timeout: timeout,
+	}
+}
+
+// NewIssueDeleteCommentDeprecatedParamsWithContext creates a new IssueDeleteCommentDeprecatedParams object
+// with the ability to set a context for a request.
+func NewIssueDeleteCommentDeprecatedParamsWithContext(ctx context.Context) *IssueDeleteCommentDeprecatedParams {
+	return &IssueDeleteCommentDeprecatedParams{
+		Context: ctx,
+	}
+}
+
+// NewIssueDeleteCommentDeprecatedParamsWithHTTPClient creates a new IssueDeleteCommentDeprecatedParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewIssueDeleteCommentDeprecatedParamsWithHTTPClient(client *http.Client) *IssueDeleteCommentDeprecatedParams {
+	return &IssueDeleteCommentDeprecatedParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+IssueDeleteCommentDeprecatedParams contains all the parameters to send to the API endpoint
+
+	for the issue delete comment deprecated operation.
+
+	Typically these are written to a http.Request.
+*/
+type IssueDeleteCommentDeprecatedParams struct {
+
+	/* ID.
+
+	   id of comment to delete
+
+	   Format: int64
+	*/
+	ID int64
+
+	/* Index.
+
+	   this parameter is ignored
+	*/
+	Index int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the issue delete comment deprecated params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueDeleteCommentDeprecatedParams) WithDefaults() *IssueDeleteCommentDeprecatedParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the issue delete comment deprecated params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueDeleteCommentDeprecatedParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the issue delete comment deprecated params
+func (o *IssueDeleteCommentDeprecatedParams) WithTimeout(timeout time.Duration) *IssueDeleteCommentDeprecatedParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the issue delete comment deprecated params
+func (o *IssueDeleteCommentDeprecatedParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the issue delete comment deprecated params
+func (o *IssueDeleteCommentDeprecatedParams) WithContext(ctx context.Context) *IssueDeleteCommentDeprecatedParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the issue delete comment deprecated params
+func (o *IssueDeleteCommentDeprecatedParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the issue delete comment deprecated params
+func (o *IssueDeleteCommentDeprecatedParams) WithHTTPClient(client *http.Client) *IssueDeleteCommentDeprecatedParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the issue delete comment deprecated params
+func (o *IssueDeleteCommentDeprecatedParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithID adds the id to the issue delete comment deprecated params
+func (o *IssueDeleteCommentDeprecatedParams) WithID(id int64) *IssueDeleteCommentDeprecatedParams {
+	o.SetID(id)
+	return o
+}
+
+// SetID adds the id to the issue delete comment deprecated params
+func (o *IssueDeleteCommentDeprecatedParams) SetID(id int64) {
+	o.ID = id
+}
+
+// WithIndex adds the index to the issue delete comment deprecated params
+func (o *IssueDeleteCommentDeprecatedParams) WithIndex(index int64) *IssueDeleteCommentDeprecatedParams {
+	o.SetIndex(index)
+	return o
+}
+
+// SetIndex adds the index to the issue delete comment deprecated params
+func (o *IssueDeleteCommentDeprecatedParams) SetIndex(index int64) {
+	o.Index = index
+}
+
+// WithOwner adds the owner to the issue delete comment deprecated params
+func (o *IssueDeleteCommentDeprecatedParams) WithOwner(owner string) *IssueDeleteCommentDeprecatedParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the issue delete comment deprecated params
+func (o *IssueDeleteCommentDeprecatedParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the issue delete comment deprecated params
+func (o *IssueDeleteCommentDeprecatedParams) WithRepo(repo string) *IssueDeleteCommentDeprecatedParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the issue delete comment deprecated params
+func (o *IssueDeleteCommentDeprecatedParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *IssueDeleteCommentDeprecatedParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param id
+	if err := r.SetPathParam("id", swag.FormatInt64(o.ID)); err != nil {
+		return err
+	}
+
+	// path param index
+	if err := r.SetPathParam("index", swag.FormatInt64(o.Index)); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_delete_comment_deprecated_responses.go b/bots-common/gitea-generated/client/issue/issue_delete_comment_deprecated_responses.go
new file mode 100644
index 0000000..e6d1967
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_delete_comment_deprecated_responses.go
@@ -0,0 +1,228 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// IssueDeleteCommentDeprecatedReader is a Reader for the IssueDeleteCommentDeprecated structure.
+type IssueDeleteCommentDeprecatedReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *IssueDeleteCommentDeprecatedReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewIssueDeleteCommentDeprecatedNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 403:
+		result := NewIssueDeleteCommentDeprecatedForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewIssueDeleteCommentDeprecatedNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[DELETE /repos/{owner}/{repo}/issues/{index}/comments/{id}] issueDeleteCommentDeprecated", response, response.Code())
+	}
+}
+
+// NewIssueDeleteCommentDeprecatedNoContent creates a IssueDeleteCommentDeprecatedNoContent with default headers values
+func NewIssueDeleteCommentDeprecatedNoContent() *IssueDeleteCommentDeprecatedNoContent {
+	return &IssueDeleteCommentDeprecatedNoContent{}
+}
+
+/*
+IssueDeleteCommentDeprecatedNoContent describes a response with status code 204, with default header values.
+
+APIEmpty is an empty response
+*/
+type IssueDeleteCommentDeprecatedNoContent struct {
+}
+
+// IsSuccess returns true when this issue delete comment deprecated no content response has a 2xx status code
+func (o *IssueDeleteCommentDeprecatedNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this issue delete comment deprecated no content response has a 3xx status code
+func (o *IssueDeleteCommentDeprecatedNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue delete comment deprecated no content response has a 4xx status code
+func (o *IssueDeleteCommentDeprecatedNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this issue delete comment deprecated no content response has a 5xx status code
+func (o *IssueDeleteCommentDeprecatedNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue delete comment deprecated no content response a status code equal to that given
+func (o *IssueDeleteCommentDeprecatedNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the issue delete comment deprecated no content response
+func (o *IssueDeleteCommentDeprecatedNoContent) Code() int {
+	return 204
+}
+
+func (o *IssueDeleteCommentDeprecatedNoContent) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/{index}/comments/{id}][%d] issueDeleteCommentDeprecatedNoContent", 204)
+}
+
+func (o *IssueDeleteCommentDeprecatedNoContent) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/{index}/comments/{id}][%d] issueDeleteCommentDeprecatedNoContent", 204)
+}
+
+func (o *IssueDeleteCommentDeprecatedNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewIssueDeleteCommentDeprecatedForbidden creates a IssueDeleteCommentDeprecatedForbidden with default headers values
+func NewIssueDeleteCommentDeprecatedForbidden() *IssueDeleteCommentDeprecatedForbidden {
+	return &IssueDeleteCommentDeprecatedForbidden{}
+}
+
+/*
+IssueDeleteCommentDeprecatedForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type IssueDeleteCommentDeprecatedForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this issue delete comment deprecated forbidden response has a 2xx status code
+func (o *IssueDeleteCommentDeprecatedForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue delete comment deprecated forbidden response has a 3xx status code
+func (o *IssueDeleteCommentDeprecatedForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue delete comment deprecated forbidden response has a 4xx status code
+func (o *IssueDeleteCommentDeprecatedForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue delete comment deprecated forbidden response has a 5xx status code
+func (o *IssueDeleteCommentDeprecatedForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue delete comment deprecated forbidden response a status code equal to that given
+func (o *IssueDeleteCommentDeprecatedForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the issue delete comment deprecated forbidden response
+func (o *IssueDeleteCommentDeprecatedForbidden) Code() int {
+	return 403
+}
+
+func (o *IssueDeleteCommentDeprecatedForbidden) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/{index}/comments/{id}][%d] issueDeleteCommentDeprecatedForbidden", 403)
+}
+
+func (o *IssueDeleteCommentDeprecatedForbidden) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/{index}/comments/{id}][%d] issueDeleteCommentDeprecatedForbidden", 403)
+}
+
+func (o *IssueDeleteCommentDeprecatedForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewIssueDeleteCommentDeprecatedNotFound creates a IssueDeleteCommentDeprecatedNotFound with default headers values
+func NewIssueDeleteCommentDeprecatedNotFound() *IssueDeleteCommentDeprecatedNotFound {
+	return &IssueDeleteCommentDeprecatedNotFound{}
+}
+
+/*
+IssueDeleteCommentDeprecatedNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type IssueDeleteCommentDeprecatedNotFound struct {
+}
+
+// IsSuccess returns true when this issue delete comment deprecated not found response has a 2xx status code
+func (o *IssueDeleteCommentDeprecatedNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue delete comment deprecated not found response has a 3xx status code
+func (o *IssueDeleteCommentDeprecatedNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue delete comment deprecated not found response has a 4xx status code
+func (o *IssueDeleteCommentDeprecatedNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue delete comment deprecated not found response has a 5xx status code
+func (o *IssueDeleteCommentDeprecatedNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue delete comment deprecated not found response a status code equal to that given
+func (o *IssueDeleteCommentDeprecatedNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the issue delete comment deprecated not found response
+func (o *IssueDeleteCommentDeprecatedNotFound) Code() int {
+	return 404
+}
+
+func (o *IssueDeleteCommentDeprecatedNotFound) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/{index}/comments/{id}][%d] issueDeleteCommentDeprecatedNotFound", 404)
+}
+
+func (o *IssueDeleteCommentDeprecatedNotFound) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/{index}/comments/{id}][%d] issueDeleteCommentDeprecatedNotFound", 404)
+}
+
+func (o *IssueDeleteCommentDeprecatedNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_delete_comment_parameters.go b/bots-common/gitea-generated/client/issue/issue_delete_comment_parameters.go
new file mode 100644
index 0000000..dd446a0
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_delete_comment_parameters.go
@@ -0,0 +1,198 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewIssueDeleteCommentParams creates a new IssueDeleteCommentParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewIssueDeleteCommentParams() *IssueDeleteCommentParams {
+	return &IssueDeleteCommentParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewIssueDeleteCommentParamsWithTimeout creates a new IssueDeleteCommentParams object
+// with the ability to set a timeout on a request.
+func NewIssueDeleteCommentParamsWithTimeout(timeout time.Duration) *IssueDeleteCommentParams {
+	return &IssueDeleteCommentParams{
+		timeout: timeout,
+	}
+}
+
+// NewIssueDeleteCommentParamsWithContext creates a new IssueDeleteCommentParams object
+// with the ability to set a context for a request.
+func NewIssueDeleteCommentParamsWithContext(ctx context.Context) *IssueDeleteCommentParams {
+	return &IssueDeleteCommentParams{
+		Context: ctx,
+	}
+}
+
+// NewIssueDeleteCommentParamsWithHTTPClient creates a new IssueDeleteCommentParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewIssueDeleteCommentParamsWithHTTPClient(client *http.Client) *IssueDeleteCommentParams {
+	return &IssueDeleteCommentParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+IssueDeleteCommentParams contains all the parameters to send to the API endpoint
+
+	for the issue delete comment operation.
+
+	Typically these are written to a http.Request.
+*/
+type IssueDeleteCommentParams struct {
+
+	/* ID.
+
+	   id of comment to delete
+
+	   Format: int64
+	*/
+	ID int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the issue delete comment params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueDeleteCommentParams) WithDefaults() *IssueDeleteCommentParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the issue delete comment params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueDeleteCommentParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the issue delete comment params
+func (o *IssueDeleteCommentParams) WithTimeout(timeout time.Duration) *IssueDeleteCommentParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the issue delete comment params
+func (o *IssueDeleteCommentParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the issue delete comment params
+func (o *IssueDeleteCommentParams) WithContext(ctx context.Context) *IssueDeleteCommentParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the issue delete comment params
+func (o *IssueDeleteCommentParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the issue delete comment params
+func (o *IssueDeleteCommentParams) WithHTTPClient(client *http.Client) *IssueDeleteCommentParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the issue delete comment params
+func (o *IssueDeleteCommentParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithID adds the id to the issue delete comment params
+func (o *IssueDeleteCommentParams) WithID(id int64) *IssueDeleteCommentParams {
+	o.SetID(id)
+	return o
+}
+
+// SetID adds the id to the issue delete comment params
+func (o *IssueDeleteCommentParams) SetID(id int64) {
+	o.ID = id
+}
+
+// WithOwner adds the owner to the issue delete comment params
+func (o *IssueDeleteCommentParams) WithOwner(owner string) *IssueDeleteCommentParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the issue delete comment params
+func (o *IssueDeleteCommentParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the issue delete comment params
+func (o *IssueDeleteCommentParams) WithRepo(repo string) *IssueDeleteCommentParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the issue delete comment params
+func (o *IssueDeleteCommentParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *IssueDeleteCommentParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param id
+	if err := r.SetPathParam("id", swag.FormatInt64(o.ID)); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_delete_comment_reaction_parameters.go b/bots-common/gitea-generated/client/issue/issue_delete_comment_reaction_parameters.go
new file mode 100644
index 0000000..2732095
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_delete_comment_reaction_parameters.go
@@ -0,0 +1,219 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewIssueDeleteCommentReactionParams creates a new IssueDeleteCommentReactionParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewIssueDeleteCommentReactionParams() *IssueDeleteCommentReactionParams {
+	return &IssueDeleteCommentReactionParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewIssueDeleteCommentReactionParamsWithTimeout creates a new IssueDeleteCommentReactionParams object
+// with the ability to set a timeout on a request.
+func NewIssueDeleteCommentReactionParamsWithTimeout(timeout time.Duration) *IssueDeleteCommentReactionParams {
+	return &IssueDeleteCommentReactionParams{
+		timeout: timeout,
+	}
+}
+
+// NewIssueDeleteCommentReactionParamsWithContext creates a new IssueDeleteCommentReactionParams object
+// with the ability to set a context for a request.
+func NewIssueDeleteCommentReactionParamsWithContext(ctx context.Context) *IssueDeleteCommentReactionParams {
+	return &IssueDeleteCommentReactionParams{
+		Context: ctx,
+	}
+}
+
+// NewIssueDeleteCommentReactionParamsWithHTTPClient creates a new IssueDeleteCommentReactionParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewIssueDeleteCommentReactionParamsWithHTTPClient(client *http.Client) *IssueDeleteCommentReactionParams {
+	return &IssueDeleteCommentReactionParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+IssueDeleteCommentReactionParams contains all the parameters to send to the API endpoint
+
+	for the issue delete comment reaction operation.
+
+	Typically these are written to a http.Request.
+*/
+type IssueDeleteCommentReactionParams struct {
+
+	// Content.
+	Content *models.EditReactionOption
+
+	/* ID.
+
+	   id of the comment to edit
+
+	   Format: int64
+	*/
+	ID int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the issue delete comment reaction params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueDeleteCommentReactionParams) WithDefaults() *IssueDeleteCommentReactionParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the issue delete comment reaction params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueDeleteCommentReactionParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the issue delete comment reaction params
+func (o *IssueDeleteCommentReactionParams) WithTimeout(timeout time.Duration) *IssueDeleteCommentReactionParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the issue delete comment reaction params
+func (o *IssueDeleteCommentReactionParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the issue delete comment reaction params
+func (o *IssueDeleteCommentReactionParams) WithContext(ctx context.Context) *IssueDeleteCommentReactionParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the issue delete comment reaction params
+func (o *IssueDeleteCommentReactionParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the issue delete comment reaction params
+func (o *IssueDeleteCommentReactionParams) WithHTTPClient(client *http.Client) *IssueDeleteCommentReactionParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the issue delete comment reaction params
+func (o *IssueDeleteCommentReactionParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithContent adds the content to the issue delete comment reaction params
+func (o *IssueDeleteCommentReactionParams) WithContent(content *models.EditReactionOption) *IssueDeleteCommentReactionParams {
+	o.SetContent(content)
+	return o
+}
+
+// SetContent adds the content to the issue delete comment reaction params
+func (o *IssueDeleteCommentReactionParams) SetContent(content *models.EditReactionOption) {
+	o.Content = content
+}
+
+// WithID adds the id to the issue delete comment reaction params
+func (o *IssueDeleteCommentReactionParams) WithID(id int64) *IssueDeleteCommentReactionParams {
+	o.SetID(id)
+	return o
+}
+
+// SetID adds the id to the issue delete comment reaction params
+func (o *IssueDeleteCommentReactionParams) SetID(id int64) {
+	o.ID = id
+}
+
+// WithOwner adds the owner to the issue delete comment reaction params
+func (o *IssueDeleteCommentReactionParams) WithOwner(owner string) *IssueDeleteCommentReactionParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the issue delete comment reaction params
+func (o *IssueDeleteCommentReactionParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the issue delete comment reaction params
+func (o *IssueDeleteCommentReactionParams) WithRepo(repo string) *IssueDeleteCommentReactionParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the issue delete comment reaction params
+func (o *IssueDeleteCommentReactionParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *IssueDeleteCommentReactionParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Content != nil {
+		if err := r.SetBodyParam(o.Content); err != nil {
+			return err
+		}
+	}
+
+	// path param id
+	if err := r.SetPathParam("id", swag.FormatInt64(o.ID)); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_delete_comment_reaction_responses.go b/bots-common/gitea-generated/client/issue/issue_delete_comment_reaction_responses.go
new file mode 100644
index 0000000..70ff43d
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_delete_comment_reaction_responses.go
@@ -0,0 +1,228 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// IssueDeleteCommentReactionReader is a Reader for the IssueDeleteCommentReaction structure.
+type IssueDeleteCommentReactionReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *IssueDeleteCommentReactionReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewIssueDeleteCommentReactionOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 403:
+		result := NewIssueDeleteCommentReactionForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewIssueDeleteCommentReactionNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[DELETE /repos/{owner}/{repo}/issues/comments/{id}/reactions] issueDeleteCommentReaction", response, response.Code())
+	}
+}
+
+// NewIssueDeleteCommentReactionOK creates a IssueDeleteCommentReactionOK with default headers values
+func NewIssueDeleteCommentReactionOK() *IssueDeleteCommentReactionOK {
+	return &IssueDeleteCommentReactionOK{}
+}
+
+/*
+IssueDeleteCommentReactionOK describes a response with status code 200, with default header values.
+
+APIEmpty is an empty response
+*/
+type IssueDeleteCommentReactionOK struct {
+}
+
+// IsSuccess returns true when this issue delete comment reaction o k response has a 2xx status code
+func (o *IssueDeleteCommentReactionOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this issue delete comment reaction o k response has a 3xx status code
+func (o *IssueDeleteCommentReactionOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue delete comment reaction o k response has a 4xx status code
+func (o *IssueDeleteCommentReactionOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this issue delete comment reaction o k response has a 5xx status code
+func (o *IssueDeleteCommentReactionOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue delete comment reaction o k response a status code equal to that given
+func (o *IssueDeleteCommentReactionOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the issue delete comment reaction o k response
+func (o *IssueDeleteCommentReactionOK) Code() int {
+	return 200
+}
+
+func (o *IssueDeleteCommentReactionOK) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/comments/{id}/reactions][%d] issueDeleteCommentReactionOK", 200)
+}
+
+func (o *IssueDeleteCommentReactionOK) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/comments/{id}/reactions][%d] issueDeleteCommentReactionOK", 200)
+}
+
+func (o *IssueDeleteCommentReactionOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewIssueDeleteCommentReactionForbidden creates a IssueDeleteCommentReactionForbidden with default headers values
+func NewIssueDeleteCommentReactionForbidden() *IssueDeleteCommentReactionForbidden {
+	return &IssueDeleteCommentReactionForbidden{}
+}
+
+/*
+IssueDeleteCommentReactionForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type IssueDeleteCommentReactionForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this issue delete comment reaction forbidden response has a 2xx status code
+func (o *IssueDeleteCommentReactionForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue delete comment reaction forbidden response has a 3xx status code
+func (o *IssueDeleteCommentReactionForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue delete comment reaction forbidden response has a 4xx status code
+func (o *IssueDeleteCommentReactionForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue delete comment reaction forbidden response has a 5xx status code
+func (o *IssueDeleteCommentReactionForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue delete comment reaction forbidden response a status code equal to that given
+func (o *IssueDeleteCommentReactionForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the issue delete comment reaction forbidden response
+func (o *IssueDeleteCommentReactionForbidden) Code() int {
+	return 403
+}
+
+func (o *IssueDeleteCommentReactionForbidden) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/comments/{id}/reactions][%d] issueDeleteCommentReactionForbidden", 403)
+}
+
+func (o *IssueDeleteCommentReactionForbidden) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/comments/{id}/reactions][%d] issueDeleteCommentReactionForbidden", 403)
+}
+
+func (o *IssueDeleteCommentReactionForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewIssueDeleteCommentReactionNotFound creates a IssueDeleteCommentReactionNotFound with default headers values
+func NewIssueDeleteCommentReactionNotFound() *IssueDeleteCommentReactionNotFound {
+	return &IssueDeleteCommentReactionNotFound{}
+}
+
+/*
+IssueDeleteCommentReactionNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type IssueDeleteCommentReactionNotFound struct {
+}
+
+// IsSuccess returns true when this issue delete comment reaction not found response has a 2xx status code
+func (o *IssueDeleteCommentReactionNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue delete comment reaction not found response has a 3xx status code
+func (o *IssueDeleteCommentReactionNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue delete comment reaction not found response has a 4xx status code
+func (o *IssueDeleteCommentReactionNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue delete comment reaction not found response has a 5xx status code
+func (o *IssueDeleteCommentReactionNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue delete comment reaction not found response a status code equal to that given
+func (o *IssueDeleteCommentReactionNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the issue delete comment reaction not found response
+func (o *IssueDeleteCommentReactionNotFound) Code() int {
+	return 404
+}
+
+func (o *IssueDeleteCommentReactionNotFound) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/comments/{id}/reactions][%d] issueDeleteCommentReactionNotFound", 404)
+}
+
+func (o *IssueDeleteCommentReactionNotFound) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/comments/{id}/reactions][%d] issueDeleteCommentReactionNotFound", 404)
+}
+
+func (o *IssueDeleteCommentReactionNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_delete_comment_responses.go b/bots-common/gitea-generated/client/issue/issue_delete_comment_responses.go
new file mode 100644
index 0000000..d0b002f
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_delete_comment_responses.go
@@ -0,0 +1,228 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// IssueDeleteCommentReader is a Reader for the IssueDeleteComment structure.
+type IssueDeleteCommentReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *IssueDeleteCommentReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewIssueDeleteCommentNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 403:
+		result := NewIssueDeleteCommentForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewIssueDeleteCommentNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[DELETE /repos/{owner}/{repo}/issues/comments/{id}] issueDeleteComment", response, response.Code())
+	}
+}
+
+// NewIssueDeleteCommentNoContent creates a IssueDeleteCommentNoContent with default headers values
+func NewIssueDeleteCommentNoContent() *IssueDeleteCommentNoContent {
+	return &IssueDeleteCommentNoContent{}
+}
+
+/*
+IssueDeleteCommentNoContent describes a response with status code 204, with default header values.
+
+APIEmpty is an empty response
+*/
+type IssueDeleteCommentNoContent struct {
+}
+
+// IsSuccess returns true when this issue delete comment no content response has a 2xx status code
+func (o *IssueDeleteCommentNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this issue delete comment no content response has a 3xx status code
+func (o *IssueDeleteCommentNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue delete comment no content response has a 4xx status code
+func (o *IssueDeleteCommentNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this issue delete comment no content response has a 5xx status code
+func (o *IssueDeleteCommentNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue delete comment no content response a status code equal to that given
+func (o *IssueDeleteCommentNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the issue delete comment no content response
+func (o *IssueDeleteCommentNoContent) Code() int {
+	return 204
+}
+
+func (o *IssueDeleteCommentNoContent) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/comments/{id}][%d] issueDeleteCommentNoContent", 204)
+}
+
+func (o *IssueDeleteCommentNoContent) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/comments/{id}][%d] issueDeleteCommentNoContent", 204)
+}
+
+func (o *IssueDeleteCommentNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewIssueDeleteCommentForbidden creates a IssueDeleteCommentForbidden with default headers values
+func NewIssueDeleteCommentForbidden() *IssueDeleteCommentForbidden {
+	return &IssueDeleteCommentForbidden{}
+}
+
+/*
+IssueDeleteCommentForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type IssueDeleteCommentForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this issue delete comment forbidden response has a 2xx status code
+func (o *IssueDeleteCommentForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue delete comment forbidden response has a 3xx status code
+func (o *IssueDeleteCommentForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue delete comment forbidden response has a 4xx status code
+func (o *IssueDeleteCommentForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue delete comment forbidden response has a 5xx status code
+func (o *IssueDeleteCommentForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue delete comment forbidden response a status code equal to that given
+func (o *IssueDeleteCommentForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the issue delete comment forbidden response
+func (o *IssueDeleteCommentForbidden) Code() int {
+	return 403
+}
+
+func (o *IssueDeleteCommentForbidden) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/comments/{id}][%d] issueDeleteCommentForbidden", 403)
+}
+
+func (o *IssueDeleteCommentForbidden) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/comments/{id}][%d] issueDeleteCommentForbidden", 403)
+}
+
+func (o *IssueDeleteCommentForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewIssueDeleteCommentNotFound creates a IssueDeleteCommentNotFound with default headers values
+func NewIssueDeleteCommentNotFound() *IssueDeleteCommentNotFound {
+	return &IssueDeleteCommentNotFound{}
+}
+
+/*
+IssueDeleteCommentNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type IssueDeleteCommentNotFound struct {
+}
+
+// IsSuccess returns true when this issue delete comment not found response has a 2xx status code
+func (o *IssueDeleteCommentNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue delete comment not found response has a 3xx status code
+func (o *IssueDeleteCommentNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue delete comment not found response has a 4xx status code
+func (o *IssueDeleteCommentNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue delete comment not found response has a 5xx status code
+func (o *IssueDeleteCommentNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue delete comment not found response a status code equal to that given
+func (o *IssueDeleteCommentNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the issue delete comment not found response
+func (o *IssueDeleteCommentNotFound) Code() int {
+	return 404
+}
+
+func (o *IssueDeleteCommentNotFound) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/comments/{id}][%d] issueDeleteCommentNotFound", 404)
+}
+
+func (o *IssueDeleteCommentNotFound) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/comments/{id}][%d] issueDeleteCommentNotFound", 404)
+}
+
+func (o *IssueDeleteCommentNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_delete_issue_attachment_parameters.go b/bots-common/gitea-generated/client/issue/issue_delete_issue_attachment_parameters.go
new file mode 100644
index 0000000..58913da
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_delete_issue_attachment_parameters.go
@@ -0,0 +1,222 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewIssueDeleteIssueAttachmentParams creates a new IssueDeleteIssueAttachmentParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewIssueDeleteIssueAttachmentParams() *IssueDeleteIssueAttachmentParams {
+	return &IssueDeleteIssueAttachmentParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewIssueDeleteIssueAttachmentParamsWithTimeout creates a new IssueDeleteIssueAttachmentParams object
+// with the ability to set a timeout on a request.
+func NewIssueDeleteIssueAttachmentParamsWithTimeout(timeout time.Duration) *IssueDeleteIssueAttachmentParams {
+	return &IssueDeleteIssueAttachmentParams{
+		timeout: timeout,
+	}
+}
+
+// NewIssueDeleteIssueAttachmentParamsWithContext creates a new IssueDeleteIssueAttachmentParams object
+// with the ability to set a context for a request.
+func NewIssueDeleteIssueAttachmentParamsWithContext(ctx context.Context) *IssueDeleteIssueAttachmentParams {
+	return &IssueDeleteIssueAttachmentParams{
+		Context: ctx,
+	}
+}
+
+// NewIssueDeleteIssueAttachmentParamsWithHTTPClient creates a new IssueDeleteIssueAttachmentParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewIssueDeleteIssueAttachmentParamsWithHTTPClient(client *http.Client) *IssueDeleteIssueAttachmentParams {
+	return &IssueDeleteIssueAttachmentParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+IssueDeleteIssueAttachmentParams contains all the parameters to send to the API endpoint
+
+	for the issue delete issue attachment operation.
+
+	Typically these are written to a http.Request.
+*/
+type IssueDeleteIssueAttachmentParams struct {
+
+	/* AttachmentID.
+
+	   id of the attachment to delete
+
+	   Format: int64
+	*/
+	AttachmentID int64
+
+	/* Index.
+
+	   index of the issue
+
+	   Format: int64
+	*/
+	Index int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the issue delete issue attachment params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueDeleteIssueAttachmentParams) WithDefaults() *IssueDeleteIssueAttachmentParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the issue delete issue attachment params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueDeleteIssueAttachmentParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the issue delete issue attachment params
+func (o *IssueDeleteIssueAttachmentParams) WithTimeout(timeout time.Duration) *IssueDeleteIssueAttachmentParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the issue delete issue attachment params
+func (o *IssueDeleteIssueAttachmentParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the issue delete issue attachment params
+func (o *IssueDeleteIssueAttachmentParams) WithContext(ctx context.Context) *IssueDeleteIssueAttachmentParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the issue delete issue attachment params
+func (o *IssueDeleteIssueAttachmentParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the issue delete issue attachment params
+func (o *IssueDeleteIssueAttachmentParams) WithHTTPClient(client *http.Client) *IssueDeleteIssueAttachmentParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the issue delete issue attachment params
+func (o *IssueDeleteIssueAttachmentParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithAttachmentID adds the attachmentID to the issue delete issue attachment params
+func (o *IssueDeleteIssueAttachmentParams) WithAttachmentID(attachmentID int64) *IssueDeleteIssueAttachmentParams {
+	o.SetAttachmentID(attachmentID)
+	return o
+}
+
+// SetAttachmentID adds the attachmentId to the issue delete issue attachment params
+func (o *IssueDeleteIssueAttachmentParams) SetAttachmentID(attachmentID int64) {
+	o.AttachmentID = attachmentID
+}
+
+// WithIndex adds the index to the issue delete issue attachment params
+func (o *IssueDeleteIssueAttachmentParams) WithIndex(index int64) *IssueDeleteIssueAttachmentParams {
+	o.SetIndex(index)
+	return o
+}
+
+// SetIndex adds the index to the issue delete issue attachment params
+func (o *IssueDeleteIssueAttachmentParams) SetIndex(index int64) {
+	o.Index = index
+}
+
+// WithOwner adds the owner to the issue delete issue attachment params
+func (o *IssueDeleteIssueAttachmentParams) WithOwner(owner string) *IssueDeleteIssueAttachmentParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the issue delete issue attachment params
+func (o *IssueDeleteIssueAttachmentParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the issue delete issue attachment params
+func (o *IssueDeleteIssueAttachmentParams) WithRepo(repo string) *IssueDeleteIssueAttachmentParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the issue delete issue attachment params
+func (o *IssueDeleteIssueAttachmentParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *IssueDeleteIssueAttachmentParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param attachment_id
+	if err := r.SetPathParam("attachment_id", swag.FormatInt64(o.AttachmentID)); err != nil {
+		return err
+	}
+
+	// path param index
+	if err := r.SetPathParam("index", swag.FormatInt64(o.Index)); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_delete_issue_attachment_responses.go b/bots-common/gitea-generated/client/issue/issue_delete_issue_attachment_responses.go
new file mode 100644
index 0000000..a79480e
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_delete_issue_attachment_responses.go
@@ -0,0 +1,244 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// IssueDeleteIssueAttachmentReader is a Reader for the IssueDeleteIssueAttachment structure.
+type IssueDeleteIssueAttachmentReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *IssueDeleteIssueAttachmentReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewIssueDeleteIssueAttachmentNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewIssueDeleteIssueAttachmentNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 423:
+		result := NewIssueDeleteIssueAttachmentLocked()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[DELETE /repos/{owner}/{repo}/issues/{index}/assets/{attachment_id}] issueDeleteIssueAttachment", response, response.Code())
+	}
+}
+
+// NewIssueDeleteIssueAttachmentNoContent creates a IssueDeleteIssueAttachmentNoContent with default headers values
+func NewIssueDeleteIssueAttachmentNoContent() *IssueDeleteIssueAttachmentNoContent {
+	return &IssueDeleteIssueAttachmentNoContent{}
+}
+
+/*
+IssueDeleteIssueAttachmentNoContent describes a response with status code 204, with default header values.
+
+APIEmpty is an empty response
+*/
+type IssueDeleteIssueAttachmentNoContent struct {
+}
+
+// IsSuccess returns true when this issue delete issue attachment no content response has a 2xx status code
+func (o *IssueDeleteIssueAttachmentNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this issue delete issue attachment no content response has a 3xx status code
+func (o *IssueDeleteIssueAttachmentNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue delete issue attachment no content response has a 4xx status code
+func (o *IssueDeleteIssueAttachmentNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this issue delete issue attachment no content response has a 5xx status code
+func (o *IssueDeleteIssueAttachmentNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue delete issue attachment no content response a status code equal to that given
+func (o *IssueDeleteIssueAttachmentNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the issue delete issue attachment no content response
+func (o *IssueDeleteIssueAttachmentNoContent) Code() int {
+	return 204
+}
+
+func (o *IssueDeleteIssueAttachmentNoContent) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/{index}/assets/{attachment_id}][%d] issueDeleteIssueAttachmentNoContent", 204)
+}
+
+func (o *IssueDeleteIssueAttachmentNoContent) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/{index}/assets/{attachment_id}][%d] issueDeleteIssueAttachmentNoContent", 204)
+}
+
+func (o *IssueDeleteIssueAttachmentNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewIssueDeleteIssueAttachmentNotFound creates a IssueDeleteIssueAttachmentNotFound with default headers values
+func NewIssueDeleteIssueAttachmentNotFound() *IssueDeleteIssueAttachmentNotFound {
+	return &IssueDeleteIssueAttachmentNotFound{}
+}
+
+/*
+IssueDeleteIssueAttachmentNotFound describes a response with status code 404, with default header values.
+
+APIError is error format response
+*/
+type IssueDeleteIssueAttachmentNotFound struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this issue delete issue attachment not found response has a 2xx status code
+func (o *IssueDeleteIssueAttachmentNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue delete issue attachment not found response has a 3xx status code
+func (o *IssueDeleteIssueAttachmentNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue delete issue attachment not found response has a 4xx status code
+func (o *IssueDeleteIssueAttachmentNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue delete issue attachment not found response has a 5xx status code
+func (o *IssueDeleteIssueAttachmentNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue delete issue attachment not found response a status code equal to that given
+func (o *IssueDeleteIssueAttachmentNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the issue delete issue attachment not found response
+func (o *IssueDeleteIssueAttachmentNotFound) Code() int {
+	return 404
+}
+
+func (o *IssueDeleteIssueAttachmentNotFound) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/{index}/assets/{attachment_id}][%d] issueDeleteIssueAttachmentNotFound", 404)
+}
+
+func (o *IssueDeleteIssueAttachmentNotFound) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/{index}/assets/{attachment_id}][%d] issueDeleteIssueAttachmentNotFound", 404)
+}
+
+func (o *IssueDeleteIssueAttachmentNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewIssueDeleteIssueAttachmentLocked creates a IssueDeleteIssueAttachmentLocked with default headers values
+func NewIssueDeleteIssueAttachmentLocked() *IssueDeleteIssueAttachmentLocked {
+	return &IssueDeleteIssueAttachmentLocked{}
+}
+
+/*
+IssueDeleteIssueAttachmentLocked describes a response with status code 423, with default header values.
+
+APIRepoArchivedError is an error that is raised when an archived repo should be modified
+*/
+type IssueDeleteIssueAttachmentLocked struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this issue delete issue attachment locked response has a 2xx status code
+func (o *IssueDeleteIssueAttachmentLocked) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue delete issue attachment locked response has a 3xx status code
+func (o *IssueDeleteIssueAttachmentLocked) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue delete issue attachment locked response has a 4xx status code
+func (o *IssueDeleteIssueAttachmentLocked) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue delete issue attachment locked response has a 5xx status code
+func (o *IssueDeleteIssueAttachmentLocked) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue delete issue attachment locked response a status code equal to that given
+func (o *IssueDeleteIssueAttachmentLocked) IsCode(code int) bool {
+	return code == 423
+}
+
+// Code gets the status code for the issue delete issue attachment locked response
+func (o *IssueDeleteIssueAttachmentLocked) Code() int {
+	return 423
+}
+
+func (o *IssueDeleteIssueAttachmentLocked) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/{index}/assets/{attachment_id}][%d] issueDeleteIssueAttachmentLocked", 423)
+}
+
+func (o *IssueDeleteIssueAttachmentLocked) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/{index}/assets/{attachment_id}][%d] issueDeleteIssueAttachmentLocked", 423)
+}
+
+func (o *IssueDeleteIssueAttachmentLocked) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_delete_issue_comment_attachment_parameters.go b/bots-common/gitea-generated/client/issue/issue_delete_issue_comment_attachment_parameters.go
new file mode 100644
index 0000000..41c658d
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_delete_issue_comment_attachment_parameters.go
@@ -0,0 +1,222 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewIssueDeleteIssueCommentAttachmentParams creates a new IssueDeleteIssueCommentAttachmentParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewIssueDeleteIssueCommentAttachmentParams() *IssueDeleteIssueCommentAttachmentParams {
+	return &IssueDeleteIssueCommentAttachmentParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewIssueDeleteIssueCommentAttachmentParamsWithTimeout creates a new IssueDeleteIssueCommentAttachmentParams object
+// with the ability to set a timeout on a request.
+func NewIssueDeleteIssueCommentAttachmentParamsWithTimeout(timeout time.Duration) *IssueDeleteIssueCommentAttachmentParams {
+	return &IssueDeleteIssueCommentAttachmentParams{
+		timeout: timeout,
+	}
+}
+
+// NewIssueDeleteIssueCommentAttachmentParamsWithContext creates a new IssueDeleteIssueCommentAttachmentParams object
+// with the ability to set a context for a request.
+func NewIssueDeleteIssueCommentAttachmentParamsWithContext(ctx context.Context) *IssueDeleteIssueCommentAttachmentParams {
+	return &IssueDeleteIssueCommentAttachmentParams{
+		Context: ctx,
+	}
+}
+
+// NewIssueDeleteIssueCommentAttachmentParamsWithHTTPClient creates a new IssueDeleteIssueCommentAttachmentParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewIssueDeleteIssueCommentAttachmentParamsWithHTTPClient(client *http.Client) *IssueDeleteIssueCommentAttachmentParams {
+	return &IssueDeleteIssueCommentAttachmentParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+IssueDeleteIssueCommentAttachmentParams contains all the parameters to send to the API endpoint
+
+	for the issue delete issue comment attachment operation.
+
+	Typically these are written to a http.Request.
+*/
+type IssueDeleteIssueCommentAttachmentParams struct {
+
+	/* AttachmentID.
+
+	   id of the attachment to delete
+
+	   Format: int64
+	*/
+	AttachmentID int64
+
+	/* ID.
+
+	   id of the comment
+
+	   Format: int64
+	*/
+	ID int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the issue delete issue comment attachment params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueDeleteIssueCommentAttachmentParams) WithDefaults() *IssueDeleteIssueCommentAttachmentParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the issue delete issue comment attachment params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueDeleteIssueCommentAttachmentParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the issue delete issue comment attachment params
+func (o *IssueDeleteIssueCommentAttachmentParams) WithTimeout(timeout time.Duration) *IssueDeleteIssueCommentAttachmentParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the issue delete issue comment attachment params
+func (o *IssueDeleteIssueCommentAttachmentParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the issue delete issue comment attachment params
+func (o *IssueDeleteIssueCommentAttachmentParams) WithContext(ctx context.Context) *IssueDeleteIssueCommentAttachmentParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the issue delete issue comment attachment params
+func (o *IssueDeleteIssueCommentAttachmentParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the issue delete issue comment attachment params
+func (o *IssueDeleteIssueCommentAttachmentParams) WithHTTPClient(client *http.Client) *IssueDeleteIssueCommentAttachmentParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the issue delete issue comment attachment params
+func (o *IssueDeleteIssueCommentAttachmentParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithAttachmentID adds the attachmentID to the issue delete issue comment attachment params
+func (o *IssueDeleteIssueCommentAttachmentParams) WithAttachmentID(attachmentID int64) *IssueDeleteIssueCommentAttachmentParams {
+	o.SetAttachmentID(attachmentID)
+	return o
+}
+
+// SetAttachmentID adds the attachmentId to the issue delete issue comment attachment params
+func (o *IssueDeleteIssueCommentAttachmentParams) SetAttachmentID(attachmentID int64) {
+	o.AttachmentID = attachmentID
+}
+
+// WithID adds the id to the issue delete issue comment attachment params
+func (o *IssueDeleteIssueCommentAttachmentParams) WithID(id int64) *IssueDeleteIssueCommentAttachmentParams {
+	o.SetID(id)
+	return o
+}
+
+// SetID adds the id to the issue delete issue comment attachment params
+func (o *IssueDeleteIssueCommentAttachmentParams) SetID(id int64) {
+	o.ID = id
+}
+
+// WithOwner adds the owner to the issue delete issue comment attachment params
+func (o *IssueDeleteIssueCommentAttachmentParams) WithOwner(owner string) *IssueDeleteIssueCommentAttachmentParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the issue delete issue comment attachment params
+func (o *IssueDeleteIssueCommentAttachmentParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the issue delete issue comment attachment params
+func (o *IssueDeleteIssueCommentAttachmentParams) WithRepo(repo string) *IssueDeleteIssueCommentAttachmentParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the issue delete issue comment attachment params
+func (o *IssueDeleteIssueCommentAttachmentParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *IssueDeleteIssueCommentAttachmentParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param attachment_id
+	if err := r.SetPathParam("attachment_id", swag.FormatInt64(o.AttachmentID)); err != nil {
+		return err
+	}
+
+	// path param id
+	if err := r.SetPathParam("id", swag.FormatInt64(o.ID)); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_delete_issue_comment_attachment_responses.go b/bots-common/gitea-generated/client/issue/issue_delete_issue_comment_attachment_responses.go
new file mode 100644
index 0000000..1bbfe80
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_delete_issue_comment_attachment_responses.go
@@ -0,0 +1,244 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// IssueDeleteIssueCommentAttachmentReader is a Reader for the IssueDeleteIssueCommentAttachment structure.
+type IssueDeleteIssueCommentAttachmentReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *IssueDeleteIssueCommentAttachmentReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewIssueDeleteIssueCommentAttachmentNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewIssueDeleteIssueCommentAttachmentNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 423:
+		result := NewIssueDeleteIssueCommentAttachmentLocked()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[DELETE /repos/{owner}/{repo}/issues/comments/{id}/assets/{attachment_id}] issueDeleteIssueCommentAttachment", response, response.Code())
+	}
+}
+
+// NewIssueDeleteIssueCommentAttachmentNoContent creates a IssueDeleteIssueCommentAttachmentNoContent with default headers values
+func NewIssueDeleteIssueCommentAttachmentNoContent() *IssueDeleteIssueCommentAttachmentNoContent {
+	return &IssueDeleteIssueCommentAttachmentNoContent{}
+}
+
+/*
+IssueDeleteIssueCommentAttachmentNoContent describes a response with status code 204, with default header values.
+
+APIEmpty is an empty response
+*/
+type IssueDeleteIssueCommentAttachmentNoContent struct {
+}
+
+// IsSuccess returns true when this issue delete issue comment attachment no content response has a 2xx status code
+func (o *IssueDeleteIssueCommentAttachmentNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this issue delete issue comment attachment no content response has a 3xx status code
+func (o *IssueDeleteIssueCommentAttachmentNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue delete issue comment attachment no content response has a 4xx status code
+func (o *IssueDeleteIssueCommentAttachmentNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this issue delete issue comment attachment no content response has a 5xx status code
+func (o *IssueDeleteIssueCommentAttachmentNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue delete issue comment attachment no content response a status code equal to that given
+func (o *IssueDeleteIssueCommentAttachmentNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the issue delete issue comment attachment no content response
+func (o *IssueDeleteIssueCommentAttachmentNoContent) Code() int {
+	return 204
+}
+
+func (o *IssueDeleteIssueCommentAttachmentNoContent) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/comments/{id}/assets/{attachment_id}][%d] issueDeleteIssueCommentAttachmentNoContent", 204)
+}
+
+func (o *IssueDeleteIssueCommentAttachmentNoContent) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/comments/{id}/assets/{attachment_id}][%d] issueDeleteIssueCommentAttachmentNoContent", 204)
+}
+
+func (o *IssueDeleteIssueCommentAttachmentNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewIssueDeleteIssueCommentAttachmentNotFound creates a IssueDeleteIssueCommentAttachmentNotFound with default headers values
+func NewIssueDeleteIssueCommentAttachmentNotFound() *IssueDeleteIssueCommentAttachmentNotFound {
+	return &IssueDeleteIssueCommentAttachmentNotFound{}
+}
+
+/*
+IssueDeleteIssueCommentAttachmentNotFound describes a response with status code 404, with default header values.
+
+APIError is error format response
+*/
+type IssueDeleteIssueCommentAttachmentNotFound struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this issue delete issue comment attachment not found response has a 2xx status code
+func (o *IssueDeleteIssueCommentAttachmentNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue delete issue comment attachment not found response has a 3xx status code
+func (o *IssueDeleteIssueCommentAttachmentNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue delete issue comment attachment not found response has a 4xx status code
+func (o *IssueDeleteIssueCommentAttachmentNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue delete issue comment attachment not found response has a 5xx status code
+func (o *IssueDeleteIssueCommentAttachmentNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue delete issue comment attachment not found response a status code equal to that given
+func (o *IssueDeleteIssueCommentAttachmentNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the issue delete issue comment attachment not found response
+func (o *IssueDeleteIssueCommentAttachmentNotFound) Code() int {
+	return 404
+}
+
+func (o *IssueDeleteIssueCommentAttachmentNotFound) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/comments/{id}/assets/{attachment_id}][%d] issueDeleteIssueCommentAttachmentNotFound", 404)
+}
+
+func (o *IssueDeleteIssueCommentAttachmentNotFound) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/comments/{id}/assets/{attachment_id}][%d] issueDeleteIssueCommentAttachmentNotFound", 404)
+}
+
+func (o *IssueDeleteIssueCommentAttachmentNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewIssueDeleteIssueCommentAttachmentLocked creates a IssueDeleteIssueCommentAttachmentLocked with default headers values
+func NewIssueDeleteIssueCommentAttachmentLocked() *IssueDeleteIssueCommentAttachmentLocked {
+	return &IssueDeleteIssueCommentAttachmentLocked{}
+}
+
+/*
+IssueDeleteIssueCommentAttachmentLocked describes a response with status code 423, with default header values.
+
+APIRepoArchivedError is an error that is raised when an archived repo should be modified
+*/
+type IssueDeleteIssueCommentAttachmentLocked struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this issue delete issue comment attachment locked response has a 2xx status code
+func (o *IssueDeleteIssueCommentAttachmentLocked) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue delete issue comment attachment locked response has a 3xx status code
+func (o *IssueDeleteIssueCommentAttachmentLocked) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue delete issue comment attachment locked response has a 4xx status code
+func (o *IssueDeleteIssueCommentAttachmentLocked) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue delete issue comment attachment locked response has a 5xx status code
+func (o *IssueDeleteIssueCommentAttachmentLocked) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue delete issue comment attachment locked response a status code equal to that given
+func (o *IssueDeleteIssueCommentAttachmentLocked) IsCode(code int) bool {
+	return code == 423
+}
+
+// Code gets the status code for the issue delete issue comment attachment locked response
+func (o *IssueDeleteIssueCommentAttachmentLocked) Code() int {
+	return 423
+}
+
+func (o *IssueDeleteIssueCommentAttachmentLocked) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/comments/{id}/assets/{attachment_id}][%d] issueDeleteIssueCommentAttachmentLocked", 423)
+}
+
+func (o *IssueDeleteIssueCommentAttachmentLocked) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/comments/{id}/assets/{attachment_id}][%d] issueDeleteIssueCommentAttachmentLocked", 423)
+}
+
+func (o *IssueDeleteIssueCommentAttachmentLocked) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_delete_issue_reaction_parameters.go b/bots-common/gitea-generated/client/issue/issue_delete_issue_reaction_parameters.go
new file mode 100644
index 0000000..fa38a37
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_delete_issue_reaction_parameters.go
@@ -0,0 +1,219 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewIssueDeleteIssueReactionParams creates a new IssueDeleteIssueReactionParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewIssueDeleteIssueReactionParams() *IssueDeleteIssueReactionParams {
+	return &IssueDeleteIssueReactionParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewIssueDeleteIssueReactionParamsWithTimeout creates a new IssueDeleteIssueReactionParams object
+// with the ability to set a timeout on a request.
+func NewIssueDeleteIssueReactionParamsWithTimeout(timeout time.Duration) *IssueDeleteIssueReactionParams {
+	return &IssueDeleteIssueReactionParams{
+		timeout: timeout,
+	}
+}
+
+// NewIssueDeleteIssueReactionParamsWithContext creates a new IssueDeleteIssueReactionParams object
+// with the ability to set a context for a request.
+func NewIssueDeleteIssueReactionParamsWithContext(ctx context.Context) *IssueDeleteIssueReactionParams {
+	return &IssueDeleteIssueReactionParams{
+		Context: ctx,
+	}
+}
+
+// NewIssueDeleteIssueReactionParamsWithHTTPClient creates a new IssueDeleteIssueReactionParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewIssueDeleteIssueReactionParamsWithHTTPClient(client *http.Client) *IssueDeleteIssueReactionParams {
+	return &IssueDeleteIssueReactionParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+IssueDeleteIssueReactionParams contains all the parameters to send to the API endpoint
+
+	for the issue delete issue reaction operation.
+
+	Typically these are written to a http.Request.
+*/
+type IssueDeleteIssueReactionParams struct {
+
+	// Content.
+	Content *models.EditReactionOption
+
+	/* Index.
+
+	   index of the issue
+
+	   Format: int64
+	*/
+	Index int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the issue delete issue reaction params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueDeleteIssueReactionParams) WithDefaults() *IssueDeleteIssueReactionParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the issue delete issue reaction params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueDeleteIssueReactionParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the issue delete issue reaction params
+func (o *IssueDeleteIssueReactionParams) WithTimeout(timeout time.Duration) *IssueDeleteIssueReactionParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the issue delete issue reaction params
+func (o *IssueDeleteIssueReactionParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the issue delete issue reaction params
+func (o *IssueDeleteIssueReactionParams) WithContext(ctx context.Context) *IssueDeleteIssueReactionParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the issue delete issue reaction params
+func (o *IssueDeleteIssueReactionParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the issue delete issue reaction params
+func (o *IssueDeleteIssueReactionParams) WithHTTPClient(client *http.Client) *IssueDeleteIssueReactionParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the issue delete issue reaction params
+func (o *IssueDeleteIssueReactionParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithContent adds the content to the issue delete issue reaction params
+func (o *IssueDeleteIssueReactionParams) WithContent(content *models.EditReactionOption) *IssueDeleteIssueReactionParams {
+	o.SetContent(content)
+	return o
+}
+
+// SetContent adds the content to the issue delete issue reaction params
+func (o *IssueDeleteIssueReactionParams) SetContent(content *models.EditReactionOption) {
+	o.Content = content
+}
+
+// WithIndex adds the index to the issue delete issue reaction params
+func (o *IssueDeleteIssueReactionParams) WithIndex(index int64) *IssueDeleteIssueReactionParams {
+	o.SetIndex(index)
+	return o
+}
+
+// SetIndex adds the index to the issue delete issue reaction params
+func (o *IssueDeleteIssueReactionParams) SetIndex(index int64) {
+	o.Index = index
+}
+
+// WithOwner adds the owner to the issue delete issue reaction params
+func (o *IssueDeleteIssueReactionParams) WithOwner(owner string) *IssueDeleteIssueReactionParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the issue delete issue reaction params
+func (o *IssueDeleteIssueReactionParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the issue delete issue reaction params
+func (o *IssueDeleteIssueReactionParams) WithRepo(repo string) *IssueDeleteIssueReactionParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the issue delete issue reaction params
+func (o *IssueDeleteIssueReactionParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *IssueDeleteIssueReactionParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Content != nil {
+		if err := r.SetBodyParam(o.Content); err != nil {
+			return err
+		}
+	}
+
+	// path param index
+	if err := r.SetPathParam("index", swag.FormatInt64(o.Index)); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_delete_issue_reaction_responses.go b/bots-common/gitea-generated/client/issue/issue_delete_issue_reaction_responses.go
new file mode 100644
index 0000000..d7b88d8
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_delete_issue_reaction_responses.go
@@ -0,0 +1,228 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// IssueDeleteIssueReactionReader is a Reader for the IssueDeleteIssueReaction structure.
+type IssueDeleteIssueReactionReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *IssueDeleteIssueReactionReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewIssueDeleteIssueReactionOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 403:
+		result := NewIssueDeleteIssueReactionForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewIssueDeleteIssueReactionNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[DELETE /repos/{owner}/{repo}/issues/{index}/reactions] issueDeleteIssueReaction", response, response.Code())
+	}
+}
+
+// NewIssueDeleteIssueReactionOK creates a IssueDeleteIssueReactionOK with default headers values
+func NewIssueDeleteIssueReactionOK() *IssueDeleteIssueReactionOK {
+	return &IssueDeleteIssueReactionOK{}
+}
+
+/*
+IssueDeleteIssueReactionOK describes a response with status code 200, with default header values.
+
+APIEmpty is an empty response
+*/
+type IssueDeleteIssueReactionOK struct {
+}
+
+// IsSuccess returns true when this issue delete issue reaction o k response has a 2xx status code
+func (o *IssueDeleteIssueReactionOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this issue delete issue reaction o k response has a 3xx status code
+func (o *IssueDeleteIssueReactionOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue delete issue reaction o k response has a 4xx status code
+func (o *IssueDeleteIssueReactionOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this issue delete issue reaction o k response has a 5xx status code
+func (o *IssueDeleteIssueReactionOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue delete issue reaction o k response a status code equal to that given
+func (o *IssueDeleteIssueReactionOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the issue delete issue reaction o k response
+func (o *IssueDeleteIssueReactionOK) Code() int {
+	return 200
+}
+
+func (o *IssueDeleteIssueReactionOK) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/{index}/reactions][%d] issueDeleteIssueReactionOK", 200)
+}
+
+func (o *IssueDeleteIssueReactionOK) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/{index}/reactions][%d] issueDeleteIssueReactionOK", 200)
+}
+
+func (o *IssueDeleteIssueReactionOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewIssueDeleteIssueReactionForbidden creates a IssueDeleteIssueReactionForbidden with default headers values
+func NewIssueDeleteIssueReactionForbidden() *IssueDeleteIssueReactionForbidden {
+	return &IssueDeleteIssueReactionForbidden{}
+}
+
+/*
+IssueDeleteIssueReactionForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type IssueDeleteIssueReactionForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this issue delete issue reaction forbidden response has a 2xx status code
+func (o *IssueDeleteIssueReactionForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue delete issue reaction forbidden response has a 3xx status code
+func (o *IssueDeleteIssueReactionForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue delete issue reaction forbidden response has a 4xx status code
+func (o *IssueDeleteIssueReactionForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue delete issue reaction forbidden response has a 5xx status code
+func (o *IssueDeleteIssueReactionForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue delete issue reaction forbidden response a status code equal to that given
+func (o *IssueDeleteIssueReactionForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the issue delete issue reaction forbidden response
+func (o *IssueDeleteIssueReactionForbidden) Code() int {
+	return 403
+}
+
+func (o *IssueDeleteIssueReactionForbidden) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/{index}/reactions][%d] issueDeleteIssueReactionForbidden", 403)
+}
+
+func (o *IssueDeleteIssueReactionForbidden) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/{index}/reactions][%d] issueDeleteIssueReactionForbidden", 403)
+}
+
+func (o *IssueDeleteIssueReactionForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewIssueDeleteIssueReactionNotFound creates a IssueDeleteIssueReactionNotFound with default headers values
+func NewIssueDeleteIssueReactionNotFound() *IssueDeleteIssueReactionNotFound {
+	return &IssueDeleteIssueReactionNotFound{}
+}
+
+/*
+IssueDeleteIssueReactionNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type IssueDeleteIssueReactionNotFound struct {
+}
+
+// IsSuccess returns true when this issue delete issue reaction not found response has a 2xx status code
+func (o *IssueDeleteIssueReactionNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue delete issue reaction not found response has a 3xx status code
+func (o *IssueDeleteIssueReactionNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue delete issue reaction not found response has a 4xx status code
+func (o *IssueDeleteIssueReactionNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue delete issue reaction not found response has a 5xx status code
+func (o *IssueDeleteIssueReactionNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue delete issue reaction not found response a status code equal to that given
+func (o *IssueDeleteIssueReactionNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the issue delete issue reaction not found response
+func (o *IssueDeleteIssueReactionNotFound) Code() int {
+	return 404
+}
+
+func (o *IssueDeleteIssueReactionNotFound) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/{index}/reactions][%d] issueDeleteIssueReactionNotFound", 404)
+}
+
+func (o *IssueDeleteIssueReactionNotFound) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/{index}/reactions][%d] issueDeleteIssueReactionNotFound", 404)
+}
+
+func (o *IssueDeleteIssueReactionNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_delete_label_parameters.go b/bots-common/gitea-generated/client/issue/issue_delete_label_parameters.go
new file mode 100644
index 0000000..0b9cfa2
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_delete_label_parameters.go
@@ -0,0 +1,198 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewIssueDeleteLabelParams creates a new IssueDeleteLabelParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewIssueDeleteLabelParams() *IssueDeleteLabelParams {
+	return &IssueDeleteLabelParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewIssueDeleteLabelParamsWithTimeout creates a new IssueDeleteLabelParams object
+// with the ability to set a timeout on a request.
+func NewIssueDeleteLabelParamsWithTimeout(timeout time.Duration) *IssueDeleteLabelParams {
+	return &IssueDeleteLabelParams{
+		timeout: timeout,
+	}
+}
+
+// NewIssueDeleteLabelParamsWithContext creates a new IssueDeleteLabelParams object
+// with the ability to set a context for a request.
+func NewIssueDeleteLabelParamsWithContext(ctx context.Context) *IssueDeleteLabelParams {
+	return &IssueDeleteLabelParams{
+		Context: ctx,
+	}
+}
+
+// NewIssueDeleteLabelParamsWithHTTPClient creates a new IssueDeleteLabelParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewIssueDeleteLabelParamsWithHTTPClient(client *http.Client) *IssueDeleteLabelParams {
+	return &IssueDeleteLabelParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+IssueDeleteLabelParams contains all the parameters to send to the API endpoint
+
+	for the issue delete label operation.
+
+	Typically these are written to a http.Request.
+*/
+type IssueDeleteLabelParams struct {
+
+	/* ID.
+
+	   id of the label to delete
+
+	   Format: int64
+	*/
+	ID int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the issue delete label params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueDeleteLabelParams) WithDefaults() *IssueDeleteLabelParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the issue delete label params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueDeleteLabelParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the issue delete label params
+func (o *IssueDeleteLabelParams) WithTimeout(timeout time.Duration) *IssueDeleteLabelParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the issue delete label params
+func (o *IssueDeleteLabelParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the issue delete label params
+func (o *IssueDeleteLabelParams) WithContext(ctx context.Context) *IssueDeleteLabelParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the issue delete label params
+func (o *IssueDeleteLabelParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the issue delete label params
+func (o *IssueDeleteLabelParams) WithHTTPClient(client *http.Client) *IssueDeleteLabelParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the issue delete label params
+func (o *IssueDeleteLabelParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithID adds the id to the issue delete label params
+func (o *IssueDeleteLabelParams) WithID(id int64) *IssueDeleteLabelParams {
+	o.SetID(id)
+	return o
+}
+
+// SetID adds the id to the issue delete label params
+func (o *IssueDeleteLabelParams) SetID(id int64) {
+	o.ID = id
+}
+
+// WithOwner adds the owner to the issue delete label params
+func (o *IssueDeleteLabelParams) WithOwner(owner string) *IssueDeleteLabelParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the issue delete label params
+func (o *IssueDeleteLabelParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the issue delete label params
+func (o *IssueDeleteLabelParams) WithRepo(repo string) *IssueDeleteLabelParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the issue delete label params
+func (o *IssueDeleteLabelParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *IssueDeleteLabelParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param id
+	if err := r.SetPathParam("id", swag.FormatInt64(o.ID)); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_delete_label_responses.go b/bots-common/gitea-generated/client/issue/issue_delete_label_responses.go
new file mode 100644
index 0000000..0c085f2
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_delete_label_responses.go
@@ -0,0 +1,150 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// IssueDeleteLabelReader is a Reader for the IssueDeleteLabel structure.
+type IssueDeleteLabelReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *IssueDeleteLabelReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewIssueDeleteLabelNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewIssueDeleteLabelNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[DELETE /repos/{owner}/{repo}/labels/{id}] issueDeleteLabel", response, response.Code())
+	}
+}
+
+// NewIssueDeleteLabelNoContent creates a IssueDeleteLabelNoContent with default headers values
+func NewIssueDeleteLabelNoContent() *IssueDeleteLabelNoContent {
+	return &IssueDeleteLabelNoContent{}
+}
+
+/*
+IssueDeleteLabelNoContent describes a response with status code 204, with default header values.
+
+APIEmpty is an empty response
+*/
+type IssueDeleteLabelNoContent struct {
+}
+
+// IsSuccess returns true when this issue delete label no content response has a 2xx status code
+func (o *IssueDeleteLabelNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this issue delete label no content response has a 3xx status code
+func (o *IssueDeleteLabelNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue delete label no content response has a 4xx status code
+func (o *IssueDeleteLabelNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this issue delete label no content response has a 5xx status code
+func (o *IssueDeleteLabelNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue delete label no content response a status code equal to that given
+func (o *IssueDeleteLabelNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the issue delete label no content response
+func (o *IssueDeleteLabelNoContent) Code() int {
+	return 204
+}
+
+func (o *IssueDeleteLabelNoContent) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/labels/{id}][%d] issueDeleteLabelNoContent", 204)
+}
+
+func (o *IssueDeleteLabelNoContent) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/labels/{id}][%d] issueDeleteLabelNoContent", 204)
+}
+
+func (o *IssueDeleteLabelNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewIssueDeleteLabelNotFound creates a IssueDeleteLabelNotFound with default headers values
+func NewIssueDeleteLabelNotFound() *IssueDeleteLabelNotFound {
+	return &IssueDeleteLabelNotFound{}
+}
+
+/*
+IssueDeleteLabelNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type IssueDeleteLabelNotFound struct {
+}
+
+// IsSuccess returns true when this issue delete label not found response has a 2xx status code
+func (o *IssueDeleteLabelNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue delete label not found response has a 3xx status code
+func (o *IssueDeleteLabelNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue delete label not found response has a 4xx status code
+func (o *IssueDeleteLabelNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue delete label not found response has a 5xx status code
+func (o *IssueDeleteLabelNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue delete label not found response a status code equal to that given
+func (o *IssueDeleteLabelNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the issue delete label not found response
+func (o *IssueDeleteLabelNotFound) Code() int {
+	return 404
+}
+
+func (o *IssueDeleteLabelNotFound) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/labels/{id}][%d] issueDeleteLabelNotFound", 404)
+}
+
+func (o *IssueDeleteLabelNotFound) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/labels/{id}][%d] issueDeleteLabelNotFound", 404)
+}
+
+func (o *IssueDeleteLabelNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_delete_milestone_parameters.go b/bots-common/gitea-generated/client/issue/issue_delete_milestone_parameters.go
new file mode 100644
index 0000000..6fd8647
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_delete_milestone_parameters.go
@@ -0,0 +1,195 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewIssueDeleteMilestoneParams creates a new IssueDeleteMilestoneParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewIssueDeleteMilestoneParams() *IssueDeleteMilestoneParams {
+	return &IssueDeleteMilestoneParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewIssueDeleteMilestoneParamsWithTimeout creates a new IssueDeleteMilestoneParams object
+// with the ability to set a timeout on a request.
+func NewIssueDeleteMilestoneParamsWithTimeout(timeout time.Duration) *IssueDeleteMilestoneParams {
+	return &IssueDeleteMilestoneParams{
+		timeout: timeout,
+	}
+}
+
+// NewIssueDeleteMilestoneParamsWithContext creates a new IssueDeleteMilestoneParams object
+// with the ability to set a context for a request.
+func NewIssueDeleteMilestoneParamsWithContext(ctx context.Context) *IssueDeleteMilestoneParams {
+	return &IssueDeleteMilestoneParams{
+		Context: ctx,
+	}
+}
+
+// NewIssueDeleteMilestoneParamsWithHTTPClient creates a new IssueDeleteMilestoneParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewIssueDeleteMilestoneParamsWithHTTPClient(client *http.Client) *IssueDeleteMilestoneParams {
+	return &IssueDeleteMilestoneParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+IssueDeleteMilestoneParams contains all the parameters to send to the API endpoint
+
+	for the issue delete milestone operation.
+
+	Typically these are written to a http.Request.
+*/
+type IssueDeleteMilestoneParams struct {
+
+	/* ID.
+
+	   the milestone to delete, identified by ID and if not available by name
+	*/
+	ID string
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the issue delete milestone params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueDeleteMilestoneParams) WithDefaults() *IssueDeleteMilestoneParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the issue delete milestone params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueDeleteMilestoneParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the issue delete milestone params
+func (o *IssueDeleteMilestoneParams) WithTimeout(timeout time.Duration) *IssueDeleteMilestoneParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the issue delete milestone params
+func (o *IssueDeleteMilestoneParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the issue delete milestone params
+func (o *IssueDeleteMilestoneParams) WithContext(ctx context.Context) *IssueDeleteMilestoneParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the issue delete milestone params
+func (o *IssueDeleteMilestoneParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the issue delete milestone params
+func (o *IssueDeleteMilestoneParams) WithHTTPClient(client *http.Client) *IssueDeleteMilestoneParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the issue delete milestone params
+func (o *IssueDeleteMilestoneParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithID adds the id to the issue delete milestone params
+func (o *IssueDeleteMilestoneParams) WithID(id string) *IssueDeleteMilestoneParams {
+	o.SetID(id)
+	return o
+}
+
+// SetID adds the id to the issue delete milestone params
+func (o *IssueDeleteMilestoneParams) SetID(id string) {
+	o.ID = id
+}
+
+// WithOwner adds the owner to the issue delete milestone params
+func (o *IssueDeleteMilestoneParams) WithOwner(owner string) *IssueDeleteMilestoneParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the issue delete milestone params
+func (o *IssueDeleteMilestoneParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the issue delete milestone params
+func (o *IssueDeleteMilestoneParams) WithRepo(repo string) *IssueDeleteMilestoneParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the issue delete milestone params
+func (o *IssueDeleteMilestoneParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *IssueDeleteMilestoneParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param id
+	if err := r.SetPathParam("id", o.ID); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_delete_milestone_responses.go b/bots-common/gitea-generated/client/issue/issue_delete_milestone_responses.go
new file mode 100644
index 0000000..9173b50
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_delete_milestone_responses.go
@@ -0,0 +1,150 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// IssueDeleteMilestoneReader is a Reader for the IssueDeleteMilestone structure.
+type IssueDeleteMilestoneReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *IssueDeleteMilestoneReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewIssueDeleteMilestoneNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewIssueDeleteMilestoneNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[DELETE /repos/{owner}/{repo}/milestones/{id}] issueDeleteMilestone", response, response.Code())
+	}
+}
+
+// NewIssueDeleteMilestoneNoContent creates a IssueDeleteMilestoneNoContent with default headers values
+func NewIssueDeleteMilestoneNoContent() *IssueDeleteMilestoneNoContent {
+	return &IssueDeleteMilestoneNoContent{}
+}
+
+/*
+IssueDeleteMilestoneNoContent describes a response with status code 204, with default header values.
+
+APIEmpty is an empty response
+*/
+type IssueDeleteMilestoneNoContent struct {
+}
+
+// IsSuccess returns true when this issue delete milestone no content response has a 2xx status code
+func (o *IssueDeleteMilestoneNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this issue delete milestone no content response has a 3xx status code
+func (o *IssueDeleteMilestoneNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue delete milestone no content response has a 4xx status code
+func (o *IssueDeleteMilestoneNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this issue delete milestone no content response has a 5xx status code
+func (o *IssueDeleteMilestoneNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue delete milestone no content response a status code equal to that given
+func (o *IssueDeleteMilestoneNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the issue delete milestone no content response
+func (o *IssueDeleteMilestoneNoContent) Code() int {
+	return 204
+}
+
+func (o *IssueDeleteMilestoneNoContent) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/milestones/{id}][%d] issueDeleteMilestoneNoContent", 204)
+}
+
+func (o *IssueDeleteMilestoneNoContent) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/milestones/{id}][%d] issueDeleteMilestoneNoContent", 204)
+}
+
+func (o *IssueDeleteMilestoneNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewIssueDeleteMilestoneNotFound creates a IssueDeleteMilestoneNotFound with default headers values
+func NewIssueDeleteMilestoneNotFound() *IssueDeleteMilestoneNotFound {
+	return &IssueDeleteMilestoneNotFound{}
+}
+
+/*
+IssueDeleteMilestoneNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type IssueDeleteMilestoneNotFound struct {
+}
+
+// IsSuccess returns true when this issue delete milestone not found response has a 2xx status code
+func (o *IssueDeleteMilestoneNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue delete milestone not found response has a 3xx status code
+func (o *IssueDeleteMilestoneNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue delete milestone not found response has a 4xx status code
+func (o *IssueDeleteMilestoneNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue delete milestone not found response has a 5xx status code
+func (o *IssueDeleteMilestoneNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue delete milestone not found response a status code equal to that given
+func (o *IssueDeleteMilestoneNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the issue delete milestone not found response
+func (o *IssueDeleteMilestoneNotFound) Code() int {
+	return 404
+}
+
+func (o *IssueDeleteMilestoneNotFound) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/milestones/{id}][%d] issueDeleteMilestoneNotFound", 404)
+}
+
+func (o *IssueDeleteMilestoneNotFound) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/milestones/{id}][%d] issueDeleteMilestoneNotFound", 404)
+}
+
+func (o *IssueDeleteMilestoneNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_delete_parameters.go b/bots-common/gitea-generated/client/issue/issue_delete_parameters.go
new file mode 100644
index 0000000..540d3cf
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_delete_parameters.go
@@ -0,0 +1,198 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewIssueDeleteParams creates a new IssueDeleteParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewIssueDeleteParams() *IssueDeleteParams {
+	return &IssueDeleteParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewIssueDeleteParamsWithTimeout creates a new IssueDeleteParams object
+// with the ability to set a timeout on a request.
+func NewIssueDeleteParamsWithTimeout(timeout time.Duration) *IssueDeleteParams {
+	return &IssueDeleteParams{
+		timeout: timeout,
+	}
+}
+
+// NewIssueDeleteParamsWithContext creates a new IssueDeleteParams object
+// with the ability to set a context for a request.
+func NewIssueDeleteParamsWithContext(ctx context.Context) *IssueDeleteParams {
+	return &IssueDeleteParams{
+		Context: ctx,
+	}
+}
+
+// NewIssueDeleteParamsWithHTTPClient creates a new IssueDeleteParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewIssueDeleteParamsWithHTTPClient(client *http.Client) *IssueDeleteParams {
+	return &IssueDeleteParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+IssueDeleteParams contains all the parameters to send to the API endpoint
+
+	for the issue delete operation.
+
+	Typically these are written to a http.Request.
+*/
+type IssueDeleteParams struct {
+
+	/* Index.
+
+	   index of issue to delete
+
+	   Format: int64
+	*/
+	Index int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the issue delete params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueDeleteParams) WithDefaults() *IssueDeleteParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the issue delete params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueDeleteParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the issue delete params
+func (o *IssueDeleteParams) WithTimeout(timeout time.Duration) *IssueDeleteParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the issue delete params
+func (o *IssueDeleteParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the issue delete params
+func (o *IssueDeleteParams) WithContext(ctx context.Context) *IssueDeleteParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the issue delete params
+func (o *IssueDeleteParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the issue delete params
+func (o *IssueDeleteParams) WithHTTPClient(client *http.Client) *IssueDeleteParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the issue delete params
+func (o *IssueDeleteParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithIndex adds the index to the issue delete params
+func (o *IssueDeleteParams) WithIndex(index int64) *IssueDeleteParams {
+	o.SetIndex(index)
+	return o
+}
+
+// SetIndex adds the index to the issue delete params
+func (o *IssueDeleteParams) SetIndex(index int64) {
+	o.Index = index
+}
+
+// WithOwner adds the owner to the issue delete params
+func (o *IssueDeleteParams) WithOwner(owner string) *IssueDeleteParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the issue delete params
+func (o *IssueDeleteParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the issue delete params
+func (o *IssueDeleteParams) WithRepo(repo string) *IssueDeleteParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the issue delete params
+func (o *IssueDeleteParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *IssueDeleteParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param index
+	if err := r.SetPathParam("index", swag.FormatInt64(o.Index)); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_delete_responses.go b/bots-common/gitea-generated/client/issue/issue_delete_responses.go
new file mode 100644
index 0000000..b59edb4
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_delete_responses.go
@@ -0,0 +1,228 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// IssueDeleteReader is a Reader for the IssueDelete structure.
+type IssueDeleteReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *IssueDeleteReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewIssueDeleteNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 403:
+		result := NewIssueDeleteForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewIssueDeleteNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[DELETE /repos/{owner}/{repo}/issues/{index}] issueDelete", response, response.Code())
+	}
+}
+
+// NewIssueDeleteNoContent creates a IssueDeleteNoContent with default headers values
+func NewIssueDeleteNoContent() *IssueDeleteNoContent {
+	return &IssueDeleteNoContent{}
+}
+
+/*
+IssueDeleteNoContent describes a response with status code 204, with default header values.
+
+APIEmpty is an empty response
+*/
+type IssueDeleteNoContent struct {
+}
+
+// IsSuccess returns true when this issue delete no content response has a 2xx status code
+func (o *IssueDeleteNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this issue delete no content response has a 3xx status code
+func (o *IssueDeleteNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue delete no content response has a 4xx status code
+func (o *IssueDeleteNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this issue delete no content response has a 5xx status code
+func (o *IssueDeleteNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue delete no content response a status code equal to that given
+func (o *IssueDeleteNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the issue delete no content response
+func (o *IssueDeleteNoContent) Code() int {
+	return 204
+}
+
+func (o *IssueDeleteNoContent) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/{index}][%d] issueDeleteNoContent", 204)
+}
+
+func (o *IssueDeleteNoContent) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/{index}][%d] issueDeleteNoContent", 204)
+}
+
+func (o *IssueDeleteNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewIssueDeleteForbidden creates a IssueDeleteForbidden with default headers values
+func NewIssueDeleteForbidden() *IssueDeleteForbidden {
+	return &IssueDeleteForbidden{}
+}
+
+/*
+IssueDeleteForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type IssueDeleteForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this issue delete forbidden response has a 2xx status code
+func (o *IssueDeleteForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue delete forbidden response has a 3xx status code
+func (o *IssueDeleteForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue delete forbidden response has a 4xx status code
+func (o *IssueDeleteForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue delete forbidden response has a 5xx status code
+func (o *IssueDeleteForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue delete forbidden response a status code equal to that given
+func (o *IssueDeleteForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the issue delete forbidden response
+func (o *IssueDeleteForbidden) Code() int {
+	return 403
+}
+
+func (o *IssueDeleteForbidden) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/{index}][%d] issueDeleteForbidden", 403)
+}
+
+func (o *IssueDeleteForbidden) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/{index}][%d] issueDeleteForbidden", 403)
+}
+
+func (o *IssueDeleteForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewIssueDeleteNotFound creates a IssueDeleteNotFound with default headers values
+func NewIssueDeleteNotFound() *IssueDeleteNotFound {
+	return &IssueDeleteNotFound{}
+}
+
+/*
+IssueDeleteNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type IssueDeleteNotFound struct {
+}
+
+// IsSuccess returns true when this issue delete not found response has a 2xx status code
+func (o *IssueDeleteNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue delete not found response has a 3xx status code
+func (o *IssueDeleteNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue delete not found response has a 4xx status code
+func (o *IssueDeleteNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue delete not found response has a 5xx status code
+func (o *IssueDeleteNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue delete not found response a status code equal to that given
+func (o *IssueDeleteNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the issue delete not found response
+func (o *IssueDeleteNotFound) Code() int {
+	return 404
+}
+
+func (o *IssueDeleteNotFound) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/{index}][%d] issueDeleteNotFound", 404)
+}
+
+func (o *IssueDeleteNotFound) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/{index}][%d] issueDeleteNotFound", 404)
+}
+
+func (o *IssueDeleteNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_delete_stop_watch_parameters.go b/bots-common/gitea-generated/client/issue/issue_delete_stop_watch_parameters.go
new file mode 100644
index 0000000..917672c
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_delete_stop_watch_parameters.go
@@ -0,0 +1,198 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewIssueDeleteStopWatchParams creates a new IssueDeleteStopWatchParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewIssueDeleteStopWatchParams() *IssueDeleteStopWatchParams {
+	return &IssueDeleteStopWatchParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewIssueDeleteStopWatchParamsWithTimeout creates a new IssueDeleteStopWatchParams object
+// with the ability to set a timeout on a request.
+func NewIssueDeleteStopWatchParamsWithTimeout(timeout time.Duration) *IssueDeleteStopWatchParams {
+	return &IssueDeleteStopWatchParams{
+		timeout: timeout,
+	}
+}
+
+// NewIssueDeleteStopWatchParamsWithContext creates a new IssueDeleteStopWatchParams object
+// with the ability to set a context for a request.
+func NewIssueDeleteStopWatchParamsWithContext(ctx context.Context) *IssueDeleteStopWatchParams {
+	return &IssueDeleteStopWatchParams{
+		Context: ctx,
+	}
+}
+
+// NewIssueDeleteStopWatchParamsWithHTTPClient creates a new IssueDeleteStopWatchParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewIssueDeleteStopWatchParamsWithHTTPClient(client *http.Client) *IssueDeleteStopWatchParams {
+	return &IssueDeleteStopWatchParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+IssueDeleteStopWatchParams contains all the parameters to send to the API endpoint
+
+	for the issue delete stop watch operation.
+
+	Typically these are written to a http.Request.
+*/
+type IssueDeleteStopWatchParams struct {
+
+	/* Index.
+
+	   index of the issue to stop the stopwatch on
+
+	   Format: int64
+	*/
+	Index int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the issue delete stop watch params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueDeleteStopWatchParams) WithDefaults() *IssueDeleteStopWatchParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the issue delete stop watch params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueDeleteStopWatchParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the issue delete stop watch params
+func (o *IssueDeleteStopWatchParams) WithTimeout(timeout time.Duration) *IssueDeleteStopWatchParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the issue delete stop watch params
+func (o *IssueDeleteStopWatchParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the issue delete stop watch params
+func (o *IssueDeleteStopWatchParams) WithContext(ctx context.Context) *IssueDeleteStopWatchParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the issue delete stop watch params
+func (o *IssueDeleteStopWatchParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the issue delete stop watch params
+func (o *IssueDeleteStopWatchParams) WithHTTPClient(client *http.Client) *IssueDeleteStopWatchParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the issue delete stop watch params
+func (o *IssueDeleteStopWatchParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithIndex adds the index to the issue delete stop watch params
+func (o *IssueDeleteStopWatchParams) WithIndex(index int64) *IssueDeleteStopWatchParams {
+	o.SetIndex(index)
+	return o
+}
+
+// SetIndex adds the index to the issue delete stop watch params
+func (o *IssueDeleteStopWatchParams) SetIndex(index int64) {
+	o.Index = index
+}
+
+// WithOwner adds the owner to the issue delete stop watch params
+func (o *IssueDeleteStopWatchParams) WithOwner(owner string) *IssueDeleteStopWatchParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the issue delete stop watch params
+func (o *IssueDeleteStopWatchParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the issue delete stop watch params
+func (o *IssueDeleteStopWatchParams) WithRepo(repo string) *IssueDeleteStopWatchParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the issue delete stop watch params
+func (o *IssueDeleteStopWatchParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *IssueDeleteStopWatchParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param index
+	if err := r.SetPathParam("index", swag.FormatInt64(o.Index)); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_delete_stop_watch_responses.go b/bots-common/gitea-generated/client/issue/issue_delete_stop_watch_responses.go
new file mode 100644
index 0000000..29afa12
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_delete_stop_watch_responses.go
@@ -0,0 +1,274 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// IssueDeleteStopWatchReader is a Reader for the IssueDeleteStopWatch structure.
+type IssueDeleteStopWatchReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *IssueDeleteStopWatchReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewIssueDeleteStopWatchNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 403:
+		result := NewIssueDeleteStopWatchForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewIssueDeleteStopWatchNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 409:
+		result := NewIssueDeleteStopWatchConflict()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[DELETE /repos/{owner}/{repo}/issues/{index}/stopwatch/delete] issueDeleteStopWatch", response, response.Code())
+	}
+}
+
+// NewIssueDeleteStopWatchNoContent creates a IssueDeleteStopWatchNoContent with default headers values
+func NewIssueDeleteStopWatchNoContent() *IssueDeleteStopWatchNoContent {
+	return &IssueDeleteStopWatchNoContent{}
+}
+
+/*
+IssueDeleteStopWatchNoContent describes a response with status code 204, with default header values.
+
+APIEmpty is an empty response
+*/
+type IssueDeleteStopWatchNoContent struct {
+}
+
+// IsSuccess returns true when this issue delete stop watch no content response has a 2xx status code
+func (o *IssueDeleteStopWatchNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this issue delete stop watch no content response has a 3xx status code
+func (o *IssueDeleteStopWatchNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue delete stop watch no content response has a 4xx status code
+func (o *IssueDeleteStopWatchNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this issue delete stop watch no content response has a 5xx status code
+func (o *IssueDeleteStopWatchNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue delete stop watch no content response a status code equal to that given
+func (o *IssueDeleteStopWatchNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the issue delete stop watch no content response
+func (o *IssueDeleteStopWatchNoContent) Code() int {
+	return 204
+}
+
+func (o *IssueDeleteStopWatchNoContent) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/{index}/stopwatch/delete][%d] issueDeleteStopWatchNoContent", 204)
+}
+
+func (o *IssueDeleteStopWatchNoContent) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/{index}/stopwatch/delete][%d] issueDeleteStopWatchNoContent", 204)
+}
+
+func (o *IssueDeleteStopWatchNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewIssueDeleteStopWatchForbidden creates a IssueDeleteStopWatchForbidden with default headers values
+func NewIssueDeleteStopWatchForbidden() *IssueDeleteStopWatchForbidden {
+	return &IssueDeleteStopWatchForbidden{}
+}
+
+/*
+IssueDeleteStopWatchForbidden describes a response with status code 403, with default header values.
+
+Not repo writer, user does not have rights to toggle stopwatch
+*/
+type IssueDeleteStopWatchForbidden struct {
+}
+
+// IsSuccess returns true when this issue delete stop watch forbidden response has a 2xx status code
+func (o *IssueDeleteStopWatchForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue delete stop watch forbidden response has a 3xx status code
+func (o *IssueDeleteStopWatchForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue delete stop watch forbidden response has a 4xx status code
+func (o *IssueDeleteStopWatchForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue delete stop watch forbidden response has a 5xx status code
+func (o *IssueDeleteStopWatchForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue delete stop watch forbidden response a status code equal to that given
+func (o *IssueDeleteStopWatchForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the issue delete stop watch forbidden response
+func (o *IssueDeleteStopWatchForbidden) Code() int {
+	return 403
+}
+
+func (o *IssueDeleteStopWatchForbidden) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/{index}/stopwatch/delete][%d] issueDeleteStopWatchForbidden", 403)
+}
+
+func (o *IssueDeleteStopWatchForbidden) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/{index}/stopwatch/delete][%d] issueDeleteStopWatchForbidden", 403)
+}
+
+func (o *IssueDeleteStopWatchForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewIssueDeleteStopWatchNotFound creates a IssueDeleteStopWatchNotFound with default headers values
+func NewIssueDeleteStopWatchNotFound() *IssueDeleteStopWatchNotFound {
+	return &IssueDeleteStopWatchNotFound{}
+}
+
+/*
+IssueDeleteStopWatchNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type IssueDeleteStopWatchNotFound struct {
+}
+
+// IsSuccess returns true when this issue delete stop watch not found response has a 2xx status code
+func (o *IssueDeleteStopWatchNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue delete stop watch not found response has a 3xx status code
+func (o *IssueDeleteStopWatchNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue delete stop watch not found response has a 4xx status code
+func (o *IssueDeleteStopWatchNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue delete stop watch not found response has a 5xx status code
+func (o *IssueDeleteStopWatchNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue delete stop watch not found response a status code equal to that given
+func (o *IssueDeleteStopWatchNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the issue delete stop watch not found response
+func (o *IssueDeleteStopWatchNotFound) Code() int {
+	return 404
+}
+
+func (o *IssueDeleteStopWatchNotFound) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/{index}/stopwatch/delete][%d] issueDeleteStopWatchNotFound", 404)
+}
+
+func (o *IssueDeleteStopWatchNotFound) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/{index}/stopwatch/delete][%d] issueDeleteStopWatchNotFound", 404)
+}
+
+func (o *IssueDeleteStopWatchNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewIssueDeleteStopWatchConflict creates a IssueDeleteStopWatchConflict with default headers values
+func NewIssueDeleteStopWatchConflict() *IssueDeleteStopWatchConflict {
+	return &IssueDeleteStopWatchConflict{}
+}
+
+/*
+IssueDeleteStopWatchConflict describes a response with status code 409, with default header values.
+
+Cannot cancel a non existent stopwatch
+*/
+type IssueDeleteStopWatchConflict struct {
+}
+
+// IsSuccess returns true when this issue delete stop watch conflict response has a 2xx status code
+func (o *IssueDeleteStopWatchConflict) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue delete stop watch conflict response has a 3xx status code
+func (o *IssueDeleteStopWatchConflict) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue delete stop watch conflict response has a 4xx status code
+func (o *IssueDeleteStopWatchConflict) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue delete stop watch conflict response has a 5xx status code
+func (o *IssueDeleteStopWatchConflict) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue delete stop watch conflict response a status code equal to that given
+func (o *IssueDeleteStopWatchConflict) IsCode(code int) bool {
+	return code == 409
+}
+
+// Code gets the status code for the issue delete stop watch conflict response
+func (o *IssueDeleteStopWatchConflict) Code() int {
+	return 409
+}
+
+func (o *IssueDeleteStopWatchConflict) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/{index}/stopwatch/delete][%d] issueDeleteStopWatchConflict", 409)
+}
+
+func (o *IssueDeleteStopWatchConflict) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/{index}/stopwatch/delete][%d] issueDeleteStopWatchConflict", 409)
+}
+
+func (o *IssueDeleteStopWatchConflict) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_delete_subscription_parameters.go b/bots-common/gitea-generated/client/issue/issue_delete_subscription_parameters.go
new file mode 100644
index 0000000..1b72f5b
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_delete_subscription_parameters.go
@@ -0,0 +1,220 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewIssueDeleteSubscriptionParams creates a new IssueDeleteSubscriptionParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewIssueDeleteSubscriptionParams() *IssueDeleteSubscriptionParams {
+	return &IssueDeleteSubscriptionParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewIssueDeleteSubscriptionParamsWithTimeout creates a new IssueDeleteSubscriptionParams object
+// with the ability to set a timeout on a request.
+func NewIssueDeleteSubscriptionParamsWithTimeout(timeout time.Duration) *IssueDeleteSubscriptionParams {
+	return &IssueDeleteSubscriptionParams{
+		timeout: timeout,
+	}
+}
+
+// NewIssueDeleteSubscriptionParamsWithContext creates a new IssueDeleteSubscriptionParams object
+// with the ability to set a context for a request.
+func NewIssueDeleteSubscriptionParamsWithContext(ctx context.Context) *IssueDeleteSubscriptionParams {
+	return &IssueDeleteSubscriptionParams{
+		Context: ctx,
+	}
+}
+
+// NewIssueDeleteSubscriptionParamsWithHTTPClient creates a new IssueDeleteSubscriptionParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewIssueDeleteSubscriptionParamsWithHTTPClient(client *http.Client) *IssueDeleteSubscriptionParams {
+	return &IssueDeleteSubscriptionParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+IssueDeleteSubscriptionParams contains all the parameters to send to the API endpoint
+
+	for the issue delete subscription operation.
+
+	Typically these are written to a http.Request.
+*/
+type IssueDeleteSubscriptionParams struct {
+
+	/* Index.
+
+	   index of the issue
+
+	   Format: int64
+	*/
+	Index int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	/* User.
+
+	   user witch unsubscribe
+	*/
+	User string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the issue delete subscription params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueDeleteSubscriptionParams) WithDefaults() *IssueDeleteSubscriptionParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the issue delete subscription params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueDeleteSubscriptionParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the issue delete subscription params
+func (o *IssueDeleteSubscriptionParams) WithTimeout(timeout time.Duration) *IssueDeleteSubscriptionParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the issue delete subscription params
+func (o *IssueDeleteSubscriptionParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the issue delete subscription params
+func (o *IssueDeleteSubscriptionParams) WithContext(ctx context.Context) *IssueDeleteSubscriptionParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the issue delete subscription params
+func (o *IssueDeleteSubscriptionParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the issue delete subscription params
+func (o *IssueDeleteSubscriptionParams) WithHTTPClient(client *http.Client) *IssueDeleteSubscriptionParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the issue delete subscription params
+func (o *IssueDeleteSubscriptionParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithIndex adds the index to the issue delete subscription params
+func (o *IssueDeleteSubscriptionParams) WithIndex(index int64) *IssueDeleteSubscriptionParams {
+	o.SetIndex(index)
+	return o
+}
+
+// SetIndex adds the index to the issue delete subscription params
+func (o *IssueDeleteSubscriptionParams) SetIndex(index int64) {
+	o.Index = index
+}
+
+// WithOwner adds the owner to the issue delete subscription params
+func (o *IssueDeleteSubscriptionParams) WithOwner(owner string) *IssueDeleteSubscriptionParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the issue delete subscription params
+func (o *IssueDeleteSubscriptionParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the issue delete subscription params
+func (o *IssueDeleteSubscriptionParams) WithRepo(repo string) *IssueDeleteSubscriptionParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the issue delete subscription params
+func (o *IssueDeleteSubscriptionParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WithUser adds the user to the issue delete subscription params
+func (o *IssueDeleteSubscriptionParams) WithUser(user string) *IssueDeleteSubscriptionParams {
+	o.SetUser(user)
+	return o
+}
+
+// SetUser adds the user to the issue delete subscription params
+func (o *IssueDeleteSubscriptionParams) SetUser(user string) {
+	o.User = user
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *IssueDeleteSubscriptionParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param index
+	if err := r.SetPathParam("index", swag.FormatInt64(o.Index)); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	// path param user
+	if err := r.SetPathParam("user", o.User); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_delete_subscription_responses.go b/bots-common/gitea-generated/client/issue/issue_delete_subscription_responses.go
new file mode 100644
index 0000000..55638a0
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_delete_subscription_responses.go
@@ -0,0 +1,274 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// IssueDeleteSubscriptionReader is a Reader for the IssueDeleteSubscription structure.
+type IssueDeleteSubscriptionReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *IssueDeleteSubscriptionReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewIssueDeleteSubscriptionOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 201:
+		result := NewIssueDeleteSubscriptionCreated()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 304:
+		result := NewIssueDeleteSubscriptionNotModified()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewIssueDeleteSubscriptionNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[DELETE /repos/{owner}/{repo}/issues/{index}/subscriptions/{user}] issueDeleteSubscription", response, response.Code())
+	}
+}
+
+// NewIssueDeleteSubscriptionOK creates a IssueDeleteSubscriptionOK with default headers values
+func NewIssueDeleteSubscriptionOK() *IssueDeleteSubscriptionOK {
+	return &IssueDeleteSubscriptionOK{}
+}
+
+/*
+IssueDeleteSubscriptionOK describes a response with status code 200, with default header values.
+
+Already unsubscribed
+*/
+type IssueDeleteSubscriptionOK struct {
+}
+
+// IsSuccess returns true when this issue delete subscription o k response has a 2xx status code
+func (o *IssueDeleteSubscriptionOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this issue delete subscription o k response has a 3xx status code
+func (o *IssueDeleteSubscriptionOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue delete subscription o k response has a 4xx status code
+func (o *IssueDeleteSubscriptionOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this issue delete subscription o k response has a 5xx status code
+func (o *IssueDeleteSubscriptionOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue delete subscription o k response a status code equal to that given
+func (o *IssueDeleteSubscriptionOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the issue delete subscription o k response
+func (o *IssueDeleteSubscriptionOK) Code() int {
+	return 200
+}
+
+func (o *IssueDeleteSubscriptionOK) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/{index}/subscriptions/{user}][%d] issueDeleteSubscriptionOK", 200)
+}
+
+func (o *IssueDeleteSubscriptionOK) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/{index}/subscriptions/{user}][%d] issueDeleteSubscriptionOK", 200)
+}
+
+func (o *IssueDeleteSubscriptionOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewIssueDeleteSubscriptionCreated creates a IssueDeleteSubscriptionCreated with default headers values
+func NewIssueDeleteSubscriptionCreated() *IssueDeleteSubscriptionCreated {
+	return &IssueDeleteSubscriptionCreated{}
+}
+
+/*
+IssueDeleteSubscriptionCreated describes a response with status code 201, with default header values.
+
+Successfully Unsubscribed
+*/
+type IssueDeleteSubscriptionCreated struct {
+}
+
+// IsSuccess returns true when this issue delete subscription created response has a 2xx status code
+func (o *IssueDeleteSubscriptionCreated) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this issue delete subscription created response has a 3xx status code
+func (o *IssueDeleteSubscriptionCreated) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue delete subscription created response has a 4xx status code
+func (o *IssueDeleteSubscriptionCreated) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this issue delete subscription created response has a 5xx status code
+func (o *IssueDeleteSubscriptionCreated) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue delete subscription created response a status code equal to that given
+func (o *IssueDeleteSubscriptionCreated) IsCode(code int) bool {
+	return code == 201
+}
+
+// Code gets the status code for the issue delete subscription created response
+func (o *IssueDeleteSubscriptionCreated) Code() int {
+	return 201
+}
+
+func (o *IssueDeleteSubscriptionCreated) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/{index}/subscriptions/{user}][%d] issueDeleteSubscriptionCreated", 201)
+}
+
+func (o *IssueDeleteSubscriptionCreated) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/{index}/subscriptions/{user}][%d] issueDeleteSubscriptionCreated", 201)
+}
+
+func (o *IssueDeleteSubscriptionCreated) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewIssueDeleteSubscriptionNotModified creates a IssueDeleteSubscriptionNotModified with default headers values
+func NewIssueDeleteSubscriptionNotModified() *IssueDeleteSubscriptionNotModified {
+	return &IssueDeleteSubscriptionNotModified{}
+}
+
+/*
+IssueDeleteSubscriptionNotModified describes a response with status code 304, with default header values.
+
+User can only subscribe itself if he is no admin
+*/
+type IssueDeleteSubscriptionNotModified struct {
+}
+
+// IsSuccess returns true when this issue delete subscription not modified response has a 2xx status code
+func (o *IssueDeleteSubscriptionNotModified) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue delete subscription not modified response has a 3xx status code
+func (o *IssueDeleteSubscriptionNotModified) IsRedirect() bool {
+	return true
+}
+
+// IsClientError returns true when this issue delete subscription not modified response has a 4xx status code
+func (o *IssueDeleteSubscriptionNotModified) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this issue delete subscription not modified response has a 5xx status code
+func (o *IssueDeleteSubscriptionNotModified) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue delete subscription not modified response a status code equal to that given
+func (o *IssueDeleteSubscriptionNotModified) IsCode(code int) bool {
+	return code == 304
+}
+
+// Code gets the status code for the issue delete subscription not modified response
+func (o *IssueDeleteSubscriptionNotModified) Code() int {
+	return 304
+}
+
+func (o *IssueDeleteSubscriptionNotModified) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/{index}/subscriptions/{user}][%d] issueDeleteSubscriptionNotModified", 304)
+}
+
+func (o *IssueDeleteSubscriptionNotModified) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/{index}/subscriptions/{user}][%d] issueDeleteSubscriptionNotModified", 304)
+}
+
+func (o *IssueDeleteSubscriptionNotModified) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewIssueDeleteSubscriptionNotFound creates a IssueDeleteSubscriptionNotFound with default headers values
+func NewIssueDeleteSubscriptionNotFound() *IssueDeleteSubscriptionNotFound {
+	return &IssueDeleteSubscriptionNotFound{}
+}
+
+/*
+IssueDeleteSubscriptionNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type IssueDeleteSubscriptionNotFound struct {
+}
+
+// IsSuccess returns true when this issue delete subscription not found response has a 2xx status code
+func (o *IssueDeleteSubscriptionNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue delete subscription not found response has a 3xx status code
+func (o *IssueDeleteSubscriptionNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue delete subscription not found response has a 4xx status code
+func (o *IssueDeleteSubscriptionNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue delete subscription not found response has a 5xx status code
+func (o *IssueDeleteSubscriptionNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue delete subscription not found response a status code equal to that given
+func (o *IssueDeleteSubscriptionNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the issue delete subscription not found response
+func (o *IssueDeleteSubscriptionNotFound) Code() int {
+	return 404
+}
+
+func (o *IssueDeleteSubscriptionNotFound) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/{index}/subscriptions/{user}][%d] issueDeleteSubscriptionNotFound", 404)
+}
+
+func (o *IssueDeleteSubscriptionNotFound) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/{index}/subscriptions/{user}][%d] issueDeleteSubscriptionNotFound", 404)
+}
+
+func (o *IssueDeleteSubscriptionNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_delete_time_parameters.go b/bots-common/gitea-generated/client/issue/issue_delete_time_parameters.go
new file mode 100644
index 0000000..5ab2cce
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_delete_time_parameters.go
@@ -0,0 +1,222 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewIssueDeleteTimeParams creates a new IssueDeleteTimeParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewIssueDeleteTimeParams() *IssueDeleteTimeParams {
+	return &IssueDeleteTimeParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewIssueDeleteTimeParamsWithTimeout creates a new IssueDeleteTimeParams object
+// with the ability to set a timeout on a request.
+func NewIssueDeleteTimeParamsWithTimeout(timeout time.Duration) *IssueDeleteTimeParams {
+	return &IssueDeleteTimeParams{
+		timeout: timeout,
+	}
+}
+
+// NewIssueDeleteTimeParamsWithContext creates a new IssueDeleteTimeParams object
+// with the ability to set a context for a request.
+func NewIssueDeleteTimeParamsWithContext(ctx context.Context) *IssueDeleteTimeParams {
+	return &IssueDeleteTimeParams{
+		Context: ctx,
+	}
+}
+
+// NewIssueDeleteTimeParamsWithHTTPClient creates a new IssueDeleteTimeParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewIssueDeleteTimeParamsWithHTTPClient(client *http.Client) *IssueDeleteTimeParams {
+	return &IssueDeleteTimeParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+IssueDeleteTimeParams contains all the parameters to send to the API endpoint
+
+	for the issue delete time operation.
+
+	Typically these are written to a http.Request.
+*/
+type IssueDeleteTimeParams struct {
+
+	/* ID.
+
+	   id of time to delete
+
+	   Format: int64
+	*/
+	ID int64
+
+	/* Index.
+
+	   index of the issue
+
+	   Format: int64
+	*/
+	Index int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the issue delete time params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueDeleteTimeParams) WithDefaults() *IssueDeleteTimeParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the issue delete time params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueDeleteTimeParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the issue delete time params
+func (o *IssueDeleteTimeParams) WithTimeout(timeout time.Duration) *IssueDeleteTimeParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the issue delete time params
+func (o *IssueDeleteTimeParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the issue delete time params
+func (o *IssueDeleteTimeParams) WithContext(ctx context.Context) *IssueDeleteTimeParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the issue delete time params
+func (o *IssueDeleteTimeParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the issue delete time params
+func (o *IssueDeleteTimeParams) WithHTTPClient(client *http.Client) *IssueDeleteTimeParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the issue delete time params
+func (o *IssueDeleteTimeParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithID adds the id to the issue delete time params
+func (o *IssueDeleteTimeParams) WithID(id int64) *IssueDeleteTimeParams {
+	o.SetID(id)
+	return o
+}
+
+// SetID adds the id to the issue delete time params
+func (o *IssueDeleteTimeParams) SetID(id int64) {
+	o.ID = id
+}
+
+// WithIndex adds the index to the issue delete time params
+func (o *IssueDeleteTimeParams) WithIndex(index int64) *IssueDeleteTimeParams {
+	o.SetIndex(index)
+	return o
+}
+
+// SetIndex adds the index to the issue delete time params
+func (o *IssueDeleteTimeParams) SetIndex(index int64) {
+	o.Index = index
+}
+
+// WithOwner adds the owner to the issue delete time params
+func (o *IssueDeleteTimeParams) WithOwner(owner string) *IssueDeleteTimeParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the issue delete time params
+func (o *IssueDeleteTimeParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the issue delete time params
+func (o *IssueDeleteTimeParams) WithRepo(repo string) *IssueDeleteTimeParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the issue delete time params
+func (o *IssueDeleteTimeParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *IssueDeleteTimeParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param id
+	if err := r.SetPathParam("id", swag.FormatInt64(o.ID)); err != nil {
+		return err
+	}
+
+	// path param index
+	if err := r.SetPathParam("index", swag.FormatInt64(o.Index)); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_delete_time_responses.go b/bots-common/gitea-generated/client/issue/issue_delete_time_responses.go
new file mode 100644
index 0000000..f499dc5
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_delete_time_responses.go
@@ -0,0 +1,306 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// IssueDeleteTimeReader is a Reader for the IssueDeleteTime structure.
+type IssueDeleteTimeReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *IssueDeleteTimeReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewIssueDeleteTimeNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 400:
+		result := NewIssueDeleteTimeBadRequest()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 403:
+		result := NewIssueDeleteTimeForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewIssueDeleteTimeNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[DELETE /repos/{owner}/{repo}/issues/{index}/times/{id}] issueDeleteTime", response, response.Code())
+	}
+}
+
+// NewIssueDeleteTimeNoContent creates a IssueDeleteTimeNoContent with default headers values
+func NewIssueDeleteTimeNoContent() *IssueDeleteTimeNoContent {
+	return &IssueDeleteTimeNoContent{}
+}
+
+/*
+IssueDeleteTimeNoContent describes a response with status code 204, with default header values.
+
+APIEmpty is an empty response
+*/
+type IssueDeleteTimeNoContent struct {
+}
+
+// IsSuccess returns true when this issue delete time no content response has a 2xx status code
+func (o *IssueDeleteTimeNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this issue delete time no content response has a 3xx status code
+func (o *IssueDeleteTimeNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue delete time no content response has a 4xx status code
+func (o *IssueDeleteTimeNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this issue delete time no content response has a 5xx status code
+func (o *IssueDeleteTimeNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue delete time no content response a status code equal to that given
+func (o *IssueDeleteTimeNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the issue delete time no content response
+func (o *IssueDeleteTimeNoContent) Code() int {
+	return 204
+}
+
+func (o *IssueDeleteTimeNoContent) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/{index}/times/{id}][%d] issueDeleteTimeNoContent", 204)
+}
+
+func (o *IssueDeleteTimeNoContent) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/{index}/times/{id}][%d] issueDeleteTimeNoContent", 204)
+}
+
+func (o *IssueDeleteTimeNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewIssueDeleteTimeBadRequest creates a IssueDeleteTimeBadRequest with default headers values
+func NewIssueDeleteTimeBadRequest() *IssueDeleteTimeBadRequest {
+	return &IssueDeleteTimeBadRequest{}
+}
+
+/*
+IssueDeleteTimeBadRequest describes a response with status code 400, with default header values.
+
+APIError is error format response
+*/
+type IssueDeleteTimeBadRequest struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this issue delete time bad request response has a 2xx status code
+func (o *IssueDeleteTimeBadRequest) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue delete time bad request response has a 3xx status code
+func (o *IssueDeleteTimeBadRequest) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue delete time bad request response has a 4xx status code
+func (o *IssueDeleteTimeBadRequest) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue delete time bad request response has a 5xx status code
+func (o *IssueDeleteTimeBadRequest) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue delete time bad request response a status code equal to that given
+func (o *IssueDeleteTimeBadRequest) IsCode(code int) bool {
+	return code == 400
+}
+
+// Code gets the status code for the issue delete time bad request response
+func (o *IssueDeleteTimeBadRequest) Code() int {
+	return 400
+}
+
+func (o *IssueDeleteTimeBadRequest) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/{index}/times/{id}][%d] issueDeleteTimeBadRequest", 400)
+}
+
+func (o *IssueDeleteTimeBadRequest) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/{index}/times/{id}][%d] issueDeleteTimeBadRequest", 400)
+}
+
+func (o *IssueDeleteTimeBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewIssueDeleteTimeForbidden creates a IssueDeleteTimeForbidden with default headers values
+func NewIssueDeleteTimeForbidden() *IssueDeleteTimeForbidden {
+	return &IssueDeleteTimeForbidden{}
+}
+
+/*
+IssueDeleteTimeForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type IssueDeleteTimeForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this issue delete time forbidden response has a 2xx status code
+func (o *IssueDeleteTimeForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue delete time forbidden response has a 3xx status code
+func (o *IssueDeleteTimeForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue delete time forbidden response has a 4xx status code
+func (o *IssueDeleteTimeForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue delete time forbidden response has a 5xx status code
+func (o *IssueDeleteTimeForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue delete time forbidden response a status code equal to that given
+func (o *IssueDeleteTimeForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the issue delete time forbidden response
+func (o *IssueDeleteTimeForbidden) Code() int {
+	return 403
+}
+
+func (o *IssueDeleteTimeForbidden) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/{index}/times/{id}][%d] issueDeleteTimeForbidden", 403)
+}
+
+func (o *IssueDeleteTimeForbidden) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/{index}/times/{id}][%d] issueDeleteTimeForbidden", 403)
+}
+
+func (o *IssueDeleteTimeForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewIssueDeleteTimeNotFound creates a IssueDeleteTimeNotFound with default headers values
+func NewIssueDeleteTimeNotFound() *IssueDeleteTimeNotFound {
+	return &IssueDeleteTimeNotFound{}
+}
+
+/*
+IssueDeleteTimeNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type IssueDeleteTimeNotFound struct {
+}
+
+// IsSuccess returns true when this issue delete time not found response has a 2xx status code
+func (o *IssueDeleteTimeNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue delete time not found response has a 3xx status code
+func (o *IssueDeleteTimeNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue delete time not found response has a 4xx status code
+func (o *IssueDeleteTimeNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue delete time not found response has a 5xx status code
+func (o *IssueDeleteTimeNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue delete time not found response a status code equal to that given
+func (o *IssueDeleteTimeNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the issue delete time not found response
+func (o *IssueDeleteTimeNotFound) Code() int {
+	return 404
+}
+
+func (o *IssueDeleteTimeNotFound) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/{index}/times/{id}][%d] issueDeleteTimeNotFound", 404)
+}
+
+func (o *IssueDeleteTimeNotFound) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/{index}/times/{id}][%d] issueDeleteTimeNotFound", 404)
+}
+
+func (o *IssueDeleteTimeNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_edit_comment_deprecated_parameters.go b/bots-common/gitea-generated/client/issue/issue_edit_comment_deprecated_parameters.go
new file mode 100644
index 0000000..08c9ad5
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_edit_comment_deprecated_parameters.go
@@ -0,0 +1,241 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewIssueEditCommentDeprecatedParams creates a new IssueEditCommentDeprecatedParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewIssueEditCommentDeprecatedParams() *IssueEditCommentDeprecatedParams {
+	return &IssueEditCommentDeprecatedParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewIssueEditCommentDeprecatedParamsWithTimeout creates a new IssueEditCommentDeprecatedParams object
+// with the ability to set a timeout on a request.
+func NewIssueEditCommentDeprecatedParamsWithTimeout(timeout time.Duration) *IssueEditCommentDeprecatedParams {
+	return &IssueEditCommentDeprecatedParams{
+		timeout: timeout,
+	}
+}
+
+// NewIssueEditCommentDeprecatedParamsWithContext creates a new IssueEditCommentDeprecatedParams object
+// with the ability to set a context for a request.
+func NewIssueEditCommentDeprecatedParamsWithContext(ctx context.Context) *IssueEditCommentDeprecatedParams {
+	return &IssueEditCommentDeprecatedParams{
+		Context: ctx,
+	}
+}
+
+// NewIssueEditCommentDeprecatedParamsWithHTTPClient creates a new IssueEditCommentDeprecatedParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewIssueEditCommentDeprecatedParamsWithHTTPClient(client *http.Client) *IssueEditCommentDeprecatedParams {
+	return &IssueEditCommentDeprecatedParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+IssueEditCommentDeprecatedParams contains all the parameters to send to the API endpoint
+
+	for the issue edit comment deprecated operation.
+
+	Typically these are written to a http.Request.
+*/
+type IssueEditCommentDeprecatedParams struct {
+
+	// Body.
+	Body *models.EditIssueCommentOption
+
+	/* ID.
+
+	   id of the comment to edit
+
+	   Format: int64
+	*/
+	ID int64
+
+	/* Index.
+
+	   this parameter is ignored
+	*/
+	Index int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the issue edit comment deprecated params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueEditCommentDeprecatedParams) WithDefaults() *IssueEditCommentDeprecatedParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the issue edit comment deprecated params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueEditCommentDeprecatedParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the issue edit comment deprecated params
+func (o *IssueEditCommentDeprecatedParams) WithTimeout(timeout time.Duration) *IssueEditCommentDeprecatedParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the issue edit comment deprecated params
+func (o *IssueEditCommentDeprecatedParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the issue edit comment deprecated params
+func (o *IssueEditCommentDeprecatedParams) WithContext(ctx context.Context) *IssueEditCommentDeprecatedParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the issue edit comment deprecated params
+func (o *IssueEditCommentDeprecatedParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the issue edit comment deprecated params
+func (o *IssueEditCommentDeprecatedParams) WithHTTPClient(client *http.Client) *IssueEditCommentDeprecatedParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the issue edit comment deprecated params
+func (o *IssueEditCommentDeprecatedParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the issue edit comment deprecated params
+func (o *IssueEditCommentDeprecatedParams) WithBody(body *models.EditIssueCommentOption) *IssueEditCommentDeprecatedParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the issue edit comment deprecated params
+func (o *IssueEditCommentDeprecatedParams) SetBody(body *models.EditIssueCommentOption) {
+	o.Body = body
+}
+
+// WithID adds the id to the issue edit comment deprecated params
+func (o *IssueEditCommentDeprecatedParams) WithID(id int64) *IssueEditCommentDeprecatedParams {
+	o.SetID(id)
+	return o
+}
+
+// SetID adds the id to the issue edit comment deprecated params
+func (o *IssueEditCommentDeprecatedParams) SetID(id int64) {
+	o.ID = id
+}
+
+// WithIndex adds the index to the issue edit comment deprecated params
+func (o *IssueEditCommentDeprecatedParams) WithIndex(index int64) *IssueEditCommentDeprecatedParams {
+	o.SetIndex(index)
+	return o
+}
+
+// SetIndex adds the index to the issue edit comment deprecated params
+func (o *IssueEditCommentDeprecatedParams) SetIndex(index int64) {
+	o.Index = index
+}
+
+// WithOwner adds the owner to the issue edit comment deprecated params
+func (o *IssueEditCommentDeprecatedParams) WithOwner(owner string) *IssueEditCommentDeprecatedParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the issue edit comment deprecated params
+func (o *IssueEditCommentDeprecatedParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the issue edit comment deprecated params
+func (o *IssueEditCommentDeprecatedParams) WithRepo(repo string) *IssueEditCommentDeprecatedParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the issue edit comment deprecated params
+func (o *IssueEditCommentDeprecatedParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *IssueEditCommentDeprecatedParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	// path param id
+	if err := r.SetPathParam("id", swag.FormatInt64(o.ID)); err != nil {
+		return err
+	}
+
+	// path param index
+	if err := r.SetPathParam("index", swag.FormatInt64(o.Index)); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_edit_comment_deprecated_responses.go b/bots-common/gitea-generated/client/issue/issue_edit_comment_deprecated_responses.go
new file mode 100644
index 0000000..55f819a
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_edit_comment_deprecated_responses.go
@@ -0,0 +1,308 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// IssueEditCommentDeprecatedReader is a Reader for the IssueEditCommentDeprecated structure.
+type IssueEditCommentDeprecatedReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *IssueEditCommentDeprecatedReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewIssueEditCommentDeprecatedOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 204:
+		result := NewIssueEditCommentDeprecatedNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 403:
+		result := NewIssueEditCommentDeprecatedForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewIssueEditCommentDeprecatedNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[PATCH /repos/{owner}/{repo}/issues/{index}/comments/{id}] issueEditCommentDeprecated", response, response.Code())
+	}
+}
+
+// NewIssueEditCommentDeprecatedOK creates a IssueEditCommentDeprecatedOK with default headers values
+func NewIssueEditCommentDeprecatedOK() *IssueEditCommentDeprecatedOK {
+	return &IssueEditCommentDeprecatedOK{}
+}
+
+/*
+IssueEditCommentDeprecatedOK describes a response with status code 200, with default header values.
+
+Comment
+*/
+type IssueEditCommentDeprecatedOK struct {
+	Payload *models.Comment
+}
+
+// IsSuccess returns true when this issue edit comment deprecated o k response has a 2xx status code
+func (o *IssueEditCommentDeprecatedOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this issue edit comment deprecated o k response has a 3xx status code
+func (o *IssueEditCommentDeprecatedOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue edit comment deprecated o k response has a 4xx status code
+func (o *IssueEditCommentDeprecatedOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this issue edit comment deprecated o k response has a 5xx status code
+func (o *IssueEditCommentDeprecatedOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue edit comment deprecated o k response a status code equal to that given
+func (o *IssueEditCommentDeprecatedOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the issue edit comment deprecated o k response
+func (o *IssueEditCommentDeprecatedOK) Code() int {
+	return 200
+}
+
+func (o *IssueEditCommentDeprecatedOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/issues/{index}/comments/{id}][%d] issueEditCommentDeprecatedOK %s", 200, payload)
+}
+
+func (o *IssueEditCommentDeprecatedOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/issues/{index}/comments/{id}][%d] issueEditCommentDeprecatedOK %s", 200, payload)
+}
+
+func (o *IssueEditCommentDeprecatedOK) GetPayload() *models.Comment {
+	return o.Payload
+}
+
+func (o *IssueEditCommentDeprecatedOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.Comment)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewIssueEditCommentDeprecatedNoContent creates a IssueEditCommentDeprecatedNoContent with default headers values
+func NewIssueEditCommentDeprecatedNoContent() *IssueEditCommentDeprecatedNoContent {
+	return &IssueEditCommentDeprecatedNoContent{}
+}
+
+/*
+IssueEditCommentDeprecatedNoContent describes a response with status code 204, with default header values.
+
+APIEmpty is an empty response
+*/
+type IssueEditCommentDeprecatedNoContent struct {
+}
+
+// IsSuccess returns true when this issue edit comment deprecated no content response has a 2xx status code
+func (o *IssueEditCommentDeprecatedNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this issue edit comment deprecated no content response has a 3xx status code
+func (o *IssueEditCommentDeprecatedNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue edit comment deprecated no content response has a 4xx status code
+func (o *IssueEditCommentDeprecatedNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this issue edit comment deprecated no content response has a 5xx status code
+func (o *IssueEditCommentDeprecatedNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue edit comment deprecated no content response a status code equal to that given
+func (o *IssueEditCommentDeprecatedNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the issue edit comment deprecated no content response
+func (o *IssueEditCommentDeprecatedNoContent) Code() int {
+	return 204
+}
+
+func (o *IssueEditCommentDeprecatedNoContent) Error() string {
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/issues/{index}/comments/{id}][%d] issueEditCommentDeprecatedNoContent", 204)
+}
+
+func (o *IssueEditCommentDeprecatedNoContent) String() string {
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/issues/{index}/comments/{id}][%d] issueEditCommentDeprecatedNoContent", 204)
+}
+
+func (o *IssueEditCommentDeprecatedNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewIssueEditCommentDeprecatedForbidden creates a IssueEditCommentDeprecatedForbidden with default headers values
+func NewIssueEditCommentDeprecatedForbidden() *IssueEditCommentDeprecatedForbidden {
+	return &IssueEditCommentDeprecatedForbidden{}
+}
+
+/*
+IssueEditCommentDeprecatedForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type IssueEditCommentDeprecatedForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this issue edit comment deprecated forbidden response has a 2xx status code
+func (o *IssueEditCommentDeprecatedForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue edit comment deprecated forbidden response has a 3xx status code
+func (o *IssueEditCommentDeprecatedForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue edit comment deprecated forbidden response has a 4xx status code
+func (o *IssueEditCommentDeprecatedForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue edit comment deprecated forbidden response has a 5xx status code
+func (o *IssueEditCommentDeprecatedForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue edit comment deprecated forbidden response a status code equal to that given
+func (o *IssueEditCommentDeprecatedForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the issue edit comment deprecated forbidden response
+func (o *IssueEditCommentDeprecatedForbidden) Code() int {
+	return 403
+}
+
+func (o *IssueEditCommentDeprecatedForbidden) Error() string {
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/issues/{index}/comments/{id}][%d] issueEditCommentDeprecatedForbidden", 403)
+}
+
+func (o *IssueEditCommentDeprecatedForbidden) String() string {
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/issues/{index}/comments/{id}][%d] issueEditCommentDeprecatedForbidden", 403)
+}
+
+func (o *IssueEditCommentDeprecatedForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewIssueEditCommentDeprecatedNotFound creates a IssueEditCommentDeprecatedNotFound with default headers values
+func NewIssueEditCommentDeprecatedNotFound() *IssueEditCommentDeprecatedNotFound {
+	return &IssueEditCommentDeprecatedNotFound{}
+}
+
+/*
+IssueEditCommentDeprecatedNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type IssueEditCommentDeprecatedNotFound struct {
+}
+
+// IsSuccess returns true when this issue edit comment deprecated not found response has a 2xx status code
+func (o *IssueEditCommentDeprecatedNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue edit comment deprecated not found response has a 3xx status code
+func (o *IssueEditCommentDeprecatedNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue edit comment deprecated not found response has a 4xx status code
+func (o *IssueEditCommentDeprecatedNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue edit comment deprecated not found response has a 5xx status code
+func (o *IssueEditCommentDeprecatedNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue edit comment deprecated not found response a status code equal to that given
+func (o *IssueEditCommentDeprecatedNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the issue edit comment deprecated not found response
+func (o *IssueEditCommentDeprecatedNotFound) Code() int {
+	return 404
+}
+
+func (o *IssueEditCommentDeprecatedNotFound) Error() string {
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/issues/{index}/comments/{id}][%d] issueEditCommentDeprecatedNotFound", 404)
+}
+
+func (o *IssueEditCommentDeprecatedNotFound) String() string {
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/issues/{index}/comments/{id}][%d] issueEditCommentDeprecatedNotFound", 404)
+}
+
+func (o *IssueEditCommentDeprecatedNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_edit_comment_parameters.go b/bots-common/gitea-generated/client/issue/issue_edit_comment_parameters.go
new file mode 100644
index 0000000..847836e
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_edit_comment_parameters.go
@@ -0,0 +1,219 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewIssueEditCommentParams creates a new IssueEditCommentParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewIssueEditCommentParams() *IssueEditCommentParams {
+	return &IssueEditCommentParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewIssueEditCommentParamsWithTimeout creates a new IssueEditCommentParams object
+// with the ability to set a timeout on a request.
+func NewIssueEditCommentParamsWithTimeout(timeout time.Duration) *IssueEditCommentParams {
+	return &IssueEditCommentParams{
+		timeout: timeout,
+	}
+}
+
+// NewIssueEditCommentParamsWithContext creates a new IssueEditCommentParams object
+// with the ability to set a context for a request.
+func NewIssueEditCommentParamsWithContext(ctx context.Context) *IssueEditCommentParams {
+	return &IssueEditCommentParams{
+		Context: ctx,
+	}
+}
+
+// NewIssueEditCommentParamsWithHTTPClient creates a new IssueEditCommentParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewIssueEditCommentParamsWithHTTPClient(client *http.Client) *IssueEditCommentParams {
+	return &IssueEditCommentParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+IssueEditCommentParams contains all the parameters to send to the API endpoint
+
+	for the issue edit comment operation.
+
+	Typically these are written to a http.Request.
+*/
+type IssueEditCommentParams struct {
+
+	// Body.
+	Body *models.EditIssueCommentOption
+
+	/* ID.
+
+	   id of the comment to edit
+
+	   Format: int64
+	*/
+	ID int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the issue edit comment params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueEditCommentParams) WithDefaults() *IssueEditCommentParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the issue edit comment params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueEditCommentParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the issue edit comment params
+func (o *IssueEditCommentParams) WithTimeout(timeout time.Duration) *IssueEditCommentParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the issue edit comment params
+func (o *IssueEditCommentParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the issue edit comment params
+func (o *IssueEditCommentParams) WithContext(ctx context.Context) *IssueEditCommentParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the issue edit comment params
+func (o *IssueEditCommentParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the issue edit comment params
+func (o *IssueEditCommentParams) WithHTTPClient(client *http.Client) *IssueEditCommentParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the issue edit comment params
+func (o *IssueEditCommentParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the issue edit comment params
+func (o *IssueEditCommentParams) WithBody(body *models.EditIssueCommentOption) *IssueEditCommentParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the issue edit comment params
+func (o *IssueEditCommentParams) SetBody(body *models.EditIssueCommentOption) {
+	o.Body = body
+}
+
+// WithID adds the id to the issue edit comment params
+func (o *IssueEditCommentParams) WithID(id int64) *IssueEditCommentParams {
+	o.SetID(id)
+	return o
+}
+
+// SetID adds the id to the issue edit comment params
+func (o *IssueEditCommentParams) SetID(id int64) {
+	o.ID = id
+}
+
+// WithOwner adds the owner to the issue edit comment params
+func (o *IssueEditCommentParams) WithOwner(owner string) *IssueEditCommentParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the issue edit comment params
+func (o *IssueEditCommentParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the issue edit comment params
+func (o *IssueEditCommentParams) WithRepo(repo string) *IssueEditCommentParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the issue edit comment params
+func (o *IssueEditCommentParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *IssueEditCommentParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	// path param id
+	if err := r.SetPathParam("id", swag.FormatInt64(o.ID)); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_edit_comment_responses.go b/bots-common/gitea-generated/client/issue/issue_edit_comment_responses.go
new file mode 100644
index 0000000..e1f90d0
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_edit_comment_responses.go
@@ -0,0 +1,386 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// IssueEditCommentReader is a Reader for the IssueEditComment structure.
+type IssueEditCommentReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *IssueEditCommentReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewIssueEditCommentOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 204:
+		result := NewIssueEditCommentNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 403:
+		result := NewIssueEditCommentForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewIssueEditCommentNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 423:
+		result := NewIssueEditCommentLocked()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[PATCH /repos/{owner}/{repo}/issues/comments/{id}] issueEditComment", response, response.Code())
+	}
+}
+
+// NewIssueEditCommentOK creates a IssueEditCommentOK with default headers values
+func NewIssueEditCommentOK() *IssueEditCommentOK {
+	return &IssueEditCommentOK{}
+}
+
+/*
+IssueEditCommentOK describes a response with status code 200, with default header values.
+
+Comment
+*/
+type IssueEditCommentOK struct {
+	Payload *models.Comment
+}
+
+// IsSuccess returns true when this issue edit comment o k response has a 2xx status code
+func (o *IssueEditCommentOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this issue edit comment o k response has a 3xx status code
+func (o *IssueEditCommentOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue edit comment o k response has a 4xx status code
+func (o *IssueEditCommentOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this issue edit comment o k response has a 5xx status code
+func (o *IssueEditCommentOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue edit comment o k response a status code equal to that given
+func (o *IssueEditCommentOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the issue edit comment o k response
+func (o *IssueEditCommentOK) Code() int {
+	return 200
+}
+
+func (o *IssueEditCommentOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/issues/comments/{id}][%d] issueEditCommentOK %s", 200, payload)
+}
+
+func (o *IssueEditCommentOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/issues/comments/{id}][%d] issueEditCommentOK %s", 200, payload)
+}
+
+func (o *IssueEditCommentOK) GetPayload() *models.Comment {
+	return o.Payload
+}
+
+func (o *IssueEditCommentOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.Comment)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewIssueEditCommentNoContent creates a IssueEditCommentNoContent with default headers values
+func NewIssueEditCommentNoContent() *IssueEditCommentNoContent {
+	return &IssueEditCommentNoContent{}
+}
+
+/*
+IssueEditCommentNoContent describes a response with status code 204, with default header values.
+
+APIEmpty is an empty response
+*/
+type IssueEditCommentNoContent struct {
+}
+
+// IsSuccess returns true when this issue edit comment no content response has a 2xx status code
+func (o *IssueEditCommentNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this issue edit comment no content response has a 3xx status code
+func (o *IssueEditCommentNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue edit comment no content response has a 4xx status code
+func (o *IssueEditCommentNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this issue edit comment no content response has a 5xx status code
+func (o *IssueEditCommentNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue edit comment no content response a status code equal to that given
+func (o *IssueEditCommentNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the issue edit comment no content response
+func (o *IssueEditCommentNoContent) Code() int {
+	return 204
+}
+
+func (o *IssueEditCommentNoContent) Error() string {
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/issues/comments/{id}][%d] issueEditCommentNoContent", 204)
+}
+
+func (o *IssueEditCommentNoContent) String() string {
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/issues/comments/{id}][%d] issueEditCommentNoContent", 204)
+}
+
+func (o *IssueEditCommentNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewIssueEditCommentForbidden creates a IssueEditCommentForbidden with default headers values
+func NewIssueEditCommentForbidden() *IssueEditCommentForbidden {
+	return &IssueEditCommentForbidden{}
+}
+
+/*
+IssueEditCommentForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type IssueEditCommentForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this issue edit comment forbidden response has a 2xx status code
+func (o *IssueEditCommentForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue edit comment forbidden response has a 3xx status code
+func (o *IssueEditCommentForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue edit comment forbidden response has a 4xx status code
+func (o *IssueEditCommentForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue edit comment forbidden response has a 5xx status code
+func (o *IssueEditCommentForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue edit comment forbidden response a status code equal to that given
+func (o *IssueEditCommentForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the issue edit comment forbidden response
+func (o *IssueEditCommentForbidden) Code() int {
+	return 403
+}
+
+func (o *IssueEditCommentForbidden) Error() string {
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/issues/comments/{id}][%d] issueEditCommentForbidden", 403)
+}
+
+func (o *IssueEditCommentForbidden) String() string {
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/issues/comments/{id}][%d] issueEditCommentForbidden", 403)
+}
+
+func (o *IssueEditCommentForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewIssueEditCommentNotFound creates a IssueEditCommentNotFound with default headers values
+func NewIssueEditCommentNotFound() *IssueEditCommentNotFound {
+	return &IssueEditCommentNotFound{}
+}
+
+/*
+IssueEditCommentNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type IssueEditCommentNotFound struct {
+}
+
+// IsSuccess returns true when this issue edit comment not found response has a 2xx status code
+func (o *IssueEditCommentNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue edit comment not found response has a 3xx status code
+func (o *IssueEditCommentNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue edit comment not found response has a 4xx status code
+func (o *IssueEditCommentNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue edit comment not found response has a 5xx status code
+func (o *IssueEditCommentNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue edit comment not found response a status code equal to that given
+func (o *IssueEditCommentNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the issue edit comment not found response
+func (o *IssueEditCommentNotFound) Code() int {
+	return 404
+}
+
+func (o *IssueEditCommentNotFound) Error() string {
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/issues/comments/{id}][%d] issueEditCommentNotFound", 404)
+}
+
+func (o *IssueEditCommentNotFound) String() string {
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/issues/comments/{id}][%d] issueEditCommentNotFound", 404)
+}
+
+func (o *IssueEditCommentNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewIssueEditCommentLocked creates a IssueEditCommentLocked with default headers values
+func NewIssueEditCommentLocked() *IssueEditCommentLocked {
+	return &IssueEditCommentLocked{}
+}
+
+/*
+IssueEditCommentLocked describes a response with status code 423, with default header values.
+
+APIRepoArchivedError is an error that is raised when an archived repo should be modified
+*/
+type IssueEditCommentLocked struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this issue edit comment locked response has a 2xx status code
+func (o *IssueEditCommentLocked) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue edit comment locked response has a 3xx status code
+func (o *IssueEditCommentLocked) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue edit comment locked response has a 4xx status code
+func (o *IssueEditCommentLocked) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue edit comment locked response has a 5xx status code
+func (o *IssueEditCommentLocked) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue edit comment locked response a status code equal to that given
+func (o *IssueEditCommentLocked) IsCode(code int) bool {
+	return code == 423
+}
+
+// Code gets the status code for the issue edit comment locked response
+func (o *IssueEditCommentLocked) Code() int {
+	return 423
+}
+
+func (o *IssueEditCommentLocked) Error() string {
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/issues/comments/{id}][%d] issueEditCommentLocked", 423)
+}
+
+func (o *IssueEditCommentLocked) String() string {
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/issues/comments/{id}][%d] issueEditCommentLocked", 423)
+}
+
+func (o *IssueEditCommentLocked) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_edit_issue_attachment_parameters.go b/bots-common/gitea-generated/client/issue/issue_edit_issue_attachment_parameters.go
new file mode 100644
index 0000000..ce7a9ce
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_edit_issue_attachment_parameters.go
@@ -0,0 +1,243 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewIssueEditIssueAttachmentParams creates a new IssueEditIssueAttachmentParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewIssueEditIssueAttachmentParams() *IssueEditIssueAttachmentParams {
+	return &IssueEditIssueAttachmentParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewIssueEditIssueAttachmentParamsWithTimeout creates a new IssueEditIssueAttachmentParams object
+// with the ability to set a timeout on a request.
+func NewIssueEditIssueAttachmentParamsWithTimeout(timeout time.Duration) *IssueEditIssueAttachmentParams {
+	return &IssueEditIssueAttachmentParams{
+		timeout: timeout,
+	}
+}
+
+// NewIssueEditIssueAttachmentParamsWithContext creates a new IssueEditIssueAttachmentParams object
+// with the ability to set a context for a request.
+func NewIssueEditIssueAttachmentParamsWithContext(ctx context.Context) *IssueEditIssueAttachmentParams {
+	return &IssueEditIssueAttachmentParams{
+		Context: ctx,
+	}
+}
+
+// NewIssueEditIssueAttachmentParamsWithHTTPClient creates a new IssueEditIssueAttachmentParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewIssueEditIssueAttachmentParamsWithHTTPClient(client *http.Client) *IssueEditIssueAttachmentParams {
+	return &IssueEditIssueAttachmentParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+IssueEditIssueAttachmentParams contains all the parameters to send to the API endpoint
+
+	for the issue edit issue attachment operation.
+
+	Typically these are written to a http.Request.
+*/
+type IssueEditIssueAttachmentParams struct {
+
+	/* AttachmentID.
+
+	   id of the attachment to edit
+
+	   Format: int64
+	*/
+	AttachmentID int64
+
+	// Body.
+	Body *models.EditAttachmentOptions
+
+	/* Index.
+
+	   index of the issue
+
+	   Format: int64
+	*/
+	Index int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the issue edit issue attachment params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueEditIssueAttachmentParams) WithDefaults() *IssueEditIssueAttachmentParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the issue edit issue attachment params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueEditIssueAttachmentParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the issue edit issue attachment params
+func (o *IssueEditIssueAttachmentParams) WithTimeout(timeout time.Duration) *IssueEditIssueAttachmentParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the issue edit issue attachment params
+func (o *IssueEditIssueAttachmentParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the issue edit issue attachment params
+func (o *IssueEditIssueAttachmentParams) WithContext(ctx context.Context) *IssueEditIssueAttachmentParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the issue edit issue attachment params
+func (o *IssueEditIssueAttachmentParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the issue edit issue attachment params
+func (o *IssueEditIssueAttachmentParams) WithHTTPClient(client *http.Client) *IssueEditIssueAttachmentParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the issue edit issue attachment params
+func (o *IssueEditIssueAttachmentParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithAttachmentID adds the attachmentID to the issue edit issue attachment params
+func (o *IssueEditIssueAttachmentParams) WithAttachmentID(attachmentID int64) *IssueEditIssueAttachmentParams {
+	o.SetAttachmentID(attachmentID)
+	return o
+}
+
+// SetAttachmentID adds the attachmentId to the issue edit issue attachment params
+func (o *IssueEditIssueAttachmentParams) SetAttachmentID(attachmentID int64) {
+	o.AttachmentID = attachmentID
+}
+
+// WithBody adds the body to the issue edit issue attachment params
+func (o *IssueEditIssueAttachmentParams) WithBody(body *models.EditAttachmentOptions) *IssueEditIssueAttachmentParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the issue edit issue attachment params
+func (o *IssueEditIssueAttachmentParams) SetBody(body *models.EditAttachmentOptions) {
+	o.Body = body
+}
+
+// WithIndex adds the index to the issue edit issue attachment params
+func (o *IssueEditIssueAttachmentParams) WithIndex(index int64) *IssueEditIssueAttachmentParams {
+	o.SetIndex(index)
+	return o
+}
+
+// SetIndex adds the index to the issue edit issue attachment params
+func (o *IssueEditIssueAttachmentParams) SetIndex(index int64) {
+	o.Index = index
+}
+
+// WithOwner adds the owner to the issue edit issue attachment params
+func (o *IssueEditIssueAttachmentParams) WithOwner(owner string) *IssueEditIssueAttachmentParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the issue edit issue attachment params
+func (o *IssueEditIssueAttachmentParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the issue edit issue attachment params
+func (o *IssueEditIssueAttachmentParams) WithRepo(repo string) *IssueEditIssueAttachmentParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the issue edit issue attachment params
+func (o *IssueEditIssueAttachmentParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *IssueEditIssueAttachmentParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param attachment_id
+	if err := r.SetPathParam("attachment_id", swag.FormatInt64(o.AttachmentID)); err != nil {
+		return err
+	}
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	// path param index
+	if err := r.SetPathParam("index", swag.FormatInt64(o.Index)); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_edit_issue_attachment_responses.go b/bots-common/gitea-generated/client/issue/issue_edit_issue_attachment_responses.go
new file mode 100644
index 0000000..ea544d4
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_edit_issue_attachment_responses.go
@@ -0,0 +1,262 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// IssueEditIssueAttachmentReader is a Reader for the IssueEditIssueAttachment structure.
+type IssueEditIssueAttachmentReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *IssueEditIssueAttachmentReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 201:
+		result := NewIssueEditIssueAttachmentCreated()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewIssueEditIssueAttachmentNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 423:
+		result := NewIssueEditIssueAttachmentLocked()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[PATCH /repos/{owner}/{repo}/issues/{index}/assets/{attachment_id}] issueEditIssueAttachment", response, response.Code())
+	}
+}
+
+// NewIssueEditIssueAttachmentCreated creates a IssueEditIssueAttachmentCreated with default headers values
+func NewIssueEditIssueAttachmentCreated() *IssueEditIssueAttachmentCreated {
+	return &IssueEditIssueAttachmentCreated{}
+}
+
+/*
+IssueEditIssueAttachmentCreated describes a response with status code 201, with default header values.
+
+Attachment
+*/
+type IssueEditIssueAttachmentCreated struct {
+	Payload *models.Attachment
+}
+
+// IsSuccess returns true when this issue edit issue attachment created response has a 2xx status code
+func (o *IssueEditIssueAttachmentCreated) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this issue edit issue attachment created response has a 3xx status code
+func (o *IssueEditIssueAttachmentCreated) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue edit issue attachment created response has a 4xx status code
+func (o *IssueEditIssueAttachmentCreated) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this issue edit issue attachment created response has a 5xx status code
+func (o *IssueEditIssueAttachmentCreated) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue edit issue attachment created response a status code equal to that given
+func (o *IssueEditIssueAttachmentCreated) IsCode(code int) bool {
+	return code == 201
+}
+
+// Code gets the status code for the issue edit issue attachment created response
+func (o *IssueEditIssueAttachmentCreated) Code() int {
+	return 201
+}
+
+func (o *IssueEditIssueAttachmentCreated) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/issues/{index}/assets/{attachment_id}][%d] issueEditIssueAttachmentCreated %s", 201, payload)
+}
+
+func (o *IssueEditIssueAttachmentCreated) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/issues/{index}/assets/{attachment_id}][%d] issueEditIssueAttachmentCreated %s", 201, payload)
+}
+
+func (o *IssueEditIssueAttachmentCreated) GetPayload() *models.Attachment {
+	return o.Payload
+}
+
+func (o *IssueEditIssueAttachmentCreated) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.Attachment)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewIssueEditIssueAttachmentNotFound creates a IssueEditIssueAttachmentNotFound with default headers values
+func NewIssueEditIssueAttachmentNotFound() *IssueEditIssueAttachmentNotFound {
+	return &IssueEditIssueAttachmentNotFound{}
+}
+
+/*
+IssueEditIssueAttachmentNotFound describes a response with status code 404, with default header values.
+
+APIError is error format response
+*/
+type IssueEditIssueAttachmentNotFound struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this issue edit issue attachment not found response has a 2xx status code
+func (o *IssueEditIssueAttachmentNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue edit issue attachment not found response has a 3xx status code
+func (o *IssueEditIssueAttachmentNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue edit issue attachment not found response has a 4xx status code
+func (o *IssueEditIssueAttachmentNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue edit issue attachment not found response has a 5xx status code
+func (o *IssueEditIssueAttachmentNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue edit issue attachment not found response a status code equal to that given
+func (o *IssueEditIssueAttachmentNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the issue edit issue attachment not found response
+func (o *IssueEditIssueAttachmentNotFound) Code() int {
+	return 404
+}
+
+func (o *IssueEditIssueAttachmentNotFound) Error() string {
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/issues/{index}/assets/{attachment_id}][%d] issueEditIssueAttachmentNotFound", 404)
+}
+
+func (o *IssueEditIssueAttachmentNotFound) String() string {
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/issues/{index}/assets/{attachment_id}][%d] issueEditIssueAttachmentNotFound", 404)
+}
+
+func (o *IssueEditIssueAttachmentNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewIssueEditIssueAttachmentLocked creates a IssueEditIssueAttachmentLocked with default headers values
+func NewIssueEditIssueAttachmentLocked() *IssueEditIssueAttachmentLocked {
+	return &IssueEditIssueAttachmentLocked{}
+}
+
+/*
+IssueEditIssueAttachmentLocked describes a response with status code 423, with default header values.
+
+APIRepoArchivedError is an error that is raised when an archived repo should be modified
+*/
+type IssueEditIssueAttachmentLocked struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this issue edit issue attachment locked response has a 2xx status code
+func (o *IssueEditIssueAttachmentLocked) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue edit issue attachment locked response has a 3xx status code
+func (o *IssueEditIssueAttachmentLocked) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue edit issue attachment locked response has a 4xx status code
+func (o *IssueEditIssueAttachmentLocked) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue edit issue attachment locked response has a 5xx status code
+func (o *IssueEditIssueAttachmentLocked) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue edit issue attachment locked response a status code equal to that given
+func (o *IssueEditIssueAttachmentLocked) IsCode(code int) bool {
+	return code == 423
+}
+
+// Code gets the status code for the issue edit issue attachment locked response
+func (o *IssueEditIssueAttachmentLocked) Code() int {
+	return 423
+}
+
+func (o *IssueEditIssueAttachmentLocked) Error() string {
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/issues/{index}/assets/{attachment_id}][%d] issueEditIssueAttachmentLocked", 423)
+}
+
+func (o *IssueEditIssueAttachmentLocked) String() string {
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/issues/{index}/assets/{attachment_id}][%d] issueEditIssueAttachmentLocked", 423)
+}
+
+func (o *IssueEditIssueAttachmentLocked) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_edit_issue_comment_attachment_parameters.go b/bots-common/gitea-generated/client/issue/issue_edit_issue_comment_attachment_parameters.go
new file mode 100644
index 0000000..49a4cfd
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_edit_issue_comment_attachment_parameters.go
@@ -0,0 +1,243 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewIssueEditIssueCommentAttachmentParams creates a new IssueEditIssueCommentAttachmentParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewIssueEditIssueCommentAttachmentParams() *IssueEditIssueCommentAttachmentParams {
+	return &IssueEditIssueCommentAttachmentParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewIssueEditIssueCommentAttachmentParamsWithTimeout creates a new IssueEditIssueCommentAttachmentParams object
+// with the ability to set a timeout on a request.
+func NewIssueEditIssueCommentAttachmentParamsWithTimeout(timeout time.Duration) *IssueEditIssueCommentAttachmentParams {
+	return &IssueEditIssueCommentAttachmentParams{
+		timeout: timeout,
+	}
+}
+
+// NewIssueEditIssueCommentAttachmentParamsWithContext creates a new IssueEditIssueCommentAttachmentParams object
+// with the ability to set a context for a request.
+func NewIssueEditIssueCommentAttachmentParamsWithContext(ctx context.Context) *IssueEditIssueCommentAttachmentParams {
+	return &IssueEditIssueCommentAttachmentParams{
+		Context: ctx,
+	}
+}
+
+// NewIssueEditIssueCommentAttachmentParamsWithHTTPClient creates a new IssueEditIssueCommentAttachmentParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewIssueEditIssueCommentAttachmentParamsWithHTTPClient(client *http.Client) *IssueEditIssueCommentAttachmentParams {
+	return &IssueEditIssueCommentAttachmentParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+IssueEditIssueCommentAttachmentParams contains all the parameters to send to the API endpoint
+
+	for the issue edit issue comment attachment operation.
+
+	Typically these are written to a http.Request.
+*/
+type IssueEditIssueCommentAttachmentParams struct {
+
+	/* AttachmentID.
+
+	   id of the attachment to edit
+
+	   Format: int64
+	*/
+	AttachmentID int64
+
+	// Body.
+	Body *models.EditAttachmentOptions
+
+	/* ID.
+
+	   id of the comment
+
+	   Format: int64
+	*/
+	ID int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the issue edit issue comment attachment params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueEditIssueCommentAttachmentParams) WithDefaults() *IssueEditIssueCommentAttachmentParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the issue edit issue comment attachment params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueEditIssueCommentAttachmentParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the issue edit issue comment attachment params
+func (o *IssueEditIssueCommentAttachmentParams) WithTimeout(timeout time.Duration) *IssueEditIssueCommentAttachmentParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the issue edit issue comment attachment params
+func (o *IssueEditIssueCommentAttachmentParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the issue edit issue comment attachment params
+func (o *IssueEditIssueCommentAttachmentParams) WithContext(ctx context.Context) *IssueEditIssueCommentAttachmentParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the issue edit issue comment attachment params
+func (o *IssueEditIssueCommentAttachmentParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the issue edit issue comment attachment params
+func (o *IssueEditIssueCommentAttachmentParams) WithHTTPClient(client *http.Client) *IssueEditIssueCommentAttachmentParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the issue edit issue comment attachment params
+func (o *IssueEditIssueCommentAttachmentParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithAttachmentID adds the attachmentID to the issue edit issue comment attachment params
+func (o *IssueEditIssueCommentAttachmentParams) WithAttachmentID(attachmentID int64) *IssueEditIssueCommentAttachmentParams {
+	o.SetAttachmentID(attachmentID)
+	return o
+}
+
+// SetAttachmentID adds the attachmentId to the issue edit issue comment attachment params
+func (o *IssueEditIssueCommentAttachmentParams) SetAttachmentID(attachmentID int64) {
+	o.AttachmentID = attachmentID
+}
+
+// WithBody adds the body to the issue edit issue comment attachment params
+func (o *IssueEditIssueCommentAttachmentParams) WithBody(body *models.EditAttachmentOptions) *IssueEditIssueCommentAttachmentParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the issue edit issue comment attachment params
+func (o *IssueEditIssueCommentAttachmentParams) SetBody(body *models.EditAttachmentOptions) {
+	o.Body = body
+}
+
+// WithID adds the id to the issue edit issue comment attachment params
+func (o *IssueEditIssueCommentAttachmentParams) WithID(id int64) *IssueEditIssueCommentAttachmentParams {
+	o.SetID(id)
+	return o
+}
+
+// SetID adds the id to the issue edit issue comment attachment params
+func (o *IssueEditIssueCommentAttachmentParams) SetID(id int64) {
+	o.ID = id
+}
+
+// WithOwner adds the owner to the issue edit issue comment attachment params
+func (o *IssueEditIssueCommentAttachmentParams) WithOwner(owner string) *IssueEditIssueCommentAttachmentParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the issue edit issue comment attachment params
+func (o *IssueEditIssueCommentAttachmentParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the issue edit issue comment attachment params
+func (o *IssueEditIssueCommentAttachmentParams) WithRepo(repo string) *IssueEditIssueCommentAttachmentParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the issue edit issue comment attachment params
+func (o *IssueEditIssueCommentAttachmentParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *IssueEditIssueCommentAttachmentParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param attachment_id
+	if err := r.SetPathParam("attachment_id", swag.FormatInt64(o.AttachmentID)); err != nil {
+		return err
+	}
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	// path param id
+	if err := r.SetPathParam("id", swag.FormatInt64(o.ID)); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_edit_issue_comment_attachment_responses.go b/bots-common/gitea-generated/client/issue/issue_edit_issue_comment_attachment_responses.go
new file mode 100644
index 0000000..b38fbc5
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_edit_issue_comment_attachment_responses.go
@@ -0,0 +1,262 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// IssueEditIssueCommentAttachmentReader is a Reader for the IssueEditIssueCommentAttachment structure.
+type IssueEditIssueCommentAttachmentReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *IssueEditIssueCommentAttachmentReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 201:
+		result := NewIssueEditIssueCommentAttachmentCreated()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewIssueEditIssueCommentAttachmentNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 423:
+		result := NewIssueEditIssueCommentAttachmentLocked()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[PATCH /repos/{owner}/{repo}/issues/comments/{id}/assets/{attachment_id}] issueEditIssueCommentAttachment", response, response.Code())
+	}
+}
+
+// NewIssueEditIssueCommentAttachmentCreated creates a IssueEditIssueCommentAttachmentCreated with default headers values
+func NewIssueEditIssueCommentAttachmentCreated() *IssueEditIssueCommentAttachmentCreated {
+	return &IssueEditIssueCommentAttachmentCreated{}
+}
+
+/*
+IssueEditIssueCommentAttachmentCreated describes a response with status code 201, with default header values.
+
+Attachment
+*/
+type IssueEditIssueCommentAttachmentCreated struct {
+	Payload *models.Attachment
+}
+
+// IsSuccess returns true when this issue edit issue comment attachment created response has a 2xx status code
+func (o *IssueEditIssueCommentAttachmentCreated) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this issue edit issue comment attachment created response has a 3xx status code
+func (o *IssueEditIssueCommentAttachmentCreated) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue edit issue comment attachment created response has a 4xx status code
+func (o *IssueEditIssueCommentAttachmentCreated) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this issue edit issue comment attachment created response has a 5xx status code
+func (o *IssueEditIssueCommentAttachmentCreated) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue edit issue comment attachment created response a status code equal to that given
+func (o *IssueEditIssueCommentAttachmentCreated) IsCode(code int) bool {
+	return code == 201
+}
+
+// Code gets the status code for the issue edit issue comment attachment created response
+func (o *IssueEditIssueCommentAttachmentCreated) Code() int {
+	return 201
+}
+
+func (o *IssueEditIssueCommentAttachmentCreated) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/issues/comments/{id}/assets/{attachment_id}][%d] issueEditIssueCommentAttachmentCreated %s", 201, payload)
+}
+
+func (o *IssueEditIssueCommentAttachmentCreated) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/issues/comments/{id}/assets/{attachment_id}][%d] issueEditIssueCommentAttachmentCreated %s", 201, payload)
+}
+
+func (o *IssueEditIssueCommentAttachmentCreated) GetPayload() *models.Attachment {
+	return o.Payload
+}
+
+func (o *IssueEditIssueCommentAttachmentCreated) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.Attachment)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewIssueEditIssueCommentAttachmentNotFound creates a IssueEditIssueCommentAttachmentNotFound with default headers values
+func NewIssueEditIssueCommentAttachmentNotFound() *IssueEditIssueCommentAttachmentNotFound {
+	return &IssueEditIssueCommentAttachmentNotFound{}
+}
+
+/*
+IssueEditIssueCommentAttachmentNotFound describes a response with status code 404, with default header values.
+
+APIError is error format response
+*/
+type IssueEditIssueCommentAttachmentNotFound struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this issue edit issue comment attachment not found response has a 2xx status code
+func (o *IssueEditIssueCommentAttachmentNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue edit issue comment attachment not found response has a 3xx status code
+func (o *IssueEditIssueCommentAttachmentNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue edit issue comment attachment not found response has a 4xx status code
+func (o *IssueEditIssueCommentAttachmentNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue edit issue comment attachment not found response has a 5xx status code
+func (o *IssueEditIssueCommentAttachmentNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue edit issue comment attachment not found response a status code equal to that given
+func (o *IssueEditIssueCommentAttachmentNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the issue edit issue comment attachment not found response
+func (o *IssueEditIssueCommentAttachmentNotFound) Code() int {
+	return 404
+}
+
+func (o *IssueEditIssueCommentAttachmentNotFound) Error() string {
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/issues/comments/{id}/assets/{attachment_id}][%d] issueEditIssueCommentAttachmentNotFound", 404)
+}
+
+func (o *IssueEditIssueCommentAttachmentNotFound) String() string {
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/issues/comments/{id}/assets/{attachment_id}][%d] issueEditIssueCommentAttachmentNotFound", 404)
+}
+
+func (o *IssueEditIssueCommentAttachmentNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewIssueEditIssueCommentAttachmentLocked creates a IssueEditIssueCommentAttachmentLocked with default headers values
+func NewIssueEditIssueCommentAttachmentLocked() *IssueEditIssueCommentAttachmentLocked {
+	return &IssueEditIssueCommentAttachmentLocked{}
+}
+
+/*
+IssueEditIssueCommentAttachmentLocked describes a response with status code 423, with default header values.
+
+APIRepoArchivedError is an error that is raised when an archived repo should be modified
+*/
+type IssueEditIssueCommentAttachmentLocked struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this issue edit issue comment attachment locked response has a 2xx status code
+func (o *IssueEditIssueCommentAttachmentLocked) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue edit issue comment attachment locked response has a 3xx status code
+func (o *IssueEditIssueCommentAttachmentLocked) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue edit issue comment attachment locked response has a 4xx status code
+func (o *IssueEditIssueCommentAttachmentLocked) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue edit issue comment attachment locked response has a 5xx status code
+func (o *IssueEditIssueCommentAttachmentLocked) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue edit issue comment attachment locked response a status code equal to that given
+func (o *IssueEditIssueCommentAttachmentLocked) IsCode(code int) bool {
+	return code == 423
+}
+
+// Code gets the status code for the issue edit issue comment attachment locked response
+func (o *IssueEditIssueCommentAttachmentLocked) Code() int {
+	return 423
+}
+
+func (o *IssueEditIssueCommentAttachmentLocked) Error() string {
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/issues/comments/{id}/assets/{attachment_id}][%d] issueEditIssueCommentAttachmentLocked", 423)
+}
+
+func (o *IssueEditIssueCommentAttachmentLocked) String() string {
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/issues/comments/{id}/assets/{attachment_id}][%d] issueEditIssueCommentAttachmentLocked", 423)
+}
+
+func (o *IssueEditIssueCommentAttachmentLocked) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_edit_issue_deadline_parameters.go b/bots-common/gitea-generated/client/issue/issue_edit_issue_deadline_parameters.go
new file mode 100644
index 0000000..54ab75a
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_edit_issue_deadline_parameters.go
@@ -0,0 +1,219 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewIssueEditIssueDeadlineParams creates a new IssueEditIssueDeadlineParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewIssueEditIssueDeadlineParams() *IssueEditIssueDeadlineParams {
+	return &IssueEditIssueDeadlineParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewIssueEditIssueDeadlineParamsWithTimeout creates a new IssueEditIssueDeadlineParams object
+// with the ability to set a timeout on a request.
+func NewIssueEditIssueDeadlineParamsWithTimeout(timeout time.Duration) *IssueEditIssueDeadlineParams {
+	return &IssueEditIssueDeadlineParams{
+		timeout: timeout,
+	}
+}
+
+// NewIssueEditIssueDeadlineParamsWithContext creates a new IssueEditIssueDeadlineParams object
+// with the ability to set a context for a request.
+func NewIssueEditIssueDeadlineParamsWithContext(ctx context.Context) *IssueEditIssueDeadlineParams {
+	return &IssueEditIssueDeadlineParams{
+		Context: ctx,
+	}
+}
+
+// NewIssueEditIssueDeadlineParamsWithHTTPClient creates a new IssueEditIssueDeadlineParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewIssueEditIssueDeadlineParamsWithHTTPClient(client *http.Client) *IssueEditIssueDeadlineParams {
+	return &IssueEditIssueDeadlineParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+IssueEditIssueDeadlineParams contains all the parameters to send to the API endpoint
+
+	for the issue edit issue deadline operation.
+
+	Typically these are written to a http.Request.
+*/
+type IssueEditIssueDeadlineParams struct {
+
+	// Body.
+	Body *models.EditDeadlineOption
+
+	/* Index.
+
+	   index of the issue to create or update a deadline on
+
+	   Format: int64
+	*/
+	Index int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the issue edit issue deadline params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueEditIssueDeadlineParams) WithDefaults() *IssueEditIssueDeadlineParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the issue edit issue deadline params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueEditIssueDeadlineParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the issue edit issue deadline params
+func (o *IssueEditIssueDeadlineParams) WithTimeout(timeout time.Duration) *IssueEditIssueDeadlineParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the issue edit issue deadline params
+func (o *IssueEditIssueDeadlineParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the issue edit issue deadline params
+func (o *IssueEditIssueDeadlineParams) WithContext(ctx context.Context) *IssueEditIssueDeadlineParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the issue edit issue deadline params
+func (o *IssueEditIssueDeadlineParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the issue edit issue deadline params
+func (o *IssueEditIssueDeadlineParams) WithHTTPClient(client *http.Client) *IssueEditIssueDeadlineParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the issue edit issue deadline params
+func (o *IssueEditIssueDeadlineParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the issue edit issue deadline params
+func (o *IssueEditIssueDeadlineParams) WithBody(body *models.EditDeadlineOption) *IssueEditIssueDeadlineParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the issue edit issue deadline params
+func (o *IssueEditIssueDeadlineParams) SetBody(body *models.EditDeadlineOption) {
+	o.Body = body
+}
+
+// WithIndex adds the index to the issue edit issue deadline params
+func (o *IssueEditIssueDeadlineParams) WithIndex(index int64) *IssueEditIssueDeadlineParams {
+	o.SetIndex(index)
+	return o
+}
+
+// SetIndex adds the index to the issue edit issue deadline params
+func (o *IssueEditIssueDeadlineParams) SetIndex(index int64) {
+	o.Index = index
+}
+
+// WithOwner adds the owner to the issue edit issue deadline params
+func (o *IssueEditIssueDeadlineParams) WithOwner(owner string) *IssueEditIssueDeadlineParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the issue edit issue deadline params
+func (o *IssueEditIssueDeadlineParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the issue edit issue deadline params
+func (o *IssueEditIssueDeadlineParams) WithRepo(repo string) *IssueEditIssueDeadlineParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the issue edit issue deadline params
+func (o *IssueEditIssueDeadlineParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *IssueEditIssueDeadlineParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	// path param index
+	if err := r.SetPathParam("index", swag.FormatInt64(o.Index)); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_edit_issue_deadline_responses.go b/bots-common/gitea-generated/client/issue/issue_edit_issue_deadline_responses.go
new file mode 100644
index 0000000..e3df339
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_edit_issue_deadline_responses.go
@@ -0,0 +1,246 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// IssueEditIssueDeadlineReader is a Reader for the IssueEditIssueDeadline structure.
+type IssueEditIssueDeadlineReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *IssueEditIssueDeadlineReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 201:
+		result := NewIssueEditIssueDeadlineCreated()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 403:
+		result := NewIssueEditIssueDeadlineForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewIssueEditIssueDeadlineNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[POST /repos/{owner}/{repo}/issues/{index}/deadline] issueEditIssueDeadline", response, response.Code())
+	}
+}
+
+// NewIssueEditIssueDeadlineCreated creates a IssueEditIssueDeadlineCreated with default headers values
+func NewIssueEditIssueDeadlineCreated() *IssueEditIssueDeadlineCreated {
+	return &IssueEditIssueDeadlineCreated{}
+}
+
+/*
+IssueEditIssueDeadlineCreated describes a response with status code 201, with default header values.
+
+IssueDeadline
+*/
+type IssueEditIssueDeadlineCreated struct {
+	Payload *models.IssueDeadline
+}
+
+// IsSuccess returns true when this issue edit issue deadline created response has a 2xx status code
+func (o *IssueEditIssueDeadlineCreated) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this issue edit issue deadline created response has a 3xx status code
+func (o *IssueEditIssueDeadlineCreated) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue edit issue deadline created response has a 4xx status code
+func (o *IssueEditIssueDeadlineCreated) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this issue edit issue deadline created response has a 5xx status code
+func (o *IssueEditIssueDeadlineCreated) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue edit issue deadline created response a status code equal to that given
+func (o *IssueEditIssueDeadlineCreated) IsCode(code int) bool {
+	return code == 201
+}
+
+// Code gets the status code for the issue edit issue deadline created response
+func (o *IssueEditIssueDeadlineCreated) Code() int {
+	return 201
+}
+
+func (o *IssueEditIssueDeadlineCreated) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/{index}/deadline][%d] issueEditIssueDeadlineCreated %s", 201, payload)
+}
+
+func (o *IssueEditIssueDeadlineCreated) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/{index}/deadline][%d] issueEditIssueDeadlineCreated %s", 201, payload)
+}
+
+func (o *IssueEditIssueDeadlineCreated) GetPayload() *models.IssueDeadline {
+	return o.Payload
+}
+
+func (o *IssueEditIssueDeadlineCreated) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.IssueDeadline)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewIssueEditIssueDeadlineForbidden creates a IssueEditIssueDeadlineForbidden with default headers values
+func NewIssueEditIssueDeadlineForbidden() *IssueEditIssueDeadlineForbidden {
+	return &IssueEditIssueDeadlineForbidden{}
+}
+
+/*
+IssueEditIssueDeadlineForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type IssueEditIssueDeadlineForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this issue edit issue deadline forbidden response has a 2xx status code
+func (o *IssueEditIssueDeadlineForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue edit issue deadline forbidden response has a 3xx status code
+func (o *IssueEditIssueDeadlineForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue edit issue deadline forbidden response has a 4xx status code
+func (o *IssueEditIssueDeadlineForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue edit issue deadline forbidden response has a 5xx status code
+func (o *IssueEditIssueDeadlineForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue edit issue deadline forbidden response a status code equal to that given
+func (o *IssueEditIssueDeadlineForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the issue edit issue deadline forbidden response
+func (o *IssueEditIssueDeadlineForbidden) Code() int {
+	return 403
+}
+
+func (o *IssueEditIssueDeadlineForbidden) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/{index}/deadline][%d] issueEditIssueDeadlineForbidden", 403)
+}
+
+func (o *IssueEditIssueDeadlineForbidden) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/{index}/deadline][%d] issueEditIssueDeadlineForbidden", 403)
+}
+
+func (o *IssueEditIssueDeadlineForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewIssueEditIssueDeadlineNotFound creates a IssueEditIssueDeadlineNotFound with default headers values
+func NewIssueEditIssueDeadlineNotFound() *IssueEditIssueDeadlineNotFound {
+	return &IssueEditIssueDeadlineNotFound{}
+}
+
+/*
+IssueEditIssueDeadlineNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type IssueEditIssueDeadlineNotFound struct {
+}
+
+// IsSuccess returns true when this issue edit issue deadline not found response has a 2xx status code
+func (o *IssueEditIssueDeadlineNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue edit issue deadline not found response has a 3xx status code
+func (o *IssueEditIssueDeadlineNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue edit issue deadline not found response has a 4xx status code
+func (o *IssueEditIssueDeadlineNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue edit issue deadline not found response has a 5xx status code
+func (o *IssueEditIssueDeadlineNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue edit issue deadline not found response a status code equal to that given
+func (o *IssueEditIssueDeadlineNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the issue edit issue deadline not found response
+func (o *IssueEditIssueDeadlineNotFound) Code() int {
+	return 404
+}
+
+func (o *IssueEditIssueDeadlineNotFound) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/{index}/deadline][%d] issueEditIssueDeadlineNotFound", 404)
+}
+
+func (o *IssueEditIssueDeadlineNotFound) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/{index}/deadline][%d] issueEditIssueDeadlineNotFound", 404)
+}
+
+func (o *IssueEditIssueDeadlineNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_edit_issue_parameters.go b/bots-common/gitea-generated/client/issue/issue_edit_issue_parameters.go
new file mode 100644
index 0000000..e480068
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_edit_issue_parameters.go
@@ -0,0 +1,219 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewIssueEditIssueParams creates a new IssueEditIssueParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewIssueEditIssueParams() *IssueEditIssueParams {
+	return &IssueEditIssueParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewIssueEditIssueParamsWithTimeout creates a new IssueEditIssueParams object
+// with the ability to set a timeout on a request.
+func NewIssueEditIssueParamsWithTimeout(timeout time.Duration) *IssueEditIssueParams {
+	return &IssueEditIssueParams{
+		timeout: timeout,
+	}
+}
+
+// NewIssueEditIssueParamsWithContext creates a new IssueEditIssueParams object
+// with the ability to set a context for a request.
+func NewIssueEditIssueParamsWithContext(ctx context.Context) *IssueEditIssueParams {
+	return &IssueEditIssueParams{
+		Context: ctx,
+	}
+}
+
+// NewIssueEditIssueParamsWithHTTPClient creates a new IssueEditIssueParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewIssueEditIssueParamsWithHTTPClient(client *http.Client) *IssueEditIssueParams {
+	return &IssueEditIssueParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+IssueEditIssueParams contains all the parameters to send to the API endpoint
+
+	for the issue edit issue operation.
+
+	Typically these are written to a http.Request.
+*/
+type IssueEditIssueParams struct {
+
+	// Body.
+	Body *models.EditIssueOption
+
+	/* Index.
+
+	   index of the issue to edit
+
+	   Format: int64
+	*/
+	Index int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the issue edit issue params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueEditIssueParams) WithDefaults() *IssueEditIssueParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the issue edit issue params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueEditIssueParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the issue edit issue params
+func (o *IssueEditIssueParams) WithTimeout(timeout time.Duration) *IssueEditIssueParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the issue edit issue params
+func (o *IssueEditIssueParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the issue edit issue params
+func (o *IssueEditIssueParams) WithContext(ctx context.Context) *IssueEditIssueParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the issue edit issue params
+func (o *IssueEditIssueParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the issue edit issue params
+func (o *IssueEditIssueParams) WithHTTPClient(client *http.Client) *IssueEditIssueParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the issue edit issue params
+func (o *IssueEditIssueParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the issue edit issue params
+func (o *IssueEditIssueParams) WithBody(body *models.EditIssueOption) *IssueEditIssueParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the issue edit issue params
+func (o *IssueEditIssueParams) SetBody(body *models.EditIssueOption) {
+	o.Body = body
+}
+
+// WithIndex adds the index to the issue edit issue params
+func (o *IssueEditIssueParams) WithIndex(index int64) *IssueEditIssueParams {
+	o.SetIndex(index)
+	return o
+}
+
+// SetIndex adds the index to the issue edit issue params
+func (o *IssueEditIssueParams) SetIndex(index int64) {
+	o.Index = index
+}
+
+// WithOwner adds the owner to the issue edit issue params
+func (o *IssueEditIssueParams) WithOwner(owner string) *IssueEditIssueParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the issue edit issue params
+func (o *IssueEditIssueParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the issue edit issue params
+func (o *IssueEditIssueParams) WithRepo(repo string) *IssueEditIssueParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the issue edit issue params
+func (o *IssueEditIssueParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *IssueEditIssueParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	// path param index
+	if err := r.SetPathParam("index", swag.FormatInt64(o.Index)); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_edit_issue_responses.go b/bots-common/gitea-generated/client/issue/issue_edit_issue_responses.go
new file mode 100644
index 0000000..5ae09f6
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_edit_issue_responses.go
@@ -0,0 +1,324 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// IssueEditIssueReader is a Reader for the IssueEditIssue structure.
+type IssueEditIssueReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *IssueEditIssueReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 201:
+		result := NewIssueEditIssueCreated()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 403:
+		result := NewIssueEditIssueForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewIssueEditIssueNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 412:
+		result := NewIssueEditIssuePreconditionFailed()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[PATCH /repos/{owner}/{repo}/issues/{index}] issueEditIssue", response, response.Code())
+	}
+}
+
+// NewIssueEditIssueCreated creates a IssueEditIssueCreated with default headers values
+func NewIssueEditIssueCreated() *IssueEditIssueCreated {
+	return &IssueEditIssueCreated{}
+}
+
+/*
+IssueEditIssueCreated describes a response with status code 201, with default header values.
+
+Issue
+*/
+type IssueEditIssueCreated struct {
+	Payload *models.Issue
+}
+
+// IsSuccess returns true when this issue edit issue created response has a 2xx status code
+func (o *IssueEditIssueCreated) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this issue edit issue created response has a 3xx status code
+func (o *IssueEditIssueCreated) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue edit issue created response has a 4xx status code
+func (o *IssueEditIssueCreated) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this issue edit issue created response has a 5xx status code
+func (o *IssueEditIssueCreated) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue edit issue created response a status code equal to that given
+func (o *IssueEditIssueCreated) IsCode(code int) bool {
+	return code == 201
+}
+
+// Code gets the status code for the issue edit issue created response
+func (o *IssueEditIssueCreated) Code() int {
+	return 201
+}
+
+func (o *IssueEditIssueCreated) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/issues/{index}][%d] issueEditIssueCreated %s", 201, payload)
+}
+
+func (o *IssueEditIssueCreated) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/issues/{index}][%d] issueEditIssueCreated %s", 201, payload)
+}
+
+func (o *IssueEditIssueCreated) GetPayload() *models.Issue {
+	return o.Payload
+}
+
+func (o *IssueEditIssueCreated) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.Issue)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewIssueEditIssueForbidden creates a IssueEditIssueForbidden with default headers values
+func NewIssueEditIssueForbidden() *IssueEditIssueForbidden {
+	return &IssueEditIssueForbidden{}
+}
+
+/*
+IssueEditIssueForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type IssueEditIssueForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this issue edit issue forbidden response has a 2xx status code
+func (o *IssueEditIssueForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue edit issue forbidden response has a 3xx status code
+func (o *IssueEditIssueForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue edit issue forbidden response has a 4xx status code
+func (o *IssueEditIssueForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue edit issue forbidden response has a 5xx status code
+func (o *IssueEditIssueForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue edit issue forbidden response a status code equal to that given
+func (o *IssueEditIssueForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the issue edit issue forbidden response
+func (o *IssueEditIssueForbidden) Code() int {
+	return 403
+}
+
+func (o *IssueEditIssueForbidden) Error() string {
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/issues/{index}][%d] issueEditIssueForbidden", 403)
+}
+
+func (o *IssueEditIssueForbidden) String() string {
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/issues/{index}][%d] issueEditIssueForbidden", 403)
+}
+
+func (o *IssueEditIssueForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewIssueEditIssueNotFound creates a IssueEditIssueNotFound with default headers values
+func NewIssueEditIssueNotFound() *IssueEditIssueNotFound {
+	return &IssueEditIssueNotFound{}
+}
+
+/*
+IssueEditIssueNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type IssueEditIssueNotFound struct {
+}
+
+// IsSuccess returns true when this issue edit issue not found response has a 2xx status code
+func (o *IssueEditIssueNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue edit issue not found response has a 3xx status code
+func (o *IssueEditIssueNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue edit issue not found response has a 4xx status code
+func (o *IssueEditIssueNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue edit issue not found response has a 5xx status code
+func (o *IssueEditIssueNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue edit issue not found response a status code equal to that given
+func (o *IssueEditIssueNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the issue edit issue not found response
+func (o *IssueEditIssueNotFound) Code() int {
+	return 404
+}
+
+func (o *IssueEditIssueNotFound) Error() string {
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/issues/{index}][%d] issueEditIssueNotFound", 404)
+}
+
+func (o *IssueEditIssueNotFound) String() string {
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/issues/{index}][%d] issueEditIssueNotFound", 404)
+}
+
+func (o *IssueEditIssueNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewIssueEditIssuePreconditionFailed creates a IssueEditIssuePreconditionFailed with default headers values
+func NewIssueEditIssuePreconditionFailed() *IssueEditIssuePreconditionFailed {
+	return &IssueEditIssuePreconditionFailed{}
+}
+
+/*
+IssueEditIssuePreconditionFailed describes a response with status code 412, with default header values.
+
+APIError is error format response
+*/
+type IssueEditIssuePreconditionFailed struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this issue edit issue precondition failed response has a 2xx status code
+func (o *IssueEditIssuePreconditionFailed) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue edit issue precondition failed response has a 3xx status code
+func (o *IssueEditIssuePreconditionFailed) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue edit issue precondition failed response has a 4xx status code
+func (o *IssueEditIssuePreconditionFailed) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue edit issue precondition failed response has a 5xx status code
+func (o *IssueEditIssuePreconditionFailed) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue edit issue precondition failed response a status code equal to that given
+func (o *IssueEditIssuePreconditionFailed) IsCode(code int) bool {
+	return code == 412
+}
+
+// Code gets the status code for the issue edit issue precondition failed response
+func (o *IssueEditIssuePreconditionFailed) Code() int {
+	return 412
+}
+
+func (o *IssueEditIssuePreconditionFailed) Error() string {
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/issues/{index}][%d] issueEditIssuePreconditionFailed", 412)
+}
+
+func (o *IssueEditIssuePreconditionFailed) String() string {
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/issues/{index}][%d] issueEditIssuePreconditionFailed", 412)
+}
+
+func (o *IssueEditIssuePreconditionFailed) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_edit_label_parameters.go b/bots-common/gitea-generated/client/issue/issue_edit_label_parameters.go
new file mode 100644
index 0000000..1349f8b
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_edit_label_parameters.go
@@ -0,0 +1,219 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewIssueEditLabelParams creates a new IssueEditLabelParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewIssueEditLabelParams() *IssueEditLabelParams {
+	return &IssueEditLabelParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewIssueEditLabelParamsWithTimeout creates a new IssueEditLabelParams object
+// with the ability to set a timeout on a request.
+func NewIssueEditLabelParamsWithTimeout(timeout time.Duration) *IssueEditLabelParams {
+	return &IssueEditLabelParams{
+		timeout: timeout,
+	}
+}
+
+// NewIssueEditLabelParamsWithContext creates a new IssueEditLabelParams object
+// with the ability to set a context for a request.
+func NewIssueEditLabelParamsWithContext(ctx context.Context) *IssueEditLabelParams {
+	return &IssueEditLabelParams{
+		Context: ctx,
+	}
+}
+
+// NewIssueEditLabelParamsWithHTTPClient creates a new IssueEditLabelParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewIssueEditLabelParamsWithHTTPClient(client *http.Client) *IssueEditLabelParams {
+	return &IssueEditLabelParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+IssueEditLabelParams contains all the parameters to send to the API endpoint
+
+	for the issue edit label operation.
+
+	Typically these are written to a http.Request.
+*/
+type IssueEditLabelParams struct {
+
+	// Body.
+	Body *models.EditLabelOption
+
+	/* ID.
+
+	   id of the label to edit
+
+	   Format: int64
+	*/
+	ID int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the issue edit label params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueEditLabelParams) WithDefaults() *IssueEditLabelParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the issue edit label params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueEditLabelParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the issue edit label params
+func (o *IssueEditLabelParams) WithTimeout(timeout time.Duration) *IssueEditLabelParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the issue edit label params
+func (o *IssueEditLabelParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the issue edit label params
+func (o *IssueEditLabelParams) WithContext(ctx context.Context) *IssueEditLabelParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the issue edit label params
+func (o *IssueEditLabelParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the issue edit label params
+func (o *IssueEditLabelParams) WithHTTPClient(client *http.Client) *IssueEditLabelParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the issue edit label params
+func (o *IssueEditLabelParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the issue edit label params
+func (o *IssueEditLabelParams) WithBody(body *models.EditLabelOption) *IssueEditLabelParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the issue edit label params
+func (o *IssueEditLabelParams) SetBody(body *models.EditLabelOption) {
+	o.Body = body
+}
+
+// WithID adds the id to the issue edit label params
+func (o *IssueEditLabelParams) WithID(id int64) *IssueEditLabelParams {
+	o.SetID(id)
+	return o
+}
+
+// SetID adds the id to the issue edit label params
+func (o *IssueEditLabelParams) SetID(id int64) {
+	o.ID = id
+}
+
+// WithOwner adds the owner to the issue edit label params
+func (o *IssueEditLabelParams) WithOwner(owner string) *IssueEditLabelParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the issue edit label params
+func (o *IssueEditLabelParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the issue edit label params
+func (o *IssueEditLabelParams) WithRepo(repo string) *IssueEditLabelParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the issue edit label params
+func (o *IssueEditLabelParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *IssueEditLabelParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	// path param id
+	if err := r.SetPathParam("id", swag.FormatInt64(o.ID)); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_edit_label_responses.go b/bots-common/gitea-generated/client/issue/issue_edit_label_responses.go
new file mode 100644
index 0000000..05b02d0
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_edit_label_responses.go
@@ -0,0 +1,246 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// IssueEditLabelReader is a Reader for the IssueEditLabel structure.
+type IssueEditLabelReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *IssueEditLabelReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewIssueEditLabelOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewIssueEditLabelNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 422:
+		result := NewIssueEditLabelUnprocessableEntity()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[PATCH /repos/{owner}/{repo}/labels/{id}] issueEditLabel", response, response.Code())
+	}
+}
+
+// NewIssueEditLabelOK creates a IssueEditLabelOK with default headers values
+func NewIssueEditLabelOK() *IssueEditLabelOK {
+	return &IssueEditLabelOK{}
+}
+
+/*
+IssueEditLabelOK describes a response with status code 200, with default header values.
+
+Label
+*/
+type IssueEditLabelOK struct {
+	Payload *models.Label
+}
+
+// IsSuccess returns true when this issue edit label o k response has a 2xx status code
+func (o *IssueEditLabelOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this issue edit label o k response has a 3xx status code
+func (o *IssueEditLabelOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue edit label o k response has a 4xx status code
+func (o *IssueEditLabelOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this issue edit label o k response has a 5xx status code
+func (o *IssueEditLabelOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue edit label o k response a status code equal to that given
+func (o *IssueEditLabelOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the issue edit label o k response
+func (o *IssueEditLabelOK) Code() int {
+	return 200
+}
+
+func (o *IssueEditLabelOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/labels/{id}][%d] issueEditLabelOK %s", 200, payload)
+}
+
+func (o *IssueEditLabelOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/labels/{id}][%d] issueEditLabelOK %s", 200, payload)
+}
+
+func (o *IssueEditLabelOK) GetPayload() *models.Label {
+	return o.Payload
+}
+
+func (o *IssueEditLabelOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.Label)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewIssueEditLabelNotFound creates a IssueEditLabelNotFound with default headers values
+func NewIssueEditLabelNotFound() *IssueEditLabelNotFound {
+	return &IssueEditLabelNotFound{}
+}
+
+/*
+IssueEditLabelNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type IssueEditLabelNotFound struct {
+}
+
+// IsSuccess returns true when this issue edit label not found response has a 2xx status code
+func (o *IssueEditLabelNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue edit label not found response has a 3xx status code
+func (o *IssueEditLabelNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue edit label not found response has a 4xx status code
+func (o *IssueEditLabelNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue edit label not found response has a 5xx status code
+func (o *IssueEditLabelNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue edit label not found response a status code equal to that given
+func (o *IssueEditLabelNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the issue edit label not found response
+func (o *IssueEditLabelNotFound) Code() int {
+	return 404
+}
+
+func (o *IssueEditLabelNotFound) Error() string {
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/labels/{id}][%d] issueEditLabelNotFound", 404)
+}
+
+func (o *IssueEditLabelNotFound) String() string {
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/labels/{id}][%d] issueEditLabelNotFound", 404)
+}
+
+func (o *IssueEditLabelNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewIssueEditLabelUnprocessableEntity creates a IssueEditLabelUnprocessableEntity with default headers values
+func NewIssueEditLabelUnprocessableEntity() *IssueEditLabelUnprocessableEntity {
+	return &IssueEditLabelUnprocessableEntity{}
+}
+
+/*
+IssueEditLabelUnprocessableEntity describes a response with status code 422, with default header values.
+
+APIValidationError is error format response related to input validation
+*/
+type IssueEditLabelUnprocessableEntity struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this issue edit label unprocessable entity response has a 2xx status code
+func (o *IssueEditLabelUnprocessableEntity) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue edit label unprocessable entity response has a 3xx status code
+func (o *IssueEditLabelUnprocessableEntity) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue edit label unprocessable entity response has a 4xx status code
+func (o *IssueEditLabelUnprocessableEntity) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue edit label unprocessable entity response has a 5xx status code
+func (o *IssueEditLabelUnprocessableEntity) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue edit label unprocessable entity response a status code equal to that given
+func (o *IssueEditLabelUnprocessableEntity) IsCode(code int) bool {
+	return code == 422
+}
+
+// Code gets the status code for the issue edit label unprocessable entity response
+func (o *IssueEditLabelUnprocessableEntity) Code() int {
+	return 422
+}
+
+func (o *IssueEditLabelUnprocessableEntity) Error() string {
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/labels/{id}][%d] issueEditLabelUnprocessableEntity", 422)
+}
+
+func (o *IssueEditLabelUnprocessableEntity) String() string {
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/labels/{id}][%d] issueEditLabelUnprocessableEntity", 422)
+}
+
+func (o *IssueEditLabelUnprocessableEntity) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_edit_milestone_parameters.go b/bots-common/gitea-generated/client/issue/issue_edit_milestone_parameters.go
new file mode 100644
index 0000000..26d5eca
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_edit_milestone_parameters.go
@@ -0,0 +1,216 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewIssueEditMilestoneParams creates a new IssueEditMilestoneParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewIssueEditMilestoneParams() *IssueEditMilestoneParams {
+	return &IssueEditMilestoneParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewIssueEditMilestoneParamsWithTimeout creates a new IssueEditMilestoneParams object
+// with the ability to set a timeout on a request.
+func NewIssueEditMilestoneParamsWithTimeout(timeout time.Duration) *IssueEditMilestoneParams {
+	return &IssueEditMilestoneParams{
+		timeout: timeout,
+	}
+}
+
+// NewIssueEditMilestoneParamsWithContext creates a new IssueEditMilestoneParams object
+// with the ability to set a context for a request.
+func NewIssueEditMilestoneParamsWithContext(ctx context.Context) *IssueEditMilestoneParams {
+	return &IssueEditMilestoneParams{
+		Context: ctx,
+	}
+}
+
+// NewIssueEditMilestoneParamsWithHTTPClient creates a new IssueEditMilestoneParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewIssueEditMilestoneParamsWithHTTPClient(client *http.Client) *IssueEditMilestoneParams {
+	return &IssueEditMilestoneParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+IssueEditMilestoneParams contains all the parameters to send to the API endpoint
+
+	for the issue edit milestone operation.
+
+	Typically these are written to a http.Request.
+*/
+type IssueEditMilestoneParams struct {
+
+	// Body.
+	Body *models.EditMilestoneOption
+
+	/* ID.
+
+	   the milestone to edit, identified by ID and if not available by name
+	*/
+	ID string
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the issue edit milestone params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueEditMilestoneParams) WithDefaults() *IssueEditMilestoneParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the issue edit milestone params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueEditMilestoneParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the issue edit milestone params
+func (o *IssueEditMilestoneParams) WithTimeout(timeout time.Duration) *IssueEditMilestoneParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the issue edit milestone params
+func (o *IssueEditMilestoneParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the issue edit milestone params
+func (o *IssueEditMilestoneParams) WithContext(ctx context.Context) *IssueEditMilestoneParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the issue edit milestone params
+func (o *IssueEditMilestoneParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the issue edit milestone params
+func (o *IssueEditMilestoneParams) WithHTTPClient(client *http.Client) *IssueEditMilestoneParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the issue edit milestone params
+func (o *IssueEditMilestoneParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the issue edit milestone params
+func (o *IssueEditMilestoneParams) WithBody(body *models.EditMilestoneOption) *IssueEditMilestoneParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the issue edit milestone params
+func (o *IssueEditMilestoneParams) SetBody(body *models.EditMilestoneOption) {
+	o.Body = body
+}
+
+// WithID adds the id to the issue edit milestone params
+func (o *IssueEditMilestoneParams) WithID(id string) *IssueEditMilestoneParams {
+	o.SetID(id)
+	return o
+}
+
+// SetID adds the id to the issue edit milestone params
+func (o *IssueEditMilestoneParams) SetID(id string) {
+	o.ID = id
+}
+
+// WithOwner adds the owner to the issue edit milestone params
+func (o *IssueEditMilestoneParams) WithOwner(owner string) *IssueEditMilestoneParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the issue edit milestone params
+func (o *IssueEditMilestoneParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the issue edit milestone params
+func (o *IssueEditMilestoneParams) WithRepo(repo string) *IssueEditMilestoneParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the issue edit milestone params
+func (o *IssueEditMilestoneParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *IssueEditMilestoneParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	// path param id
+	if err := r.SetPathParam("id", o.ID); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_edit_milestone_responses.go b/bots-common/gitea-generated/client/issue/issue_edit_milestone_responses.go
new file mode 100644
index 0000000..44db61a
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_edit_milestone_responses.go
@@ -0,0 +1,168 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// IssueEditMilestoneReader is a Reader for the IssueEditMilestone structure.
+type IssueEditMilestoneReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *IssueEditMilestoneReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewIssueEditMilestoneOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewIssueEditMilestoneNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[PATCH /repos/{owner}/{repo}/milestones/{id}] issueEditMilestone", response, response.Code())
+	}
+}
+
+// NewIssueEditMilestoneOK creates a IssueEditMilestoneOK with default headers values
+func NewIssueEditMilestoneOK() *IssueEditMilestoneOK {
+	return &IssueEditMilestoneOK{}
+}
+
+/*
+IssueEditMilestoneOK describes a response with status code 200, with default header values.
+
+Milestone
+*/
+type IssueEditMilestoneOK struct {
+	Payload *models.Milestone
+}
+
+// IsSuccess returns true when this issue edit milestone o k response has a 2xx status code
+func (o *IssueEditMilestoneOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this issue edit milestone o k response has a 3xx status code
+func (o *IssueEditMilestoneOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue edit milestone o k response has a 4xx status code
+func (o *IssueEditMilestoneOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this issue edit milestone o k response has a 5xx status code
+func (o *IssueEditMilestoneOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue edit milestone o k response a status code equal to that given
+func (o *IssueEditMilestoneOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the issue edit milestone o k response
+func (o *IssueEditMilestoneOK) Code() int {
+	return 200
+}
+
+func (o *IssueEditMilestoneOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/milestones/{id}][%d] issueEditMilestoneOK %s", 200, payload)
+}
+
+func (o *IssueEditMilestoneOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/milestones/{id}][%d] issueEditMilestoneOK %s", 200, payload)
+}
+
+func (o *IssueEditMilestoneOK) GetPayload() *models.Milestone {
+	return o.Payload
+}
+
+func (o *IssueEditMilestoneOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.Milestone)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewIssueEditMilestoneNotFound creates a IssueEditMilestoneNotFound with default headers values
+func NewIssueEditMilestoneNotFound() *IssueEditMilestoneNotFound {
+	return &IssueEditMilestoneNotFound{}
+}
+
+/*
+IssueEditMilestoneNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type IssueEditMilestoneNotFound struct {
+}
+
+// IsSuccess returns true when this issue edit milestone not found response has a 2xx status code
+func (o *IssueEditMilestoneNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue edit milestone not found response has a 3xx status code
+func (o *IssueEditMilestoneNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue edit milestone not found response has a 4xx status code
+func (o *IssueEditMilestoneNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue edit milestone not found response has a 5xx status code
+func (o *IssueEditMilestoneNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue edit milestone not found response a status code equal to that given
+func (o *IssueEditMilestoneNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the issue edit milestone not found response
+func (o *IssueEditMilestoneNotFound) Code() int {
+	return 404
+}
+
+func (o *IssueEditMilestoneNotFound) Error() string {
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/milestones/{id}][%d] issueEditMilestoneNotFound", 404)
+}
+
+func (o *IssueEditMilestoneNotFound) String() string {
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/milestones/{id}][%d] issueEditMilestoneNotFound", 404)
+}
+
+func (o *IssueEditMilestoneNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_get_comment_parameters.go b/bots-common/gitea-generated/client/issue/issue_get_comment_parameters.go
new file mode 100644
index 0000000..82272a1
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_get_comment_parameters.go
@@ -0,0 +1,198 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewIssueGetCommentParams creates a new IssueGetCommentParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewIssueGetCommentParams() *IssueGetCommentParams {
+	return &IssueGetCommentParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewIssueGetCommentParamsWithTimeout creates a new IssueGetCommentParams object
+// with the ability to set a timeout on a request.
+func NewIssueGetCommentParamsWithTimeout(timeout time.Duration) *IssueGetCommentParams {
+	return &IssueGetCommentParams{
+		timeout: timeout,
+	}
+}
+
+// NewIssueGetCommentParamsWithContext creates a new IssueGetCommentParams object
+// with the ability to set a context for a request.
+func NewIssueGetCommentParamsWithContext(ctx context.Context) *IssueGetCommentParams {
+	return &IssueGetCommentParams{
+		Context: ctx,
+	}
+}
+
+// NewIssueGetCommentParamsWithHTTPClient creates a new IssueGetCommentParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewIssueGetCommentParamsWithHTTPClient(client *http.Client) *IssueGetCommentParams {
+	return &IssueGetCommentParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+IssueGetCommentParams contains all the parameters to send to the API endpoint
+
+	for the issue get comment operation.
+
+	Typically these are written to a http.Request.
+*/
+type IssueGetCommentParams struct {
+
+	/* ID.
+
+	   id of the comment
+
+	   Format: int64
+	*/
+	ID int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the issue get comment params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueGetCommentParams) WithDefaults() *IssueGetCommentParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the issue get comment params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueGetCommentParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the issue get comment params
+func (o *IssueGetCommentParams) WithTimeout(timeout time.Duration) *IssueGetCommentParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the issue get comment params
+func (o *IssueGetCommentParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the issue get comment params
+func (o *IssueGetCommentParams) WithContext(ctx context.Context) *IssueGetCommentParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the issue get comment params
+func (o *IssueGetCommentParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the issue get comment params
+func (o *IssueGetCommentParams) WithHTTPClient(client *http.Client) *IssueGetCommentParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the issue get comment params
+func (o *IssueGetCommentParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithID adds the id to the issue get comment params
+func (o *IssueGetCommentParams) WithID(id int64) *IssueGetCommentParams {
+	o.SetID(id)
+	return o
+}
+
+// SetID adds the id to the issue get comment params
+func (o *IssueGetCommentParams) SetID(id int64) {
+	o.ID = id
+}
+
+// WithOwner adds the owner to the issue get comment params
+func (o *IssueGetCommentParams) WithOwner(owner string) *IssueGetCommentParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the issue get comment params
+func (o *IssueGetCommentParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the issue get comment params
+func (o *IssueGetCommentParams) WithRepo(repo string) *IssueGetCommentParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the issue get comment params
+func (o *IssueGetCommentParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *IssueGetCommentParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param id
+	if err := r.SetPathParam("id", swag.FormatInt64(o.ID)); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_get_comment_reactions_parameters.go b/bots-common/gitea-generated/client/issue/issue_get_comment_reactions_parameters.go
new file mode 100644
index 0000000..ea3845a
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_get_comment_reactions_parameters.go
@@ -0,0 +1,198 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewIssueGetCommentReactionsParams creates a new IssueGetCommentReactionsParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewIssueGetCommentReactionsParams() *IssueGetCommentReactionsParams {
+	return &IssueGetCommentReactionsParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewIssueGetCommentReactionsParamsWithTimeout creates a new IssueGetCommentReactionsParams object
+// with the ability to set a timeout on a request.
+func NewIssueGetCommentReactionsParamsWithTimeout(timeout time.Duration) *IssueGetCommentReactionsParams {
+	return &IssueGetCommentReactionsParams{
+		timeout: timeout,
+	}
+}
+
+// NewIssueGetCommentReactionsParamsWithContext creates a new IssueGetCommentReactionsParams object
+// with the ability to set a context for a request.
+func NewIssueGetCommentReactionsParamsWithContext(ctx context.Context) *IssueGetCommentReactionsParams {
+	return &IssueGetCommentReactionsParams{
+		Context: ctx,
+	}
+}
+
+// NewIssueGetCommentReactionsParamsWithHTTPClient creates a new IssueGetCommentReactionsParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewIssueGetCommentReactionsParamsWithHTTPClient(client *http.Client) *IssueGetCommentReactionsParams {
+	return &IssueGetCommentReactionsParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+IssueGetCommentReactionsParams contains all the parameters to send to the API endpoint
+
+	for the issue get comment reactions operation.
+
+	Typically these are written to a http.Request.
+*/
+type IssueGetCommentReactionsParams struct {
+
+	/* ID.
+
+	   id of the comment to edit
+
+	   Format: int64
+	*/
+	ID int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the issue get comment reactions params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueGetCommentReactionsParams) WithDefaults() *IssueGetCommentReactionsParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the issue get comment reactions params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueGetCommentReactionsParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the issue get comment reactions params
+func (o *IssueGetCommentReactionsParams) WithTimeout(timeout time.Duration) *IssueGetCommentReactionsParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the issue get comment reactions params
+func (o *IssueGetCommentReactionsParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the issue get comment reactions params
+func (o *IssueGetCommentReactionsParams) WithContext(ctx context.Context) *IssueGetCommentReactionsParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the issue get comment reactions params
+func (o *IssueGetCommentReactionsParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the issue get comment reactions params
+func (o *IssueGetCommentReactionsParams) WithHTTPClient(client *http.Client) *IssueGetCommentReactionsParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the issue get comment reactions params
+func (o *IssueGetCommentReactionsParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithID adds the id to the issue get comment reactions params
+func (o *IssueGetCommentReactionsParams) WithID(id int64) *IssueGetCommentReactionsParams {
+	o.SetID(id)
+	return o
+}
+
+// SetID adds the id to the issue get comment reactions params
+func (o *IssueGetCommentReactionsParams) SetID(id int64) {
+	o.ID = id
+}
+
+// WithOwner adds the owner to the issue get comment reactions params
+func (o *IssueGetCommentReactionsParams) WithOwner(owner string) *IssueGetCommentReactionsParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the issue get comment reactions params
+func (o *IssueGetCommentReactionsParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the issue get comment reactions params
+func (o *IssueGetCommentReactionsParams) WithRepo(repo string) *IssueGetCommentReactionsParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the issue get comment reactions params
+func (o *IssueGetCommentReactionsParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *IssueGetCommentReactionsParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param id
+	if err := r.SetPathParam("id", swag.FormatInt64(o.ID)); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_get_comment_reactions_responses.go b/bots-common/gitea-generated/client/issue/issue_get_comment_reactions_responses.go
new file mode 100644
index 0000000..24837aa
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_get_comment_reactions_responses.go
@@ -0,0 +1,244 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// IssueGetCommentReactionsReader is a Reader for the IssueGetCommentReactions structure.
+type IssueGetCommentReactionsReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *IssueGetCommentReactionsReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewIssueGetCommentReactionsOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 403:
+		result := NewIssueGetCommentReactionsForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewIssueGetCommentReactionsNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/issues/comments/{id}/reactions] issueGetCommentReactions", response, response.Code())
+	}
+}
+
+// NewIssueGetCommentReactionsOK creates a IssueGetCommentReactionsOK with default headers values
+func NewIssueGetCommentReactionsOK() *IssueGetCommentReactionsOK {
+	return &IssueGetCommentReactionsOK{}
+}
+
+/*
+IssueGetCommentReactionsOK describes a response with status code 200, with default header values.
+
+ReactionList
+*/
+type IssueGetCommentReactionsOK struct {
+	Payload []*models.Reaction
+}
+
+// IsSuccess returns true when this issue get comment reactions o k response has a 2xx status code
+func (o *IssueGetCommentReactionsOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this issue get comment reactions o k response has a 3xx status code
+func (o *IssueGetCommentReactionsOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue get comment reactions o k response has a 4xx status code
+func (o *IssueGetCommentReactionsOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this issue get comment reactions o k response has a 5xx status code
+func (o *IssueGetCommentReactionsOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue get comment reactions o k response a status code equal to that given
+func (o *IssueGetCommentReactionsOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the issue get comment reactions o k response
+func (o *IssueGetCommentReactionsOK) Code() int {
+	return 200
+}
+
+func (o *IssueGetCommentReactionsOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issues/comments/{id}/reactions][%d] issueGetCommentReactionsOK %s", 200, payload)
+}
+
+func (o *IssueGetCommentReactionsOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issues/comments/{id}/reactions][%d] issueGetCommentReactionsOK %s", 200, payload)
+}
+
+func (o *IssueGetCommentReactionsOK) GetPayload() []*models.Reaction {
+	return o.Payload
+}
+
+func (o *IssueGetCommentReactionsOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewIssueGetCommentReactionsForbidden creates a IssueGetCommentReactionsForbidden with default headers values
+func NewIssueGetCommentReactionsForbidden() *IssueGetCommentReactionsForbidden {
+	return &IssueGetCommentReactionsForbidden{}
+}
+
+/*
+IssueGetCommentReactionsForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type IssueGetCommentReactionsForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this issue get comment reactions forbidden response has a 2xx status code
+func (o *IssueGetCommentReactionsForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue get comment reactions forbidden response has a 3xx status code
+func (o *IssueGetCommentReactionsForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue get comment reactions forbidden response has a 4xx status code
+func (o *IssueGetCommentReactionsForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue get comment reactions forbidden response has a 5xx status code
+func (o *IssueGetCommentReactionsForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue get comment reactions forbidden response a status code equal to that given
+func (o *IssueGetCommentReactionsForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the issue get comment reactions forbidden response
+func (o *IssueGetCommentReactionsForbidden) Code() int {
+	return 403
+}
+
+func (o *IssueGetCommentReactionsForbidden) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issues/comments/{id}/reactions][%d] issueGetCommentReactionsForbidden", 403)
+}
+
+func (o *IssueGetCommentReactionsForbidden) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issues/comments/{id}/reactions][%d] issueGetCommentReactionsForbidden", 403)
+}
+
+func (o *IssueGetCommentReactionsForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewIssueGetCommentReactionsNotFound creates a IssueGetCommentReactionsNotFound with default headers values
+func NewIssueGetCommentReactionsNotFound() *IssueGetCommentReactionsNotFound {
+	return &IssueGetCommentReactionsNotFound{}
+}
+
+/*
+IssueGetCommentReactionsNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type IssueGetCommentReactionsNotFound struct {
+}
+
+// IsSuccess returns true when this issue get comment reactions not found response has a 2xx status code
+func (o *IssueGetCommentReactionsNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue get comment reactions not found response has a 3xx status code
+func (o *IssueGetCommentReactionsNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue get comment reactions not found response has a 4xx status code
+func (o *IssueGetCommentReactionsNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue get comment reactions not found response has a 5xx status code
+func (o *IssueGetCommentReactionsNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue get comment reactions not found response a status code equal to that given
+func (o *IssueGetCommentReactionsNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the issue get comment reactions not found response
+func (o *IssueGetCommentReactionsNotFound) Code() int {
+	return 404
+}
+
+func (o *IssueGetCommentReactionsNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issues/comments/{id}/reactions][%d] issueGetCommentReactionsNotFound", 404)
+}
+
+func (o *IssueGetCommentReactionsNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issues/comments/{id}/reactions][%d] issueGetCommentReactionsNotFound", 404)
+}
+
+func (o *IssueGetCommentReactionsNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_get_comment_responses.go b/bots-common/gitea-generated/client/issue/issue_get_comment_responses.go
new file mode 100644
index 0000000..83d9eb3
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_get_comment_responses.go
@@ -0,0 +1,308 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// IssueGetCommentReader is a Reader for the IssueGetComment structure.
+type IssueGetCommentReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *IssueGetCommentReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewIssueGetCommentOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 204:
+		result := NewIssueGetCommentNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 403:
+		result := NewIssueGetCommentForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewIssueGetCommentNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/issues/comments/{id}] issueGetComment", response, response.Code())
+	}
+}
+
+// NewIssueGetCommentOK creates a IssueGetCommentOK with default headers values
+func NewIssueGetCommentOK() *IssueGetCommentOK {
+	return &IssueGetCommentOK{}
+}
+
+/*
+IssueGetCommentOK describes a response with status code 200, with default header values.
+
+Comment
+*/
+type IssueGetCommentOK struct {
+	Payload *models.Comment
+}
+
+// IsSuccess returns true when this issue get comment o k response has a 2xx status code
+func (o *IssueGetCommentOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this issue get comment o k response has a 3xx status code
+func (o *IssueGetCommentOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue get comment o k response has a 4xx status code
+func (o *IssueGetCommentOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this issue get comment o k response has a 5xx status code
+func (o *IssueGetCommentOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue get comment o k response a status code equal to that given
+func (o *IssueGetCommentOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the issue get comment o k response
+func (o *IssueGetCommentOK) Code() int {
+	return 200
+}
+
+func (o *IssueGetCommentOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issues/comments/{id}][%d] issueGetCommentOK %s", 200, payload)
+}
+
+func (o *IssueGetCommentOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issues/comments/{id}][%d] issueGetCommentOK %s", 200, payload)
+}
+
+func (o *IssueGetCommentOK) GetPayload() *models.Comment {
+	return o.Payload
+}
+
+func (o *IssueGetCommentOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.Comment)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewIssueGetCommentNoContent creates a IssueGetCommentNoContent with default headers values
+func NewIssueGetCommentNoContent() *IssueGetCommentNoContent {
+	return &IssueGetCommentNoContent{}
+}
+
+/*
+IssueGetCommentNoContent describes a response with status code 204, with default header values.
+
+APIEmpty is an empty response
+*/
+type IssueGetCommentNoContent struct {
+}
+
+// IsSuccess returns true when this issue get comment no content response has a 2xx status code
+func (o *IssueGetCommentNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this issue get comment no content response has a 3xx status code
+func (o *IssueGetCommentNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue get comment no content response has a 4xx status code
+func (o *IssueGetCommentNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this issue get comment no content response has a 5xx status code
+func (o *IssueGetCommentNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue get comment no content response a status code equal to that given
+func (o *IssueGetCommentNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the issue get comment no content response
+func (o *IssueGetCommentNoContent) Code() int {
+	return 204
+}
+
+func (o *IssueGetCommentNoContent) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issues/comments/{id}][%d] issueGetCommentNoContent", 204)
+}
+
+func (o *IssueGetCommentNoContent) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issues/comments/{id}][%d] issueGetCommentNoContent", 204)
+}
+
+func (o *IssueGetCommentNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewIssueGetCommentForbidden creates a IssueGetCommentForbidden with default headers values
+func NewIssueGetCommentForbidden() *IssueGetCommentForbidden {
+	return &IssueGetCommentForbidden{}
+}
+
+/*
+IssueGetCommentForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type IssueGetCommentForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this issue get comment forbidden response has a 2xx status code
+func (o *IssueGetCommentForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue get comment forbidden response has a 3xx status code
+func (o *IssueGetCommentForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue get comment forbidden response has a 4xx status code
+func (o *IssueGetCommentForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue get comment forbidden response has a 5xx status code
+func (o *IssueGetCommentForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue get comment forbidden response a status code equal to that given
+func (o *IssueGetCommentForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the issue get comment forbidden response
+func (o *IssueGetCommentForbidden) Code() int {
+	return 403
+}
+
+func (o *IssueGetCommentForbidden) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issues/comments/{id}][%d] issueGetCommentForbidden", 403)
+}
+
+func (o *IssueGetCommentForbidden) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issues/comments/{id}][%d] issueGetCommentForbidden", 403)
+}
+
+func (o *IssueGetCommentForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewIssueGetCommentNotFound creates a IssueGetCommentNotFound with default headers values
+func NewIssueGetCommentNotFound() *IssueGetCommentNotFound {
+	return &IssueGetCommentNotFound{}
+}
+
+/*
+IssueGetCommentNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type IssueGetCommentNotFound struct {
+}
+
+// IsSuccess returns true when this issue get comment not found response has a 2xx status code
+func (o *IssueGetCommentNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue get comment not found response has a 3xx status code
+func (o *IssueGetCommentNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue get comment not found response has a 4xx status code
+func (o *IssueGetCommentNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue get comment not found response has a 5xx status code
+func (o *IssueGetCommentNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue get comment not found response a status code equal to that given
+func (o *IssueGetCommentNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the issue get comment not found response
+func (o *IssueGetCommentNotFound) Code() int {
+	return 404
+}
+
+func (o *IssueGetCommentNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issues/comments/{id}][%d] issueGetCommentNotFound", 404)
+}
+
+func (o *IssueGetCommentNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issues/comments/{id}][%d] issueGetCommentNotFound", 404)
+}
+
+func (o *IssueGetCommentNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_get_comments_and_timeline_parameters.go b/bots-common/gitea-generated/client/issue/issue_get_comments_and_timeline_parameters.go
new file mode 100644
index 0000000..e088927
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_get_comments_and_timeline_parameters.go
@@ -0,0 +1,338 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewIssueGetCommentsAndTimelineParams creates a new IssueGetCommentsAndTimelineParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewIssueGetCommentsAndTimelineParams() *IssueGetCommentsAndTimelineParams {
+	return &IssueGetCommentsAndTimelineParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewIssueGetCommentsAndTimelineParamsWithTimeout creates a new IssueGetCommentsAndTimelineParams object
+// with the ability to set a timeout on a request.
+func NewIssueGetCommentsAndTimelineParamsWithTimeout(timeout time.Duration) *IssueGetCommentsAndTimelineParams {
+	return &IssueGetCommentsAndTimelineParams{
+		timeout: timeout,
+	}
+}
+
+// NewIssueGetCommentsAndTimelineParamsWithContext creates a new IssueGetCommentsAndTimelineParams object
+// with the ability to set a context for a request.
+func NewIssueGetCommentsAndTimelineParamsWithContext(ctx context.Context) *IssueGetCommentsAndTimelineParams {
+	return &IssueGetCommentsAndTimelineParams{
+		Context: ctx,
+	}
+}
+
+// NewIssueGetCommentsAndTimelineParamsWithHTTPClient creates a new IssueGetCommentsAndTimelineParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewIssueGetCommentsAndTimelineParamsWithHTTPClient(client *http.Client) *IssueGetCommentsAndTimelineParams {
+	return &IssueGetCommentsAndTimelineParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+IssueGetCommentsAndTimelineParams contains all the parameters to send to the API endpoint
+
+	for the issue get comments and timeline operation.
+
+	Typically these are written to a http.Request.
+*/
+type IssueGetCommentsAndTimelineParams struct {
+
+	/* Before.
+
+	   if provided, only comments updated before the provided time are returned.
+
+	   Format: date-time
+	*/
+	Before *strfmt.DateTime
+
+	/* Index.
+
+	   index of the issue
+
+	   Format: int64
+	*/
+	Index int64
+
+	/* Limit.
+
+	   page size of results
+	*/
+	Limit *int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Page.
+
+	   page number of results to return (1-based)
+	*/
+	Page *int64
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	/* Since.
+
+	   if provided, only comments updated since the specified time are returned.
+
+	   Format: date-time
+	*/
+	Since *strfmt.DateTime
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the issue get comments and timeline params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueGetCommentsAndTimelineParams) WithDefaults() *IssueGetCommentsAndTimelineParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the issue get comments and timeline params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueGetCommentsAndTimelineParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the issue get comments and timeline params
+func (o *IssueGetCommentsAndTimelineParams) WithTimeout(timeout time.Duration) *IssueGetCommentsAndTimelineParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the issue get comments and timeline params
+func (o *IssueGetCommentsAndTimelineParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the issue get comments and timeline params
+func (o *IssueGetCommentsAndTimelineParams) WithContext(ctx context.Context) *IssueGetCommentsAndTimelineParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the issue get comments and timeline params
+func (o *IssueGetCommentsAndTimelineParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the issue get comments and timeline params
+func (o *IssueGetCommentsAndTimelineParams) WithHTTPClient(client *http.Client) *IssueGetCommentsAndTimelineParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the issue get comments and timeline params
+func (o *IssueGetCommentsAndTimelineParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBefore adds the before to the issue get comments and timeline params
+func (o *IssueGetCommentsAndTimelineParams) WithBefore(before *strfmt.DateTime) *IssueGetCommentsAndTimelineParams {
+	o.SetBefore(before)
+	return o
+}
+
+// SetBefore adds the before to the issue get comments and timeline params
+func (o *IssueGetCommentsAndTimelineParams) SetBefore(before *strfmt.DateTime) {
+	o.Before = before
+}
+
+// WithIndex adds the index to the issue get comments and timeline params
+func (o *IssueGetCommentsAndTimelineParams) WithIndex(index int64) *IssueGetCommentsAndTimelineParams {
+	o.SetIndex(index)
+	return o
+}
+
+// SetIndex adds the index to the issue get comments and timeline params
+func (o *IssueGetCommentsAndTimelineParams) SetIndex(index int64) {
+	o.Index = index
+}
+
+// WithLimit adds the limit to the issue get comments and timeline params
+func (o *IssueGetCommentsAndTimelineParams) WithLimit(limit *int64) *IssueGetCommentsAndTimelineParams {
+	o.SetLimit(limit)
+	return o
+}
+
+// SetLimit adds the limit to the issue get comments and timeline params
+func (o *IssueGetCommentsAndTimelineParams) SetLimit(limit *int64) {
+	o.Limit = limit
+}
+
+// WithOwner adds the owner to the issue get comments and timeline params
+func (o *IssueGetCommentsAndTimelineParams) WithOwner(owner string) *IssueGetCommentsAndTimelineParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the issue get comments and timeline params
+func (o *IssueGetCommentsAndTimelineParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithPage adds the page to the issue get comments and timeline params
+func (o *IssueGetCommentsAndTimelineParams) WithPage(page *int64) *IssueGetCommentsAndTimelineParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the issue get comments and timeline params
+func (o *IssueGetCommentsAndTimelineParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WithRepo adds the repo to the issue get comments and timeline params
+func (o *IssueGetCommentsAndTimelineParams) WithRepo(repo string) *IssueGetCommentsAndTimelineParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the issue get comments and timeline params
+func (o *IssueGetCommentsAndTimelineParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WithSince adds the since to the issue get comments and timeline params
+func (o *IssueGetCommentsAndTimelineParams) WithSince(since *strfmt.DateTime) *IssueGetCommentsAndTimelineParams {
+	o.SetSince(since)
+	return o
+}
+
+// SetSince adds the since to the issue get comments and timeline params
+func (o *IssueGetCommentsAndTimelineParams) SetSince(since *strfmt.DateTime) {
+	o.Since = since
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *IssueGetCommentsAndTimelineParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.Before != nil {
+
+		// query param before
+		var qrBefore strfmt.DateTime
+
+		if o.Before != nil {
+			qrBefore = *o.Before
+		}
+		qBefore := qrBefore.String()
+		if qBefore != "" {
+
+			if err := r.SetQueryParam("before", qBefore); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param index
+	if err := r.SetPathParam("index", swag.FormatInt64(o.Index)); err != nil {
+		return err
+	}
+
+	if o.Limit != nil {
+
+		// query param limit
+		var qrLimit int64
+
+		if o.Limit != nil {
+			qrLimit = *o.Limit
+		}
+		qLimit := swag.FormatInt64(qrLimit)
+		if qLimit != "" {
+
+			if err := r.SetQueryParam("limit", qLimit); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if o.Since != nil {
+
+		// query param since
+		var qrSince strfmt.DateTime
+
+		if o.Since != nil {
+			qrSince = *o.Since
+		}
+		qSince := qrSince.String()
+		if qSince != "" {
+
+			if err := r.SetQueryParam("since", qSince); err != nil {
+				return err
+			}
+		}
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_get_comments_and_timeline_responses.go b/bots-common/gitea-generated/client/issue/issue_get_comments_and_timeline_responses.go
new file mode 100644
index 0000000..eeec8bb
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_get_comments_and_timeline_responses.go
@@ -0,0 +1,166 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// IssueGetCommentsAndTimelineReader is a Reader for the IssueGetCommentsAndTimeline structure.
+type IssueGetCommentsAndTimelineReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *IssueGetCommentsAndTimelineReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewIssueGetCommentsAndTimelineOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewIssueGetCommentsAndTimelineNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/issues/{index}/timeline] issueGetCommentsAndTimeline", response, response.Code())
+	}
+}
+
+// NewIssueGetCommentsAndTimelineOK creates a IssueGetCommentsAndTimelineOK with default headers values
+func NewIssueGetCommentsAndTimelineOK() *IssueGetCommentsAndTimelineOK {
+	return &IssueGetCommentsAndTimelineOK{}
+}
+
+/*
+IssueGetCommentsAndTimelineOK describes a response with status code 200, with default header values.
+
+TimelineList
+*/
+type IssueGetCommentsAndTimelineOK struct {
+	Payload []*models.TimelineComment
+}
+
+// IsSuccess returns true when this issue get comments and timeline o k response has a 2xx status code
+func (o *IssueGetCommentsAndTimelineOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this issue get comments and timeline o k response has a 3xx status code
+func (o *IssueGetCommentsAndTimelineOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue get comments and timeline o k response has a 4xx status code
+func (o *IssueGetCommentsAndTimelineOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this issue get comments and timeline o k response has a 5xx status code
+func (o *IssueGetCommentsAndTimelineOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue get comments and timeline o k response a status code equal to that given
+func (o *IssueGetCommentsAndTimelineOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the issue get comments and timeline o k response
+func (o *IssueGetCommentsAndTimelineOK) Code() int {
+	return 200
+}
+
+func (o *IssueGetCommentsAndTimelineOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issues/{index}/timeline][%d] issueGetCommentsAndTimelineOK %s", 200, payload)
+}
+
+func (o *IssueGetCommentsAndTimelineOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issues/{index}/timeline][%d] issueGetCommentsAndTimelineOK %s", 200, payload)
+}
+
+func (o *IssueGetCommentsAndTimelineOK) GetPayload() []*models.TimelineComment {
+	return o.Payload
+}
+
+func (o *IssueGetCommentsAndTimelineOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewIssueGetCommentsAndTimelineNotFound creates a IssueGetCommentsAndTimelineNotFound with default headers values
+func NewIssueGetCommentsAndTimelineNotFound() *IssueGetCommentsAndTimelineNotFound {
+	return &IssueGetCommentsAndTimelineNotFound{}
+}
+
+/*
+IssueGetCommentsAndTimelineNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type IssueGetCommentsAndTimelineNotFound struct {
+}
+
+// IsSuccess returns true when this issue get comments and timeline not found response has a 2xx status code
+func (o *IssueGetCommentsAndTimelineNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue get comments and timeline not found response has a 3xx status code
+func (o *IssueGetCommentsAndTimelineNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue get comments and timeline not found response has a 4xx status code
+func (o *IssueGetCommentsAndTimelineNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue get comments and timeline not found response has a 5xx status code
+func (o *IssueGetCommentsAndTimelineNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue get comments and timeline not found response a status code equal to that given
+func (o *IssueGetCommentsAndTimelineNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the issue get comments and timeline not found response
+func (o *IssueGetCommentsAndTimelineNotFound) Code() int {
+	return 404
+}
+
+func (o *IssueGetCommentsAndTimelineNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issues/{index}/timeline][%d] issueGetCommentsAndTimelineNotFound", 404)
+}
+
+func (o *IssueGetCommentsAndTimelineNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issues/{index}/timeline][%d] issueGetCommentsAndTimelineNotFound", 404)
+}
+
+func (o *IssueGetCommentsAndTimelineNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_get_comments_parameters.go b/bots-common/gitea-generated/client/issue/issue_get_comments_parameters.go
new file mode 100644
index 0000000..dadb1f1
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_get_comments_parameters.go
@@ -0,0 +1,270 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewIssueGetCommentsParams creates a new IssueGetCommentsParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewIssueGetCommentsParams() *IssueGetCommentsParams {
+	return &IssueGetCommentsParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewIssueGetCommentsParamsWithTimeout creates a new IssueGetCommentsParams object
+// with the ability to set a timeout on a request.
+func NewIssueGetCommentsParamsWithTimeout(timeout time.Duration) *IssueGetCommentsParams {
+	return &IssueGetCommentsParams{
+		timeout: timeout,
+	}
+}
+
+// NewIssueGetCommentsParamsWithContext creates a new IssueGetCommentsParams object
+// with the ability to set a context for a request.
+func NewIssueGetCommentsParamsWithContext(ctx context.Context) *IssueGetCommentsParams {
+	return &IssueGetCommentsParams{
+		Context: ctx,
+	}
+}
+
+// NewIssueGetCommentsParamsWithHTTPClient creates a new IssueGetCommentsParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewIssueGetCommentsParamsWithHTTPClient(client *http.Client) *IssueGetCommentsParams {
+	return &IssueGetCommentsParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+IssueGetCommentsParams contains all the parameters to send to the API endpoint
+
+	for the issue get comments operation.
+
+	Typically these are written to a http.Request.
+*/
+type IssueGetCommentsParams struct {
+
+	/* Before.
+
+	   if provided, only comments updated before the provided time are returned.
+
+	   Format: date-time
+	*/
+	Before *strfmt.DateTime
+
+	/* Index.
+
+	   index of the issue
+
+	   Format: int64
+	*/
+	Index int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	/* Since.
+
+	   if provided, only comments updated since the specified time are returned.
+
+	   Format: date-time
+	*/
+	Since *strfmt.DateTime
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the issue get comments params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueGetCommentsParams) WithDefaults() *IssueGetCommentsParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the issue get comments params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueGetCommentsParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the issue get comments params
+func (o *IssueGetCommentsParams) WithTimeout(timeout time.Duration) *IssueGetCommentsParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the issue get comments params
+func (o *IssueGetCommentsParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the issue get comments params
+func (o *IssueGetCommentsParams) WithContext(ctx context.Context) *IssueGetCommentsParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the issue get comments params
+func (o *IssueGetCommentsParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the issue get comments params
+func (o *IssueGetCommentsParams) WithHTTPClient(client *http.Client) *IssueGetCommentsParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the issue get comments params
+func (o *IssueGetCommentsParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBefore adds the before to the issue get comments params
+func (o *IssueGetCommentsParams) WithBefore(before *strfmt.DateTime) *IssueGetCommentsParams {
+	o.SetBefore(before)
+	return o
+}
+
+// SetBefore adds the before to the issue get comments params
+func (o *IssueGetCommentsParams) SetBefore(before *strfmt.DateTime) {
+	o.Before = before
+}
+
+// WithIndex adds the index to the issue get comments params
+func (o *IssueGetCommentsParams) WithIndex(index int64) *IssueGetCommentsParams {
+	o.SetIndex(index)
+	return o
+}
+
+// SetIndex adds the index to the issue get comments params
+func (o *IssueGetCommentsParams) SetIndex(index int64) {
+	o.Index = index
+}
+
+// WithOwner adds the owner to the issue get comments params
+func (o *IssueGetCommentsParams) WithOwner(owner string) *IssueGetCommentsParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the issue get comments params
+func (o *IssueGetCommentsParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the issue get comments params
+func (o *IssueGetCommentsParams) WithRepo(repo string) *IssueGetCommentsParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the issue get comments params
+func (o *IssueGetCommentsParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WithSince adds the since to the issue get comments params
+func (o *IssueGetCommentsParams) WithSince(since *strfmt.DateTime) *IssueGetCommentsParams {
+	o.SetSince(since)
+	return o
+}
+
+// SetSince adds the since to the issue get comments params
+func (o *IssueGetCommentsParams) SetSince(since *strfmt.DateTime) {
+	o.Since = since
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *IssueGetCommentsParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.Before != nil {
+
+		// query param before
+		var qrBefore strfmt.DateTime
+
+		if o.Before != nil {
+			qrBefore = *o.Before
+		}
+		qBefore := qrBefore.String()
+		if qBefore != "" {
+
+			if err := r.SetQueryParam("before", qBefore); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param index
+	if err := r.SetPathParam("index", swag.FormatInt64(o.Index)); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if o.Since != nil {
+
+		// query param since
+		var qrSince strfmt.DateTime
+
+		if o.Since != nil {
+			qrSince = *o.Since
+		}
+		qSince := qrSince.String()
+		if qSince != "" {
+
+			if err := r.SetQueryParam("since", qSince); err != nil {
+				return err
+			}
+		}
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_get_comments_responses.go b/bots-common/gitea-generated/client/issue/issue_get_comments_responses.go
new file mode 100644
index 0000000..40e7d30
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_get_comments_responses.go
@@ -0,0 +1,166 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// IssueGetCommentsReader is a Reader for the IssueGetComments structure.
+type IssueGetCommentsReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *IssueGetCommentsReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewIssueGetCommentsOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewIssueGetCommentsNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/issues/{index}/comments] issueGetComments", response, response.Code())
+	}
+}
+
+// NewIssueGetCommentsOK creates a IssueGetCommentsOK with default headers values
+func NewIssueGetCommentsOK() *IssueGetCommentsOK {
+	return &IssueGetCommentsOK{}
+}
+
+/*
+IssueGetCommentsOK describes a response with status code 200, with default header values.
+
+CommentList
+*/
+type IssueGetCommentsOK struct {
+	Payload []*models.Comment
+}
+
+// IsSuccess returns true when this issue get comments o k response has a 2xx status code
+func (o *IssueGetCommentsOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this issue get comments o k response has a 3xx status code
+func (o *IssueGetCommentsOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue get comments o k response has a 4xx status code
+func (o *IssueGetCommentsOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this issue get comments o k response has a 5xx status code
+func (o *IssueGetCommentsOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue get comments o k response a status code equal to that given
+func (o *IssueGetCommentsOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the issue get comments o k response
+func (o *IssueGetCommentsOK) Code() int {
+	return 200
+}
+
+func (o *IssueGetCommentsOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issues/{index}/comments][%d] issueGetCommentsOK %s", 200, payload)
+}
+
+func (o *IssueGetCommentsOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issues/{index}/comments][%d] issueGetCommentsOK %s", 200, payload)
+}
+
+func (o *IssueGetCommentsOK) GetPayload() []*models.Comment {
+	return o.Payload
+}
+
+func (o *IssueGetCommentsOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewIssueGetCommentsNotFound creates a IssueGetCommentsNotFound with default headers values
+func NewIssueGetCommentsNotFound() *IssueGetCommentsNotFound {
+	return &IssueGetCommentsNotFound{}
+}
+
+/*
+IssueGetCommentsNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type IssueGetCommentsNotFound struct {
+}
+
+// IsSuccess returns true when this issue get comments not found response has a 2xx status code
+func (o *IssueGetCommentsNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue get comments not found response has a 3xx status code
+func (o *IssueGetCommentsNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue get comments not found response has a 4xx status code
+func (o *IssueGetCommentsNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue get comments not found response has a 5xx status code
+func (o *IssueGetCommentsNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue get comments not found response a status code equal to that given
+func (o *IssueGetCommentsNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the issue get comments not found response
+func (o *IssueGetCommentsNotFound) Code() int {
+	return 404
+}
+
+func (o *IssueGetCommentsNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issues/{index}/comments][%d] issueGetCommentsNotFound", 404)
+}
+
+func (o *IssueGetCommentsNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issues/{index}/comments][%d] issueGetCommentsNotFound", 404)
+}
+
+func (o *IssueGetCommentsNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_get_issue_attachment_parameters.go b/bots-common/gitea-generated/client/issue/issue_get_issue_attachment_parameters.go
new file mode 100644
index 0000000..b366742
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_get_issue_attachment_parameters.go
@@ -0,0 +1,222 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewIssueGetIssueAttachmentParams creates a new IssueGetIssueAttachmentParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewIssueGetIssueAttachmentParams() *IssueGetIssueAttachmentParams {
+	return &IssueGetIssueAttachmentParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewIssueGetIssueAttachmentParamsWithTimeout creates a new IssueGetIssueAttachmentParams object
+// with the ability to set a timeout on a request.
+func NewIssueGetIssueAttachmentParamsWithTimeout(timeout time.Duration) *IssueGetIssueAttachmentParams {
+	return &IssueGetIssueAttachmentParams{
+		timeout: timeout,
+	}
+}
+
+// NewIssueGetIssueAttachmentParamsWithContext creates a new IssueGetIssueAttachmentParams object
+// with the ability to set a context for a request.
+func NewIssueGetIssueAttachmentParamsWithContext(ctx context.Context) *IssueGetIssueAttachmentParams {
+	return &IssueGetIssueAttachmentParams{
+		Context: ctx,
+	}
+}
+
+// NewIssueGetIssueAttachmentParamsWithHTTPClient creates a new IssueGetIssueAttachmentParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewIssueGetIssueAttachmentParamsWithHTTPClient(client *http.Client) *IssueGetIssueAttachmentParams {
+	return &IssueGetIssueAttachmentParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+IssueGetIssueAttachmentParams contains all the parameters to send to the API endpoint
+
+	for the issue get issue attachment operation.
+
+	Typically these are written to a http.Request.
+*/
+type IssueGetIssueAttachmentParams struct {
+
+	/* AttachmentID.
+
+	   id of the attachment to get
+
+	   Format: int64
+	*/
+	AttachmentID int64
+
+	/* Index.
+
+	   index of the issue
+
+	   Format: int64
+	*/
+	Index int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the issue get issue attachment params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueGetIssueAttachmentParams) WithDefaults() *IssueGetIssueAttachmentParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the issue get issue attachment params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueGetIssueAttachmentParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the issue get issue attachment params
+func (o *IssueGetIssueAttachmentParams) WithTimeout(timeout time.Duration) *IssueGetIssueAttachmentParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the issue get issue attachment params
+func (o *IssueGetIssueAttachmentParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the issue get issue attachment params
+func (o *IssueGetIssueAttachmentParams) WithContext(ctx context.Context) *IssueGetIssueAttachmentParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the issue get issue attachment params
+func (o *IssueGetIssueAttachmentParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the issue get issue attachment params
+func (o *IssueGetIssueAttachmentParams) WithHTTPClient(client *http.Client) *IssueGetIssueAttachmentParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the issue get issue attachment params
+func (o *IssueGetIssueAttachmentParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithAttachmentID adds the attachmentID to the issue get issue attachment params
+func (o *IssueGetIssueAttachmentParams) WithAttachmentID(attachmentID int64) *IssueGetIssueAttachmentParams {
+	o.SetAttachmentID(attachmentID)
+	return o
+}
+
+// SetAttachmentID adds the attachmentId to the issue get issue attachment params
+func (o *IssueGetIssueAttachmentParams) SetAttachmentID(attachmentID int64) {
+	o.AttachmentID = attachmentID
+}
+
+// WithIndex adds the index to the issue get issue attachment params
+func (o *IssueGetIssueAttachmentParams) WithIndex(index int64) *IssueGetIssueAttachmentParams {
+	o.SetIndex(index)
+	return o
+}
+
+// SetIndex adds the index to the issue get issue attachment params
+func (o *IssueGetIssueAttachmentParams) SetIndex(index int64) {
+	o.Index = index
+}
+
+// WithOwner adds the owner to the issue get issue attachment params
+func (o *IssueGetIssueAttachmentParams) WithOwner(owner string) *IssueGetIssueAttachmentParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the issue get issue attachment params
+func (o *IssueGetIssueAttachmentParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the issue get issue attachment params
+func (o *IssueGetIssueAttachmentParams) WithRepo(repo string) *IssueGetIssueAttachmentParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the issue get issue attachment params
+func (o *IssueGetIssueAttachmentParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *IssueGetIssueAttachmentParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param attachment_id
+	if err := r.SetPathParam("attachment_id", swag.FormatInt64(o.AttachmentID)); err != nil {
+		return err
+	}
+
+	// path param index
+	if err := r.SetPathParam("index", swag.FormatInt64(o.Index)); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_get_issue_attachment_responses.go b/bots-common/gitea-generated/client/issue/issue_get_issue_attachment_responses.go
new file mode 100644
index 0000000..b8f1430
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_get_issue_attachment_responses.go
@@ -0,0 +1,184 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// IssueGetIssueAttachmentReader is a Reader for the IssueGetIssueAttachment structure.
+type IssueGetIssueAttachmentReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *IssueGetIssueAttachmentReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewIssueGetIssueAttachmentOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewIssueGetIssueAttachmentNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/issues/{index}/assets/{attachment_id}] issueGetIssueAttachment", response, response.Code())
+	}
+}
+
+// NewIssueGetIssueAttachmentOK creates a IssueGetIssueAttachmentOK with default headers values
+func NewIssueGetIssueAttachmentOK() *IssueGetIssueAttachmentOK {
+	return &IssueGetIssueAttachmentOK{}
+}
+
+/*
+IssueGetIssueAttachmentOK describes a response with status code 200, with default header values.
+
+Attachment
+*/
+type IssueGetIssueAttachmentOK struct {
+	Payload *models.Attachment
+}
+
+// IsSuccess returns true when this issue get issue attachment o k response has a 2xx status code
+func (o *IssueGetIssueAttachmentOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this issue get issue attachment o k response has a 3xx status code
+func (o *IssueGetIssueAttachmentOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue get issue attachment o k response has a 4xx status code
+func (o *IssueGetIssueAttachmentOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this issue get issue attachment o k response has a 5xx status code
+func (o *IssueGetIssueAttachmentOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue get issue attachment o k response a status code equal to that given
+func (o *IssueGetIssueAttachmentOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the issue get issue attachment o k response
+func (o *IssueGetIssueAttachmentOK) Code() int {
+	return 200
+}
+
+func (o *IssueGetIssueAttachmentOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issues/{index}/assets/{attachment_id}][%d] issueGetIssueAttachmentOK %s", 200, payload)
+}
+
+func (o *IssueGetIssueAttachmentOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issues/{index}/assets/{attachment_id}][%d] issueGetIssueAttachmentOK %s", 200, payload)
+}
+
+func (o *IssueGetIssueAttachmentOK) GetPayload() *models.Attachment {
+	return o.Payload
+}
+
+func (o *IssueGetIssueAttachmentOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.Attachment)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewIssueGetIssueAttachmentNotFound creates a IssueGetIssueAttachmentNotFound with default headers values
+func NewIssueGetIssueAttachmentNotFound() *IssueGetIssueAttachmentNotFound {
+	return &IssueGetIssueAttachmentNotFound{}
+}
+
+/*
+IssueGetIssueAttachmentNotFound describes a response with status code 404, with default header values.
+
+APIError is error format response
+*/
+type IssueGetIssueAttachmentNotFound struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this issue get issue attachment not found response has a 2xx status code
+func (o *IssueGetIssueAttachmentNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue get issue attachment not found response has a 3xx status code
+func (o *IssueGetIssueAttachmentNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue get issue attachment not found response has a 4xx status code
+func (o *IssueGetIssueAttachmentNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue get issue attachment not found response has a 5xx status code
+func (o *IssueGetIssueAttachmentNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue get issue attachment not found response a status code equal to that given
+func (o *IssueGetIssueAttachmentNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the issue get issue attachment not found response
+func (o *IssueGetIssueAttachmentNotFound) Code() int {
+	return 404
+}
+
+func (o *IssueGetIssueAttachmentNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issues/{index}/assets/{attachment_id}][%d] issueGetIssueAttachmentNotFound", 404)
+}
+
+func (o *IssueGetIssueAttachmentNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issues/{index}/assets/{attachment_id}][%d] issueGetIssueAttachmentNotFound", 404)
+}
+
+func (o *IssueGetIssueAttachmentNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_get_issue_comment_attachment_parameters.go b/bots-common/gitea-generated/client/issue/issue_get_issue_comment_attachment_parameters.go
new file mode 100644
index 0000000..0f4b2fe
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_get_issue_comment_attachment_parameters.go
@@ -0,0 +1,222 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewIssueGetIssueCommentAttachmentParams creates a new IssueGetIssueCommentAttachmentParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewIssueGetIssueCommentAttachmentParams() *IssueGetIssueCommentAttachmentParams {
+	return &IssueGetIssueCommentAttachmentParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewIssueGetIssueCommentAttachmentParamsWithTimeout creates a new IssueGetIssueCommentAttachmentParams object
+// with the ability to set a timeout on a request.
+func NewIssueGetIssueCommentAttachmentParamsWithTimeout(timeout time.Duration) *IssueGetIssueCommentAttachmentParams {
+	return &IssueGetIssueCommentAttachmentParams{
+		timeout: timeout,
+	}
+}
+
+// NewIssueGetIssueCommentAttachmentParamsWithContext creates a new IssueGetIssueCommentAttachmentParams object
+// with the ability to set a context for a request.
+func NewIssueGetIssueCommentAttachmentParamsWithContext(ctx context.Context) *IssueGetIssueCommentAttachmentParams {
+	return &IssueGetIssueCommentAttachmentParams{
+		Context: ctx,
+	}
+}
+
+// NewIssueGetIssueCommentAttachmentParamsWithHTTPClient creates a new IssueGetIssueCommentAttachmentParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewIssueGetIssueCommentAttachmentParamsWithHTTPClient(client *http.Client) *IssueGetIssueCommentAttachmentParams {
+	return &IssueGetIssueCommentAttachmentParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+IssueGetIssueCommentAttachmentParams contains all the parameters to send to the API endpoint
+
+	for the issue get issue comment attachment operation.
+
+	Typically these are written to a http.Request.
+*/
+type IssueGetIssueCommentAttachmentParams struct {
+
+	/* AttachmentID.
+
+	   id of the attachment to get
+
+	   Format: int64
+	*/
+	AttachmentID int64
+
+	/* ID.
+
+	   id of the comment
+
+	   Format: int64
+	*/
+	ID int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the issue get issue comment attachment params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueGetIssueCommentAttachmentParams) WithDefaults() *IssueGetIssueCommentAttachmentParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the issue get issue comment attachment params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueGetIssueCommentAttachmentParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the issue get issue comment attachment params
+func (o *IssueGetIssueCommentAttachmentParams) WithTimeout(timeout time.Duration) *IssueGetIssueCommentAttachmentParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the issue get issue comment attachment params
+func (o *IssueGetIssueCommentAttachmentParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the issue get issue comment attachment params
+func (o *IssueGetIssueCommentAttachmentParams) WithContext(ctx context.Context) *IssueGetIssueCommentAttachmentParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the issue get issue comment attachment params
+func (o *IssueGetIssueCommentAttachmentParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the issue get issue comment attachment params
+func (o *IssueGetIssueCommentAttachmentParams) WithHTTPClient(client *http.Client) *IssueGetIssueCommentAttachmentParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the issue get issue comment attachment params
+func (o *IssueGetIssueCommentAttachmentParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithAttachmentID adds the attachmentID to the issue get issue comment attachment params
+func (o *IssueGetIssueCommentAttachmentParams) WithAttachmentID(attachmentID int64) *IssueGetIssueCommentAttachmentParams {
+	o.SetAttachmentID(attachmentID)
+	return o
+}
+
+// SetAttachmentID adds the attachmentId to the issue get issue comment attachment params
+func (o *IssueGetIssueCommentAttachmentParams) SetAttachmentID(attachmentID int64) {
+	o.AttachmentID = attachmentID
+}
+
+// WithID adds the id to the issue get issue comment attachment params
+func (o *IssueGetIssueCommentAttachmentParams) WithID(id int64) *IssueGetIssueCommentAttachmentParams {
+	o.SetID(id)
+	return o
+}
+
+// SetID adds the id to the issue get issue comment attachment params
+func (o *IssueGetIssueCommentAttachmentParams) SetID(id int64) {
+	o.ID = id
+}
+
+// WithOwner adds the owner to the issue get issue comment attachment params
+func (o *IssueGetIssueCommentAttachmentParams) WithOwner(owner string) *IssueGetIssueCommentAttachmentParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the issue get issue comment attachment params
+func (o *IssueGetIssueCommentAttachmentParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the issue get issue comment attachment params
+func (o *IssueGetIssueCommentAttachmentParams) WithRepo(repo string) *IssueGetIssueCommentAttachmentParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the issue get issue comment attachment params
+func (o *IssueGetIssueCommentAttachmentParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *IssueGetIssueCommentAttachmentParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param attachment_id
+	if err := r.SetPathParam("attachment_id", swag.FormatInt64(o.AttachmentID)); err != nil {
+		return err
+	}
+
+	// path param id
+	if err := r.SetPathParam("id", swag.FormatInt64(o.ID)); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_get_issue_comment_attachment_responses.go b/bots-common/gitea-generated/client/issue/issue_get_issue_comment_attachment_responses.go
new file mode 100644
index 0000000..6b2df49
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_get_issue_comment_attachment_responses.go
@@ -0,0 +1,184 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// IssueGetIssueCommentAttachmentReader is a Reader for the IssueGetIssueCommentAttachment structure.
+type IssueGetIssueCommentAttachmentReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *IssueGetIssueCommentAttachmentReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewIssueGetIssueCommentAttachmentOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewIssueGetIssueCommentAttachmentNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/issues/comments/{id}/assets/{attachment_id}] issueGetIssueCommentAttachment", response, response.Code())
+	}
+}
+
+// NewIssueGetIssueCommentAttachmentOK creates a IssueGetIssueCommentAttachmentOK with default headers values
+func NewIssueGetIssueCommentAttachmentOK() *IssueGetIssueCommentAttachmentOK {
+	return &IssueGetIssueCommentAttachmentOK{}
+}
+
+/*
+IssueGetIssueCommentAttachmentOK describes a response with status code 200, with default header values.
+
+Attachment
+*/
+type IssueGetIssueCommentAttachmentOK struct {
+	Payload *models.Attachment
+}
+
+// IsSuccess returns true when this issue get issue comment attachment o k response has a 2xx status code
+func (o *IssueGetIssueCommentAttachmentOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this issue get issue comment attachment o k response has a 3xx status code
+func (o *IssueGetIssueCommentAttachmentOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue get issue comment attachment o k response has a 4xx status code
+func (o *IssueGetIssueCommentAttachmentOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this issue get issue comment attachment o k response has a 5xx status code
+func (o *IssueGetIssueCommentAttachmentOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue get issue comment attachment o k response a status code equal to that given
+func (o *IssueGetIssueCommentAttachmentOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the issue get issue comment attachment o k response
+func (o *IssueGetIssueCommentAttachmentOK) Code() int {
+	return 200
+}
+
+func (o *IssueGetIssueCommentAttachmentOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issues/comments/{id}/assets/{attachment_id}][%d] issueGetIssueCommentAttachmentOK %s", 200, payload)
+}
+
+func (o *IssueGetIssueCommentAttachmentOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issues/comments/{id}/assets/{attachment_id}][%d] issueGetIssueCommentAttachmentOK %s", 200, payload)
+}
+
+func (o *IssueGetIssueCommentAttachmentOK) GetPayload() *models.Attachment {
+	return o.Payload
+}
+
+func (o *IssueGetIssueCommentAttachmentOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.Attachment)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewIssueGetIssueCommentAttachmentNotFound creates a IssueGetIssueCommentAttachmentNotFound with default headers values
+func NewIssueGetIssueCommentAttachmentNotFound() *IssueGetIssueCommentAttachmentNotFound {
+	return &IssueGetIssueCommentAttachmentNotFound{}
+}
+
+/*
+IssueGetIssueCommentAttachmentNotFound describes a response with status code 404, with default header values.
+
+APIError is error format response
+*/
+type IssueGetIssueCommentAttachmentNotFound struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this issue get issue comment attachment not found response has a 2xx status code
+func (o *IssueGetIssueCommentAttachmentNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue get issue comment attachment not found response has a 3xx status code
+func (o *IssueGetIssueCommentAttachmentNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue get issue comment attachment not found response has a 4xx status code
+func (o *IssueGetIssueCommentAttachmentNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue get issue comment attachment not found response has a 5xx status code
+func (o *IssueGetIssueCommentAttachmentNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue get issue comment attachment not found response a status code equal to that given
+func (o *IssueGetIssueCommentAttachmentNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the issue get issue comment attachment not found response
+func (o *IssueGetIssueCommentAttachmentNotFound) Code() int {
+	return 404
+}
+
+func (o *IssueGetIssueCommentAttachmentNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issues/comments/{id}/assets/{attachment_id}][%d] issueGetIssueCommentAttachmentNotFound", 404)
+}
+
+func (o *IssueGetIssueCommentAttachmentNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issues/comments/{id}/assets/{attachment_id}][%d] issueGetIssueCommentAttachmentNotFound", 404)
+}
+
+func (o *IssueGetIssueCommentAttachmentNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_get_issue_parameters.go b/bots-common/gitea-generated/client/issue/issue_get_issue_parameters.go
new file mode 100644
index 0000000..d3676de
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_get_issue_parameters.go
@@ -0,0 +1,198 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewIssueGetIssueParams creates a new IssueGetIssueParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewIssueGetIssueParams() *IssueGetIssueParams {
+	return &IssueGetIssueParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewIssueGetIssueParamsWithTimeout creates a new IssueGetIssueParams object
+// with the ability to set a timeout on a request.
+func NewIssueGetIssueParamsWithTimeout(timeout time.Duration) *IssueGetIssueParams {
+	return &IssueGetIssueParams{
+		timeout: timeout,
+	}
+}
+
+// NewIssueGetIssueParamsWithContext creates a new IssueGetIssueParams object
+// with the ability to set a context for a request.
+func NewIssueGetIssueParamsWithContext(ctx context.Context) *IssueGetIssueParams {
+	return &IssueGetIssueParams{
+		Context: ctx,
+	}
+}
+
+// NewIssueGetIssueParamsWithHTTPClient creates a new IssueGetIssueParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewIssueGetIssueParamsWithHTTPClient(client *http.Client) *IssueGetIssueParams {
+	return &IssueGetIssueParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+IssueGetIssueParams contains all the parameters to send to the API endpoint
+
+	for the issue get issue operation.
+
+	Typically these are written to a http.Request.
+*/
+type IssueGetIssueParams struct {
+
+	/* Index.
+
+	   index of the issue to get
+
+	   Format: int64
+	*/
+	Index int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the issue get issue params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueGetIssueParams) WithDefaults() *IssueGetIssueParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the issue get issue params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueGetIssueParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the issue get issue params
+func (o *IssueGetIssueParams) WithTimeout(timeout time.Duration) *IssueGetIssueParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the issue get issue params
+func (o *IssueGetIssueParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the issue get issue params
+func (o *IssueGetIssueParams) WithContext(ctx context.Context) *IssueGetIssueParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the issue get issue params
+func (o *IssueGetIssueParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the issue get issue params
+func (o *IssueGetIssueParams) WithHTTPClient(client *http.Client) *IssueGetIssueParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the issue get issue params
+func (o *IssueGetIssueParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithIndex adds the index to the issue get issue params
+func (o *IssueGetIssueParams) WithIndex(index int64) *IssueGetIssueParams {
+	o.SetIndex(index)
+	return o
+}
+
+// SetIndex adds the index to the issue get issue params
+func (o *IssueGetIssueParams) SetIndex(index int64) {
+	o.Index = index
+}
+
+// WithOwner adds the owner to the issue get issue params
+func (o *IssueGetIssueParams) WithOwner(owner string) *IssueGetIssueParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the issue get issue params
+func (o *IssueGetIssueParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the issue get issue params
+func (o *IssueGetIssueParams) WithRepo(repo string) *IssueGetIssueParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the issue get issue params
+func (o *IssueGetIssueParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *IssueGetIssueParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param index
+	if err := r.SetPathParam("index", swag.FormatInt64(o.Index)); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_get_issue_reactions_parameters.go b/bots-common/gitea-generated/client/issue/issue_get_issue_reactions_parameters.go
new file mode 100644
index 0000000..544b292
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_get_issue_reactions_parameters.go
@@ -0,0 +1,266 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewIssueGetIssueReactionsParams creates a new IssueGetIssueReactionsParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewIssueGetIssueReactionsParams() *IssueGetIssueReactionsParams {
+	return &IssueGetIssueReactionsParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewIssueGetIssueReactionsParamsWithTimeout creates a new IssueGetIssueReactionsParams object
+// with the ability to set a timeout on a request.
+func NewIssueGetIssueReactionsParamsWithTimeout(timeout time.Duration) *IssueGetIssueReactionsParams {
+	return &IssueGetIssueReactionsParams{
+		timeout: timeout,
+	}
+}
+
+// NewIssueGetIssueReactionsParamsWithContext creates a new IssueGetIssueReactionsParams object
+// with the ability to set a context for a request.
+func NewIssueGetIssueReactionsParamsWithContext(ctx context.Context) *IssueGetIssueReactionsParams {
+	return &IssueGetIssueReactionsParams{
+		Context: ctx,
+	}
+}
+
+// NewIssueGetIssueReactionsParamsWithHTTPClient creates a new IssueGetIssueReactionsParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewIssueGetIssueReactionsParamsWithHTTPClient(client *http.Client) *IssueGetIssueReactionsParams {
+	return &IssueGetIssueReactionsParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+IssueGetIssueReactionsParams contains all the parameters to send to the API endpoint
+
+	for the issue get issue reactions operation.
+
+	Typically these are written to a http.Request.
+*/
+type IssueGetIssueReactionsParams struct {
+
+	/* Index.
+
+	   index of the issue
+
+	   Format: int64
+	*/
+	Index int64
+
+	/* Limit.
+
+	   page size of results
+	*/
+	Limit *int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Page.
+
+	   page number of results to return (1-based)
+	*/
+	Page *int64
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the issue get issue reactions params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueGetIssueReactionsParams) WithDefaults() *IssueGetIssueReactionsParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the issue get issue reactions params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueGetIssueReactionsParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the issue get issue reactions params
+func (o *IssueGetIssueReactionsParams) WithTimeout(timeout time.Duration) *IssueGetIssueReactionsParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the issue get issue reactions params
+func (o *IssueGetIssueReactionsParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the issue get issue reactions params
+func (o *IssueGetIssueReactionsParams) WithContext(ctx context.Context) *IssueGetIssueReactionsParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the issue get issue reactions params
+func (o *IssueGetIssueReactionsParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the issue get issue reactions params
+func (o *IssueGetIssueReactionsParams) WithHTTPClient(client *http.Client) *IssueGetIssueReactionsParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the issue get issue reactions params
+func (o *IssueGetIssueReactionsParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithIndex adds the index to the issue get issue reactions params
+func (o *IssueGetIssueReactionsParams) WithIndex(index int64) *IssueGetIssueReactionsParams {
+	o.SetIndex(index)
+	return o
+}
+
+// SetIndex adds the index to the issue get issue reactions params
+func (o *IssueGetIssueReactionsParams) SetIndex(index int64) {
+	o.Index = index
+}
+
+// WithLimit adds the limit to the issue get issue reactions params
+func (o *IssueGetIssueReactionsParams) WithLimit(limit *int64) *IssueGetIssueReactionsParams {
+	o.SetLimit(limit)
+	return o
+}
+
+// SetLimit adds the limit to the issue get issue reactions params
+func (o *IssueGetIssueReactionsParams) SetLimit(limit *int64) {
+	o.Limit = limit
+}
+
+// WithOwner adds the owner to the issue get issue reactions params
+func (o *IssueGetIssueReactionsParams) WithOwner(owner string) *IssueGetIssueReactionsParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the issue get issue reactions params
+func (o *IssueGetIssueReactionsParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithPage adds the page to the issue get issue reactions params
+func (o *IssueGetIssueReactionsParams) WithPage(page *int64) *IssueGetIssueReactionsParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the issue get issue reactions params
+func (o *IssueGetIssueReactionsParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WithRepo adds the repo to the issue get issue reactions params
+func (o *IssueGetIssueReactionsParams) WithRepo(repo string) *IssueGetIssueReactionsParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the issue get issue reactions params
+func (o *IssueGetIssueReactionsParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *IssueGetIssueReactionsParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param index
+	if err := r.SetPathParam("index", swag.FormatInt64(o.Index)); err != nil {
+		return err
+	}
+
+	if o.Limit != nil {
+
+		// query param limit
+		var qrLimit int64
+
+		if o.Limit != nil {
+			qrLimit = *o.Limit
+		}
+		qLimit := swag.FormatInt64(qrLimit)
+		if qLimit != "" {
+
+			if err := r.SetQueryParam("limit", qLimit); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_get_issue_reactions_responses.go b/bots-common/gitea-generated/client/issue/issue_get_issue_reactions_responses.go
new file mode 100644
index 0000000..a9b1224
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_get_issue_reactions_responses.go
@@ -0,0 +1,244 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// IssueGetIssueReactionsReader is a Reader for the IssueGetIssueReactions structure.
+type IssueGetIssueReactionsReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *IssueGetIssueReactionsReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewIssueGetIssueReactionsOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 403:
+		result := NewIssueGetIssueReactionsForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewIssueGetIssueReactionsNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/issues/{index}/reactions] issueGetIssueReactions", response, response.Code())
+	}
+}
+
+// NewIssueGetIssueReactionsOK creates a IssueGetIssueReactionsOK with default headers values
+func NewIssueGetIssueReactionsOK() *IssueGetIssueReactionsOK {
+	return &IssueGetIssueReactionsOK{}
+}
+
+/*
+IssueGetIssueReactionsOK describes a response with status code 200, with default header values.
+
+ReactionList
+*/
+type IssueGetIssueReactionsOK struct {
+	Payload []*models.Reaction
+}
+
+// IsSuccess returns true when this issue get issue reactions o k response has a 2xx status code
+func (o *IssueGetIssueReactionsOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this issue get issue reactions o k response has a 3xx status code
+func (o *IssueGetIssueReactionsOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue get issue reactions o k response has a 4xx status code
+func (o *IssueGetIssueReactionsOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this issue get issue reactions o k response has a 5xx status code
+func (o *IssueGetIssueReactionsOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue get issue reactions o k response a status code equal to that given
+func (o *IssueGetIssueReactionsOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the issue get issue reactions o k response
+func (o *IssueGetIssueReactionsOK) Code() int {
+	return 200
+}
+
+func (o *IssueGetIssueReactionsOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issues/{index}/reactions][%d] issueGetIssueReactionsOK %s", 200, payload)
+}
+
+func (o *IssueGetIssueReactionsOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issues/{index}/reactions][%d] issueGetIssueReactionsOK %s", 200, payload)
+}
+
+func (o *IssueGetIssueReactionsOK) GetPayload() []*models.Reaction {
+	return o.Payload
+}
+
+func (o *IssueGetIssueReactionsOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewIssueGetIssueReactionsForbidden creates a IssueGetIssueReactionsForbidden with default headers values
+func NewIssueGetIssueReactionsForbidden() *IssueGetIssueReactionsForbidden {
+	return &IssueGetIssueReactionsForbidden{}
+}
+
+/*
+IssueGetIssueReactionsForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type IssueGetIssueReactionsForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this issue get issue reactions forbidden response has a 2xx status code
+func (o *IssueGetIssueReactionsForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue get issue reactions forbidden response has a 3xx status code
+func (o *IssueGetIssueReactionsForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue get issue reactions forbidden response has a 4xx status code
+func (o *IssueGetIssueReactionsForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue get issue reactions forbidden response has a 5xx status code
+func (o *IssueGetIssueReactionsForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue get issue reactions forbidden response a status code equal to that given
+func (o *IssueGetIssueReactionsForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the issue get issue reactions forbidden response
+func (o *IssueGetIssueReactionsForbidden) Code() int {
+	return 403
+}
+
+func (o *IssueGetIssueReactionsForbidden) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issues/{index}/reactions][%d] issueGetIssueReactionsForbidden", 403)
+}
+
+func (o *IssueGetIssueReactionsForbidden) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issues/{index}/reactions][%d] issueGetIssueReactionsForbidden", 403)
+}
+
+func (o *IssueGetIssueReactionsForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewIssueGetIssueReactionsNotFound creates a IssueGetIssueReactionsNotFound with default headers values
+func NewIssueGetIssueReactionsNotFound() *IssueGetIssueReactionsNotFound {
+	return &IssueGetIssueReactionsNotFound{}
+}
+
+/*
+IssueGetIssueReactionsNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type IssueGetIssueReactionsNotFound struct {
+}
+
+// IsSuccess returns true when this issue get issue reactions not found response has a 2xx status code
+func (o *IssueGetIssueReactionsNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue get issue reactions not found response has a 3xx status code
+func (o *IssueGetIssueReactionsNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue get issue reactions not found response has a 4xx status code
+func (o *IssueGetIssueReactionsNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue get issue reactions not found response has a 5xx status code
+func (o *IssueGetIssueReactionsNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue get issue reactions not found response a status code equal to that given
+func (o *IssueGetIssueReactionsNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the issue get issue reactions not found response
+func (o *IssueGetIssueReactionsNotFound) Code() int {
+	return 404
+}
+
+func (o *IssueGetIssueReactionsNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issues/{index}/reactions][%d] issueGetIssueReactionsNotFound", 404)
+}
+
+func (o *IssueGetIssueReactionsNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issues/{index}/reactions][%d] issueGetIssueReactionsNotFound", 404)
+}
+
+func (o *IssueGetIssueReactionsNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_get_issue_responses.go b/bots-common/gitea-generated/client/issue/issue_get_issue_responses.go
new file mode 100644
index 0000000..0c4e413
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_get_issue_responses.go
@@ -0,0 +1,168 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// IssueGetIssueReader is a Reader for the IssueGetIssue structure.
+type IssueGetIssueReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *IssueGetIssueReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewIssueGetIssueOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewIssueGetIssueNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/issues/{index}] issueGetIssue", response, response.Code())
+	}
+}
+
+// NewIssueGetIssueOK creates a IssueGetIssueOK with default headers values
+func NewIssueGetIssueOK() *IssueGetIssueOK {
+	return &IssueGetIssueOK{}
+}
+
+/*
+IssueGetIssueOK describes a response with status code 200, with default header values.
+
+Issue
+*/
+type IssueGetIssueOK struct {
+	Payload *models.Issue
+}
+
+// IsSuccess returns true when this issue get issue o k response has a 2xx status code
+func (o *IssueGetIssueOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this issue get issue o k response has a 3xx status code
+func (o *IssueGetIssueOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue get issue o k response has a 4xx status code
+func (o *IssueGetIssueOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this issue get issue o k response has a 5xx status code
+func (o *IssueGetIssueOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue get issue o k response a status code equal to that given
+func (o *IssueGetIssueOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the issue get issue o k response
+func (o *IssueGetIssueOK) Code() int {
+	return 200
+}
+
+func (o *IssueGetIssueOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issues/{index}][%d] issueGetIssueOK %s", 200, payload)
+}
+
+func (o *IssueGetIssueOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issues/{index}][%d] issueGetIssueOK %s", 200, payload)
+}
+
+func (o *IssueGetIssueOK) GetPayload() *models.Issue {
+	return o.Payload
+}
+
+func (o *IssueGetIssueOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.Issue)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewIssueGetIssueNotFound creates a IssueGetIssueNotFound with default headers values
+func NewIssueGetIssueNotFound() *IssueGetIssueNotFound {
+	return &IssueGetIssueNotFound{}
+}
+
+/*
+IssueGetIssueNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type IssueGetIssueNotFound struct {
+}
+
+// IsSuccess returns true when this issue get issue not found response has a 2xx status code
+func (o *IssueGetIssueNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue get issue not found response has a 3xx status code
+func (o *IssueGetIssueNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue get issue not found response has a 4xx status code
+func (o *IssueGetIssueNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue get issue not found response has a 5xx status code
+func (o *IssueGetIssueNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue get issue not found response a status code equal to that given
+func (o *IssueGetIssueNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the issue get issue not found response
+func (o *IssueGetIssueNotFound) Code() int {
+	return 404
+}
+
+func (o *IssueGetIssueNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issues/{index}][%d] issueGetIssueNotFound", 404)
+}
+
+func (o *IssueGetIssueNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issues/{index}][%d] issueGetIssueNotFound", 404)
+}
+
+func (o *IssueGetIssueNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_get_label_parameters.go b/bots-common/gitea-generated/client/issue/issue_get_label_parameters.go
new file mode 100644
index 0000000..f182b90
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_get_label_parameters.go
@@ -0,0 +1,198 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewIssueGetLabelParams creates a new IssueGetLabelParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewIssueGetLabelParams() *IssueGetLabelParams {
+	return &IssueGetLabelParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewIssueGetLabelParamsWithTimeout creates a new IssueGetLabelParams object
+// with the ability to set a timeout on a request.
+func NewIssueGetLabelParamsWithTimeout(timeout time.Duration) *IssueGetLabelParams {
+	return &IssueGetLabelParams{
+		timeout: timeout,
+	}
+}
+
+// NewIssueGetLabelParamsWithContext creates a new IssueGetLabelParams object
+// with the ability to set a context for a request.
+func NewIssueGetLabelParamsWithContext(ctx context.Context) *IssueGetLabelParams {
+	return &IssueGetLabelParams{
+		Context: ctx,
+	}
+}
+
+// NewIssueGetLabelParamsWithHTTPClient creates a new IssueGetLabelParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewIssueGetLabelParamsWithHTTPClient(client *http.Client) *IssueGetLabelParams {
+	return &IssueGetLabelParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+IssueGetLabelParams contains all the parameters to send to the API endpoint
+
+	for the issue get label operation.
+
+	Typically these are written to a http.Request.
+*/
+type IssueGetLabelParams struct {
+
+	/* ID.
+
+	   id of the label to get
+
+	   Format: int64
+	*/
+	ID int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the issue get label params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueGetLabelParams) WithDefaults() *IssueGetLabelParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the issue get label params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueGetLabelParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the issue get label params
+func (o *IssueGetLabelParams) WithTimeout(timeout time.Duration) *IssueGetLabelParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the issue get label params
+func (o *IssueGetLabelParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the issue get label params
+func (o *IssueGetLabelParams) WithContext(ctx context.Context) *IssueGetLabelParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the issue get label params
+func (o *IssueGetLabelParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the issue get label params
+func (o *IssueGetLabelParams) WithHTTPClient(client *http.Client) *IssueGetLabelParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the issue get label params
+func (o *IssueGetLabelParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithID adds the id to the issue get label params
+func (o *IssueGetLabelParams) WithID(id int64) *IssueGetLabelParams {
+	o.SetID(id)
+	return o
+}
+
+// SetID adds the id to the issue get label params
+func (o *IssueGetLabelParams) SetID(id int64) {
+	o.ID = id
+}
+
+// WithOwner adds the owner to the issue get label params
+func (o *IssueGetLabelParams) WithOwner(owner string) *IssueGetLabelParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the issue get label params
+func (o *IssueGetLabelParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the issue get label params
+func (o *IssueGetLabelParams) WithRepo(repo string) *IssueGetLabelParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the issue get label params
+func (o *IssueGetLabelParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *IssueGetLabelParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param id
+	if err := r.SetPathParam("id", swag.FormatInt64(o.ID)); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_get_label_responses.go b/bots-common/gitea-generated/client/issue/issue_get_label_responses.go
new file mode 100644
index 0000000..61f28fd
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_get_label_responses.go
@@ -0,0 +1,168 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// IssueGetLabelReader is a Reader for the IssueGetLabel structure.
+type IssueGetLabelReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *IssueGetLabelReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewIssueGetLabelOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewIssueGetLabelNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/labels/{id}] issueGetLabel", response, response.Code())
+	}
+}
+
+// NewIssueGetLabelOK creates a IssueGetLabelOK with default headers values
+func NewIssueGetLabelOK() *IssueGetLabelOK {
+	return &IssueGetLabelOK{}
+}
+
+/*
+IssueGetLabelOK describes a response with status code 200, with default header values.
+
+Label
+*/
+type IssueGetLabelOK struct {
+	Payload *models.Label
+}
+
+// IsSuccess returns true when this issue get label o k response has a 2xx status code
+func (o *IssueGetLabelOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this issue get label o k response has a 3xx status code
+func (o *IssueGetLabelOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue get label o k response has a 4xx status code
+func (o *IssueGetLabelOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this issue get label o k response has a 5xx status code
+func (o *IssueGetLabelOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue get label o k response a status code equal to that given
+func (o *IssueGetLabelOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the issue get label o k response
+func (o *IssueGetLabelOK) Code() int {
+	return 200
+}
+
+func (o *IssueGetLabelOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/labels/{id}][%d] issueGetLabelOK %s", 200, payload)
+}
+
+func (o *IssueGetLabelOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/labels/{id}][%d] issueGetLabelOK %s", 200, payload)
+}
+
+func (o *IssueGetLabelOK) GetPayload() *models.Label {
+	return o.Payload
+}
+
+func (o *IssueGetLabelOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.Label)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewIssueGetLabelNotFound creates a IssueGetLabelNotFound with default headers values
+func NewIssueGetLabelNotFound() *IssueGetLabelNotFound {
+	return &IssueGetLabelNotFound{}
+}
+
+/*
+IssueGetLabelNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type IssueGetLabelNotFound struct {
+}
+
+// IsSuccess returns true when this issue get label not found response has a 2xx status code
+func (o *IssueGetLabelNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue get label not found response has a 3xx status code
+func (o *IssueGetLabelNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue get label not found response has a 4xx status code
+func (o *IssueGetLabelNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue get label not found response has a 5xx status code
+func (o *IssueGetLabelNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue get label not found response a status code equal to that given
+func (o *IssueGetLabelNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the issue get label not found response
+func (o *IssueGetLabelNotFound) Code() int {
+	return 404
+}
+
+func (o *IssueGetLabelNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/labels/{id}][%d] issueGetLabelNotFound", 404)
+}
+
+func (o *IssueGetLabelNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/labels/{id}][%d] issueGetLabelNotFound", 404)
+}
+
+func (o *IssueGetLabelNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_get_labels_parameters.go b/bots-common/gitea-generated/client/issue/issue_get_labels_parameters.go
new file mode 100644
index 0000000..f9179d9
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_get_labels_parameters.go
@@ -0,0 +1,198 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewIssueGetLabelsParams creates a new IssueGetLabelsParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewIssueGetLabelsParams() *IssueGetLabelsParams {
+	return &IssueGetLabelsParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewIssueGetLabelsParamsWithTimeout creates a new IssueGetLabelsParams object
+// with the ability to set a timeout on a request.
+func NewIssueGetLabelsParamsWithTimeout(timeout time.Duration) *IssueGetLabelsParams {
+	return &IssueGetLabelsParams{
+		timeout: timeout,
+	}
+}
+
+// NewIssueGetLabelsParamsWithContext creates a new IssueGetLabelsParams object
+// with the ability to set a context for a request.
+func NewIssueGetLabelsParamsWithContext(ctx context.Context) *IssueGetLabelsParams {
+	return &IssueGetLabelsParams{
+		Context: ctx,
+	}
+}
+
+// NewIssueGetLabelsParamsWithHTTPClient creates a new IssueGetLabelsParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewIssueGetLabelsParamsWithHTTPClient(client *http.Client) *IssueGetLabelsParams {
+	return &IssueGetLabelsParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+IssueGetLabelsParams contains all the parameters to send to the API endpoint
+
+	for the issue get labels operation.
+
+	Typically these are written to a http.Request.
+*/
+type IssueGetLabelsParams struct {
+
+	/* Index.
+
+	   index of the issue
+
+	   Format: int64
+	*/
+	Index int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the issue get labels params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueGetLabelsParams) WithDefaults() *IssueGetLabelsParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the issue get labels params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueGetLabelsParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the issue get labels params
+func (o *IssueGetLabelsParams) WithTimeout(timeout time.Duration) *IssueGetLabelsParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the issue get labels params
+func (o *IssueGetLabelsParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the issue get labels params
+func (o *IssueGetLabelsParams) WithContext(ctx context.Context) *IssueGetLabelsParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the issue get labels params
+func (o *IssueGetLabelsParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the issue get labels params
+func (o *IssueGetLabelsParams) WithHTTPClient(client *http.Client) *IssueGetLabelsParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the issue get labels params
+func (o *IssueGetLabelsParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithIndex adds the index to the issue get labels params
+func (o *IssueGetLabelsParams) WithIndex(index int64) *IssueGetLabelsParams {
+	o.SetIndex(index)
+	return o
+}
+
+// SetIndex adds the index to the issue get labels params
+func (o *IssueGetLabelsParams) SetIndex(index int64) {
+	o.Index = index
+}
+
+// WithOwner adds the owner to the issue get labels params
+func (o *IssueGetLabelsParams) WithOwner(owner string) *IssueGetLabelsParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the issue get labels params
+func (o *IssueGetLabelsParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the issue get labels params
+func (o *IssueGetLabelsParams) WithRepo(repo string) *IssueGetLabelsParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the issue get labels params
+func (o *IssueGetLabelsParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *IssueGetLabelsParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param index
+	if err := r.SetPathParam("index", swag.FormatInt64(o.Index)); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_get_labels_responses.go b/bots-common/gitea-generated/client/issue/issue_get_labels_responses.go
new file mode 100644
index 0000000..4c41992
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_get_labels_responses.go
@@ -0,0 +1,166 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// IssueGetLabelsReader is a Reader for the IssueGetLabels structure.
+type IssueGetLabelsReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *IssueGetLabelsReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewIssueGetLabelsOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewIssueGetLabelsNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/issues/{index}/labels] issueGetLabels", response, response.Code())
+	}
+}
+
+// NewIssueGetLabelsOK creates a IssueGetLabelsOK with default headers values
+func NewIssueGetLabelsOK() *IssueGetLabelsOK {
+	return &IssueGetLabelsOK{}
+}
+
+/*
+IssueGetLabelsOK describes a response with status code 200, with default header values.
+
+LabelList
+*/
+type IssueGetLabelsOK struct {
+	Payload []*models.Label
+}
+
+// IsSuccess returns true when this issue get labels o k response has a 2xx status code
+func (o *IssueGetLabelsOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this issue get labels o k response has a 3xx status code
+func (o *IssueGetLabelsOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue get labels o k response has a 4xx status code
+func (o *IssueGetLabelsOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this issue get labels o k response has a 5xx status code
+func (o *IssueGetLabelsOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue get labels o k response a status code equal to that given
+func (o *IssueGetLabelsOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the issue get labels o k response
+func (o *IssueGetLabelsOK) Code() int {
+	return 200
+}
+
+func (o *IssueGetLabelsOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issues/{index}/labels][%d] issueGetLabelsOK %s", 200, payload)
+}
+
+func (o *IssueGetLabelsOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issues/{index}/labels][%d] issueGetLabelsOK %s", 200, payload)
+}
+
+func (o *IssueGetLabelsOK) GetPayload() []*models.Label {
+	return o.Payload
+}
+
+func (o *IssueGetLabelsOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewIssueGetLabelsNotFound creates a IssueGetLabelsNotFound with default headers values
+func NewIssueGetLabelsNotFound() *IssueGetLabelsNotFound {
+	return &IssueGetLabelsNotFound{}
+}
+
+/*
+IssueGetLabelsNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type IssueGetLabelsNotFound struct {
+}
+
+// IsSuccess returns true when this issue get labels not found response has a 2xx status code
+func (o *IssueGetLabelsNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue get labels not found response has a 3xx status code
+func (o *IssueGetLabelsNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue get labels not found response has a 4xx status code
+func (o *IssueGetLabelsNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue get labels not found response has a 5xx status code
+func (o *IssueGetLabelsNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue get labels not found response a status code equal to that given
+func (o *IssueGetLabelsNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the issue get labels not found response
+func (o *IssueGetLabelsNotFound) Code() int {
+	return 404
+}
+
+func (o *IssueGetLabelsNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issues/{index}/labels][%d] issueGetLabelsNotFound", 404)
+}
+
+func (o *IssueGetLabelsNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issues/{index}/labels][%d] issueGetLabelsNotFound", 404)
+}
+
+func (o *IssueGetLabelsNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_get_milestone_parameters.go b/bots-common/gitea-generated/client/issue/issue_get_milestone_parameters.go
new file mode 100644
index 0000000..de68395
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_get_milestone_parameters.go
@@ -0,0 +1,195 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewIssueGetMilestoneParams creates a new IssueGetMilestoneParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewIssueGetMilestoneParams() *IssueGetMilestoneParams {
+	return &IssueGetMilestoneParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewIssueGetMilestoneParamsWithTimeout creates a new IssueGetMilestoneParams object
+// with the ability to set a timeout on a request.
+func NewIssueGetMilestoneParamsWithTimeout(timeout time.Duration) *IssueGetMilestoneParams {
+	return &IssueGetMilestoneParams{
+		timeout: timeout,
+	}
+}
+
+// NewIssueGetMilestoneParamsWithContext creates a new IssueGetMilestoneParams object
+// with the ability to set a context for a request.
+func NewIssueGetMilestoneParamsWithContext(ctx context.Context) *IssueGetMilestoneParams {
+	return &IssueGetMilestoneParams{
+		Context: ctx,
+	}
+}
+
+// NewIssueGetMilestoneParamsWithHTTPClient creates a new IssueGetMilestoneParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewIssueGetMilestoneParamsWithHTTPClient(client *http.Client) *IssueGetMilestoneParams {
+	return &IssueGetMilestoneParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+IssueGetMilestoneParams contains all the parameters to send to the API endpoint
+
+	for the issue get milestone operation.
+
+	Typically these are written to a http.Request.
+*/
+type IssueGetMilestoneParams struct {
+
+	/* ID.
+
+	   the milestone to get, identified by ID and if not available by name
+	*/
+	ID string
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the issue get milestone params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueGetMilestoneParams) WithDefaults() *IssueGetMilestoneParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the issue get milestone params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueGetMilestoneParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the issue get milestone params
+func (o *IssueGetMilestoneParams) WithTimeout(timeout time.Duration) *IssueGetMilestoneParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the issue get milestone params
+func (o *IssueGetMilestoneParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the issue get milestone params
+func (o *IssueGetMilestoneParams) WithContext(ctx context.Context) *IssueGetMilestoneParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the issue get milestone params
+func (o *IssueGetMilestoneParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the issue get milestone params
+func (o *IssueGetMilestoneParams) WithHTTPClient(client *http.Client) *IssueGetMilestoneParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the issue get milestone params
+func (o *IssueGetMilestoneParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithID adds the id to the issue get milestone params
+func (o *IssueGetMilestoneParams) WithID(id string) *IssueGetMilestoneParams {
+	o.SetID(id)
+	return o
+}
+
+// SetID adds the id to the issue get milestone params
+func (o *IssueGetMilestoneParams) SetID(id string) {
+	o.ID = id
+}
+
+// WithOwner adds the owner to the issue get milestone params
+func (o *IssueGetMilestoneParams) WithOwner(owner string) *IssueGetMilestoneParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the issue get milestone params
+func (o *IssueGetMilestoneParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the issue get milestone params
+func (o *IssueGetMilestoneParams) WithRepo(repo string) *IssueGetMilestoneParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the issue get milestone params
+func (o *IssueGetMilestoneParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *IssueGetMilestoneParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param id
+	if err := r.SetPathParam("id", o.ID); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_get_milestone_responses.go b/bots-common/gitea-generated/client/issue/issue_get_milestone_responses.go
new file mode 100644
index 0000000..dca20a7
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_get_milestone_responses.go
@@ -0,0 +1,168 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// IssueGetMilestoneReader is a Reader for the IssueGetMilestone structure.
+type IssueGetMilestoneReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *IssueGetMilestoneReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewIssueGetMilestoneOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewIssueGetMilestoneNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/milestones/{id}] issueGetMilestone", response, response.Code())
+	}
+}
+
+// NewIssueGetMilestoneOK creates a IssueGetMilestoneOK with default headers values
+func NewIssueGetMilestoneOK() *IssueGetMilestoneOK {
+	return &IssueGetMilestoneOK{}
+}
+
+/*
+IssueGetMilestoneOK describes a response with status code 200, with default header values.
+
+Milestone
+*/
+type IssueGetMilestoneOK struct {
+	Payload *models.Milestone
+}
+
+// IsSuccess returns true when this issue get milestone o k response has a 2xx status code
+func (o *IssueGetMilestoneOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this issue get milestone o k response has a 3xx status code
+func (o *IssueGetMilestoneOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue get milestone o k response has a 4xx status code
+func (o *IssueGetMilestoneOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this issue get milestone o k response has a 5xx status code
+func (o *IssueGetMilestoneOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue get milestone o k response a status code equal to that given
+func (o *IssueGetMilestoneOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the issue get milestone o k response
+func (o *IssueGetMilestoneOK) Code() int {
+	return 200
+}
+
+func (o *IssueGetMilestoneOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/milestones/{id}][%d] issueGetMilestoneOK %s", 200, payload)
+}
+
+func (o *IssueGetMilestoneOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/milestones/{id}][%d] issueGetMilestoneOK %s", 200, payload)
+}
+
+func (o *IssueGetMilestoneOK) GetPayload() *models.Milestone {
+	return o.Payload
+}
+
+func (o *IssueGetMilestoneOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.Milestone)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewIssueGetMilestoneNotFound creates a IssueGetMilestoneNotFound with default headers values
+func NewIssueGetMilestoneNotFound() *IssueGetMilestoneNotFound {
+	return &IssueGetMilestoneNotFound{}
+}
+
+/*
+IssueGetMilestoneNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type IssueGetMilestoneNotFound struct {
+}
+
+// IsSuccess returns true when this issue get milestone not found response has a 2xx status code
+func (o *IssueGetMilestoneNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue get milestone not found response has a 3xx status code
+func (o *IssueGetMilestoneNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue get milestone not found response has a 4xx status code
+func (o *IssueGetMilestoneNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue get milestone not found response has a 5xx status code
+func (o *IssueGetMilestoneNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue get milestone not found response a status code equal to that given
+func (o *IssueGetMilestoneNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the issue get milestone not found response
+func (o *IssueGetMilestoneNotFound) Code() int {
+	return 404
+}
+
+func (o *IssueGetMilestoneNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/milestones/{id}][%d] issueGetMilestoneNotFound", 404)
+}
+
+func (o *IssueGetMilestoneNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/milestones/{id}][%d] issueGetMilestoneNotFound", 404)
+}
+
+func (o *IssueGetMilestoneNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_get_milestones_list_parameters.go b/bots-common/gitea-generated/client/issue/issue_get_milestones_list_parameters.go
new file mode 100644
index 0000000..f6a26a3
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_get_milestones_list_parameters.go
@@ -0,0 +1,310 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewIssueGetMilestonesListParams creates a new IssueGetMilestonesListParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewIssueGetMilestonesListParams() *IssueGetMilestonesListParams {
+	return &IssueGetMilestonesListParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewIssueGetMilestonesListParamsWithTimeout creates a new IssueGetMilestonesListParams object
+// with the ability to set a timeout on a request.
+func NewIssueGetMilestonesListParamsWithTimeout(timeout time.Duration) *IssueGetMilestonesListParams {
+	return &IssueGetMilestonesListParams{
+		timeout: timeout,
+	}
+}
+
+// NewIssueGetMilestonesListParamsWithContext creates a new IssueGetMilestonesListParams object
+// with the ability to set a context for a request.
+func NewIssueGetMilestonesListParamsWithContext(ctx context.Context) *IssueGetMilestonesListParams {
+	return &IssueGetMilestonesListParams{
+		Context: ctx,
+	}
+}
+
+// NewIssueGetMilestonesListParamsWithHTTPClient creates a new IssueGetMilestonesListParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewIssueGetMilestonesListParamsWithHTTPClient(client *http.Client) *IssueGetMilestonesListParams {
+	return &IssueGetMilestonesListParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+IssueGetMilestonesListParams contains all the parameters to send to the API endpoint
+
+	for the issue get milestones list operation.
+
+	Typically these are written to a http.Request.
+*/
+type IssueGetMilestonesListParams struct {
+
+	/* Limit.
+
+	   page size of results
+	*/
+	Limit *int64
+
+	/* Name.
+
+	   filter by milestone name
+	*/
+	Name *string
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Page.
+
+	   page number of results to return (1-based)
+	*/
+	Page *int64
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	/* State.
+
+	   Milestone state, Recognized values are open, closed and all. Defaults to "open"
+	*/
+	State *string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the issue get milestones list params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueGetMilestonesListParams) WithDefaults() *IssueGetMilestonesListParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the issue get milestones list params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueGetMilestonesListParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the issue get milestones list params
+func (o *IssueGetMilestonesListParams) WithTimeout(timeout time.Duration) *IssueGetMilestonesListParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the issue get milestones list params
+func (o *IssueGetMilestonesListParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the issue get milestones list params
+func (o *IssueGetMilestonesListParams) WithContext(ctx context.Context) *IssueGetMilestonesListParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the issue get milestones list params
+func (o *IssueGetMilestonesListParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the issue get milestones list params
+func (o *IssueGetMilestonesListParams) WithHTTPClient(client *http.Client) *IssueGetMilestonesListParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the issue get milestones list params
+func (o *IssueGetMilestonesListParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithLimit adds the limit to the issue get milestones list params
+func (o *IssueGetMilestonesListParams) WithLimit(limit *int64) *IssueGetMilestonesListParams {
+	o.SetLimit(limit)
+	return o
+}
+
+// SetLimit adds the limit to the issue get milestones list params
+func (o *IssueGetMilestonesListParams) SetLimit(limit *int64) {
+	o.Limit = limit
+}
+
+// WithName adds the name to the issue get milestones list params
+func (o *IssueGetMilestonesListParams) WithName(name *string) *IssueGetMilestonesListParams {
+	o.SetName(name)
+	return o
+}
+
+// SetName adds the name to the issue get milestones list params
+func (o *IssueGetMilestonesListParams) SetName(name *string) {
+	o.Name = name
+}
+
+// WithOwner adds the owner to the issue get milestones list params
+func (o *IssueGetMilestonesListParams) WithOwner(owner string) *IssueGetMilestonesListParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the issue get milestones list params
+func (o *IssueGetMilestonesListParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithPage adds the page to the issue get milestones list params
+func (o *IssueGetMilestonesListParams) WithPage(page *int64) *IssueGetMilestonesListParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the issue get milestones list params
+func (o *IssueGetMilestonesListParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WithRepo adds the repo to the issue get milestones list params
+func (o *IssueGetMilestonesListParams) WithRepo(repo string) *IssueGetMilestonesListParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the issue get milestones list params
+func (o *IssueGetMilestonesListParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WithState adds the state to the issue get milestones list params
+func (o *IssueGetMilestonesListParams) WithState(state *string) *IssueGetMilestonesListParams {
+	o.SetState(state)
+	return o
+}
+
+// SetState adds the state to the issue get milestones list params
+func (o *IssueGetMilestonesListParams) SetState(state *string) {
+	o.State = state
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *IssueGetMilestonesListParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.Limit != nil {
+
+		// query param limit
+		var qrLimit int64
+
+		if o.Limit != nil {
+			qrLimit = *o.Limit
+		}
+		qLimit := swag.FormatInt64(qrLimit)
+		if qLimit != "" {
+
+			if err := r.SetQueryParam("limit", qLimit); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Name != nil {
+
+		// query param name
+		var qrName string
+
+		if o.Name != nil {
+			qrName = *o.Name
+		}
+		qName := qrName
+		if qName != "" {
+
+			if err := r.SetQueryParam("name", qName); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if o.State != nil {
+
+		// query param state
+		var qrState string
+
+		if o.State != nil {
+			qrState = *o.State
+		}
+		qState := qrState
+		if qState != "" {
+
+			if err := r.SetQueryParam("state", qState); err != nil {
+				return err
+			}
+		}
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_get_milestones_list_responses.go b/bots-common/gitea-generated/client/issue/issue_get_milestones_list_responses.go
new file mode 100644
index 0000000..2e05edb
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_get_milestones_list_responses.go
@@ -0,0 +1,166 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// IssueGetMilestonesListReader is a Reader for the IssueGetMilestonesList structure.
+type IssueGetMilestonesListReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *IssueGetMilestonesListReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewIssueGetMilestonesListOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewIssueGetMilestonesListNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/milestones] issueGetMilestonesList", response, response.Code())
+	}
+}
+
+// NewIssueGetMilestonesListOK creates a IssueGetMilestonesListOK with default headers values
+func NewIssueGetMilestonesListOK() *IssueGetMilestonesListOK {
+	return &IssueGetMilestonesListOK{}
+}
+
+/*
+IssueGetMilestonesListOK describes a response with status code 200, with default header values.
+
+MilestoneList
+*/
+type IssueGetMilestonesListOK struct {
+	Payload []*models.Milestone
+}
+
+// IsSuccess returns true when this issue get milestones list o k response has a 2xx status code
+func (o *IssueGetMilestonesListOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this issue get milestones list o k response has a 3xx status code
+func (o *IssueGetMilestonesListOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue get milestones list o k response has a 4xx status code
+func (o *IssueGetMilestonesListOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this issue get milestones list o k response has a 5xx status code
+func (o *IssueGetMilestonesListOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue get milestones list o k response a status code equal to that given
+func (o *IssueGetMilestonesListOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the issue get milestones list o k response
+func (o *IssueGetMilestonesListOK) Code() int {
+	return 200
+}
+
+func (o *IssueGetMilestonesListOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/milestones][%d] issueGetMilestonesListOK %s", 200, payload)
+}
+
+func (o *IssueGetMilestonesListOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/milestones][%d] issueGetMilestonesListOK %s", 200, payload)
+}
+
+func (o *IssueGetMilestonesListOK) GetPayload() []*models.Milestone {
+	return o.Payload
+}
+
+func (o *IssueGetMilestonesListOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewIssueGetMilestonesListNotFound creates a IssueGetMilestonesListNotFound with default headers values
+func NewIssueGetMilestonesListNotFound() *IssueGetMilestonesListNotFound {
+	return &IssueGetMilestonesListNotFound{}
+}
+
+/*
+IssueGetMilestonesListNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type IssueGetMilestonesListNotFound struct {
+}
+
+// IsSuccess returns true when this issue get milestones list not found response has a 2xx status code
+func (o *IssueGetMilestonesListNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue get milestones list not found response has a 3xx status code
+func (o *IssueGetMilestonesListNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue get milestones list not found response has a 4xx status code
+func (o *IssueGetMilestonesListNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue get milestones list not found response has a 5xx status code
+func (o *IssueGetMilestonesListNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue get milestones list not found response a status code equal to that given
+func (o *IssueGetMilestonesListNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the issue get milestones list not found response
+func (o *IssueGetMilestonesListNotFound) Code() int {
+	return 404
+}
+
+func (o *IssueGetMilestonesListNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/milestones][%d] issueGetMilestonesListNotFound", 404)
+}
+
+func (o *IssueGetMilestonesListNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/milestones][%d] issueGetMilestonesListNotFound", 404)
+}
+
+func (o *IssueGetMilestonesListNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_get_repo_comments_parameters.go b/bots-common/gitea-generated/client/issue/issue_get_repo_comments_parameters.go
new file mode 100644
index 0000000..c30bd26
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_get_repo_comments_parameters.go
@@ -0,0 +1,314 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewIssueGetRepoCommentsParams creates a new IssueGetRepoCommentsParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewIssueGetRepoCommentsParams() *IssueGetRepoCommentsParams {
+	return &IssueGetRepoCommentsParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewIssueGetRepoCommentsParamsWithTimeout creates a new IssueGetRepoCommentsParams object
+// with the ability to set a timeout on a request.
+func NewIssueGetRepoCommentsParamsWithTimeout(timeout time.Duration) *IssueGetRepoCommentsParams {
+	return &IssueGetRepoCommentsParams{
+		timeout: timeout,
+	}
+}
+
+// NewIssueGetRepoCommentsParamsWithContext creates a new IssueGetRepoCommentsParams object
+// with the ability to set a context for a request.
+func NewIssueGetRepoCommentsParamsWithContext(ctx context.Context) *IssueGetRepoCommentsParams {
+	return &IssueGetRepoCommentsParams{
+		Context: ctx,
+	}
+}
+
+// NewIssueGetRepoCommentsParamsWithHTTPClient creates a new IssueGetRepoCommentsParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewIssueGetRepoCommentsParamsWithHTTPClient(client *http.Client) *IssueGetRepoCommentsParams {
+	return &IssueGetRepoCommentsParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+IssueGetRepoCommentsParams contains all the parameters to send to the API endpoint
+
+	for the issue get repo comments operation.
+
+	Typically these are written to a http.Request.
+*/
+type IssueGetRepoCommentsParams struct {
+
+	/* Before.
+
+	   if provided, only comments updated before the provided time are returned.
+
+	   Format: date-time
+	*/
+	Before *strfmt.DateTime
+
+	/* Limit.
+
+	   page size of results
+	*/
+	Limit *int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Page.
+
+	   page number of results to return (1-based)
+	*/
+	Page *int64
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	/* Since.
+
+	   if provided, only comments updated since the provided time are returned.
+
+	   Format: date-time
+	*/
+	Since *strfmt.DateTime
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the issue get repo comments params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueGetRepoCommentsParams) WithDefaults() *IssueGetRepoCommentsParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the issue get repo comments params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueGetRepoCommentsParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the issue get repo comments params
+func (o *IssueGetRepoCommentsParams) WithTimeout(timeout time.Duration) *IssueGetRepoCommentsParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the issue get repo comments params
+func (o *IssueGetRepoCommentsParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the issue get repo comments params
+func (o *IssueGetRepoCommentsParams) WithContext(ctx context.Context) *IssueGetRepoCommentsParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the issue get repo comments params
+func (o *IssueGetRepoCommentsParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the issue get repo comments params
+func (o *IssueGetRepoCommentsParams) WithHTTPClient(client *http.Client) *IssueGetRepoCommentsParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the issue get repo comments params
+func (o *IssueGetRepoCommentsParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBefore adds the before to the issue get repo comments params
+func (o *IssueGetRepoCommentsParams) WithBefore(before *strfmt.DateTime) *IssueGetRepoCommentsParams {
+	o.SetBefore(before)
+	return o
+}
+
+// SetBefore adds the before to the issue get repo comments params
+func (o *IssueGetRepoCommentsParams) SetBefore(before *strfmt.DateTime) {
+	o.Before = before
+}
+
+// WithLimit adds the limit to the issue get repo comments params
+func (o *IssueGetRepoCommentsParams) WithLimit(limit *int64) *IssueGetRepoCommentsParams {
+	o.SetLimit(limit)
+	return o
+}
+
+// SetLimit adds the limit to the issue get repo comments params
+func (o *IssueGetRepoCommentsParams) SetLimit(limit *int64) {
+	o.Limit = limit
+}
+
+// WithOwner adds the owner to the issue get repo comments params
+func (o *IssueGetRepoCommentsParams) WithOwner(owner string) *IssueGetRepoCommentsParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the issue get repo comments params
+func (o *IssueGetRepoCommentsParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithPage adds the page to the issue get repo comments params
+func (o *IssueGetRepoCommentsParams) WithPage(page *int64) *IssueGetRepoCommentsParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the issue get repo comments params
+func (o *IssueGetRepoCommentsParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WithRepo adds the repo to the issue get repo comments params
+func (o *IssueGetRepoCommentsParams) WithRepo(repo string) *IssueGetRepoCommentsParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the issue get repo comments params
+func (o *IssueGetRepoCommentsParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WithSince adds the since to the issue get repo comments params
+func (o *IssueGetRepoCommentsParams) WithSince(since *strfmt.DateTime) *IssueGetRepoCommentsParams {
+	o.SetSince(since)
+	return o
+}
+
+// SetSince adds the since to the issue get repo comments params
+func (o *IssueGetRepoCommentsParams) SetSince(since *strfmt.DateTime) {
+	o.Since = since
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *IssueGetRepoCommentsParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.Before != nil {
+
+		// query param before
+		var qrBefore strfmt.DateTime
+
+		if o.Before != nil {
+			qrBefore = *o.Before
+		}
+		qBefore := qrBefore.String()
+		if qBefore != "" {
+
+			if err := r.SetQueryParam("before", qBefore); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Limit != nil {
+
+		// query param limit
+		var qrLimit int64
+
+		if o.Limit != nil {
+			qrLimit = *o.Limit
+		}
+		qLimit := swag.FormatInt64(qrLimit)
+		if qLimit != "" {
+
+			if err := r.SetQueryParam("limit", qLimit); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if o.Since != nil {
+
+		// query param since
+		var qrSince strfmt.DateTime
+
+		if o.Since != nil {
+			qrSince = *o.Since
+		}
+		qSince := qrSince.String()
+		if qSince != "" {
+
+			if err := r.SetQueryParam("since", qSince); err != nil {
+				return err
+			}
+		}
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_get_repo_comments_responses.go b/bots-common/gitea-generated/client/issue/issue_get_repo_comments_responses.go
new file mode 100644
index 0000000..6bd36a8
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_get_repo_comments_responses.go
@@ -0,0 +1,166 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// IssueGetRepoCommentsReader is a Reader for the IssueGetRepoComments structure.
+type IssueGetRepoCommentsReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *IssueGetRepoCommentsReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewIssueGetRepoCommentsOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewIssueGetRepoCommentsNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/issues/comments] issueGetRepoComments", response, response.Code())
+	}
+}
+
+// NewIssueGetRepoCommentsOK creates a IssueGetRepoCommentsOK with default headers values
+func NewIssueGetRepoCommentsOK() *IssueGetRepoCommentsOK {
+	return &IssueGetRepoCommentsOK{}
+}
+
+/*
+IssueGetRepoCommentsOK describes a response with status code 200, with default header values.
+
+CommentList
+*/
+type IssueGetRepoCommentsOK struct {
+	Payload []*models.Comment
+}
+
+// IsSuccess returns true when this issue get repo comments o k response has a 2xx status code
+func (o *IssueGetRepoCommentsOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this issue get repo comments o k response has a 3xx status code
+func (o *IssueGetRepoCommentsOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue get repo comments o k response has a 4xx status code
+func (o *IssueGetRepoCommentsOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this issue get repo comments o k response has a 5xx status code
+func (o *IssueGetRepoCommentsOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue get repo comments o k response a status code equal to that given
+func (o *IssueGetRepoCommentsOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the issue get repo comments o k response
+func (o *IssueGetRepoCommentsOK) Code() int {
+	return 200
+}
+
+func (o *IssueGetRepoCommentsOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issues/comments][%d] issueGetRepoCommentsOK %s", 200, payload)
+}
+
+func (o *IssueGetRepoCommentsOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issues/comments][%d] issueGetRepoCommentsOK %s", 200, payload)
+}
+
+func (o *IssueGetRepoCommentsOK) GetPayload() []*models.Comment {
+	return o.Payload
+}
+
+func (o *IssueGetRepoCommentsOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewIssueGetRepoCommentsNotFound creates a IssueGetRepoCommentsNotFound with default headers values
+func NewIssueGetRepoCommentsNotFound() *IssueGetRepoCommentsNotFound {
+	return &IssueGetRepoCommentsNotFound{}
+}
+
+/*
+IssueGetRepoCommentsNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type IssueGetRepoCommentsNotFound struct {
+}
+
+// IsSuccess returns true when this issue get repo comments not found response has a 2xx status code
+func (o *IssueGetRepoCommentsNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue get repo comments not found response has a 3xx status code
+func (o *IssueGetRepoCommentsNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue get repo comments not found response has a 4xx status code
+func (o *IssueGetRepoCommentsNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue get repo comments not found response has a 5xx status code
+func (o *IssueGetRepoCommentsNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue get repo comments not found response a status code equal to that given
+func (o *IssueGetRepoCommentsNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the issue get repo comments not found response
+func (o *IssueGetRepoCommentsNotFound) Code() int {
+	return 404
+}
+
+func (o *IssueGetRepoCommentsNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issues/comments][%d] issueGetRepoCommentsNotFound", 404)
+}
+
+func (o *IssueGetRepoCommentsNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issues/comments][%d] issueGetRepoCommentsNotFound", 404)
+}
+
+func (o *IssueGetRepoCommentsNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_list_blocks_parameters.go b/bots-common/gitea-generated/client/issue/issue_list_blocks_parameters.go
new file mode 100644
index 0000000..2b32848
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_list_blocks_parameters.go
@@ -0,0 +1,264 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewIssueListBlocksParams creates a new IssueListBlocksParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewIssueListBlocksParams() *IssueListBlocksParams {
+	return &IssueListBlocksParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewIssueListBlocksParamsWithTimeout creates a new IssueListBlocksParams object
+// with the ability to set a timeout on a request.
+func NewIssueListBlocksParamsWithTimeout(timeout time.Duration) *IssueListBlocksParams {
+	return &IssueListBlocksParams{
+		timeout: timeout,
+	}
+}
+
+// NewIssueListBlocksParamsWithContext creates a new IssueListBlocksParams object
+// with the ability to set a context for a request.
+func NewIssueListBlocksParamsWithContext(ctx context.Context) *IssueListBlocksParams {
+	return &IssueListBlocksParams{
+		Context: ctx,
+	}
+}
+
+// NewIssueListBlocksParamsWithHTTPClient creates a new IssueListBlocksParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewIssueListBlocksParamsWithHTTPClient(client *http.Client) *IssueListBlocksParams {
+	return &IssueListBlocksParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+IssueListBlocksParams contains all the parameters to send to the API endpoint
+
+	for the issue list blocks operation.
+
+	Typically these are written to a http.Request.
+*/
+type IssueListBlocksParams struct {
+
+	/* Index.
+
+	   index of the issue
+	*/
+	Index string
+
+	/* Limit.
+
+	   page size of results
+	*/
+	Limit *int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Page.
+
+	   page number of results to return (1-based)
+	*/
+	Page *int64
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the issue list blocks params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueListBlocksParams) WithDefaults() *IssueListBlocksParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the issue list blocks params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueListBlocksParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the issue list blocks params
+func (o *IssueListBlocksParams) WithTimeout(timeout time.Duration) *IssueListBlocksParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the issue list blocks params
+func (o *IssueListBlocksParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the issue list blocks params
+func (o *IssueListBlocksParams) WithContext(ctx context.Context) *IssueListBlocksParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the issue list blocks params
+func (o *IssueListBlocksParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the issue list blocks params
+func (o *IssueListBlocksParams) WithHTTPClient(client *http.Client) *IssueListBlocksParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the issue list blocks params
+func (o *IssueListBlocksParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithIndex adds the index to the issue list blocks params
+func (o *IssueListBlocksParams) WithIndex(index string) *IssueListBlocksParams {
+	o.SetIndex(index)
+	return o
+}
+
+// SetIndex adds the index to the issue list blocks params
+func (o *IssueListBlocksParams) SetIndex(index string) {
+	o.Index = index
+}
+
+// WithLimit adds the limit to the issue list blocks params
+func (o *IssueListBlocksParams) WithLimit(limit *int64) *IssueListBlocksParams {
+	o.SetLimit(limit)
+	return o
+}
+
+// SetLimit adds the limit to the issue list blocks params
+func (o *IssueListBlocksParams) SetLimit(limit *int64) {
+	o.Limit = limit
+}
+
+// WithOwner adds the owner to the issue list blocks params
+func (o *IssueListBlocksParams) WithOwner(owner string) *IssueListBlocksParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the issue list blocks params
+func (o *IssueListBlocksParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithPage adds the page to the issue list blocks params
+func (o *IssueListBlocksParams) WithPage(page *int64) *IssueListBlocksParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the issue list blocks params
+func (o *IssueListBlocksParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WithRepo adds the repo to the issue list blocks params
+func (o *IssueListBlocksParams) WithRepo(repo string) *IssueListBlocksParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the issue list blocks params
+func (o *IssueListBlocksParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *IssueListBlocksParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param index
+	if err := r.SetPathParam("index", o.Index); err != nil {
+		return err
+	}
+
+	if o.Limit != nil {
+
+		// query param limit
+		var qrLimit int64
+
+		if o.Limit != nil {
+			qrLimit = *o.Limit
+		}
+		qLimit := swag.FormatInt64(qrLimit)
+		if qLimit != "" {
+
+			if err := r.SetQueryParam("limit", qLimit); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_list_blocks_responses.go b/bots-common/gitea-generated/client/issue/issue_list_blocks_responses.go
new file mode 100644
index 0000000..409295e
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_list_blocks_responses.go
@@ -0,0 +1,166 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// IssueListBlocksReader is a Reader for the IssueListBlocks structure.
+type IssueListBlocksReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *IssueListBlocksReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewIssueListBlocksOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewIssueListBlocksNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/issues/{index}/blocks] issueListBlocks", response, response.Code())
+	}
+}
+
+// NewIssueListBlocksOK creates a IssueListBlocksOK with default headers values
+func NewIssueListBlocksOK() *IssueListBlocksOK {
+	return &IssueListBlocksOK{}
+}
+
+/*
+IssueListBlocksOK describes a response with status code 200, with default header values.
+
+IssueList
+*/
+type IssueListBlocksOK struct {
+	Payload []*models.Issue
+}
+
+// IsSuccess returns true when this issue list blocks o k response has a 2xx status code
+func (o *IssueListBlocksOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this issue list blocks o k response has a 3xx status code
+func (o *IssueListBlocksOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue list blocks o k response has a 4xx status code
+func (o *IssueListBlocksOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this issue list blocks o k response has a 5xx status code
+func (o *IssueListBlocksOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue list blocks o k response a status code equal to that given
+func (o *IssueListBlocksOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the issue list blocks o k response
+func (o *IssueListBlocksOK) Code() int {
+	return 200
+}
+
+func (o *IssueListBlocksOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issues/{index}/blocks][%d] issueListBlocksOK %s", 200, payload)
+}
+
+func (o *IssueListBlocksOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issues/{index}/blocks][%d] issueListBlocksOK %s", 200, payload)
+}
+
+func (o *IssueListBlocksOK) GetPayload() []*models.Issue {
+	return o.Payload
+}
+
+func (o *IssueListBlocksOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewIssueListBlocksNotFound creates a IssueListBlocksNotFound with default headers values
+func NewIssueListBlocksNotFound() *IssueListBlocksNotFound {
+	return &IssueListBlocksNotFound{}
+}
+
+/*
+IssueListBlocksNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type IssueListBlocksNotFound struct {
+}
+
+// IsSuccess returns true when this issue list blocks not found response has a 2xx status code
+func (o *IssueListBlocksNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue list blocks not found response has a 3xx status code
+func (o *IssueListBlocksNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue list blocks not found response has a 4xx status code
+func (o *IssueListBlocksNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue list blocks not found response has a 5xx status code
+func (o *IssueListBlocksNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue list blocks not found response a status code equal to that given
+func (o *IssueListBlocksNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the issue list blocks not found response
+func (o *IssueListBlocksNotFound) Code() int {
+	return 404
+}
+
+func (o *IssueListBlocksNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issues/{index}/blocks][%d] issueListBlocksNotFound", 404)
+}
+
+func (o *IssueListBlocksNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issues/{index}/blocks][%d] issueListBlocksNotFound", 404)
+}
+
+func (o *IssueListBlocksNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_list_issue_attachments_parameters.go b/bots-common/gitea-generated/client/issue/issue_list_issue_attachments_parameters.go
new file mode 100644
index 0000000..487e36d
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_list_issue_attachments_parameters.go
@@ -0,0 +1,198 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewIssueListIssueAttachmentsParams creates a new IssueListIssueAttachmentsParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewIssueListIssueAttachmentsParams() *IssueListIssueAttachmentsParams {
+	return &IssueListIssueAttachmentsParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewIssueListIssueAttachmentsParamsWithTimeout creates a new IssueListIssueAttachmentsParams object
+// with the ability to set a timeout on a request.
+func NewIssueListIssueAttachmentsParamsWithTimeout(timeout time.Duration) *IssueListIssueAttachmentsParams {
+	return &IssueListIssueAttachmentsParams{
+		timeout: timeout,
+	}
+}
+
+// NewIssueListIssueAttachmentsParamsWithContext creates a new IssueListIssueAttachmentsParams object
+// with the ability to set a context for a request.
+func NewIssueListIssueAttachmentsParamsWithContext(ctx context.Context) *IssueListIssueAttachmentsParams {
+	return &IssueListIssueAttachmentsParams{
+		Context: ctx,
+	}
+}
+
+// NewIssueListIssueAttachmentsParamsWithHTTPClient creates a new IssueListIssueAttachmentsParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewIssueListIssueAttachmentsParamsWithHTTPClient(client *http.Client) *IssueListIssueAttachmentsParams {
+	return &IssueListIssueAttachmentsParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+IssueListIssueAttachmentsParams contains all the parameters to send to the API endpoint
+
+	for the issue list issue attachments operation.
+
+	Typically these are written to a http.Request.
+*/
+type IssueListIssueAttachmentsParams struct {
+
+	/* Index.
+
+	   index of the issue
+
+	   Format: int64
+	*/
+	Index int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the issue list issue attachments params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueListIssueAttachmentsParams) WithDefaults() *IssueListIssueAttachmentsParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the issue list issue attachments params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueListIssueAttachmentsParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the issue list issue attachments params
+func (o *IssueListIssueAttachmentsParams) WithTimeout(timeout time.Duration) *IssueListIssueAttachmentsParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the issue list issue attachments params
+func (o *IssueListIssueAttachmentsParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the issue list issue attachments params
+func (o *IssueListIssueAttachmentsParams) WithContext(ctx context.Context) *IssueListIssueAttachmentsParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the issue list issue attachments params
+func (o *IssueListIssueAttachmentsParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the issue list issue attachments params
+func (o *IssueListIssueAttachmentsParams) WithHTTPClient(client *http.Client) *IssueListIssueAttachmentsParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the issue list issue attachments params
+func (o *IssueListIssueAttachmentsParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithIndex adds the index to the issue list issue attachments params
+func (o *IssueListIssueAttachmentsParams) WithIndex(index int64) *IssueListIssueAttachmentsParams {
+	o.SetIndex(index)
+	return o
+}
+
+// SetIndex adds the index to the issue list issue attachments params
+func (o *IssueListIssueAttachmentsParams) SetIndex(index int64) {
+	o.Index = index
+}
+
+// WithOwner adds the owner to the issue list issue attachments params
+func (o *IssueListIssueAttachmentsParams) WithOwner(owner string) *IssueListIssueAttachmentsParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the issue list issue attachments params
+func (o *IssueListIssueAttachmentsParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the issue list issue attachments params
+func (o *IssueListIssueAttachmentsParams) WithRepo(repo string) *IssueListIssueAttachmentsParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the issue list issue attachments params
+func (o *IssueListIssueAttachmentsParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *IssueListIssueAttachmentsParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param index
+	if err := r.SetPathParam("index", swag.FormatInt64(o.Index)); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_list_issue_attachments_responses.go b/bots-common/gitea-generated/client/issue/issue_list_issue_attachments_responses.go
new file mode 100644
index 0000000..4f24da3
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_list_issue_attachments_responses.go
@@ -0,0 +1,182 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// IssueListIssueAttachmentsReader is a Reader for the IssueListIssueAttachments structure.
+type IssueListIssueAttachmentsReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *IssueListIssueAttachmentsReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewIssueListIssueAttachmentsOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewIssueListIssueAttachmentsNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/issues/{index}/assets] issueListIssueAttachments", response, response.Code())
+	}
+}
+
+// NewIssueListIssueAttachmentsOK creates a IssueListIssueAttachmentsOK with default headers values
+func NewIssueListIssueAttachmentsOK() *IssueListIssueAttachmentsOK {
+	return &IssueListIssueAttachmentsOK{}
+}
+
+/*
+IssueListIssueAttachmentsOK describes a response with status code 200, with default header values.
+
+AttachmentList
+*/
+type IssueListIssueAttachmentsOK struct {
+	Payload []*models.Attachment
+}
+
+// IsSuccess returns true when this issue list issue attachments o k response has a 2xx status code
+func (o *IssueListIssueAttachmentsOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this issue list issue attachments o k response has a 3xx status code
+func (o *IssueListIssueAttachmentsOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue list issue attachments o k response has a 4xx status code
+func (o *IssueListIssueAttachmentsOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this issue list issue attachments o k response has a 5xx status code
+func (o *IssueListIssueAttachmentsOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue list issue attachments o k response a status code equal to that given
+func (o *IssueListIssueAttachmentsOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the issue list issue attachments o k response
+func (o *IssueListIssueAttachmentsOK) Code() int {
+	return 200
+}
+
+func (o *IssueListIssueAttachmentsOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issues/{index}/assets][%d] issueListIssueAttachmentsOK %s", 200, payload)
+}
+
+func (o *IssueListIssueAttachmentsOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issues/{index}/assets][%d] issueListIssueAttachmentsOK %s", 200, payload)
+}
+
+func (o *IssueListIssueAttachmentsOK) GetPayload() []*models.Attachment {
+	return o.Payload
+}
+
+func (o *IssueListIssueAttachmentsOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewIssueListIssueAttachmentsNotFound creates a IssueListIssueAttachmentsNotFound with default headers values
+func NewIssueListIssueAttachmentsNotFound() *IssueListIssueAttachmentsNotFound {
+	return &IssueListIssueAttachmentsNotFound{}
+}
+
+/*
+IssueListIssueAttachmentsNotFound describes a response with status code 404, with default header values.
+
+APIError is error format response
+*/
+type IssueListIssueAttachmentsNotFound struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this issue list issue attachments not found response has a 2xx status code
+func (o *IssueListIssueAttachmentsNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue list issue attachments not found response has a 3xx status code
+func (o *IssueListIssueAttachmentsNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue list issue attachments not found response has a 4xx status code
+func (o *IssueListIssueAttachmentsNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue list issue attachments not found response has a 5xx status code
+func (o *IssueListIssueAttachmentsNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue list issue attachments not found response a status code equal to that given
+func (o *IssueListIssueAttachmentsNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the issue list issue attachments not found response
+func (o *IssueListIssueAttachmentsNotFound) Code() int {
+	return 404
+}
+
+func (o *IssueListIssueAttachmentsNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issues/{index}/assets][%d] issueListIssueAttachmentsNotFound", 404)
+}
+
+func (o *IssueListIssueAttachmentsNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issues/{index}/assets][%d] issueListIssueAttachmentsNotFound", 404)
+}
+
+func (o *IssueListIssueAttachmentsNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_list_issue_comment_attachments_parameters.go b/bots-common/gitea-generated/client/issue/issue_list_issue_comment_attachments_parameters.go
new file mode 100644
index 0000000..84fea79
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_list_issue_comment_attachments_parameters.go
@@ -0,0 +1,198 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewIssueListIssueCommentAttachmentsParams creates a new IssueListIssueCommentAttachmentsParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewIssueListIssueCommentAttachmentsParams() *IssueListIssueCommentAttachmentsParams {
+	return &IssueListIssueCommentAttachmentsParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewIssueListIssueCommentAttachmentsParamsWithTimeout creates a new IssueListIssueCommentAttachmentsParams object
+// with the ability to set a timeout on a request.
+func NewIssueListIssueCommentAttachmentsParamsWithTimeout(timeout time.Duration) *IssueListIssueCommentAttachmentsParams {
+	return &IssueListIssueCommentAttachmentsParams{
+		timeout: timeout,
+	}
+}
+
+// NewIssueListIssueCommentAttachmentsParamsWithContext creates a new IssueListIssueCommentAttachmentsParams object
+// with the ability to set a context for a request.
+func NewIssueListIssueCommentAttachmentsParamsWithContext(ctx context.Context) *IssueListIssueCommentAttachmentsParams {
+	return &IssueListIssueCommentAttachmentsParams{
+		Context: ctx,
+	}
+}
+
+// NewIssueListIssueCommentAttachmentsParamsWithHTTPClient creates a new IssueListIssueCommentAttachmentsParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewIssueListIssueCommentAttachmentsParamsWithHTTPClient(client *http.Client) *IssueListIssueCommentAttachmentsParams {
+	return &IssueListIssueCommentAttachmentsParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+IssueListIssueCommentAttachmentsParams contains all the parameters to send to the API endpoint
+
+	for the issue list issue comment attachments operation.
+
+	Typically these are written to a http.Request.
+*/
+type IssueListIssueCommentAttachmentsParams struct {
+
+	/* ID.
+
+	   id of the comment
+
+	   Format: int64
+	*/
+	ID int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the issue list issue comment attachments params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueListIssueCommentAttachmentsParams) WithDefaults() *IssueListIssueCommentAttachmentsParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the issue list issue comment attachments params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueListIssueCommentAttachmentsParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the issue list issue comment attachments params
+func (o *IssueListIssueCommentAttachmentsParams) WithTimeout(timeout time.Duration) *IssueListIssueCommentAttachmentsParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the issue list issue comment attachments params
+func (o *IssueListIssueCommentAttachmentsParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the issue list issue comment attachments params
+func (o *IssueListIssueCommentAttachmentsParams) WithContext(ctx context.Context) *IssueListIssueCommentAttachmentsParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the issue list issue comment attachments params
+func (o *IssueListIssueCommentAttachmentsParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the issue list issue comment attachments params
+func (o *IssueListIssueCommentAttachmentsParams) WithHTTPClient(client *http.Client) *IssueListIssueCommentAttachmentsParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the issue list issue comment attachments params
+func (o *IssueListIssueCommentAttachmentsParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithID adds the id to the issue list issue comment attachments params
+func (o *IssueListIssueCommentAttachmentsParams) WithID(id int64) *IssueListIssueCommentAttachmentsParams {
+	o.SetID(id)
+	return o
+}
+
+// SetID adds the id to the issue list issue comment attachments params
+func (o *IssueListIssueCommentAttachmentsParams) SetID(id int64) {
+	o.ID = id
+}
+
+// WithOwner adds the owner to the issue list issue comment attachments params
+func (o *IssueListIssueCommentAttachmentsParams) WithOwner(owner string) *IssueListIssueCommentAttachmentsParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the issue list issue comment attachments params
+func (o *IssueListIssueCommentAttachmentsParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the issue list issue comment attachments params
+func (o *IssueListIssueCommentAttachmentsParams) WithRepo(repo string) *IssueListIssueCommentAttachmentsParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the issue list issue comment attachments params
+func (o *IssueListIssueCommentAttachmentsParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *IssueListIssueCommentAttachmentsParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param id
+	if err := r.SetPathParam("id", swag.FormatInt64(o.ID)); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_list_issue_comment_attachments_responses.go b/bots-common/gitea-generated/client/issue/issue_list_issue_comment_attachments_responses.go
new file mode 100644
index 0000000..2e7dc5d
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_list_issue_comment_attachments_responses.go
@@ -0,0 +1,182 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// IssueListIssueCommentAttachmentsReader is a Reader for the IssueListIssueCommentAttachments structure.
+type IssueListIssueCommentAttachmentsReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *IssueListIssueCommentAttachmentsReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewIssueListIssueCommentAttachmentsOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewIssueListIssueCommentAttachmentsNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/issues/comments/{id}/assets] issueListIssueCommentAttachments", response, response.Code())
+	}
+}
+
+// NewIssueListIssueCommentAttachmentsOK creates a IssueListIssueCommentAttachmentsOK with default headers values
+func NewIssueListIssueCommentAttachmentsOK() *IssueListIssueCommentAttachmentsOK {
+	return &IssueListIssueCommentAttachmentsOK{}
+}
+
+/*
+IssueListIssueCommentAttachmentsOK describes a response with status code 200, with default header values.
+
+AttachmentList
+*/
+type IssueListIssueCommentAttachmentsOK struct {
+	Payload []*models.Attachment
+}
+
+// IsSuccess returns true when this issue list issue comment attachments o k response has a 2xx status code
+func (o *IssueListIssueCommentAttachmentsOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this issue list issue comment attachments o k response has a 3xx status code
+func (o *IssueListIssueCommentAttachmentsOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue list issue comment attachments o k response has a 4xx status code
+func (o *IssueListIssueCommentAttachmentsOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this issue list issue comment attachments o k response has a 5xx status code
+func (o *IssueListIssueCommentAttachmentsOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue list issue comment attachments o k response a status code equal to that given
+func (o *IssueListIssueCommentAttachmentsOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the issue list issue comment attachments o k response
+func (o *IssueListIssueCommentAttachmentsOK) Code() int {
+	return 200
+}
+
+func (o *IssueListIssueCommentAttachmentsOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issues/comments/{id}/assets][%d] issueListIssueCommentAttachmentsOK %s", 200, payload)
+}
+
+func (o *IssueListIssueCommentAttachmentsOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issues/comments/{id}/assets][%d] issueListIssueCommentAttachmentsOK %s", 200, payload)
+}
+
+func (o *IssueListIssueCommentAttachmentsOK) GetPayload() []*models.Attachment {
+	return o.Payload
+}
+
+func (o *IssueListIssueCommentAttachmentsOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewIssueListIssueCommentAttachmentsNotFound creates a IssueListIssueCommentAttachmentsNotFound with default headers values
+func NewIssueListIssueCommentAttachmentsNotFound() *IssueListIssueCommentAttachmentsNotFound {
+	return &IssueListIssueCommentAttachmentsNotFound{}
+}
+
+/*
+IssueListIssueCommentAttachmentsNotFound describes a response with status code 404, with default header values.
+
+APIError is error format response
+*/
+type IssueListIssueCommentAttachmentsNotFound struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this issue list issue comment attachments not found response has a 2xx status code
+func (o *IssueListIssueCommentAttachmentsNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue list issue comment attachments not found response has a 3xx status code
+func (o *IssueListIssueCommentAttachmentsNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue list issue comment attachments not found response has a 4xx status code
+func (o *IssueListIssueCommentAttachmentsNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue list issue comment attachments not found response has a 5xx status code
+func (o *IssueListIssueCommentAttachmentsNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue list issue comment attachments not found response a status code equal to that given
+func (o *IssueListIssueCommentAttachmentsNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the issue list issue comment attachments not found response
+func (o *IssueListIssueCommentAttachmentsNotFound) Code() int {
+	return 404
+}
+
+func (o *IssueListIssueCommentAttachmentsNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issues/comments/{id}/assets][%d] issueListIssueCommentAttachmentsNotFound", 404)
+}
+
+func (o *IssueListIssueCommentAttachmentsNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issues/comments/{id}/assets][%d] issueListIssueCommentAttachmentsNotFound", 404)
+}
+
+func (o *IssueListIssueCommentAttachmentsNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_list_issue_dependencies_parameters.go b/bots-common/gitea-generated/client/issue/issue_list_issue_dependencies_parameters.go
new file mode 100644
index 0000000..ca87fba
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_list_issue_dependencies_parameters.go
@@ -0,0 +1,264 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewIssueListIssueDependenciesParams creates a new IssueListIssueDependenciesParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewIssueListIssueDependenciesParams() *IssueListIssueDependenciesParams {
+	return &IssueListIssueDependenciesParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewIssueListIssueDependenciesParamsWithTimeout creates a new IssueListIssueDependenciesParams object
+// with the ability to set a timeout on a request.
+func NewIssueListIssueDependenciesParamsWithTimeout(timeout time.Duration) *IssueListIssueDependenciesParams {
+	return &IssueListIssueDependenciesParams{
+		timeout: timeout,
+	}
+}
+
+// NewIssueListIssueDependenciesParamsWithContext creates a new IssueListIssueDependenciesParams object
+// with the ability to set a context for a request.
+func NewIssueListIssueDependenciesParamsWithContext(ctx context.Context) *IssueListIssueDependenciesParams {
+	return &IssueListIssueDependenciesParams{
+		Context: ctx,
+	}
+}
+
+// NewIssueListIssueDependenciesParamsWithHTTPClient creates a new IssueListIssueDependenciesParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewIssueListIssueDependenciesParamsWithHTTPClient(client *http.Client) *IssueListIssueDependenciesParams {
+	return &IssueListIssueDependenciesParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+IssueListIssueDependenciesParams contains all the parameters to send to the API endpoint
+
+	for the issue list issue dependencies operation.
+
+	Typically these are written to a http.Request.
+*/
+type IssueListIssueDependenciesParams struct {
+
+	/* Index.
+
+	   index of the issue
+	*/
+	Index string
+
+	/* Limit.
+
+	   page size of results
+	*/
+	Limit *int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Page.
+
+	   page number of results to return (1-based)
+	*/
+	Page *int64
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the issue list issue dependencies params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueListIssueDependenciesParams) WithDefaults() *IssueListIssueDependenciesParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the issue list issue dependencies params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueListIssueDependenciesParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the issue list issue dependencies params
+func (o *IssueListIssueDependenciesParams) WithTimeout(timeout time.Duration) *IssueListIssueDependenciesParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the issue list issue dependencies params
+func (o *IssueListIssueDependenciesParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the issue list issue dependencies params
+func (o *IssueListIssueDependenciesParams) WithContext(ctx context.Context) *IssueListIssueDependenciesParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the issue list issue dependencies params
+func (o *IssueListIssueDependenciesParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the issue list issue dependencies params
+func (o *IssueListIssueDependenciesParams) WithHTTPClient(client *http.Client) *IssueListIssueDependenciesParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the issue list issue dependencies params
+func (o *IssueListIssueDependenciesParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithIndex adds the index to the issue list issue dependencies params
+func (o *IssueListIssueDependenciesParams) WithIndex(index string) *IssueListIssueDependenciesParams {
+	o.SetIndex(index)
+	return o
+}
+
+// SetIndex adds the index to the issue list issue dependencies params
+func (o *IssueListIssueDependenciesParams) SetIndex(index string) {
+	o.Index = index
+}
+
+// WithLimit adds the limit to the issue list issue dependencies params
+func (o *IssueListIssueDependenciesParams) WithLimit(limit *int64) *IssueListIssueDependenciesParams {
+	o.SetLimit(limit)
+	return o
+}
+
+// SetLimit adds the limit to the issue list issue dependencies params
+func (o *IssueListIssueDependenciesParams) SetLimit(limit *int64) {
+	o.Limit = limit
+}
+
+// WithOwner adds the owner to the issue list issue dependencies params
+func (o *IssueListIssueDependenciesParams) WithOwner(owner string) *IssueListIssueDependenciesParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the issue list issue dependencies params
+func (o *IssueListIssueDependenciesParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithPage adds the page to the issue list issue dependencies params
+func (o *IssueListIssueDependenciesParams) WithPage(page *int64) *IssueListIssueDependenciesParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the issue list issue dependencies params
+func (o *IssueListIssueDependenciesParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WithRepo adds the repo to the issue list issue dependencies params
+func (o *IssueListIssueDependenciesParams) WithRepo(repo string) *IssueListIssueDependenciesParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the issue list issue dependencies params
+func (o *IssueListIssueDependenciesParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *IssueListIssueDependenciesParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param index
+	if err := r.SetPathParam("index", o.Index); err != nil {
+		return err
+	}
+
+	if o.Limit != nil {
+
+		// query param limit
+		var qrLimit int64
+
+		if o.Limit != nil {
+			qrLimit = *o.Limit
+		}
+		qLimit := swag.FormatInt64(qrLimit)
+		if qLimit != "" {
+
+			if err := r.SetQueryParam("limit", qLimit); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_list_issue_dependencies_responses.go b/bots-common/gitea-generated/client/issue/issue_list_issue_dependencies_responses.go
new file mode 100644
index 0000000..5d43488
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_list_issue_dependencies_responses.go
@@ -0,0 +1,166 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// IssueListIssueDependenciesReader is a Reader for the IssueListIssueDependencies structure.
+type IssueListIssueDependenciesReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *IssueListIssueDependenciesReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewIssueListIssueDependenciesOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewIssueListIssueDependenciesNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/issues/{index}/dependencies] issueListIssueDependencies", response, response.Code())
+	}
+}
+
+// NewIssueListIssueDependenciesOK creates a IssueListIssueDependenciesOK with default headers values
+func NewIssueListIssueDependenciesOK() *IssueListIssueDependenciesOK {
+	return &IssueListIssueDependenciesOK{}
+}
+
+/*
+IssueListIssueDependenciesOK describes a response with status code 200, with default header values.
+
+IssueList
+*/
+type IssueListIssueDependenciesOK struct {
+	Payload []*models.Issue
+}
+
+// IsSuccess returns true when this issue list issue dependencies o k response has a 2xx status code
+func (o *IssueListIssueDependenciesOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this issue list issue dependencies o k response has a 3xx status code
+func (o *IssueListIssueDependenciesOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue list issue dependencies o k response has a 4xx status code
+func (o *IssueListIssueDependenciesOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this issue list issue dependencies o k response has a 5xx status code
+func (o *IssueListIssueDependenciesOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue list issue dependencies o k response a status code equal to that given
+func (o *IssueListIssueDependenciesOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the issue list issue dependencies o k response
+func (o *IssueListIssueDependenciesOK) Code() int {
+	return 200
+}
+
+func (o *IssueListIssueDependenciesOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issues/{index}/dependencies][%d] issueListIssueDependenciesOK %s", 200, payload)
+}
+
+func (o *IssueListIssueDependenciesOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issues/{index}/dependencies][%d] issueListIssueDependenciesOK %s", 200, payload)
+}
+
+func (o *IssueListIssueDependenciesOK) GetPayload() []*models.Issue {
+	return o.Payload
+}
+
+func (o *IssueListIssueDependenciesOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewIssueListIssueDependenciesNotFound creates a IssueListIssueDependenciesNotFound with default headers values
+func NewIssueListIssueDependenciesNotFound() *IssueListIssueDependenciesNotFound {
+	return &IssueListIssueDependenciesNotFound{}
+}
+
+/*
+IssueListIssueDependenciesNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type IssueListIssueDependenciesNotFound struct {
+}
+
+// IsSuccess returns true when this issue list issue dependencies not found response has a 2xx status code
+func (o *IssueListIssueDependenciesNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue list issue dependencies not found response has a 3xx status code
+func (o *IssueListIssueDependenciesNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue list issue dependencies not found response has a 4xx status code
+func (o *IssueListIssueDependenciesNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue list issue dependencies not found response has a 5xx status code
+func (o *IssueListIssueDependenciesNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue list issue dependencies not found response a status code equal to that given
+func (o *IssueListIssueDependenciesNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the issue list issue dependencies not found response
+func (o *IssueListIssueDependenciesNotFound) Code() int {
+	return 404
+}
+
+func (o *IssueListIssueDependenciesNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issues/{index}/dependencies][%d] issueListIssueDependenciesNotFound", 404)
+}
+
+func (o *IssueListIssueDependenciesNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issues/{index}/dependencies][%d] issueListIssueDependenciesNotFound", 404)
+}
+
+func (o *IssueListIssueDependenciesNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_list_issues_parameters.go b/bots-common/gitea-generated/client/issue/issue_list_issues_parameters.go
new file mode 100644
index 0000000..ab3cba8
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_list_issues_parameters.go
@@ -0,0 +1,586 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewIssueListIssuesParams creates a new IssueListIssuesParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewIssueListIssuesParams() *IssueListIssuesParams {
+	return &IssueListIssuesParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewIssueListIssuesParamsWithTimeout creates a new IssueListIssuesParams object
+// with the ability to set a timeout on a request.
+func NewIssueListIssuesParamsWithTimeout(timeout time.Duration) *IssueListIssuesParams {
+	return &IssueListIssuesParams{
+		timeout: timeout,
+	}
+}
+
+// NewIssueListIssuesParamsWithContext creates a new IssueListIssuesParams object
+// with the ability to set a context for a request.
+func NewIssueListIssuesParamsWithContext(ctx context.Context) *IssueListIssuesParams {
+	return &IssueListIssuesParams{
+		Context: ctx,
+	}
+}
+
+// NewIssueListIssuesParamsWithHTTPClient creates a new IssueListIssuesParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewIssueListIssuesParamsWithHTTPClient(client *http.Client) *IssueListIssuesParams {
+	return &IssueListIssuesParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+IssueListIssuesParams contains all the parameters to send to the API endpoint
+
+	for the issue list issues operation.
+
+	Typically these are written to a http.Request.
+*/
+type IssueListIssuesParams struct {
+
+	/* AssignedBy.
+
+	   Only show items for which the given user is assigned
+	*/
+	AssignedBy *string
+
+	/* Before.
+
+	   Only show items updated before the given time. This is a timestamp in RFC 3339 format
+
+	   Format: date-time
+	*/
+	Before *strfmt.DateTime
+
+	/* CreatedBy.
+
+	   Only show items which were created by the given user
+	*/
+	CreatedBy *string
+
+	/* Labels.
+
+	   comma separated list of labels. Fetch only issues that have any of this labels. Non existent labels are discarded
+	*/
+	Labels *string
+
+	/* Limit.
+
+	   page size of results
+	*/
+	Limit *int64
+
+	/* MentionedBy.
+
+	   Only show items in which the given user was mentioned
+	*/
+	MentionedBy *string
+
+	/* Milestones.
+
+	   comma separated list of milestone names or ids. It uses names and fall back to ids. Fetch only issues that have any of this milestones. Non existent milestones are discarded
+	*/
+	Milestones *string
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Page.
+
+	   page number of results to return (1-based)
+	*/
+	Page *int64
+
+	/* Q.
+
+	   search string
+	*/
+	Q *string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	/* Since.
+
+	   Only show items updated after the given time. This is a timestamp in RFC 3339 format
+
+	   Format: date-time
+	*/
+	Since *strfmt.DateTime
+
+	/* State.
+
+	   whether issue is open or closed
+	*/
+	State *string
+
+	/* Type.
+
+	   filter by type (issues / pulls) if set
+	*/
+	Type *string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the issue list issues params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueListIssuesParams) WithDefaults() *IssueListIssuesParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the issue list issues params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueListIssuesParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the issue list issues params
+func (o *IssueListIssuesParams) WithTimeout(timeout time.Duration) *IssueListIssuesParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the issue list issues params
+func (o *IssueListIssuesParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the issue list issues params
+func (o *IssueListIssuesParams) WithContext(ctx context.Context) *IssueListIssuesParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the issue list issues params
+func (o *IssueListIssuesParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the issue list issues params
+func (o *IssueListIssuesParams) WithHTTPClient(client *http.Client) *IssueListIssuesParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the issue list issues params
+func (o *IssueListIssuesParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithAssignedBy adds the assignedBy to the issue list issues params
+func (o *IssueListIssuesParams) WithAssignedBy(assignedBy *string) *IssueListIssuesParams {
+	o.SetAssignedBy(assignedBy)
+	return o
+}
+
+// SetAssignedBy adds the assignedBy to the issue list issues params
+func (o *IssueListIssuesParams) SetAssignedBy(assignedBy *string) {
+	o.AssignedBy = assignedBy
+}
+
+// WithBefore adds the before to the issue list issues params
+func (o *IssueListIssuesParams) WithBefore(before *strfmt.DateTime) *IssueListIssuesParams {
+	o.SetBefore(before)
+	return o
+}
+
+// SetBefore adds the before to the issue list issues params
+func (o *IssueListIssuesParams) SetBefore(before *strfmt.DateTime) {
+	o.Before = before
+}
+
+// WithCreatedBy adds the createdBy to the issue list issues params
+func (o *IssueListIssuesParams) WithCreatedBy(createdBy *string) *IssueListIssuesParams {
+	o.SetCreatedBy(createdBy)
+	return o
+}
+
+// SetCreatedBy adds the createdBy to the issue list issues params
+func (o *IssueListIssuesParams) SetCreatedBy(createdBy *string) {
+	o.CreatedBy = createdBy
+}
+
+// WithLabels adds the labels to the issue list issues params
+func (o *IssueListIssuesParams) WithLabels(labels *string) *IssueListIssuesParams {
+	o.SetLabels(labels)
+	return o
+}
+
+// SetLabels adds the labels to the issue list issues params
+func (o *IssueListIssuesParams) SetLabels(labels *string) {
+	o.Labels = labels
+}
+
+// WithLimit adds the limit to the issue list issues params
+func (o *IssueListIssuesParams) WithLimit(limit *int64) *IssueListIssuesParams {
+	o.SetLimit(limit)
+	return o
+}
+
+// SetLimit adds the limit to the issue list issues params
+func (o *IssueListIssuesParams) SetLimit(limit *int64) {
+	o.Limit = limit
+}
+
+// WithMentionedBy adds the mentionedBy to the issue list issues params
+func (o *IssueListIssuesParams) WithMentionedBy(mentionedBy *string) *IssueListIssuesParams {
+	o.SetMentionedBy(mentionedBy)
+	return o
+}
+
+// SetMentionedBy adds the mentionedBy to the issue list issues params
+func (o *IssueListIssuesParams) SetMentionedBy(mentionedBy *string) {
+	o.MentionedBy = mentionedBy
+}
+
+// WithMilestones adds the milestones to the issue list issues params
+func (o *IssueListIssuesParams) WithMilestones(milestones *string) *IssueListIssuesParams {
+	o.SetMilestones(milestones)
+	return o
+}
+
+// SetMilestones adds the milestones to the issue list issues params
+func (o *IssueListIssuesParams) SetMilestones(milestones *string) {
+	o.Milestones = milestones
+}
+
+// WithOwner adds the owner to the issue list issues params
+func (o *IssueListIssuesParams) WithOwner(owner string) *IssueListIssuesParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the issue list issues params
+func (o *IssueListIssuesParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithPage adds the page to the issue list issues params
+func (o *IssueListIssuesParams) WithPage(page *int64) *IssueListIssuesParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the issue list issues params
+func (o *IssueListIssuesParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WithQ adds the q to the issue list issues params
+func (o *IssueListIssuesParams) WithQ(q *string) *IssueListIssuesParams {
+	o.SetQ(q)
+	return o
+}
+
+// SetQ adds the q to the issue list issues params
+func (o *IssueListIssuesParams) SetQ(q *string) {
+	o.Q = q
+}
+
+// WithRepo adds the repo to the issue list issues params
+func (o *IssueListIssuesParams) WithRepo(repo string) *IssueListIssuesParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the issue list issues params
+func (o *IssueListIssuesParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WithSince adds the since to the issue list issues params
+func (o *IssueListIssuesParams) WithSince(since *strfmt.DateTime) *IssueListIssuesParams {
+	o.SetSince(since)
+	return o
+}
+
+// SetSince adds the since to the issue list issues params
+func (o *IssueListIssuesParams) SetSince(since *strfmt.DateTime) {
+	o.Since = since
+}
+
+// WithState adds the state to the issue list issues params
+func (o *IssueListIssuesParams) WithState(state *string) *IssueListIssuesParams {
+	o.SetState(state)
+	return o
+}
+
+// SetState adds the state to the issue list issues params
+func (o *IssueListIssuesParams) SetState(state *string) {
+	o.State = state
+}
+
+// WithType adds the typeVar to the issue list issues params
+func (o *IssueListIssuesParams) WithType(typeVar *string) *IssueListIssuesParams {
+	o.SetType(typeVar)
+	return o
+}
+
+// SetType adds the type to the issue list issues params
+func (o *IssueListIssuesParams) SetType(typeVar *string) {
+	o.Type = typeVar
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *IssueListIssuesParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.AssignedBy != nil {
+
+		// query param assigned_by
+		var qrAssignedBy string
+
+		if o.AssignedBy != nil {
+			qrAssignedBy = *o.AssignedBy
+		}
+		qAssignedBy := qrAssignedBy
+		if qAssignedBy != "" {
+
+			if err := r.SetQueryParam("assigned_by", qAssignedBy); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Before != nil {
+
+		// query param before
+		var qrBefore strfmt.DateTime
+
+		if o.Before != nil {
+			qrBefore = *o.Before
+		}
+		qBefore := qrBefore.String()
+		if qBefore != "" {
+
+			if err := r.SetQueryParam("before", qBefore); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.CreatedBy != nil {
+
+		// query param created_by
+		var qrCreatedBy string
+
+		if o.CreatedBy != nil {
+			qrCreatedBy = *o.CreatedBy
+		}
+		qCreatedBy := qrCreatedBy
+		if qCreatedBy != "" {
+
+			if err := r.SetQueryParam("created_by", qCreatedBy); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Labels != nil {
+
+		// query param labels
+		var qrLabels string
+
+		if o.Labels != nil {
+			qrLabels = *o.Labels
+		}
+		qLabels := qrLabels
+		if qLabels != "" {
+
+			if err := r.SetQueryParam("labels", qLabels); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Limit != nil {
+
+		// query param limit
+		var qrLimit int64
+
+		if o.Limit != nil {
+			qrLimit = *o.Limit
+		}
+		qLimit := swag.FormatInt64(qrLimit)
+		if qLimit != "" {
+
+			if err := r.SetQueryParam("limit", qLimit); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.MentionedBy != nil {
+
+		// query param mentioned_by
+		var qrMentionedBy string
+
+		if o.MentionedBy != nil {
+			qrMentionedBy = *o.MentionedBy
+		}
+		qMentionedBy := qrMentionedBy
+		if qMentionedBy != "" {
+
+			if err := r.SetQueryParam("mentioned_by", qMentionedBy); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Milestones != nil {
+
+		// query param milestones
+		var qrMilestones string
+
+		if o.Milestones != nil {
+			qrMilestones = *o.Milestones
+		}
+		qMilestones := qrMilestones
+		if qMilestones != "" {
+
+			if err := r.SetQueryParam("milestones", qMilestones); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Q != nil {
+
+		// query param q
+		var qrQ string
+
+		if o.Q != nil {
+			qrQ = *o.Q
+		}
+		qQ := qrQ
+		if qQ != "" {
+
+			if err := r.SetQueryParam("q", qQ); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if o.Since != nil {
+
+		// query param since
+		var qrSince strfmt.DateTime
+
+		if o.Since != nil {
+			qrSince = *o.Since
+		}
+		qSince := qrSince.String()
+		if qSince != "" {
+
+			if err := r.SetQueryParam("since", qSince); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.State != nil {
+
+		// query param state
+		var qrState string
+
+		if o.State != nil {
+			qrState = *o.State
+		}
+		qState := qrState
+		if qState != "" {
+
+			if err := r.SetQueryParam("state", qState); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Type != nil {
+
+		// query param type
+		var qrType string
+
+		if o.Type != nil {
+			qrType = *o.Type
+		}
+		qType := qrType
+		if qType != "" {
+
+			if err := r.SetQueryParam("type", qType); err != nil {
+				return err
+			}
+		}
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_list_issues_responses.go b/bots-common/gitea-generated/client/issue/issue_list_issues_responses.go
new file mode 100644
index 0000000..a8a4635
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_list_issues_responses.go
@@ -0,0 +1,166 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// IssueListIssuesReader is a Reader for the IssueListIssues structure.
+type IssueListIssuesReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *IssueListIssuesReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewIssueListIssuesOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewIssueListIssuesNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/issues] issueListIssues", response, response.Code())
+	}
+}
+
+// NewIssueListIssuesOK creates a IssueListIssuesOK with default headers values
+func NewIssueListIssuesOK() *IssueListIssuesOK {
+	return &IssueListIssuesOK{}
+}
+
+/*
+IssueListIssuesOK describes a response with status code 200, with default header values.
+
+IssueList
+*/
+type IssueListIssuesOK struct {
+	Payload []*models.Issue
+}
+
+// IsSuccess returns true when this issue list issues o k response has a 2xx status code
+func (o *IssueListIssuesOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this issue list issues o k response has a 3xx status code
+func (o *IssueListIssuesOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue list issues o k response has a 4xx status code
+func (o *IssueListIssuesOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this issue list issues o k response has a 5xx status code
+func (o *IssueListIssuesOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue list issues o k response a status code equal to that given
+func (o *IssueListIssuesOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the issue list issues o k response
+func (o *IssueListIssuesOK) Code() int {
+	return 200
+}
+
+func (o *IssueListIssuesOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issues][%d] issueListIssuesOK %s", 200, payload)
+}
+
+func (o *IssueListIssuesOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issues][%d] issueListIssuesOK %s", 200, payload)
+}
+
+func (o *IssueListIssuesOK) GetPayload() []*models.Issue {
+	return o.Payload
+}
+
+func (o *IssueListIssuesOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewIssueListIssuesNotFound creates a IssueListIssuesNotFound with default headers values
+func NewIssueListIssuesNotFound() *IssueListIssuesNotFound {
+	return &IssueListIssuesNotFound{}
+}
+
+/*
+IssueListIssuesNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type IssueListIssuesNotFound struct {
+}
+
+// IsSuccess returns true when this issue list issues not found response has a 2xx status code
+func (o *IssueListIssuesNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue list issues not found response has a 3xx status code
+func (o *IssueListIssuesNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue list issues not found response has a 4xx status code
+func (o *IssueListIssuesNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue list issues not found response has a 5xx status code
+func (o *IssueListIssuesNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue list issues not found response a status code equal to that given
+func (o *IssueListIssuesNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the issue list issues not found response
+func (o *IssueListIssuesNotFound) Code() int {
+	return 404
+}
+
+func (o *IssueListIssuesNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issues][%d] issueListIssuesNotFound", 404)
+}
+
+func (o *IssueListIssuesNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issues][%d] issueListIssuesNotFound", 404)
+}
+
+func (o *IssueListIssuesNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_list_labels_parameters.go b/bots-common/gitea-generated/client/issue/issue_list_labels_parameters.go
new file mode 100644
index 0000000..ade3532
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_list_labels_parameters.go
@@ -0,0 +1,242 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewIssueListLabelsParams creates a new IssueListLabelsParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewIssueListLabelsParams() *IssueListLabelsParams {
+	return &IssueListLabelsParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewIssueListLabelsParamsWithTimeout creates a new IssueListLabelsParams object
+// with the ability to set a timeout on a request.
+func NewIssueListLabelsParamsWithTimeout(timeout time.Duration) *IssueListLabelsParams {
+	return &IssueListLabelsParams{
+		timeout: timeout,
+	}
+}
+
+// NewIssueListLabelsParamsWithContext creates a new IssueListLabelsParams object
+// with the ability to set a context for a request.
+func NewIssueListLabelsParamsWithContext(ctx context.Context) *IssueListLabelsParams {
+	return &IssueListLabelsParams{
+		Context: ctx,
+	}
+}
+
+// NewIssueListLabelsParamsWithHTTPClient creates a new IssueListLabelsParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewIssueListLabelsParamsWithHTTPClient(client *http.Client) *IssueListLabelsParams {
+	return &IssueListLabelsParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+IssueListLabelsParams contains all the parameters to send to the API endpoint
+
+	for the issue list labels operation.
+
+	Typically these are written to a http.Request.
+*/
+type IssueListLabelsParams struct {
+
+	/* Limit.
+
+	   page size of results
+	*/
+	Limit *int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Page.
+
+	   page number of results to return (1-based)
+	*/
+	Page *int64
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the issue list labels params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueListLabelsParams) WithDefaults() *IssueListLabelsParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the issue list labels params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueListLabelsParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the issue list labels params
+func (o *IssueListLabelsParams) WithTimeout(timeout time.Duration) *IssueListLabelsParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the issue list labels params
+func (o *IssueListLabelsParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the issue list labels params
+func (o *IssueListLabelsParams) WithContext(ctx context.Context) *IssueListLabelsParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the issue list labels params
+func (o *IssueListLabelsParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the issue list labels params
+func (o *IssueListLabelsParams) WithHTTPClient(client *http.Client) *IssueListLabelsParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the issue list labels params
+func (o *IssueListLabelsParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithLimit adds the limit to the issue list labels params
+func (o *IssueListLabelsParams) WithLimit(limit *int64) *IssueListLabelsParams {
+	o.SetLimit(limit)
+	return o
+}
+
+// SetLimit adds the limit to the issue list labels params
+func (o *IssueListLabelsParams) SetLimit(limit *int64) {
+	o.Limit = limit
+}
+
+// WithOwner adds the owner to the issue list labels params
+func (o *IssueListLabelsParams) WithOwner(owner string) *IssueListLabelsParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the issue list labels params
+func (o *IssueListLabelsParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithPage adds the page to the issue list labels params
+func (o *IssueListLabelsParams) WithPage(page *int64) *IssueListLabelsParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the issue list labels params
+func (o *IssueListLabelsParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WithRepo adds the repo to the issue list labels params
+func (o *IssueListLabelsParams) WithRepo(repo string) *IssueListLabelsParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the issue list labels params
+func (o *IssueListLabelsParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *IssueListLabelsParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.Limit != nil {
+
+		// query param limit
+		var qrLimit int64
+
+		if o.Limit != nil {
+			qrLimit = *o.Limit
+		}
+		qLimit := swag.FormatInt64(qrLimit)
+		if qLimit != "" {
+
+			if err := r.SetQueryParam("limit", qLimit); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_list_labels_responses.go b/bots-common/gitea-generated/client/issue/issue_list_labels_responses.go
new file mode 100644
index 0000000..7f6ba39
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_list_labels_responses.go
@@ -0,0 +1,166 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// IssueListLabelsReader is a Reader for the IssueListLabels structure.
+type IssueListLabelsReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *IssueListLabelsReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewIssueListLabelsOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewIssueListLabelsNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/labels] issueListLabels", response, response.Code())
+	}
+}
+
+// NewIssueListLabelsOK creates a IssueListLabelsOK with default headers values
+func NewIssueListLabelsOK() *IssueListLabelsOK {
+	return &IssueListLabelsOK{}
+}
+
+/*
+IssueListLabelsOK describes a response with status code 200, with default header values.
+
+LabelList
+*/
+type IssueListLabelsOK struct {
+	Payload []*models.Label
+}
+
+// IsSuccess returns true when this issue list labels o k response has a 2xx status code
+func (o *IssueListLabelsOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this issue list labels o k response has a 3xx status code
+func (o *IssueListLabelsOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue list labels o k response has a 4xx status code
+func (o *IssueListLabelsOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this issue list labels o k response has a 5xx status code
+func (o *IssueListLabelsOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue list labels o k response a status code equal to that given
+func (o *IssueListLabelsOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the issue list labels o k response
+func (o *IssueListLabelsOK) Code() int {
+	return 200
+}
+
+func (o *IssueListLabelsOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/labels][%d] issueListLabelsOK %s", 200, payload)
+}
+
+func (o *IssueListLabelsOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/labels][%d] issueListLabelsOK %s", 200, payload)
+}
+
+func (o *IssueListLabelsOK) GetPayload() []*models.Label {
+	return o.Payload
+}
+
+func (o *IssueListLabelsOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewIssueListLabelsNotFound creates a IssueListLabelsNotFound with default headers values
+func NewIssueListLabelsNotFound() *IssueListLabelsNotFound {
+	return &IssueListLabelsNotFound{}
+}
+
+/*
+IssueListLabelsNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type IssueListLabelsNotFound struct {
+}
+
+// IsSuccess returns true when this issue list labels not found response has a 2xx status code
+func (o *IssueListLabelsNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue list labels not found response has a 3xx status code
+func (o *IssueListLabelsNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue list labels not found response has a 4xx status code
+func (o *IssueListLabelsNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue list labels not found response has a 5xx status code
+func (o *IssueListLabelsNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue list labels not found response a status code equal to that given
+func (o *IssueListLabelsNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the issue list labels not found response
+func (o *IssueListLabelsNotFound) Code() int {
+	return 404
+}
+
+func (o *IssueListLabelsNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/labels][%d] issueListLabelsNotFound", 404)
+}
+
+func (o *IssueListLabelsNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/labels][%d] issueListLabelsNotFound", 404)
+}
+
+func (o *IssueListLabelsNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_post_comment_reaction_parameters.go b/bots-common/gitea-generated/client/issue/issue_post_comment_reaction_parameters.go
new file mode 100644
index 0000000..a947a5f
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_post_comment_reaction_parameters.go
@@ -0,0 +1,219 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewIssuePostCommentReactionParams creates a new IssuePostCommentReactionParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewIssuePostCommentReactionParams() *IssuePostCommentReactionParams {
+	return &IssuePostCommentReactionParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewIssuePostCommentReactionParamsWithTimeout creates a new IssuePostCommentReactionParams object
+// with the ability to set a timeout on a request.
+func NewIssuePostCommentReactionParamsWithTimeout(timeout time.Duration) *IssuePostCommentReactionParams {
+	return &IssuePostCommentReactionParams{
+		timeout: timeout,
+	}
+}
+
+// NewIssuePostCommentReactionParamsWithContext creates a new IssuePostCommentReactionParams object
+// with the ability to set a context for a request.
+func NewIssuePostCommentReactionParamsWithContext(ctx context.Context) *IssuePostCommentReactionParams {
+	return &IssuePostCommentReactionParams{
+		Context: ctx,
+	}
+}
+
+// NewIssuePostCommentReactionParamsWithHTTPClient creates a new IssuePostCommentReactionParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewIssuePostCommentReactionParamsWithHTTPClient(client *http.Client) *IssuePostCommentReactionParams {
+	return &IssuePostCommentReactionParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+IssuePostCommentReactionParams contains all the parameters to send to the API endpoint
+
+	for the issue post comment reaction operation.
+
+	Typically these are written to a http.Request.
+*/
+type IssuePostCommentReactionParams struct {
+
+	// Content.
+	Content *models.EditReactionOption
+
+	/* ID.
+
+	   id of the comment to edit
+
+	   Format: int64
+	*/
+	ID int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the issue post comment reaction params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssuePostCommentReactionParams) WithDefaults() *IssuePostCommentReactionParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the issue post comment reaction params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssuePostCommentReactionParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the issue post comment reaction params
+func (o *IssuePostCommentReactionParams) WithTimeout(timeout time.Duration) *IssuePostCommentReactionParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the issue post comment reaction params
+func (o *IssuePostCommentReactionParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the issue post comment reaction params
+func (o *IssuePostCommentReactionParams) WithContext(ctx context.Context) *IssuePostCommentReactionParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the issue post comment reaction params
+func (o *IssuePostCommentReactionParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the issue post comment reaction params
+func (o *IssuePostCommentReactionParams) WithHTTPClient(client *http.Client) *IssuePostCommentReactionParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the issue post comment reaction params
+func (o *IssuePostCommentReactionParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithContent adds the content to the issue post comment reaction params
+func (o *IssuePostCommentReactionParams) WithContent(content *models.EditReactionOption) *IssuePostCommentReactionParams {
+	o.SetContent(content)
+	return o
+}
+
+// SetContent adds the content to the issue post comment reaction params
+func (o *IssuePostCommentReactionParams) SetContent(content *models.EditReactionOption) {
+	o.Content = content
+}
+
+// WithID adds the id to the issue post comment reaction params
+func (o *IssuePostCommentReactionParams) WithID(id int64) *IssuePostCommentReactionParams {
+	o.SetID(id)
+	return o
+}
+
+// SetID adds the id to the issue post comment reaction params
+func (o *IssuePostCommentReactionParams) SetID(id int64) {
+	o.ID = id
+}
+
+// WithOwner adds the owner to the issue post comment reaction params
+func (o *IssuePostCommentReactionParams) WithOwner(owner string) *IssuePostCommentReactionParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the issue post comment reaction params
+func (o *IssuePostCommentReactionParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the issue post comment reaction params
+func (o *IssuePostCommentReactionParams) WithRepo(repo string) *IssuePostCommentReactionParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the issue post comment reaction params
+func (o *IssuePostCommentReactionParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *IssuePostCommentReactionParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Content != nil {
+		if err := r.SetBodyParam(o.Content); err != nil {
+			return err
+		}
+	}
+
+	// path param id
+	if err := r.SetPathParam("id", swag.FormatInt64(o.ID)); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_post_comment_reaction_responses.go b/bots-common/gitea-generated/client/issue/issue_post_comment_reaction_responses.go
new file mode 100644
index 0000000..4118345
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_post_comment_reaction_responses.go
@@ -0,0 +1,322 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// IssuePostCommentReactionReader is a Reader for the IssuePostCommentReaction structure.
+type IssuePostCommentReactionReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *IssuePostCommentReactionReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewIssuePostCommentReactionOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 201:
+		result := NewIssuePostCommentReactionCreated()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 403:
+		result := NewIssuePostCommentReactionForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewIssuePostCommentReactionNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[POST /repos/{owner}/{repo}/issues/comments/{id}/reactions] issuePostCommentReaction", response, response.Code())
+	}
+}
+
+// NewIssuePostCommentReactionOK creates a IssuePostCommentReactionOK with default headers values
+func NewIssuePostCommentReactionOK() *IssuePostCommentReactionOK {
+	return &IssuePostCommentReactionOK{}
+}
+
+/*
+IssuePostCommentReactionOK describes a response with status code 200, with default header values.
+
+Reaction
+*/
+type IssuePostCommentReactionOK struct {
+	Payload *models.Reaction
+}
+
+// IsSuccess returns true when this issue post comment reaction o k response has a 2xx status code
+func (o *IssuePostCommentReactionOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this issue post comment reaction o k response has a 3xx status code
+func (o *IssuePostCommentReactionOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue post comment reaction o k response has a 4xx status code
+func (o *IssuePostCommentReactionOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this issue post comment reaction o k response has a 5xx status code
+func (o *IssuePostCommentReactionOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue post comment reaction o k response a status code equal to that given
+func (o *IssuePostCommentReactionOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the issue post comment reaction o k response
+func (o *IssuePostCommentReactionOK) Code() int {
+	return 200
+}
+
+func (o *IssuePostCommentReactionOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/comments/{id}/reactions][%d] issuePostCommentReactionOK %s", 200, payload)
+}
+
+func (o *IssuePostCommentReactionOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/comments/{id}/reactions][%d] issuePostCommentReactionOK %s", 200, payload)
+}
+
+func (o *IssuePostCommentReactionOK) GetPayload() *models.Reaction {
+	return o.Payload
+}
+
+func (o *IssuePostCommentReactionOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.Reaction)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewIssuePostCommentReactionCreated creates a IssuePostCommentReactionCreated with default headers values
+func NewIssuePostCommentReactionCreated() *IssuePostCommentReactionCreated {
+	return &IssuePostCommentReactionCreated{}
+}
+
+/*
+IssuePostCommentReactionCreated describes a response with status code 201, with default header values.
+
+Reaction
+*/
+type IssuePostCommentReactionCreated struct {
+	Payload *models.Reaction
+}
+
+// IsSuccess returns true when this issue post comment reaction created response has a 2xx status code
+func (o *IssuePostCommentReactionCreated) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this issue post comment reaction created response has a 3xx status code
+func (o *IssuePostCommentReactionCreated) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue post comment reaction created response has a 4xx status code
+func (o *IssuePostCommentReactionCreated) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this issue post comment reaction created response has a 5xx status code
+func (o *IssuePostCommentReactionCreated) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue post comment reaction created response a status code equal to that given
+func (o *IssuePostCommentReactionCreated) IsCode(code int) bool {
+	return code == 201
+}
+
+// Code gets the status code for the issue post comment reaction created response
+func (o *IssuePostCommentReactionCreated) Code() int {
+	return 201
+}
+
+func (o *IssuePostCommentReactionCreated) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/comments/{id}/reactions][%d] issuePostCommentReactionCreated %s", 201, payload)
+}
+
+func (o *IssuePostCommentReactionCreated) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/comments/{id}/reactions][%d] issuePostCommentReactionCreated %s", 201, payload)
+}
+
+func (o *IssuePostCommentReactionCreated) GetPayload() *models.Reaction {
+	return o.Payload
+}
+
+func (o *IssuePostCommentReactionCreated) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.Reaction)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewIssuePostCommentReactionForbidden creates a IssuePostCommentReactionForbidden with default headers values
+func NewIssuePostCommentReactionForbidden() *IssuePostCommentReactionForbidden {
+	return &IssuePostCommentReactionForbidden{}
+}
+
+/*
+IssuePostCommentReactionForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type IssuePostCommentReactionForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this issue post comment reaction forbidden response has a 2xx status code
+func (o *IssuePostCommentReactionForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue post comment reaction forbidden response has a 3xx status code
+func (o *IssuePostCommentReactionForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue post comment reaction forbidden response has a 4xx status code
+func (o *IssuePostCommentReactionForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue post comment reaction forbidden response has a 5xx status code
+func (o *IssuePostCommentReactionForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue post comment reaction forbidden response a status code equal to that given
+func (o *IssuePostCommentReactionForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the issue post comment reaction forbidden response
+func (o *IssuePostCommentReactionForbidden) Code() int {
+	return 403
+}
+
+func (o *IssuePostCommentReactionForbidden) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/comments/{id}/reactions][%d] issuePostCommentReactionForbidden", 403)
+}
+
+func (o *IssuePostCommentReactionForbidden) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/comments/{id}/reactions][%d] issuePostCommentReactionForbidden", 403)
+}
+
+func (o *IssuePostCommentReactionForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewIssuePostCommentReactionNotFound creates a IssuePostCommentReactionNotFound with default headers values
+func NewIssuePostCommentReactionNotFound() *IssuePostCommentReactionNotFound {
+	return &IssuePostCommentReactionNotFound{}
+}
+
+/*
+IssuePostCommentReactionNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type IssuePostCommentReactionNotFound struct {
+}
+
+// IsSuccess returns true when this issue post comment reaction not found response has a 2xx status code
+func (o *IssuePostCommentReactionNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue post comment reaction not found response has a 3xx status code
+func (o *IssuePostCommentReactionNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue post comment reaction not found response has a 4xx status code
+func (o *IssuePostCommentReactionNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue post comment reaction not found response has a 5xx status code
+func (o *IssuePostCommentReactionNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue post comment reaction not found response a status code equal to that given
+func (o *IssuePostCommentReactionNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the issue post comment reaction not found response
+func (o *IssuePostCommentReactionNotFound) Code() int {
+	return 404
+}
+
+func (o *IssuePostCommentReactionNotFound) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/comments/{id}/reactions][%d] issuePostCommentReactionNotFound", 404)
+}
+
+func (o *IssuePostCommentReactionNotFound) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/comments/{id}/reactions][%d] issuePostCommentReactionNotFound", 404)
+}
+
+func (o *IssuePostCommentReactionNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_post_issue_reaction_parameters.go b/bots-common/gitea-generated/client/issue/issue_post_issue_reaction_parameters.go
new file mode 100644
index 0000000..e8c17ef
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_post_issue_reaction_parameters.go
@@ -0,0 +1,219 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewIssuePostIssueReactionParams creates a new IssuePostIssueReactionParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewIssuePostIssueReactionParams() *IssuePostIssueReactionParams {
+	return &IssuePostIssueReactionParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewIssuePostIssueReactionParamsWithTimeout creates a new IssuePostIssueReactionParams object
+// with the ability to set a timeout on a request.
+func NewIssuePostIssueReactionParamsWithTimeout(timeout time.Duration) *IssuePostIssueReactionParams {
+	return &IssuePostIssueReactionParams{
+		timeout: timeout,
+	}
+}
+
+// NewIssuePostIssueReactionParamsWithContext creates a new IssuePostIssueReactionParams object
+// with the ability to set a context for a request.
+func NewIssuePostIssueReactionParamsWithContext(ctx context.Context) *IssuePostIssueReactionParams {
+	return &IssuePostIssueReactionParams{
+		Context: ctx,
+	}
+}
+
+// NewIssuePostIssueReactionParamsWithHTTPClient creates a new IssuePostIssueReactionParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewIssuePostIssueReactionParamsWithHTTPClient(client *http.Client) *IssuePostIssueReactionParams {
+	return &IssuePostIssueReactionParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+IssuePostIssueReactionParams contains all the parameters to send to the API endpoint
+
+	for the issue post issue reaction operation.
+
+	Typically these are written to a http.Request.
+*/
+type IssuePostIssueReactionParams struct {
+
+	// Content.
+	Content *models.EditReactionOption
+
+	/* Index.
+
+	   index of the issue
+
+	   Format: int64
+	*/
+	Index int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the issue post issue reaction params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssuePostIssueReactionParams) WithDefaults() *IssuePostIssueReactionParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the issue post issue reaction params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssuePostIssueReactionParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the issue post issue reaction params
+func (o *IssuePostIssueReactionParams) WithTimeout(timeout time.Duration) *IssuePostIssueReactionParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the issue post issue reaction params
+func (o *IssuePostIssueReactionParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the issue post issue reaction params
+func (o *IssuePostIssueReactionParams) WithContext(ctx context.Context) *IssuePostIssueReactionParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the issue post issue reaction params
+func (o *IssuePostIssueReactionParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the issue post issue reaction params
+func (o *IssuePostIssueReactionParams) WithHTTPClient(client *http.Client) *IssuePostIssueReactionParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the issue post issue reaction params
+func (o *IssuePostIssueReactionParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithContent adds the content to the issue post issue reaction params
+func (o *IssuePostIssueReactionParams) WithContent(content *models.EditReactionOption) *IssuePostIssueReactionParams {
+	o.SetContent(content)
+	return o
+}
+
+// SetContent adds the content to the issue post issue reaction params
+func (o *IssuePostIssueReactionParams) SetContent(content *models.EditReactionOption) {
+	o.Content = content
+}
+
+// WithIndex adds the index to the issue post issue reaction params
+func (o *IssuePostIssueReactionParams) WithIndex(index int64) *IssuePostIssueReactionParams {
+	o.SetIndex(index)
+	return o
+}
+
+// SetIndex adds the index to the issue post issue reaction params
+func (o *IssuePostIssueReactionParams) SetIndex(index int64) {
+	o.Index = index
+}
+
+// WithOwner adds the owner to the issue post issue reaction params
+func (o *IssuePostIssueReactionParams) WithOwner(owner string) *IssuePostIssueReactionParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the issue post issue reaction params
+func (o *IssuePostIssueReactionParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the issue post issue reaction params
+func (o *IssuePostIssueReactionParams) WithRepo(repo string) *IssuePostIssueReactionParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the issue post issue reaction params
+func (o *IssuePostIssueReactionParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *IssuePostIssueReactionParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Content != nil {
+		if err := r.SetBodyParam(o.Content); err != nil {
+			return err
+		}
+	}
+
+	// path param index
+	if err := r.SetPathParam("index", swag.FormatInt64(o.Index)); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_post_issue_reaction_responses.go b/bots-common/gitea-generated/client/issue/issue_post_issue_reaction_responses.go
new file mode 100644
index 0000000..5e0a899
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_post_issue_reaction_responses.go
@@ -0,0 +1,322 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// IssuePostIssueReactionReader is a Reader for the IssuePostIssueReaction structure.
+type IssuePostIssueReactionReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *IssuePostIssueReactionReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewIssuePostIssueReactionOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 201:
+		result := NewIssuePostIssueReactionCreated()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 403:
+		result := NewIssuePostIssueReactionForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewIssuePostIssueReactionNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[POST /repos/{owner}/{repo}/issues/{index}/reactions] issuePostIssueReaction", response, response.Code())
+	}
+}
+
+// NewIssuePostIssueReactionOK creates a IssuePostIssueReactionOK with default headers values
+func NewIssuePostIssueReactionOK() *IssuePostIssueReactionOK {
+	return &IssuePostIssueReactionOK{}
+}
+
+/*
+IssuePostIssueReactionOK describes a response with status code 200, with default header values.
+
+Reaction
+*/
+type IssuePostIssueReactionOK struct {
+	Payload *models.Reaction
+}
+
+// IsSuccess returns true when this issue post issue reaction o k response has a 2xx status code
+func (o *IssuePostIssueReactionOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this issue post issue reaction o k response has a 3xx status code
+func (o *IssuePostIssueReactionOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue post issue reaction o k response has a 4xx status code
+func (o *IssuePostIssueReactionOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this issue post issue reaction o k response has a 5xx status code
+func (o *IssuePostIssueReactionOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue post issue reaction o k response a status code equal to that given
+func (o *IssuePostIssueReactionOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the issue post issue reaction o k response
+func (o *IssuePostIssueReactionOK) Code() int {
+	return 200
+}
+
+func (o *IssuePostIssueReactionOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/{index}/reactions][%d] issuePostIssueReactionOK %s", 200, payload)
+}
+
+func (o *IssuePostIssueReactionOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/{index}/reactions][%d] issuePostIssueReactionOK %s", 200, payload)
+}
+
+func (o *IssuePostIssueReactionOK) GetPayload() *models.Reaction {
+	return o.Payload
+}
+
+func (o *IssuePostIssueReactionOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.Reaction)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewIssuePostIssueReactionCreated creates a IssuePostIssueReactionCreated with default headers values
+func NewIssuePostIssueReactionCreated() *IssuePostIssueReactionCreated {
+	return &IssuePostIssueReactionCreated{}
+}
+
+/*
+IssuePostIssueReactionCreated describes a response with status code 201, with default header values.
+
+Reaction
+*/
+type IssuePostIssueReactionCreated struct {
+	Payload *models.Reaction
+}
+
+// IsSuccess returns true when this issue post issue reaction created response has a 2xx status code
+func (o *IssuePostIssueReactionCreated) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this issue post issue reaction created response has a 3xx status code
+func (o *IssuePostIssueReactionCreated) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue post issue reaction created response has a 4xx status code
+func (o *IssuePostIssueReactionCreated) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this issue post issue reaction created response has a 5xx status code
+func (o *IssuePostIssueReactionCreated) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue post issue reaction created response a status code equal to that given
+func (o *IssuePostIssueReactionCreated) IsCode(code int) bool {
+	return code == 201
+}
+
+// Code gets the status code for the issue post issue reaction created response
+func (o *IssuePostIssueReactionCreated) Code() int {
+	return 201
+}
+
+func (o *IssuePostIssueReactionCreated) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/{index}/reactions][%d] issuePostIssueReactionCreated %s", 201, payload)
+}
+
+func (o *IssuePostIssueReactionCreated) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/{index}/reactions][%d] issuePostIssueReactionCreated %s", 201, payload)
+}
+
+func (o *IssuePostIssueReactionCreated) GetPayload() *models.Reaction {
+	return o.Payload
+}
+
+func (o *IssuePostIssueReactionCreated) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.Reaction)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewIssuePostIssueReactionForbidden creates a IssuePostIssueReactionForbidden with default headers values
+func NewIssuePostIssueReactionForbidden() *IssuePostIssueReactionForbidden {
+	return &IssuePostIssueReactionForbidden{}
+}
+
+/*
+IssuePostIssueReactionForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type IssuePostIssueReactionForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this issue post issue reaction forbidden response has a 2xx status code
+func (o *IssuePostIssueReactionForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue post issue reaction forbidden response has a 3xx status code
+func (o *IssuePostIssueReactionForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue post issue reaction forbidden response has a 4xx status code
+func (o *IssuePostIssueReactionForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue post issue reaction forbidden response has a 5xx status code
+func (o *IssuePostIssueReactionForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue post issue reaction forbidden response a status code equal to that given
+func (o *IssuePostIssueReactionForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the issue post issue reaction forbidden response
+func (o *IssuePostIssueReactionForbidden) Code() int {
+	return 403
+}
+
+func (o *IssuePostIssueReactionForbidden) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/{index}/reactions][%d] issuePostIssueReactionForbidden", 403)
+}
+
+func (o *IssuePostIssueReactionForbidden) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/{index}/reactions][%d] issuePostIssueReactionForbidden", 403)
+}
+
+func (o *IssuePostIssueReactionForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewIssuePostIssueReactionNotFound creates a IssuePostIssueReactionNotFound with default headers values
+func NewIssuePostIssueReactionNotFound() *IssuePostIssueReactionNotFound {
+	return &IssuePostIssueReactionNotFound{}
+}
+
+/*
+IssuePostIssueReactionNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type IssuePostIssueReactionNotFound struct {
+}
+
+// IsSuccess returns true when this issue post issue reaction not found response has a 2xx status code
+func (o *IssuePostIssueReactionNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue post issue reaction not found response has a 3xx status code
+func (o *IssuePostIssueReactionNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue post issue reaction not found response has a 4xx status code
+func (o *IssuePostIssueReactionNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue post issue reaction not found response has a 5xx status code
+func (o *IssuePostIssueReactionNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue post issue reaction not found response a status code equal to that given
+func (o *IssuePostIssueReactionNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the issue post issue reaction not found response
+func (o *IssuePostIssueReactionNotFound) Code() int {
+	return 404
+}
+
+func (o *IssuePostIssueReactionNotFound) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/{index}/reactions][%d] issuePostIssueReactionNotFound", 404)
+}
+
+func (o *IssuePostIssueReactionNotFound) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/{index}/reactions][%d] issuePostIssueReactionNotFound", 404)
+}
+
+func (o *IssuePostIssueReactionNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_remove_issue_blocking_parameters.go b/bots-common/gitea-generated/client/issue/issue_remove_issue_blocking_parameters.go
new file mode 100644
index 0000000..f1e2d25
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_remove_issue_blocking_parameters.go
@@ -0,0 +1,216 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewIssueRemoveIssueBlockingParams creates a new IssueRemoveIssueBlockingParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewIssueRemoveIssueBlockingParams() *IssueRemoveIssueBlockingParams {
+	return &IssueRemoveIssueBlockingParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewIssueRemoveIssueBlockingParamsWithTimeout creates a new IssueRemoveIssueBlockingParams object
+// with the ability to set a timeout on a request.
+func NewIssueRemoveIssueBlockingParamsWithTimeout(timeout time.Duration) *IssueRemoveIssueBlockingParams {
+	return &IssueRemoveIssueBlockingParams{
+		timeout: timeout,
+	}
+}
+
+// NewIssueRemoveIssueBlockingParamsWithContext creates a new IssueRemoveIssueBlockingParams object
+// with the ability to set a context for a request.
+func NewIssueRemoveIssueBlockingParamsWithContext(ctx context.Context) *IssueRemoveIssueBlockingParams {
+	return &IssueRemoveIssueBlockingParams{
+		Context: ctx,
+	}
+}
+
+// NewIssueRemoveIssueBlockingParamsWithHTTPClient creates a new IssueRemoveIssueBlockingParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewIssueRemoveIssueBlockingParamsWithHTTPClient(client *http.Client) *IssueRemoveIssueBlockingParams {
+	return &IssueRemoveIssueBlockingParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+IssueRemoveIssueBlockingParams contains all the parameters to send to the API endpoint
+
+	for the issue remove issue blocking operation.
+
+	Typically these are written to a http.Request.
+*/
+type IssueRemoveIssueBlockingParams struct {
+
+	// Body.
+	Body *models.IssueMeta
+
+	/* Index.
+
+	   index of the issue
+	*/
+	Index string
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the issue remove issue blocking params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueRemoveIssueBlockingParams) WithDefaults() *IssueRemoveIssueBlockingParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the issue remove issue blocking params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueRemoveIssueBlockingParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the issue remove issue blocking params
+func (o *IssueRemoveIssueBlockingParams) WithTimeout(timeout time.Duration) *IssueRemoveIssueBlockingParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the issue remove issue blocking params
+func (o *IssueRemoveIssueBlockingParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the issue remove issue blocking params
+func (o *IssueRemoveIssueBlockingParams) WithContext(ctx context.Context) *IssueRemoveIssueBlockingParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the issue remove issue blocking params
+func (o *IssueRemoveIssueBlockingParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the issue remove issue blocking params
+func (o *IssueRemoveIssueBlockingParams) WithHTTPClient(client *http.Client) *IssueRemoveIssueBlockingParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the issue remove issue blocking params
+func (o *IssueRemoveIssueBlockingParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the issue remove issue blocking params
+func (o *IssueRemoveIssueBlockingParams) WithBody(body *models.IssueMeta) *IssueRemoveIssueBlockingParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the issue remove issue blocking params
+func (o *IssueRemoveIssueBlockingParams) SetBody(body *models.IssueMeta) {
+	o.Body = body
+}
+
+// WithIndex adds the index to the issue remove issue blocking params
+func (o *IssueRemoveIssueBlockingParams) WithIndex(index string) *IssueRemoveIssueBlockingParams {
+	o.SetIndex(index)
+	return o
+}
+
+// SetIndex adds the index to the issue remove issue blocking params
+func (o *IssueRemoveIssueBlockingParams) SetIndex(index string) {
+	o.Index = index
+}
+
+// WithOwner adds the owner to the issue remove issue blocking params
+func (o *IssueRemoveIssueBlockingParams) WithOwner(owner string) *IssueRemoveIssueBlockingParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the issue remove issue blocking params
+func (o *IssueRemoveIssueBlockingParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the issue remove issue blocking params
+func (o *IssueRemoveIssueBlockingParams) WithRepo(repo string) *IssueRemoveIssueBlockingParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the issue remove issue blocking params
+func (o *IssueRemoveIssueBlockingParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *IssueRemoveIssueBlockingParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	// path param index
+	if err := r.SetPathParam("index", o.Index); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_remove_issue_blocking_responses.go b/bots-common/gitea-generated/client/issue/issue_remove_issue_blocking_responses.go
new file mode 100644
index 0000000..8878dc3
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_remove_issue_blocking_responses.go
@@ -0,0 +1,168 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// IssueRemoveIssueBlockingReader is a Reader for the IssueRemoveIssueBlocking structure.
+type IssueRemoveIssueBlockingReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *IssueRemoveIssueBlockingReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewIssueRemoveIssueBlockingOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewIssueRemoveIssueBlockingNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[DELETE /repos/{owner}/{repo}/issues/{index}/blocks] issueRemoveIssueBlocking", response, response.Code())
+	}
+}
+
+// NewIssueRemoveIssueBlockingOK creates a IssueRemoveIssueBlockingOK with default headers values
+func NewIssueRemoveIssueBlockingOK() *IssueRemoveIssueBlockingOK {
+	return &IssueRemoveIssueBlockingOK{}
+}
+
+/*
+IssueRemoveIssueBlockingOK describes a response with status code 200, with default header values.
+
+Issue
+*/
+type IssueRemoveIssueBlockingOK struct {
+	Payload *models.Issue
+}
+
+// IsSuccess returns true when this issue remove issue blocking o k response has a 2xx status code
+func (o *IssueRemoveIssueBlockingOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this issue remove issue blocking o k response has a 3xx status code
+func (o *IssueRemoveIssueBlockingOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue remove issue blocking o k response has a 4xx status code
+func (o *IssueRemoveIssueBlockingOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this issue remove issue blocking o k response has a 5xx status code
+func (o *IssueRemoveIssueBlockingOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue remove issue blocking o k response a status code equal to that given
+func (o *IssueRemoveIssueBlockingOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the issue remove issue blocking o k response
+func (o *IssueRemoveIssueBlockingOK) Code() int {
+	return 200
+}
+
+func (o *IssueRemoveIssueBlockingOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/{index}/blocks][%d] issueRemoveIssueBlockingOK %s", 200, payload)
+}
+
+func (o *IssueRemoveIssueBlockingOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/{index}/blocks][%d] issueRemoveIssueBlockingOK %s", 200, payload)
+}
+
+func (o *IssueRemoveIssueBlockingOK) GetPayload() *models.Issue {
+	return o.Payload
+}
+
+func (o *IssueRemoveIssueBlockingOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.Issue)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewIssueRemoveIssueBlockingNotFound creates a IssueRemoveIssueBlockingNotFound with default headers values
+func NewIssueRemoveIssueBlockingNotFound() *IssueRemoveIssueBlockingNotFound {
+	return &IssueRemoveIssueBlockingNotFound{}
+}
+
+/*
+IssueRemoveIssueBlockingNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type IssueRemoveIssueBlockingNotFound struct {
+}
+
+// IsSuccess returns true when this issue remove issue blocking not found response has a 2xx status code
+func (o *IssueRemoveIssueBlockingNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue remove issue blocking not found response has a 3xx status code
+func (o *IssueRemoveIssueBlockingNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue remove issue blocking not found response has a 4xx status code
+func (o *IssueRemoveIssueBlockingNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue remove issue blocking not found response has a 5xx status code
+func (o *IssueRemoveIssueBlockingNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue remove issue blocking not found response a status code equal to that given
+func (o *IssueRemoveIssueBlockingNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the issue remove issue blocking not found response
+func (o *IssueRemoveIssueBlockingNotFound) Code() int {
+	return 404
+}
+
+func (o *IssueRemoveIssueBlockingNotFound) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/{index}/blocks][%d] issueRemoveIssueBlockingNotFound", 404)
+}
+
+func (o *IssueRemoveIssueBlockingNotFound) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/{index}/blocks][%d] issueRemoveIssueBlockingNotFound", 404)
+}
+
+func (o *IssueRemoveIssueBlockingNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_remove_issue_dependencies_parameters.go b/bots-common/gitea-generated/client/issue/issue_remove_issue_dependencies_parameters.go
new file mode 100644
index 0000000..cbcbec0
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_remove_issue_dependencies_parameters.go
@@ -0,0 +1,216 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewIssueRemoveIssueDependenciesParams creates a new IssueRemoveIssueDependenciesParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewIssueRemoveIssueDependenciesParams() *IssueRemoveIssueDependenciesParams {
+	return &IssueRemoveIssueDependenciesParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewIssueRemoveIssueDependenciesParamsWithTimeout creates a new IssueRemoveIssueDependenciesParams object
+// with the ability to set a timeout on a request.
+func NewIssueRemoveIssueDependenciesParamsWithTimeout(timeout time.Duration) *IssueRemoveIssueDependenciesParams {
+	return &IssueRemoveIssueDependenciesParams{
+		timeout: timeout,
+	}
+}
+
+// NewIssueRemoveIssueDependenciesParamsWithContext creates a new IssueRemoveIssueDependenciesParams object
+// with the ability to set a context for a request.
+func NewIssueRemoveIssueDependenciesParamsWithContext(ctx context.Context) *IssueRemoveIssueDependenciesParams {
+	return &IssueRemoveIssueDependenciesParams{
+		Context: ctx,
+	}
+}
+
+// NewIssueRemoveIssueDependenciesParamsWithHTTPClient creates a new IssueRemoveIssueDependenciesParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewIssueRemoveIssueDependenciesParamsWithHTTPClient(client *http.Client) *IssueRemoveIssueDependenciesParams {
+	return &IssueRemoveIssueDependenciesParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+IssueRemoveIssueDependenciesParams contains all the parameters to send to the API endpoint
+
+	for the issue remove issue dependencies operation.
+
+	Typically these are written to a http.Request.
+*/
+type IssueRemoveIssueDependenciesParams struct {
+
+	// Body.
+	Body *models.IssueMeta
+
+	/* Index.
+
+	   index of the issue
+	*/
+	Index string
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the issue remove issue dependencies params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueRemoveIssueDependenciesParams) WithDefaults() *IssueRemoveIssueDependenciesParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the issue remove issue dependencies params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueRemoveIssueDependenciesParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the issue remove issue dependencies params
+func (o *IssueRemoveIssueDependenciesParams) WithTimeout(timeout time.Duration) *IssueRemoveIssueDependenciesParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the issue remove issue dependencies params
+func (o *IssueRemoveIssueDependenciesParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the issue remove issue dependencies params
+func (o *IssueRemoveIssueDependenciesParams) WithContext(ctx context.Context) *IssueRemoveIssueDependenciesParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the issue remove issue dependencies params
+func (o *IssueRemoveIssueDependenciesParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the issue remove issue dependencies params
+func (o *IssueRemoveIssueDependenciesParams) WithHTTPClient(client *http.Client) *IssueRemoveIssueDependenciesParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the issue remove issue dependencies params
+func (o *IssueRemoveIssueDependenciesParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the issue remove issue dependencies params
+func (o *IssueRemoveIssueDependenciesParams) WithBody(body *models.IssueMeta) *IssueRemoveIssueDependenciesParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the issue remove issue dependencies params
+func (o *IssueRemoveIssueDependenciesParams) SetBody(body *models.IssueMeta) {
+	o.Body = body
+}
+
+// WithIndex adds the index to the issue remove issue dependencies params
+func (o *IssueRemoveIssueDependenciesParams) WithIndex(index string) *IssueRemoveIssueDependenciesParams {
+	o.SetIndex(index)
+	return o
+}
+
+// SetIndex adds the index to the issue remove issue dependencies params
+func (o *IssueRemoveIssueDependenciesParams) SetIndex(index string) {
+	o.Index = index
+}
+
+// WithOwner adds the owner to the issue remove issue dependencies params
+func (o *IssueRemoveIssueDependenciesParams) WithOwner(owner string) *IssueRemoveIssueDependenciesParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the issue remove issue dependencies params
+func (o *IssueRemoveIssueDependenciesParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the issue remove issue dependencies params
+func (o *IssueRemoveIssueDependenciesParams) WithRepo(repo string) *IssueRemoveIssueDependenciesParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the issue remove issue dependencies params
+func (o *IssueRemoveIssueDependenciesParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *IssueRemoveIssueDependenciesParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	// path param index
+	if err := r.SetPathParam("index", o.Index); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_remove_issue_dependencies_responses.go b/bots-common/gitea-generated/client/issue/issue_remove_issue_dependencies_responses.go
new file mode 100644
index 0000000..ebb70fb
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_remove_issue_dependencies_responses.go
@@ -0,0 +1,246 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// IssueRemoveIssueDependenciesReader is a Reader for the IssueRemoveIssueDependencies structure.
+type IssueRemoveIssueDependenciesReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *IssueRemoveIssueDependenciesReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewIssueRemoveIssueDependenciesOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewIssueRemoveIssueDependenciesNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 423:
+		result := NewIssueRemoveIssueDependenciesLocked()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[DELETE /repos/{owner}/{repo}/issues/{index}/dependencies] issueRemoveIssueDependencies", response, response.Code())
+	}
+}
+
+// NewIssueRemoveIssueDependenciesOK creates a IssueRemoveIssueDependenciesOK with default headers values
+func NewIssueRemoveIssueDependenciesOK() *IssueRemoveIssueDependenciesOK {
+	return &IssueRemoveIssueDependenciesOK{}
+}
+
+/*
+IssueRemoveIssueDependenciesOK describes a response with status code 200, with default header values.
+
+Issue
+*/
+type IssueRemoveIssueDependenciesOK struct {
+	Payload *models.Issue
+}
+
+// IsSuccess returns true when this issue remove issue dependencies o k response has a 2xx status code
+func (o *IssueRemoveIssueDependenciesOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this issue remove issue dependencies o k response has a 3xx status code
+func (o *IssueRemoveIssueDependenciesOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue remove issue dependencies o k response has a 4xx status code
+func (o *IssueRemoveIssueDependenciesOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this issue remove issue dependencies o k response has a 5xx status code
+func (o *IssueRemoveIssueDependenciesOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue remove issue dependencies o k response a status code equal to that given
+func (o *IssueRemoveIssueDependenciesOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the issue remove issue dependencies o k response
+func (o *IssueRemoveIssueDependenciesOK) Code() int {
+	return 200
+}
+
+func (o *IssueRemoveIssueDependenciesOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/{index}/dependencies][%d] issueRemoveIssueDependenciesOK %s", 200, payload)
+}
+
+func (o *IssueRemoveIssueDependenciesOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/{index}/dependencies][%d] issueRemoveIssueDependenciesOK %s", 200, payload)
+}
+
+func (o *IssueRemoveIssueDependenciesOK) GetPayload() *models.Issue {
+	return o.Payload
+}
+
+func (o *IssueRemoveIssueDependenciesOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.Issue)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewIssueRemoveIssueDependenciesNotFound creates a IssueRemoveIssueDependenciesNotFound with default headers values
+func NewIssueRemoveIssueDependenciesNotFound() *IssueRemoveIssueDependenciesNotFound {
+	return &IssueRemoveIssueDependenciesNotFound{}
+}
+
+/*
+IssueRemoveIssueDependenciesNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type IssueRemoveIssueDependenciesNotFound struct {
+}
+
+// IsSuccess returns true when this issue remove issue dependencies not found response has a 2xx status code
+func (o *IssueRemoveIssueDependenciesNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue remove issue dependencies not found response has a 3xx status code
+func (o *IssueRemoveIssueDependenciesNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue remove issue dependencies not found response has a 4xx status code
+func (o *IssueRemoveIssueDependenciesNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue remove issue dependencies not found response has a 5xx status code
+func (o *IssueRemoveIssueDependenciesNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue remove issue dependencies not found response a status code equal to that given
+func (o *IssueRemoveIssueDependenciesNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the issue remove issue dependencies not found response
+func (o *IssueRemoveIssueDependenciesNotFound) Code() int {
+	return 404
+}
+
+func (o *IssueRemoveIssueDependenciesNotFound) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/{index}/dependencies][%d] issueRemoveIssueDependenciesNotFound", 404)
+}
+
+func (o *IssueRemoveIssueDependenciesNotFound) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/{index}/dependencies][%d] issueRemoveIssueDependenciesNotFound", 404)
+}
+
+func (o *IssueRemoveIssueDependenciesNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewIssueRemoveIssueDependenciesLocked creates a IssueRemoveIssueDependenciesLocked with default headers values
+func NewIssueRemoveIssueDependenciesLocked() *IssueRemoveIssueDependenciesLocked {
+	return &IssueRemoveIssueDependenciesLocked{}
+}
+
+/*
+IssueRemoveIssueDependenciesLocked describes a response with status code 423, with default header values.
+
+APIRepoArchivedError is an error that is raised when an archived repo should be modified
+*/
+type IssueRemoveIssueDependenciesLocked struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this issue remove issue dependencies locked response has a 2xx status code
+func (o *IssueRemoveIssueDependenciesLocked) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue remove issue dependencies locked response has a 3xx status code
+func (o *IssueRemoveIssueDependenciesLocked) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue remove issue dependencies locked response has a 4xx status code
+func (o *IssueRemoveIssueDependenciesLocked) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue remove issue dependencies locked response has a 5xx status code
+func (o *IssueRemoveIssueDependenciesLocked) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue remove issue dependencies locked response a status code equal to that given
+func (o *IssueRemoveIssueDependenciesLocked) IsCode(code int) bool {
+	return code == 423
+}
+
+// Code gets the status code for the issue remove issue dependencies locked response
+func (o *IssueRemoveIssueDependenciesLocked) Code() int {
+	return 423
+}
+
+func (o *IssueRemoveIssueDependenciesLocked) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/{index}/dependencies][%d] issueRemoveIssueDependenciesLocked", 423)
+}
+
+func (o *IssueRemoveIssueDependenciesLocked) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/{index}/dependencies][%d] issueRemoveIssueDependenciesLocked", 423)
+}
+
+func (o *IssueRemoveIssueDependenciesLocked) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_remove_label_parameters.go b/bots-common/gitea-generated/client/issue/issue_remove_label_parameters.go
new file mode 100644
index 0000000..397b476
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_remove_label_parameters.go
@@ -0,0 +1,222 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewIssueRemoveLabelParams creates a new IssueRemoveLabelParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewIssueRemoveLabelParams() *IssueRemoveLabelParams {
+	return &IssueRemoveLabelParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewIssueRemoveLabelParamsWithTimeout creates a new IssueRemoveLabelParams object
+// with the ability to set a timeout on a request.
+func NewIssueRemoveLabelParamsWithTimeout(timeout time.Duration) *IssueRemoveLabelParams {
+	return &IssueRemoveLabelParams{
+		timeout: timeout,
+	}
+}
+
+// NewIssueRemoveLabelParamsWithContext creates a new IssueRemoveLabelParams object
+// with the ability to set a context for a request.
+func NewIssueRemoveLabelParamsWithContext(ctx context.Context) *IssueRemoveLabelParams {
+	return &IssueRemoveLabelParams{
+		Context: ctx,
+	}
+}
+
+// NewIssueRemoveLabelParamsWithHTTPClient creates a new IssueRemoveLabelParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewIssueRemoveLabelParamsWithHTTPClient(client *http.Client) *IssueRemoveLabelParams {
+	return &IssueRemoveLabelParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+IssueRemoveLabelParams contains all the parameters to send to the API endpoint
+
+	for the issue remove label operation.
+
+	Typically these are written to a http.Request.
+*/
+type IssueRemoveLabelParams struct {
+
+	/* ID.
+
+	   id of the label to remove
+
+	   Format: int64
+	*/
+	ID int64
+
+	/* Index.
+
+	   index of the issue
+
+	   Format: int64
+	*/
+	Index int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the issue remove label params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueRemoveLabelParams) WithDefaults() *IssueRemoveLabelParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the issue remove label params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueRemoveLabelParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the issue remove label params
+func (o *IssueRemoveLabelParams) WithTimeout(timeout time.Duration) *IssueRemoveLabelParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the issue remove label params
+func (o *IssueRemoveLabelParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the issue remove label params
+func (o *IssueRemoveLabelParams) WithContext(ctx context.Context) *IssueRemoveLabelParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the issue remove label params
+func (o *IssueRemoveLabelParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the issue remove label params
+func (o *IssueRemoveLabelParams) WithHTTPClient(client *http.Client) *IssueRemoveLabelParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the issue remove label params
+func (o *IssueRemoveLabelParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithID adds the id to the issue remove label params
+func (o *IssueRemoveLabelParams) WithID(id int64) *IssueRemoveLabelParams {
+	o.SetID(id)
+	return o
+}
+
+// SetID adds the id to the issue remove label params
+func (o *IssueRemoveLabelParams) SetID(id int64) {
+	o.ID = id
+}
+
+// WithIndex adds the index to the issue remove label params
+func (o *IssueRemoveLabelParams) WithIndex(index int64) *IssueRemoveLabelParams {
+	o.SetIndex(index)
+	return o
+}
+
+// SetIndex adds the index to the issue remove label params
+func (o *IssueRemoveLabelParams) SetIndex(index int64) {
+	o.Index = index
+}
+
+// WithOwner adds the owner to the issue remove label params
+func (o *IssueRemoveLabelParams) WithOwner(owner string) *IssueRemoveLabelParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the issue remove label params
+func (o *IssueRemoveLabelParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the issue remove label params
+func (o *IssueRemoveLabelParams) WithRepo(repo string) *IssueRemoveLabelParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the issue remove label params
+func (o *IssueRemoveLabelParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *IssueRemoveLabelParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param id
+	if err := r.SetPathParam("id", swag.FormatInt64(o.ID)); err != nil {
+		return err
+	}
+
+	// path param index
+	if err := r.SetPathParam("index", swag.FormatInt64(o.Index)); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_remove_label_responses.go b/bots-common/gitea-generated/client/issue/issue_remove_label_responses.go
new file mode 100644
index 0000000..8d6ec0b
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_remove_label_responses.go
@@ -0,0 +1,306 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// IssueRemoveLabelReader is a Reader for the IssueRemoveLabel structure.
+type IssueRemoveLabelReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *IssueRemoveLabelReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewIssueRemoveLabelNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 403:
+		result := NewIssueRemoveLabelForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewIssueRemoveLabelNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 422:
+		result := NewIssueRemoveLabelUnprocessableEntity()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[DELETE /repos/{owner}/{repo}/issues/{index}/labels/{id}] issueRemoveLabel", response, response.Code())
+	}
+}
+
+// NewIssueRemoveLabelNoContent creates a IssueRemoveLabelNoContent with default headers values
+func NewIssueRemoveLabelNoContent() *IssueRemoveLabelNoContent {
+	return &IssueRemoveLabelNoContent{}
+}
+
+/*
+IssueRemoveLabelNoContent describes a response with status code 204, with default header values.
+
+APIEmpty is an empty response
+*/
+type IssueRemoveLabelNoContent struct {
+}
+
+// IsSuccess returns true when this issue remove label no content response has a 2xx status code
+func (o *IssueRemoveLabelNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this issue remove label no content response has a 3xx status code
+func (o *IssueRemoveLabelNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue remove label no content response has a 4xx status code
+func (o *IssueRemoveLabelNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this issue remove label no content response has a 5xx status code
+func (o *IssueRemoveLabelNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue remove label no content response a status code equal to that given
+func (o *IssueRemoveLabelNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the issue remove label no content response
+func (o *IssueRemoveLabelNoContent) Code() int {
+	return 204
+}
+
+func (o *IssueRemoveLabelNoContent) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/{index}/labels/{id}][%d] issueRemoveLabelNoContent", 204)
+}
+
+func (o *IssueRemoveLabelNoContent) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/{index}/labels/{id}][%d] issueRemoveLabelNoContent", 204)
+}
+
+func (o *IssueRemoveLabelNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewIssueRemoveLabelForbidden creates a IssueRemoveLabelForbidden with default headers values
+func NewIssueRemoveLabelForbidden() *IssueRemoveLabelForbidden {
+	return &IssueRemoveLabelForbidden{}
+}
+
+/*
+IssueRemoveLabelForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type IssueRemoveLabelForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this issue remove label forbidden response has a 2xx status code
+func (o *IssueRemoveLabelForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue remove label forbidden response has a 3xx status code
+func (o *IssueRemoveLabelForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue remove label forbidden response has a 4xx status code
+func (o *IssueRemoveLabelForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue remove label forbidden response has a 5xx status code
+func (o *IssueRemoveLabelForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue remove label forbidden response a status code equal to that given
+func (o *IssueRemoveLabelForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the issue remove label forbidden response
+func (o *IssueRemoveLabelForbidden) Code() int {
+	return 403
+}
+
+func (o *IssueRemoveLabelForbidden) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/{index}/labels/{id}][%d] issueRemoveLabelForbidden", 403)
+}
+
+func (o *IssueRemoveLabelForbidden) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/{index}/labels/{id}][%d] issueRemoveLabelForbidden", 403)
+}
+
+func (o *IssueRemoveLabelForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewIssueRemoveLabelNotFound creates a IssueRemoveLabelNotFound with default headers values
+func NewIssueRemoveLabelNotFound() *IssueRemoveLabelNotFound {
+	return &IssueRemoveLabelNotFound{}
+}
+
+/*
+IssueRemoveLabelNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type IssueRemoveLabelNotFound struct {
+}
+
+// IsSuccess returns true when this issue remove label not found response has a 2xx status code
+func (o *IssueRemoveLabelNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue remove label not found response has a 3xx status code
+func (o *IssueRemoveLabelNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue remove label not found response has a 4xx status code
+func (o *IssueRemoveLabelNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue remove label not found response has a 5xx status code
+func (o *IssueRemoveLabelNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue remove label not found response a status code equal to that given
+func (o *IssueRemoveLabelNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the issue remove label not found response
+func (o *IssueRemoveLabelNotFound) Code() int {
+	return 404
+}
+
+func (o *IssueRemoveLabelNotFound) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/{index}/labels/{id}][%d] issueRemoveLabelNotFound", 404)
+}
+
+func (o *IssueRemoveLabelNotFound) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/{index}/labels/{id}][%d] issueRemoveLabelNotFound", 404)
+}
+
+func (o *IssueRemoveLabelNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewIssueRemoveLabelUnprocessableEntity creates a IssueRemoveLabelUnprocessableEntity with default headers values
+func NewIssueRemoveLabelUnprocessableEntity() *IssueRemoveLabelUnprocessableEntity {
+	return &IssueRemoveLabelUnprocessableEntity{}
+}
+
+/*
+IssueRemoveLabelUnprocessableEntity describes a response with status code 422, with default header values.
+
+APIValidationError is error format response related to input validation
+*/
+type IssueRemoveLabelUnprocessableEntity struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this issue remove label unprocessable entity response has a 2xx status code
+func (o *IssueRemoveLabelUnprocessableEntity) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue remove label unprocessable entity response has a 3xx status code
+func (o *IssueRemoveLabelUnprocessableEntity) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue remove label unprocessable entity response has a 4xx status code
+func (o *IssueRemoveLabelUnprocessableEntity) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue remove label unprocessable entity response has a 5xx status code
+func (o *IssueRemoveLabelUnprocessableEntity) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue remove label unprocessable entity response a status code equal to that given
+func (o *IssueRemoveLabelUnprocessableEntity) IsCode(code int) bool {
+	return code == 422
+}
+
+// Code gets the status code for the issue remove label unprocessable entity response
+func (o *IssueRemoveLabelUnprocessableEntity) Code() int {
+	return 422
+}
+
+func (o *IssueRemoveLabelUnprocessableEntity) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/{index}/labels/{id}][%d] issueRemoveLabelUnprocessableEntity", 422)
+}
+
+func (o *IssueRemoveLabelUnprocessableEntity) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/{index}/labels/{id}][%d] issueRemoveLabelUnprocessableEntity", 422)
+}
+
+func (o *IssueRemoveLabelUnprocessableEntity) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_replace_labels_parameters.go b/bots-common/gitea-generated/client/issue/issue_replace_labels_parameters.go
new file mode 100644
index 0000000..bc15dca
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_replace_labels_parameters.go
@@ -0,0 +1,219 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewIssueReplaceLabelsParams creates a new IssueReplaceLabelsParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewIssueReplaceLabelsParams() *IssueReplaceLabelsParams {
+	return &IssueReplaceLabelsParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewIssueReplaceLabelsParamsWithTimeout creates a new IssueReplaceLabelsParams object
+// with the ability to set a timeout on a request.
+func NewIssueReplaceLabelsParamsWithTimeout(timeout time.Duration) *IssueReplaceLabelsParams {
+	return &IssueReplaceLabelsParams{
+		timeout: timeout,
+	}
+}
+
+// NewIssueReplaceLabelsParamsWithContext creates a new IssueReplaceLabelsParams object
+// with the ability to set a context for a request.
+func NewIssueReplaceLabelsParamsWithContext(ctx context.Context) *IssueReplaceLabelsParams {
+	return &IssueReplaceLabelsParams{
+		Context: ctx,
+	}
+}
+
+// NewIssueReplaceLabelsParamsWithHTTPClient creates a new IssueReplaceLabelsParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewIssueReplaceLabelsParamsWithHTTPClient(client *http.Client) *IssueReplaceLabelsParams {
+	return &IssueReplaceLabelsParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+IssueReplaceLabelsParams contains all the parameters to send to the API endpoint
+
+	for the issue replace labels operation.
+
+	Typically these are written to a http.Request.
+*/
+type IssueReplaceLabelsParams struct {
+
+	// Body.
+	Body *models.IssueLabelsOption
+
+	/* Index.
+
+	   index of the issue
+
+	   Format: int64
+	*/
+	Index int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the issue replace labels params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueReplaceLabelsParams) WithDefaults() *IssueReplaceLabelsParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the issue replace labels params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueReplaceLabelsParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the issue replace labels params
+func (o *IssueReplaceLabelsParams) WithTimeout(timeout time.Duration) *IssueReplaceLabelsParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the issue replace labels params
+func (o *IssueReplaceLabelsParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the issue replace labels params
+func (o *IssueReplaceLabelsParams) WithContext(ctx context.Context) *IssueReplaceLabelsParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the issue replace labels params
+func (o *IssueReplaceLabelsParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the issue replace labels params
+func (o *IssueReplaceLabelsParams) WithHTTPClient(client *http.Client) *IssueReplaceLabelsParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the issue replace labels params
+func (o *IssueReplaceLabelsParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the issue replace labels params
+func (o *IssueReplaceLabelsParams) WithBody(body *models.IssueLabelsOption) *IssueReplaceLabelsParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the issue replace labels params
+func (o *IssueReplaceLabelsParams) SetBody(body *models.IssueLabelsOption) {
+	o.Body = body
+}
+
+// WithIndex adds the index to the issue replace labels params
+func (o *IssueReplaceLabelsParams) WithIndex(index int64) *IssueReplaceLabelsParams {
+	o.SetIndex(index)
+	return o
+}
+
+// SetIndex adds the index to the issue replace labels params
+func (o *IssueReplaceLabelsParams) SetIndex(index int64) {
+	o.Index = index
+}
+
+// WithOwner adds the owner to the issue replace labels params
+func (o *IssueReplaceLabelsParams) WithOwner(owner string) *IssueReplaceLabelsParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the issue replace labels params
+func (o *IssueReplaceLabelsParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the issue replace labels params
+func (o *IssueReplaceLabelsParams) WithRepo(repo string) *IssueReplaceLabelsParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the issue replace labels params
+func (o *IssueReplaceLabelsParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *IssueReplaceLabelsParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	// path param index
+	if err := r.SetPathParam("index", swag.FormatInt64(o.Index)); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_replace_labels_responses.go b/bots-common/gitea-generated/client/issue/issue_replace_labels_responses.go
new file mode 100644
index 0000000..a44d37b
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_replace_labels_responses.go
@@ -0,0 +1,244 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// IssueReplaceLabelsReader is a Reader for the IssueReplaceLabels structure.
+type IssueReplaceLabelsReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *IssueReplaceLabelsReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewIssueReplaceLabelsOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 403:
+		result := NewIssueReplaceLabelsForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewIssueReplaceLabelsNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[PUT /repos/{owner}/{repo}/issues/{index}/labels] issueReplaceLabels", response, response.Code())
+	}
+}
+
+// NewIssueReplaceLabelsOK creates a IssueReplaceLabelsOK with default headers values
+func NewIssueReplaceLabelsOK() *IssueReplaceLabelsOK {
+	return &IssueReplaceLabelsOK{}
+}
+
+/*
+IssueReplaceLabelsOK describes a response with status code 200, with default header values.
+
+LabelList
+*/
+type IssueReplaceLabelsOK struct {
+	Payload []*models.Label
+}
+
+// IsSuccess returns true when this issue replace labels o k response has a 2xx status code
+func (o *IssueReplaceLabelsOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this issue replace labels o k response has a 3xx status code
+func (o *IssueReplaceLabelsOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue replace labels o k response has a 4xx status code
+func (o *IssueReplaceLabelsOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this issue replace labels o k response has a 5xx status code
+func (o *IssueReplaceLabelsOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue replace labels o k response a status code equal to that given
+func (o *IssueReplaceLabelsOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the issue replace labels o k response
+func (o *IssueReplaceLabelsOK) Code() int {
+	return 200
+}
+
+func (o *IssueReplaceLabelsOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[PUT /repos/{owner}/{repo}/issues/{index}/labels][%d] issueReplaceLabelsOK %s", 200, payload)
+}
+
+func (o *IssueReplaceLabelsOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[PUT /repos/{owner}/{repo}/issues/{index}/labels][%d] issueReplaceLabelsOK %s", 200, payload)
+}
+
+func (o *IssueReplaceLabelsOK) GetPayload() []*models.Label {
+	return o.Payload
+}
+
+func (o *IssueReplaceLabelsOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewIssueReplaceLabelsForbidden creates a IssueReplaceLabelsForbidden with default headers values
+func NewIssueReplaceLabelsForbidden() *IssueReplaceLabelsForbidden {
+	return &IssueReplaceLabelsForbidden{}
+}
+
+/*
+IssueReplaceLabelsForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type IssueReplaceLabelsForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this issue replace labels forbidden response has a 2xx status code
+func (o *IssueReplaceLabelsForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue replace labels forbidden response has a 3xx status code
+func (o *IssueReplaceLabelsForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue replace labels forbidden response has a 4xx status code
+func (o *IssueReplaceLabelsForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue replace labels forbidden response has a 5xx status code
+func (o *IssueReplaceLabelsForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue replace labels forbidden response a status code equal to that given
+func (o *IssueReplaceLabelsForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the issue replace labels forbidden response
+func (o *IssueReplaceLabelsForbidden) Code() int {
+	return 403
+}
+
+func (o *IssueReplaceLabelsForbidden) Error() string {
+	return fmt.Sprintf("[PUT /repos/{owner}/{repo}/issues/{index}/labels][%d] issueReplaceLabelsForbidden", 403)
+}
+
+func (o *IssueReplaceLabelsForbidden) String() string {
+	return fmt.Sprintf("[PUT /repos/{owner}/{repo}/issues/{index}/labels][%d] issueReplaceLabelsForbidden", 403)
+}
+
+func (o *IssueReplaceLabelsForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewIssueReplaceLabelsNotFound creates a IssueReplaceLabelsNotFound with default headers values
+func NewIssueReplaceLabelsNotFound() *IssueReplaceLabelsNotFound {
+	return &IssueReplaceLabelsNotFound{}
+}
+
+/*
+IssueReplaceLabelsNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type IssueReplaceLabelsNotFound struct {
+}
+
+// IsSuccess returns true when this issue replace labels not found response has a 2xx status code
+func (o *IssueReplaceLabelsNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue replace labels not found response has a 3xx status code
+func (o *IssueReplaceLabelsNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue replace labels not found response has a 4xx status code
+func (o *IssueReplaceLabelsNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue replace labels not found response has a 5xx status code
+func (o *IssueReplaceLabelsNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue replace labels not found response a status code equal to that given
+func (o *IssueReplaceLabelsNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the issue replace labels not found response
+func (o *IssueReplaceLabelsNotFound) Code() int {
+	return 404
+}
+
+func (o *IssueReplaceLabelsNotFound) Error() string {
+	return fmt.Sprintf("[PUT /repos/{owner}/{repo}/issues/{index}/labels][%d] issueReplaceLabelsNotFound", 404)
+}
+
+func (o *IssueReplaceLabelsNotFound) String() string {
+	return fmt.Sprintf("[PUT /repos/{owner}/{repo}/issues/{index}/labels][%d] issueReplaceLabelsNotFound", 404)
+}
+
+func (o *IssueReplaceLabelsNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_reset_time_parameters.go b/bots-common/gitea-generated/client/issue/issue_reset_time_parameters.go
new file mode 100644
index 0000000..b8b381d
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_reset_time_parameters.go
@@ -0,0 +1,198 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewIssueResetTimeParams creates a new IssueResetTimeParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewIssueResetTimeParams() *IssueResetTimeParams {
+	return &IssueResetTimeParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewIssueResetTimeParamsWithTimeout creates a new IssueResetTimeParams object
+// with the ability to set a timeout on a request.
+func NewIssueResetTimeParamsWithTimeout(timeout time.Duration) *IssueResetTimeParams {
+	return &IssueResetTimeParams{
+		timeout: timeout,
+	}
+}
+
+// NewIssueResetTimeParamsWithContext creates a new IssueResetTimeParams object
+// with the ability to set a context for a request.
+func NewIssueResetTimeParamsWithContext(ctx context.Context) *IssueResetTimeParams {
+	return &IssueResetTimeParams{
+		Context: ctx,
+	}
+}
+
+// NewIssueResetTimeParamsWithHTTPClient creates a new IssueResetTimeParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewIssueResetTimeParamsWithHTTPClient(client *http.Client) *IssueResetTimeParams {
+	return &IssueResetTimeParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+IssueResetTimeParams contains all the parameters to send to the API endpoint
+
+	for the issue reset time operation.
+
+	Typically these are written to a http.Request.
+*/
+type IssueResetTimeParams struct {
+
+	/* Index.
+
+	   index of the issue to add tracked time to
+
+	   Format: int64
+	*/
+	Index int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the issue reset time params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueResetTimeParams) WithDefaults() *IssueResetTimeParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the issue reset time params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueResetTimeParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the issue reset time params
+func (o *IssueResetTimeParams) WithTimeout(timeout time.Duration) *IssueResetTimeParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the issue reset time params
+func (o *IssueResetTimeParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the issue reset time params
+func (o *IssueResetTimeParams) WithContext(ctx context.Context) *IssueResetTimeParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the issue reset time params
+func (o *IssueResetTimeParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the issue reset time params
+func (o *IssueResetTimeParams) WithHTTPClient(client *http.Client) *IssueResetTimeParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the issue reset time params
+func (o *IssueResetTimeParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithIndex adds the index to the issue reset time params
+func (o *IssueResetTimeParams) WithIndex(index int64) *IssueResetTimeParams {
+	o.SetIndex(index)
+	return o
+}
+
+// SetIndex adds the index to the issue reset time params
+func (o *IssueResetTimeParams) SetIndex(index int64) {
+	o.Index = index
+}
+
+// WithOwner adds the owner to the issue reset time params
+func (o *IssueResetTimeParams) WithOwner(owner string) *IssueResetTimeParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the issue reset time params
+func (o *IssueResetTimeParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the issue reset time params
+func (o *IssueResetTimeParams) WithRepo(repo string) *IssueResetTimeParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the issue reset time params
+func (o *IssueResetTimeParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *IssueResetTimeParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param index
+	if err := r.SetPathParam("index", swag.FormatInt64(o.Index)); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_reset_time_responses.go b/bots-common/gitea-generated/client/issue/issue_reset_time_responses.go
new file mode 100644
index 0000000..649a35c
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_reset_time_responses.go
@@ -0,0 +1,306 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// IssueResetTimeReader is a Reader for the IssueResetTime structure.
+type IssueResetTimeReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *IssueResetTimeReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewIssueResetTimeNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 400:
+		result := NewIssueResetTimeBadRequest()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 403:
+		result := NewIssueResetTimeForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewIssueResetTimeNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[DELETE /repos/{owner}/{repo}/issues/{index}/times] issueResetTime", response, response.Code())
+	}
+}
+
+// NewIssueResetTimeNoContent creates a IssueResetTimeNoContent with default headers values
+func NewIssueResetTimeNoContent() *IssueResetTimeNoContent {
+	return &IssueResetTimeNoContent{}
+}
+
+/*
+IssueResetTimeNoContent describes a response with status code 204, with default header values.
+
+APIEmpty is an empty response
+*/
+type IssueResetTimeNoContent struct {
+}
+
+// IsSuccess returns true when this issue reset time no content response has a 2xx status code
+func (o *IssueResetTimeNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this issue reset time no content response has a 3xx status code
+func (o *IssueResetTimeNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue reset time no content response has a 4xx status code
+func (o *IssueResetTimeNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this issue reset time no content response has a 5xx status code
+func (o *IssueResetTimeNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue reset time no content response a status code equal to that given
+func (o *IssueResetTimeNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the issue reset time no content response
+func (o *IssueResetTimeNoContent) Code() int {
+	return 204
+}
+
+func (o *IssueResetTimeNoContent) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/{index}/times][%d] issueResetTimeNoContent", 204)
+}
+
+func (o *IssueResetTimeNoContent) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/{index}/times][%d] issueResetTimeNoContent", 204)
+}
+
+func (o *IssueResetTimeNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewIssueResetTimeBadRequest creates a IssueResetTimeBadRequest with default headers values
+func NewIssueResetTimeBadRequest() *IssueResetTimeBadRequest {
+	return &IssueResetTimeBadRequest{}
+}
+
+/*
+IssueResetTimeBadRequest describes a response with status code 400, with default header values.
+
+APIError is error format response
+*/
+type IssueResetTimeBadRequest struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this issue reset time bad request response has a 2xx status code
+func (o *IssueResetTimeBadRequest) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue reset time bad request response has a 3xx status code
+func (o *IssueResetTimeBadRequest) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue reset time bad request response has a 4xx status code
+func (o *IssueResetTimeBadRequest) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue reset time bad request response has a 5xx status code
+func (o *IssueResetTimeBadRequest) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue reset time bad request response a status code equal to that given
+func (o *IssueResetTimeBadRequest) IsCode(code int) bool {
+	return code == 400
+}
+
+// Code gets the status code for the issue reset time bad request response
+func (o *IssueResetTimeBadRequest) Code() int {
+	return 400
+}
+
+func (o *IssueResetTimeBadRequest) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/{index}/times][%d] issueResetTimeBadRequest", 400)
+}
+
+func (o *IssueResetTimeBadRequest) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/{index}/times][%d] issueResetTimeBadRequest", 400)
+}
+
+func (o *IssueResetTimeBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewIssueResetTimeForbidden creates a IssueResetTimeForbidden with default headers values
+func NewIssueResetTimeForbidden() *IssueResetTimeForbidden {
+	return &IssueResetTimeForbidden{}
+}
+
+/*
+IssueResetTimeForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type IssueResetTimeForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this issue reset time forbidden response has a 2xx status code
+func (o *IssueResetTimeForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue reset time forbidden response has a 3xx status code
+func (o *IssueResetTimeForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue reset time forbidden response has a 4xx status code
+func (o *IssueResetTimeForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue reset time forbidden response has a 5xx status code
+func (o *IssueResetTimeForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue reset time forbidden response a status code equal to that given
+func (o *IssueResetTimeForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the issue reset time forbidden response
+func (o *IssueResetTimeForbidden) Code() int {
+	return 403
+}
+
+func (o *IssueResetTimeForbidden) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/{index}/times][%d] issueResetTimeForbidden", 403)
+}
+
+func (o *IssueResetTimeForbidden) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/{index}/times][%d] issueResetTimeForbidden", 403)
+}
+
+func (o *IssueResetTimeForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewIssueResetTimeNotFound creates a IssueResetTimeNotFound with default headers values
+func NewIssueResetTimeNotFound() *IssueResetTimeNotFound {
+	return &IssueResetTimeNotFound{}
+}
+
+/*
+IssueResetTimeNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type IssueResetTimeNotFound struct {
+}
+
+// IsSuccess returns true when this issue reset time not found response has a 2xx status code
+func (o *IssueResetTimeNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue reset time not found response has a 3xx status code
+func (o *IssueResetTimeNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue reset time not found response has a 4xx status code
+func (o *IssueResetTimeNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue reset time not found response has a 5xx status code
+func (o *IssueResetTimeNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue reset time not found response a status code equal to that given
+func (o *IssueResetTimeNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the issue reset time not found response
+func (o *IssueResetTimeNotFound) Code() int {
+	return 404
+}
+
+func (o *IssueResetTimeNotFound) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/{index}/times][%d] issueResetTimeNotFound", 404)
+}
+
+func (o *IssueResetTimeNotFound) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/{index}/times][%d] issueResetTimeNotFound", 404)
+}
+
+func (o *IssueResetTimeNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_search_issues_parameters.go b/bots-common/gitea-generated/client/issue/issue_search_issues_parameters.go
new file mode 100644
index 0000000..9a1b9d1
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_search_issues_parameters.go
@@ -0,0 +1,714 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewIssueSearchIssuesParams creates a new IssueSearchIssuesParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewIssueSearchIssuesParams() *IssueSearchIssuesParams {
+	return &IssueSearchIssuesParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewIssueSearchIssuesParamsWithTimeout creates a new IssueSearchIssuesParams object
+// with the ability to set a timeout on a request.
+func NewIssueSearchIssuesParamsWithTimeout(timeout time.Duration) *IssueSearchIssuesParams {
+	return &IssueSearchIssuesParams{
+		timeout: timeout,
+	}
+}
+
+// NewIssueSearchIssuesParamsWithContext creates a new IssueSearchIssuesParams object
+// with the ability to set a context for a request.
+func NewIssueSearchIssuesParamsWithContext(ctx context.Context) *IssueSearchIssuesParams {
+	return &IssueSearchIssuesParams{
+		Context: ctx,
+	}
+}
+
+// NewIssueSearchIssuesParamsWithHTTPClient creates a new IssueSearchIssuesParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewIssueSearchIssuesParamsWithHTTPClient(client *http.Client) *IssueSearchIssuesParams {
+	return &IssueSearchIssuesParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+IssueSearchIssuesParams contains all the parameters to send to the API endpoint
+
+	for the issue search issues operation.
+
+	Typically these are written to a http.Request.
+*/
+type IssueSearchIssuesParams struct {
+
+	/* Assigned.
+
+	   filter (issues / pulls) assigned to you, default is false
+	*/
+	Assigned *bool
+
+	/* Before.
+
+	   Only show notifications updated before the given time. This is a timestamp in RFC 3339 format
+
+	   Format: date-time
+	*/
+	Before *strfmt.DateTime
+
+	/* Created.
+
+	   filter (issues / pulls) created by you, default is false
+	*/
+	Created *bool
+
+	/* Labels.
+
+	   comma separated list of labels. Fetch only issues that have any of this labels. Non existent labels are discarded
+	*/
+	Labels *string
+
+	/* Limit.
+
+	   page size of results
+	*/
+	Limit *int64
+
+	/* Mentioned.
+
+	   filter (issues / pulls) mentioning you, default is false
+	*/
+	Mentioned *bool
+
+	/* Milestones.
+
+	   comma separated list of milestone names. Fetch only issues that have any of this milestones. Non existent are discarded
+	*/
+	Milestones *string
+
+	/* Owner.
+
+	   filter by owner
+	*/
+	Owner *string
+
+	/* Page.
+
+	   page number of results to return (1-based)
+	*/
+	Page *int64
+
+	/* PriorityRepoID.
+
+	   repository to prioritize in the results
+
+	   Format: int64
+	*/
+	PriorityRepoID *int64
+
+	/* Q.
+
+	   search string
+	*/
+	Q *string
+
+	/* ReviewRequested.
+
+	   filter pulls requesting your review, default is false
+	*/
+	ReviewRequested *bool
+
+	/* Reviewed.
+
+	   filter pulls reviewed by you, default is false
+	*/
+	Reviewed *bool
+
+	/* Since.
+
+	   Only show notifications updated after the given time. This is a timestamp in RFC 3339 format
+
+	   Format: date-time
+	*/
+	Since *strfmt.DateTime
+
+	/* State.
+
+	   whether issue is open or closed
+	*/
+	State *string
+
+	/* Team.
+
+	   filter by team (requires organization owner parameter to be provided)
+	*/
+	Team *string
+
+	/* Type.
+
+	   filter by type (issues / pulls) if set
+	*/
+	Type *string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the issue search issues params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueSearchIssuesParams) WithDefaults() *IssueSearchIssuesParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the issue search issues params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueSearchIssuesParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the issue search issues params
+func (o *IssueSearchIssuesParams) WithTimeout(timeout time.Duration) *IssueSearchIssuesParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the issue search issues params
+func (o *IssueSearchIssuesParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the issue search issues params
+func (o *IssueSearchIssuesParams) WithContext(ctx context.Context) *IssueSearchIssuesParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the issue search issues params
+func (o *IssueSearchIssuesParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the issue search issues params
+func (o *IssueSearchIssuesParams) WithHTTPClient(client *http.Client) *IssueSearchIssuesParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the issue search issues params
+func (o *IssueSearchIssuesParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithAssigned adds the assigned to the issue search issues params
+func (o *IssueSearchIssuesParams) WithAssigned(assigned *bool) *IssueSearchIssuesParams {
+	o.SetAssigned(assigned)
+	return o
+}
+
+// SetAssigned adds the assigned to the issue search issues params
+func (o *IssueSearchIssuesParams) SetAssigned(assigned *bool) {
+	o.Assigned = assigned
+}
+
+// WithBefore adds the before to the issue search issues params
+func (o *IssueSearchIssuesParams) WithBefore(before *strfmt.DateTime) *IssueSearchIssuesParams {
+	o.SetBefore(before)
+	return o
+}
+
+// SetBefore adds the before to the issue search issues params
+func (o *IssueSearchIssuesParams) SetBefore(before *strfmt.DateTime) {
+	o.Before = before
+}
+
+// WithCreated adds the created to the issue search issues params
+func (o *IssueSearchIssuesParams) WithCreated(created *bool) *IssueSearchIssuesParams {
+	o.SetCreated(created)
+	return o
+}
+
+// SetCreated adds the created to the issue search issues params
+func (o *IssueSearchIssuesParams) SetCreated(created *bool) {
+	o.Created = created
+}
+
+// WithLabels adds the labels to the issue search issues params
+func (o *IssueSearchIssuesParams) WithLabels(labels *string) *IssueSearchIssuesParams {
+	o.SetLabels(labels)
+	return o
+}
+
+// SetLabels adds the labels to the issue search issues params
+func (o *IssueSearchIssuesParams) SetLabels(labels *string) {
+	o.Labels = labels
+}
+
+// WithLimit adds the limit to the issue search issues params
+func (o *IssueSearchIssuesParams) WithLimit(limit *int64) *IssueSearchIssuesParams {
+	o.SetLimit(limit)
+	return o
+}
+
+// SetLimit adds the limit to the issue search issues params
+func (o *IssueSearchIssuesParams) SetLimit(limit *int64) {
+	o.Limit = limit
+}
+
+// WithMentioned adds the mentioned to the issue search issues params
+func (o *IssueSearchIssuesParams) WithMentioned(mentioned *bool) *IssueSearchIssuesParams {
+	o.SetMentioned(mentioned)
+	return o
+}
+
+// SetMentioned adds the mentioned to the issue search issues params
+func (o *IssueSearchIssuesParams) SetMentioned(mentioned *bool) {
+	o.Mentioned = mentioned
+}
+
+// WithMilestones adds the milestones to the issue search issues params
+func (o *IssueSearchIssuesParams) WithMilestones(milestones *string) *IssueSearchIssuesParams {
+	o.SetMilestones(milestones)
+	return o
+}
+
+// SetMilestones adds the milestones to the issue search issues params
+func (o *IssueSearchIssuesParams) SetMilestones(milestones *string) {
+	o.Milestones = milestones
+}
+
+// WithOwner adds the owner to the issue search issues params
+func (o *IssueSearchIssuesParams) WithOwner(owner *string) *IssueSearchIssuesParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the issue search issues params
+func (o *IssueSearchIssuesParams) SetOwner(owner *string) {
+	o.Owner = owner
+}
+
+// WithPage adds the page to the issue search issues params
+func (o *IssueSearchIssuesParams) WithPage(page *int64) *IssueSearchIssuesParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the issue search issues params
+func (o *IssueSearchIssuesParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WithPriorityRepoID adds the priorityRepoID to the issue search issues params
+func (o *IssueSearchIssuesParams) WithPriorityRepoID(priorityRepoID *int64) *IssueSearchIssuesParams {
+	o.SetPriorityRepoID(priorityRepoID)
+	return o
+}
+
+// SetPriorityRepoID adds the priorityRepoId to the issue search issues params
+func (o *IssueSearchIssuesParams) SetPriorityRepoID(priorityRepoID *int64) {
+	o.PriorityRepoID = priorityRepoID
+}
+
+// WithQ adds the q to the issue search issues params
+func (o *IssueSearchIssuesParams) WithQ(q *string) *IssueSearchIssuesParams {
+	o.SetQ(q)
+	return o
+}
+
+// SetQ adds the q to the issue search issues params
+func (o *IssueSearchIssuesParams) SetQ(q *string) {
+	o.Q = q
+}
+
+// WithReviewRequested adds the reviewRequested to the issue search issues params
+func (o *IssueSearchIssuesParams) WithReviewRequested(reviewRequested *bool) *IssueSearchIssuesParams {
+	o.SetReviewRequested(reviewRequested)
+	return o
+}
+
+// SetReviewRequested adds the reviewRequested to the issue search issues params
+func (o *IssueSearchIssuesParams) SetReviewRequested(reviewRequested *bool) {
+	o.ReviewRequested = reviewRequested
+}
+
+// WithReviewed adds the reviewed to the issue search issues params
+func (o *IssueSearchIssuesParams) WithReviewed(reviewed *bool) *IssueSearchIssuesParams {
+	o.SetReviewed(reviewed)
+	return o
+}
+
+// SetReviewed adds the reviewed to the issue search issues params
+func (o *IssueSearchIssuesParams) SetReviewed(reviewed *bool) {
+	o.Reviewed = reviewed
+}
+
+// WithSince adds the since to the issue search issues params
+func (o *IssueSearchIssuesParams) WithSince(since *strfmt.DateTime) *IssueSearchIssuesParams {
+	o.SetSince(since)
+	return o
+}
+
+// SetSince adds the since to the issue search issues params
+func (o *IssueSearchIssuesParams) SetSince(since *strfmt.DateTime) {
+	o.Since = since
+}
+
+// WithState adds the state to the issue search issues params
+func (o *IssueSearchIssuesParams) WithState(state *string) *IssueSearchIssuesParams {
+	o.SetState(state)
+	return o
+}
+
+// SetState adds the state to the issue search issues params
+func (o *IssueSearchIssuesParams) SetState(state *string) {
+	o.State = state
+}
+
+// WithTeam adds the team to the issue search issues params
+func (o *IssueSearchIssuesParams) WithTeam(team *string) *IssueSearchIssuesParams {
+	o.SetTeam(team)
+	return o
+}
+
+// SetTeam adds the team to the issue search issues params
+func (o *IssueSearchIssuesParams) SetTeam(team *string) {
+	o.Team = team
+}
+
+// WithType adds the typeVar to the issue search issues params
+func (o *IssueSearchIssuesParams) WithType(typeVar *string) *IssueSearchIssuesParams {
+	o.SetType(typeVar)
+	return o
+}
+
+// SetType adds the type to the issue search issues params
+func (o *IssueSearchIssuesParams) SetType(typeVar *string) {
+	o.Type = typeVar
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *IssueSearchIssuesParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.Assigned != nil {
+
+		// query param assigned
+		var qrAssigned bool
+
+		if o.Assigned != nil {
+			qrAssigned = *o.Assigned
+		}
+		qAssigned := swag.FormatBool(qrAssigned)
+		if qAssigned != "" {
+
+			if err := r.SetQueryParam("assigned", qAssigned); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Before != nil {
+
+		// query param before
+		var qrBefore strfmt.DateTime
+
+		if o.Before != nil {
+			qrBefore = *o.Before
+		}
+		qBefore := qrBefore.String()
+		if qBefore != "" {
+
+			if err := r.SetQueryParam("before", qBefore); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Created != nil {
+
+		// query param created
+		var qrCreated bool
+
+		if o.Created != nil {
+			qrCreated = *o.Created
+		}
+		qCreated := swag.FormatBool(qrCreated)
+		if qCreated != "" {
+
+			if err := r.SetQueryParam("created", qCreated); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Labels != nil {
+
+		// query param labels
+		var qrLabels string
+
+		if o.Labels != nil {
+			qrLabels = *o.Labels
+		}
+		qLabels := qrLabels
+		if qLabels != "" {
+
+			if err := r.SetQueryParam("labels", qLabels); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Limit != nil {
+
+		// query param limit
+		var qrLimit int64
+
+		if o.Limit != nil {
+			qrLimit = *o.Limit
+		}
+		qLimit := swag.FormatInt64(qrLimit)
+		if qLimit != "" {
+
+			if err := r.SetQueryParam("limit", qLimit); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Mentioned != nil {
+
+		// query param mentioned
+		var qrMentioned bool
+
+		if o.Mentioned != nil {
+			qrMentioned = *o.Mentioned
+		}
+		qMentioned := swag.FormatBool(qrMentioned)
+		if qMentioned != "" {
+
+			if err := r.SetQueryParam("mentioned", qMentioned); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Milestones != nil {
+
+		// query param milestones
+		var qrMilestones string
+
+		if o.Milestones != nil {
+			qrMilestones = *o.Milestones
+		}
+		qMilestones := qrMilestones
+		if qMilestones != "" {
+
+			if err := r.SetQueryParam("milestones", qMilestones); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Owner != nil {
+
+		// query param owner
+		var qrOwner string
+
+		if o.Owner != nil {
+			qrOwner = *o.Owner
+		}
+		qOwner := qrOwner
+		if qOwner != "" {
+
+			if err := r.SetQueryParam("owner", qOwner); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.PriorityRepoID != nil {
+
+		// query param priority_repo_id
+		var qrPriorityRepoID int64
+
+		if o.PriorityRepoID != nil {
+			qrPriorityRepoID = *o.PriorityRepoID
+		}
+		qPriorityRepoID := swag.FormatInt64(qrPriorityRepoID)
+		if qPriorityRepoID != "" {
+
+			if err := r.SetQueryParam("priority_repo_id", qPriorityRepoID); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Q != nil {
+
+		// query param q
+		var qrQ string
+
+		if o.Q != nil {
+			qrQ = *o.Q
+		}
+		qQ := qrQ
+		if qQ != "" {
+
+			if err := r.SetQueryParam("q", qQ); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.ReviewRequested != nil {
+
+		// query param review_requested
+		var qrReviewRequested bool
+
+		if o.ReviewRequested != nil {
+			qrReviewRequested = *o.ReviewRequested
+		}
+		qReviewRequested := swag.FormatBool(qrReviewRequested)
+		if qReviewRequested != "" {
+
+			if err := r.SetQueryParam("review_requested", qReviewRequested); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Reviewed != nil {
+
+		// query param reviewed
+		var qrReviewed bool
+
+		if o.Reviewed != nil {
+			qrReviewed = *o.Reviewed
+		}
+		qReviewed := swag.FormatBool(qrReviewed)
+		if qReviewed != "" {
+
+			if err := r.SetQueryParam("reviewed", qReviewed); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Since != nil {
+
+		// query param since
+		var qrSince strfmt.DateTime
+
+		if o.Since != nil {
+			qrSince = *o.Since
+		}
+		qSince := qrSince.String()
+		if qSince != "" {
+
+			if err := r.SetQueryParam("since", qSince); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.State != nil {
+
+		// query param state
+		var qrState string
+
+		if o.State != nil {
+			qrState = *o.State
+		}
+		qState := qrState
+		if qState != "" {
+
+			if err := r.SetQueryParam("state", qState); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Team != nil {
+
+		// query param team
+		var qrTeam string
+
+		if o.Team != nil {
+			qrTeam = *o.Team
+		}
+		qTeam := qrTeam
+		if qTeam != "" {
+
+			if err := r.SetQueryParam("team", qTeam); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Type != nil {
+
+		// query param type
+		var qrType string
+
+		if o.Type != nil {
+			qrType = *o.Type
+		}
+		qType := qrType
+		if qType != "" {
+
+			if err := r.SetQueryParam("type", qType); err != nil {
+				return err
+			}
+		}
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_search_issues_responses.go b/bots-common/gitea-generated/client/issue/issue_search_issues_responses.go
new file mode 100644
index 0000000..c85f208
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_search_issues_responses.go
@@ -0,0 +1,104 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// IssueSearchIssuesReader is a Reader for the IssueSearchIssues structure.
+type IssueSearchIssuesReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *IssueSearchIssuesReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewIssueSearchIssuesOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/issues/search] issueSearchIssues", response, response.Code())
+	}
+}
+
+// NewIssueSearchIssuesOK creates a IssueSearchIssuesOK with default headers values
+func NewIssueSearchIssuesOK() *IssueSearchIssuesOK {
+	return &IssueSearchIssuesOK{}
+}
+
+/*
+IssueSearchIssuesOK describes a response with status code 200, with default header values.
+
+IssueList
+*/
+type IssueSearchIssuesOK struct {
+	Payload []*models.Issue
+}
+
+// IsSuccess returns true when this issue search issues o k response has a 2xx status code
+func (o *IssueSearchIssuesOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this issue search issues o k response has a 3xx status code
+func (o *IssueSearchIssuesOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue search issues o k response has a 4xx status code
+func (o *IssueSearchIssuesOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this issue search issues o k response has a 5xx status code
+func (o *IssueSearchIssuesOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue search issues o k response a status code equal to that given
+func (o *IssueSearchIssuesOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the issue search issues o k response
+func (o *IssueSearchIssuesOK) Code() int {
+	return 200
+}
+
+func (o *IssueSearchIssuesOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/issues/search][%d] issueSearchIssuesOK %s", 200, payload)
+}
+
+func (o *IssueSearchIssuesOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/issues/search][%d] issueSearchIssuesOK %s", 200, payload)
+}
+
+func (o *IssueSearchIssuesOK) GetPayload() []*models.Issue {
+	return o.Payload
+}
+
+func (o *IssueSearchIssuesOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_start_stop_watch_parameters.go b/bots-common/gitea-generated/client/issue/issue_start_stop_watch_parameters.go
new file mode 100644
index 0000000..fa766f3
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_start_stop_watch_parameters.go
@@ -0,0 +1,198 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewIssueStartStopWatchParams creates a new IssueStartStopWatchParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewIssueStartStopWatchParams() *IssueStartStopWatchParams {
+	return &IssueStartStopWatchParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewIssueStartStopWatchParamsWithTimeout creates a new IssueStartStopWatchParams object
+// with the ability to set a timeout on a request.
+func NewIssueStartStopWatchParamsWithTimeout(timeout time.Duration) *IssueStartStopWatchParams {
+	return &IssueStartStopWatchParams{
+		timeout: timeout,
+	}
+}
+
+// NewIssueStartStopWatchParamsWithContext creates a new IssueStartStopWatchParams object
+// with the ability to set a context for a request.
+func NewIssueStartStopWatchParamsWithContext(ctx context.Context) *IssueStartStopWatchParams {
+	return &IssueStartStopWatchParams{
+		Context: ctx,
+	}
+}
+
+// NewIssueStartStopWatchParamsWithHTTPClient creates a new IssueStartStopWatchParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewIssueStartStopWatchParamsWithHTTPClient(client *http.Client) *IssueStartStopWatchParams {
+	return &IssueStartStopWatchParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+IssueStartStopWatchParams contains all the parameters to send to the API endpoint
+
+	for the issue start stop watch operation.
+
+	Typically these are written to a http.Request.
+*/
+type IssueStartStopWatchParams struct {
+
+	/* Index.
+
+	   index of the issue to create the stopwatch on
+
+	   Format: int64
+	*/
+	Index int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the issue start stop watch params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueStartStopWatchParams) WithDefaults() *IssueStartStopWatchParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the issue start stop watch params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueStartStopWatchParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the issue start stop watch params
+func (o *IssueStartStopWatchParams) WithTimeout(timeout time.Duration) *IssueStartStopWatchParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the issue start stop watch params
+func (o *IssueStartStopWatchParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the issue start stop watch params
+func (o *IssueStartStopWatchParams) WithContext(ctx context.Context) *IssueStartStopWatchParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the issue start stop watch params
+func (o *IssueStartStopWatchParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the issue start stop watch params
+func (o *IssueStartStopWatchParams) WithHTTPClient(client *http.Client) *IssueStartStopWatchParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the issue start stop watch params
+func (o *IssueStartStopWatchParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithIndex adds the index to the issue start stop watch params
+func (o *IssueStartStopWatchParams) WithIndex(index int64) *IssueStartStopWatchParams {
+	o.SetIndex(index)
+	return o
+}
+
+// SetIndex adds the index to the issue start stop watch params
+func (o *IssueStartStopWatchParams) SetIndex(index int64) {
+	o.Index = index
+}
+
+// WithOwner adds the owner to the issue start stop watch params
+func (o *IssueStartStopWatchParams) WithOwner(owner string) *IssueStartStopWatchParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the issue start stop watch params
+func (o *IssueStartStopWatchParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the issue start stop watch params
+func (o *IssueStartStopWatchParams) WithRepo(repo string) *IssueStartStopWatchParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the issue start stop watch params
+func (o *IssueStartStopWatchParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *IssueStartStopWatchParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param index
+	if err := r.SetPathParam("index", swag.FormatInt64(o.Index)); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_start_stop_watch_responses.go b/bots-common/gitea-generated/client/issue/issue_start_stop_watch_responses.go
new file mode 100644
index 0000000..433def4
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_start_stop_watch_responses.go
@@ -0,0 +1,274 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// IssueStartStopWatchReader is a Reader for the IssueStartStopWatch structure.
+type IssueStartStopWatchReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *IssueStartStopWatchReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 201:
+		result := NewIssueStartStopWatchCreated()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 403:
+		result := NewIssueStartStopWatchForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewIssueStartStopWatchNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 409:
+		result := NewIssueStartStopWatchConflict()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[POST /repos/{owner}/{repo}/issues/{index}/stopwatch/start] issueStartStopWatch", response, response.Code())
+	}
+}
+
+// NewIssueStartStopWatchCreated creates a IssueStartStopWatchCreated with default headers values
+func NewIssueStartStopWatchCreated() *IssueStartStopWatchCreated {
+	return &IssueStartStopWatchCreated{}
+}
+
+/*
+IssueStartStopWatchCreated describes a response with status code 201, with default header values.
+
+APIEmpty is an empty response
+*/
+type IssueStartStopWatchCreated struct {
+}
+
+// IsSuccess returns true when this issue start stop watch created response has a 2xx status code
+func (o *IssueStartStopWatchCreated) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this issue start stop watch created response has a 3xx status code
+func (o *IssueStartStopWatchCreated) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue start stop watch created response has a 4xx status code
+func (o *IssueStartStopWatchCreated) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this issue start stop watch created response has a 5xx status code
+func (o *IssueStartStopWatchCreated) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue start stop watch created response a status code equal to that given
+func (o *IssueStartStopWatchCreated) IsCode(code int) bool {
+	return code == 201
+}
+
+// Code gets the status code for the issue start stop watch created response
+func (o *IssueStartStopWatchCreated) Code() int {
+	return 201
+}
+
+func (o *IssueStartStopWatchCreated) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/{index}/stopwatch/start][%d] issueStartStopWatchCreated", 201)
+}
+
+func (o *IssueStartStopWatchCreated) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/{index}/stopwatch/start][%d] issueStartStopWatchCreated", 201)
+}
+
+func (o *IssueStartStopWatchCreated) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewIssueStartStopWatchForbidden creates a IssueStartStopWatchForbidden with default headers values
+func NewIssueStartStopWatchForbidden() *IssueStartStopWatchForbidden {
+	return &IssueStartStopWatchForbidden{}
+}
+
+/*
+IssueStartStopWatchForbidden describes a response with status code 403, with default header values.
+
+Not repo writer, user does not have rights to toggle stopwatch
+*/
+type IssueStartStopWatchForbidden struct {
+}
+
+// IsSuccess returns true when this issue start stop watch forbidden response has a 2xx status code
+func (o *IssueStartStopWatchForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue start stop watch forbidden response has a 3xx status code
+func (o *IssueStartStopWatchForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue start stop watch forbidden response has a 4xx status code
+func (o *IssueStartStopWatchForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue start stop watch forbidden response has a 5xx status code
+func (o *IssueStartStopWatchForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue start stop watch forbidden response a status code equal to that given
+func (o *IssueStartStopWatchForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the issue start stop watch forbidden response
+func (o *IssueStartStopWatchForbidden) Code() int {
+	return 403
+}
+
+func (o *IssueStartStopWatchForbidden) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/{index}/stopwatch/start][%d] issueStartStopWatchForbidden", 403)
+}
+
+func (o *IssueStartStopWatchForbidden) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/{index}/stopwatch/start][%d] issueStartStopWatchForbidden", 403)
+}
+
+func (o *IssueStartStopWatchForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewIssueStartStopWatchNotFound creates a IssueStartStopWatchNotFound with default headers values
+func NewIssueStartStopWatchNotFound() *IssueStartStopWatchNotFound {
+	return &IssueStartStopWatchNotFound{}
+}
+
+/*
+IssueStartStopWatchNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type IssueStartStopWatchNotFound struct {
+}
+
+// IsSuccess returns true when this issue start stop watch not found response has a 2xx status code
+func (o *IssueStartStopWatchNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue start stop watch not found response has a 3xx status code
+func (o *IssueStartStopWatchNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue start stop watch not found response has a 4xx status code
+func (o *IssueStartStopWatchNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue start stop watch not found response has a 5xx status code
+func (o *IssueStartStopWatchNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue start stop watch not found response a status code equal to that given
+func (o *IssueStartStopWatchNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the issue start stop watch not found response
+func (o *IssueStartStopWatchNotFound) Code() int {
+	return 404
+}
+
+func (o *IssueStartStopWatchNotFound) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/{index}/stopwatch/start][%d] issueStartStopWatchNotFound", 404)
+}
+
+func (o *IssueStartStopWatchNotFound) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/{index}/stopwatch/start][%d] issueStartStopWatchNotFound", 404)
+}
+
+func (o *IssueStartStopWatchNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewIssueStartStopWatchConflict creates a IssueStartStopWatchConflict with default headers values
+func NewIssueStartStopWatchConflict() *IssueStartStopWatchConflict {
+	return &IssueStartStopWatchConflict{}
+}
+
+/*
+IssueStartStopWatchConflict describes a response with status code 409, with default header values.
+
+Cannot start a stopwatch again if it already exists
+*/
+type IssueStartStopWatchConflict struct {
+}
+
+// IsSuccess returns true when this issue start stop watch conflict response has a 2xx status code
+func (o *IssueStartStopWatchConflict) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue start stop watch conflict response has a 3xx status code
+func (o *IssueStartStopWatchConflict) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue start stop watch conflict response has a 4xx status code
+func (o *IssueStartStopWatchConflict) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue start stop watch conflict response has a 5xx status code
+func (o *IssueStartStopWatchConflict) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue start stop watch conflict response a status code equal to that given
+func (o *IssueStartStopWatchConflict) IsCode(code int) bool {
+	return code == 409
+}
+
+// Code gets the status code for the issue start stop watch conflict response
+func (o *IssueStartStopWatchConflict) Code() int {
+	return 409
+}
+
+func (o *IssueStartStopWatchConflict) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/{index}/stopwatch/start][%d] issueStartStopWatchConflict", 409)
+}
+
+func (o *IssueStartStopWatchConflict) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/{index}/stopwatch/start][%d] issueStartStopWatchConflict", 409)
+}
+
+func (o *IssueStartStopWatchConflict) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_stop_stop_watch_parameters.go b/bots-common/gitea-generated/client/issue/issue_stop_stop_watch_parameters.go
new file mode 100644
index 0000000..e732ad4
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_stop_stop_watch_parameters.go
@@ -0,0 +1,198 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewIssueStopStopWatchParams creates a new IssueStopStopWatchParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewIssueStopStopWatchParams() *IssueStopStopWatchParams {
+	return &IssueStopStopWatchParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewIssueStopStopWatchParamsWithTimeout creates a new IssueStopStopWatchParams object
+// with the ability to set a timeout on a request.
+func NewIssueStopStopWatchParamsWithTimeout(timeout time.Duration) *IssueStopStopWatchParams {
+	return &IssueStopStopWatchParams{
+		timeout: timeout,
+	}
+}
+
+// NewIssueStopStopWatchParamsWithContext creates a new IssueStopStopWatchParams object
+// with the ability to set a context for a request.
+func NewIssueStopStopWatchParamsWithContext(ctx context.Context) *IssueStopStopWatchParams {
+	return &IssueStopStopWatchParams{
+		Context: ctx,
+	}
+}
+
+// NewIssueStopStopWatchParamsWithHTTPClient creates a new IssueStopStopWatchParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewIssueStopStopWatchParamsWithHTTPClient(client *http.Client) *IssueStopStopWatchParams {
+	return &IssueStopStopWatchParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+IssueStopStopWatchParams contains all the parameters to send to the API endpoint
+
+	for the issue stop stop watch operation.
+
+	Typically these are written to a http.Request.
+*/
+type IssueStopStopWatchParams struct {
+
+	/* Index.
+
+	   index of the issue to stop the stopwatch on
+
+	   Format: int64
+	*/
+	Index int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the issue stop stop watch params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueStopStopWatchParams) WithDefaults() *IssueStopStopWatchParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the issue stop stop watch params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueStopStopWatchParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the issue stop stop watch params
+func (o *IssueStopStopWatchParams) WithTimeout(timeout time.Duration) *IssueStopStopWatchParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the issue stop stop watch params
+func (o *IssueStopStopWatchParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the issue stop stop watch params
+func (o *IssueStopStopWatchParams) WithContext(ctx context.Context) *IssueStopStopWatchParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the issue stop stop watch params
+func (o *IssueStopStopWatchParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the issue stop stop watch params
+func (o *IssueStopStopWatchParams) WithHTTPClient(client *http.Client) *IssueStopStopWatchParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the issue stop stop watch params
+func (o *IssueStopStopWatchParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithIndex adds the index to the issue stop stop watch params
+func (o *IssueStopStopWatchParams) WithIndex(index int64) *IssueStopStopWatchParams {
+	o.SetIndex(index)
+	return o
+}
+
+// SetIndex adds the index to the issue stop stop watch params
+func (o *IssueStopStopWatchParams) SetIndex(index int64) {
+	o.Index = index
+}
+
+// WithOwner adds the owner to the issue stop stop watch params
+func (o *IssueStopStopWatchParams) WithOwner(owner string) *IssueStopStopWatchParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the issue stop stop watch params
+func (o *IssueStopStopWatchParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the issue stop stop watch params
+func (o *IssueStopStopWatchParams) WithRepo(repo string) *IssueStopStopWatchParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the issue stop stop watch params
+func (o *IssueStopStopWatchParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *IssueStopStopWatchParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param index
+	if err := r.SetPathParam("index", swag.FormatInt64(o.Index)); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_stop_stop_watch_responses.go b/bots-common/gitea-generated/client/issue/issue_stop_stop_watch_responses.go
new file mode 100644
index 0000000..cff9744
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_stop_stop_watch_responses.go
@@ -0,0 +1,274 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// IssueStopStopWatchReader is a Reader for the IssueStopStopWatch structure.
+type IssueStopStopWatchReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *IssueStopStopWatchReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 201:
+		result := NewIssueStopStopWatchCreated()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 403:
+		result := NewIssueStopStopWatchForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewIssueStopStopWatchNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 409:
+		result := NewIssueStopStopWatchConflict()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[POST /repos/{owner}/{repo}/issues/{index}/stopwatch/stop] issueStopStopWatch", response, response.Code())
+	}
+}
+
+// NewIssueStopStopWatchCreated creates a IssueStopStopWatchCreated with default headers values
+func NewIssueStopStopWatchCreated() *IssueStopStopWatchCreated {
+	return &IssueStopStopWatchCreated{}
+}
+
+/*
+IssueStopStopWatchCreated describes a response with status code 201, with default header values.
+
+APIEmpty is an empty response
+*/
+type IssueStopStopWatchCreated struct {
+}
+
+// IsSuccess returns true when this issue stop stop watch created response has a 2xx status code
+func (o *IssueStopStopWatchCreated) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this issue stop stop watch created response has a 3xx status code
+func (o *IssueStopStopWatchCreated) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue stop stop watch created response has a 4xx status code
+func (o *IssueStopStopWatchCreated) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this issue stop stop watch created response has a 5xx status code
+func (o *IssueStopStopWatchCreated) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue stop stop watch created response a status code equal to that given
+func (o *IssueStopStopWatchCreated) IsCode(code int) bool {
+	return code == 201
+}
+
+// Code gets the status code for the issue stop stop watch created response
+func (o *IssueStopStopWatchCreated) Code() int {
+	return 201
+}
+
+func (o *IssueStopStopWatchCreated) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/{index}/stopwatch/stop][%d] issueStopStopWatchCreated", 201)
+}
+
+func (o *IssueStopStopWatchCreated) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/{index}/stopwatch/stop][%d] issueStopStopWatchCreated", 201)
+}
+
+func (o *IssueStopStopWatchCreated) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewIssueStopStopWatchForbidden creates a IssueStopStopWatchForbidden with default headers values
+func NewIssueStopStopWatchForbidden() *IssueStopStopWatchForbidden {
+	return &IssueStopStopWatchForbidden{}
+}
+
+/*
+IssueStopStopWatchForbidden describes a response with status code 403, with default header values.
+
+Not repo writer, user does not have rights to toggle stopwatch
+*/
+type IssueStopStopWatchForbidden struct {
+}
+
+// IsSuccess returns true when this issue stop stop watch forbidden response has a 2xx status code
+func (o *IssueStopStopWatchForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue stop stop watch forbidden response has a 3xx status code
+func (o *IssueStopStopWatchForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue stop stop watch forbidden response has a 4xx status code
+func (o *IssueStopStopWatchForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue stop stop watch forbidden response has a 5xx status code
+func (o *IssueStopStopWatchForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue stop stop watch forbidden response a status code equal to that given
+func (o *IssueStopStopWatchForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the issue stop stop watch forbidden response
+func (o *IssueStopStopWatchForbidden) Code() int {
+	return 403
+}
+
+func (o *IssueStopStopWatchForbidden) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/{index}/stopwatch/stop][%d] issueStopStopWatchForbidden", 403)
+}
+
+func (o *IssueStopStopWatchForbidden) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/{index}/stopwatch/stop][%d] issueStopStopWatchForbidden", 403)
+}
+
+func (o *IssueStopStopWatchForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewIssueStopStopWatchNotFound creates a IssueStopStopWatchNotFound with default headers values
+func NewIssueStopStopWatchNotFound() *IssueStopStopWatchNotFound {
+	return &IssueStopStopWatchNotFound{}
+}
+
+/*
+IssueStopStopWatchNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type IssueStopStopWatchNotFound struct {
+}
+
+// IsSuccess returns true when this issue stop stop watch not found response has a 2xx status code
+func (o *IssueStopStopWatchNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue stop stop watch not found response has a 3xx status code
+func (o *IssueStopStopWatchNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue stop stop watch not found response has a 4xx status code
+func (o *IssueStopStopWatchNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue stop stop watch not found response has a 5xx status code
+func (o *IssueStopStopWatchNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue stop stop watch not found response a status code equal to that given
+func (o *IssueStopStopWatchNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the issue stop stop watch not found response
+func (o *IssueStopStopWatchNotFound) Code() int {
+	return 404
+}
+
+func (o *IssueStopStopWatchNotFound) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/{index}/stopwatch/stop][%d] issueStopStopWatchNotFound", 404)
+}
+
+func (o *IssueStopStopWatchNotFound) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/{index}/stopwatch/stop][%d] issueStopStopWatchNotFound", 404)
+}
+
+func (o *IssueStopStopWatchNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewIssueStopStopWatchConflict creates a IssueStopStopWatchConflict with default headers values
+func NewIssueStopStopWatchConflict() *IssueStopStopWatchConflict {
+	return &IssueStopStopWatchConflict{}
+}
+
+/*
+IssueStopStopWatchConflict describes a response with status code 409, with default header values.
+
+Cannot stop a non existent stopwatch
+*/
+type IssueStopStopWatchConflict struct {
+}
+
+// IsSuccess returns true when this issue stop stop watch conflict response has a 2xx status code
+func (o *IssueStopStopWatchConflict) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue stop stop watch conflict response has a 3xx status code
+func (o *IssueStopStopWatchConflict) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue stop stop watch conflict response has a 4xx status code
+func (o *IssueStopStopWatchConflict) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue stop stop watch conflict response has a 5xx status code
+func (o *IssueStopStopWatchConflict) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue stop stop watch conflict response a status code equal to that given
+func (o *IssueStopStopWatchConflict) IsCode(code int) bool {
+	return code == 409
+}
+
+// Code gets the status code for the issue stop stop watch conflict response
+func (o *IssueStopStopWatchConflict) Code() int {
+	return 409
+}
+
+func (o *IssueStopStopWatchConflict) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/{index}/stopwatch/stop][%d] issueStopStopWatchConflict", 409)
+}
+
+func (o *IssueStopStopWatchConflict) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/{index}/stopwatch/stop][%d] issueStopStopWatchConflict", 409)
+}
+
+func (o *IssueStopStopWatchConflict) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_subscriptions_parameters.go b/bots-common/gitea-generated/client/issue/issue_subscriptions_parameters.go
new file mode 100644
index 0000000..1045379
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_subscriptions_parameters.go
@@ -0,0 +1,266 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewIssueSubscriptionsParams creates a new IssueSubscriptionsParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewIssueSubscriptionsParams() *IssueSubscriptionsParams {
+	return &IssueSubscriptionsParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewIssueSubscriptionsParamsWithTimeout creates a new IssueSubscriptionsParams object
+// with the ability to set a timeout on a request.
+func NewIssueSubscriptionsParamsWithTimeout(timeout time.Duration) *IssueSubscriptionsParams {
+	return &IssueSubscriptionsParams{
+		timeout: timeout,
+	}
+}
+
+// NewIssueSubscriptionsParamsWithContext creates a new IssueSubscriptionsParams object
+// with the ability to set a context for a request.
+func NewIssueSubscriptionsParamsWithContext(ctx context.Context) *IssueSubscriptionsParams {
+	return &IssueSubscriptionsParams{
+		Context: ctx,
+	}
+}
+
+// NewIssueSubscriptionsParamsWithHTTPClient creates a new IssueSubscriptionsParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewIssueSubscriptionsParamsWithHTTPClient(client *http.Client) *IssueSubscriptionsParams {
+	return &IssueSubscriptionsParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+IssueSubscriptionsParams contains all the parameters to send to the API endpoint
+
+	for the issue subscriptions operation.
+
+	Typically these are written to a http.Request.
+*/
+type IssueSubscriptionsParams struct {
+
+	/* Index.
+
+	   index of the issue
+
+	   Format: int64
+	*/
+	Index int64
+
+	/* Limit.
+
+	   page size of results
+	*/
+	Limit *int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Page.
+
+	   page number of results to return (1-based)
+	*/
+	Page *int64
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the issue subscriptions params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueSubscriptionsParams) WithDefaults() *IssueSubscriptionsParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the issue subscriptions params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueSubscriptionsParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the issue subscriptions params
+func (o *IssueSubscriptionsParams) WithTimeout(timeout time.Duration) *IssueSubscriptionsParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the issue subscriptions params
+func (o *IssueSubscriptionsParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the issue subscriptions params
+func (o *IssueSubscriptionsParams) WithContext(ctx context.Context) *IssueSubscriptionsParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the issue subscriptions params
+func (o *IssueSubscriptionsParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the issue subscriptions params
+func (o *IssueSubscriptionsParams) WithHTTPClient(client *http.Client) *IssueSubscriptionsParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the issue subscriptions params
+func (o *IssueSubscriptionsParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithIndex adds the index to the issue subscriptions params
+func (o *IssueSubscriptionsParams) WithIndex(index int64) *IssueSubscriptionsParams {
+	o.SetIndex(index)
+	return o
+}
+
+// SetIndex adds the index to the issue subscriptions params
+func (o *IssueSubscriptionsParams) SetIndex(index int64) {
+	o.Index = index
+}
+
+// WithLimit adds the limit to the issue subscriptions params
+func (o *IssueSubscriptionsParams) WithLimit(limit *int64) *IssueSubscriptionsParams {
+	o.SetLimit(limit)
+	return o
+}
+
+// SetLimit adds the limit to the issue subscriptions params
+func (o *IssueSubscriptionsParams) SetLimit(limit *int64) {
+	o.Limit = limit
+}
+
+// WithOwner adds the owner to the issue subscriptions params
+func (o *IssueSubscriptionsParams) WithOwner(owner string) *IssueSubscriptionsParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the issue subscriptions params
+func (o *IssueSubscriptionsParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithPage adds the page to the issue subscriptions params
+func (o *IssueSubscriptionsParams) WithPage(page *int64) *IssueSubscriptionsParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the issue subscriptions params
+func (o *IssueSubscriptionsParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WithRepo adds the repo to the issue subscriptions params
+func (o *IssueSubscriptionsParams) WithRepo(repo string) *IssueSubscriptionsParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the issue subscriptions params
+func (o *IssueSubscriptionsParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *IssueSubscriptionsParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param index
+	if err := r.SetPathParam("index", swag.FormatInt64(o.Index)); err != nil {
+		return err
+	}
+
+	if o.Limit != nil {
+
+		// query param limit
+		var qrLimit int64
+
+		if o.Limit != nil {
+			qrLimit = *o.Limit
+		}
+		qLimit := swag.FormatInt64(qrLimit)
+		if qLimit != "" {
+
+			if err := r.SetQueryParam("limit", qLimit); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_subscriptions_responses.go b/bots-common/gitea-generated/client/issue/issue_subscriptions_responses.go
new file mode 100644
index 0000000..8b5ed91
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_subscriptions_responses.go
@@ -0,0 +1,166 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// IssueSubscriptionsReader is a Reader for the IssueSubscriptions structure.
+type IssueSubscriptionsReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *IssueSubscriptionsReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewIssueSubscriptionsOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewIssueSubscriptionsNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/issues/{index}/subscriptions] issueSubscriptions", response, response.Code())
+	}
+}
+
+// NewIssueSubscriptionsOK creates a IssueSubscriptionsOK with default headers values
+func NewIssueSubscriptionsOK() *IssueSubscriptionsOK {
+	return &IssueSubscriptionsOK{}
+}
+
+/*
+IssueSubscriptionsOK describes a response with status code 200, with default header values.
+
+UserList
+*/
+type IssueSubscriptionsOK struct {
+	Payload []*models.User
+}
+
+// IsSuccess returns true when this issue subscriptions o k response has a 2xx status code
+func (o *IssueSubscriptionsOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this issue subscriptions o k response has a 3xx status code
+func (o *IssueSubscriptionsOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue subscriptions o k response has a 4xx status code
+func (o *IssueSubscriptionsOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this issue subscriptions o k response has a 5xx status code
+func (o *IssueSubscriptionsOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue subscriptions o k response a status code equal to that given
+func (o *IssueSubscriptionsOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the issue subscriptions o k response
+func (o *IssueSubscriptionsOK) Code() int {
+	return 200
+}
+
+func (o *IssueSubscriptionsOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issues/{index}/subscriptions][%d] issueSubscriptionsOK %s", 200, payload)
+}
+
+func (o *IssueSubscriptionsOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issues/{index}/subscriptions][%d] issueSubscriptionsOK %s", 200, payload)
+}
+
+func (o *IssueSubscriptionsOK) GetPayload() []*models.User {
+	return o.Payload
+}
+
+func (o *IssueSubscriptionsOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewIssueSubscriptionsNotFound creates a IssueSubscriptionsNotFound with default headers values
+func NewIssueSubscriptionsNotFound() *IssueSubscriptionsNotFound {
+	return &IssueSubscriptionsNotFound{}
+}
+
+/*
+IssueSubscriptionsNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type IssueSubscriptionsNotFound struct {
+}
+
+// IsSuccess returns true when this issue subscriptions not found response has a 2xx status code
+func (o *IssueSubscriptionsNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue subscriptions not found response has a 3xx status code
+func (o *IssueSubscriptionsNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue subscriptions not found response has a 4xx status code
+func (o *IssueSubscriptionsNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue subscriptions not found response has a 5xx status code
+func (o *IssueSubscriptionsNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue subscriptions not found response a status code equal to that given
+func (o *IssueSubscriptionsNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the issue subscriptions not found response
+func (o *IssueSubscriptionsNotFound) Code() int {
+	return 404
+}
+
+func (o *IssueSubscriptionsNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issues/{index}/subscriptions][%d] issueSubscriptionsNotFound", 404)
+}
+
+func (o *IssueSubscriptionsNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issues/{index}/subscriptions][%d] issueSubscriptionsNotFound", 404)
+}
+
+func (o *IssueSubscriptionsNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_tracked_times_parameters.go b/bots-common/gitea-generated/client/issue/issue_tracked_times_parameters.go
new file mode 100644
index 0000000..a72ba0a
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_tracked_times_parameters.go
@@ -0,0 +1,372 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewIssueTrackedTimesParams creates a new IssueTrackedTimesParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewIssueTrackedTimesParams() *IssueTrackedTimesParams {
+	return &IssueTrackedTimesParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewIssueTrackedTimesParamsWithTimeout creates a new IssueTrackedTimesParams object
+// with the ability to set a timeout on a request.
+func NewIssueTrackedTimesParamsWithTimeout(timeout time.Duration) *IssueTrackedTimesParams {
+	return &IssueTrackedTimesParams{
+		timeout: timeout,
+	}
+}
+
+// NewIssueTrackedTimesParamsWithContext creates a new IssueTrackedTimesParams object
+// with the ability to set a context for a request.
+func NewIssueTrackedTimesParamsWithContext(ctx context.Context) *IssueTrackedTimesParams {
+	return &IssueTrackedTimesParams{
+		Context: ctx,
+	}
+}
+
+// NewIssueTrackedTimesParamsWithHTTPClient creates a new IssueTrackedTimesParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewIssueTrackedTimesParamsWithHTTPClient(client *http.Client) *IssueTrackedTimesParams {
+	return &IssueTrackedTimesParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+IssueTrackedTimesParams contains all the parameters to send to the API endpoint
+
+	for the issue tracked times operation.
+
+	Typically these are written to a http.Request.
+*/
+type IssueTrackedTimesParams struct {
+
+	/* Before.
+
+	   Only show times updated before the given time. This is a timestamp in RFC 3339 format
+
+	   Format: date-time
+	*/
+	Before *strfmt.DateTime
+
+	/* Index.
+
+	   index of the issue
+
+	   Format: int64
+	*/
+	Index int64
+
+	/* Limit.
+
+	   page size of results
+	*/
+	Limit *int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Page.
+
+	   page number of results to return (1-based)
+	*/
+	Page *int64
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	/* Since.
+
+	   Only show times updated after the given time. This is a timestamp in RFC 3339 format
+
+	   Format: date-time
+	*/
+	Since *strfmt.DateTime
+
+	/* User.
+
+	   optional filter by user (available for issue managers)
+	*/
+	User *string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the issue tracked times params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueTrackedTimesParams) WithDefaults() *IssueTrackedTimesParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the issue tracked times params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *IssueTrackedTimesParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the issue tracked times params
+func (o *IssueTrackedTimesParams) WithTimeout(timeout time.Duration) *IssueTrackedTimesParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the issue tracked times params
+func (o *IssueTrackedTimesParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the issue tracked times params
+func (o *IssueTrackedTimesParams) WithContext(ctx context.Context) *IssueTrackedTimesParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the issue tracked times params
+func (o *IssueTrackedTimesParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the issue tracked times params
+func (o *IssueTrackedTimesParams) WithHTTPClient(client *http.Client) *IssueTrackedTimesParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the issue tracked times params
+func (o *IssueTrackedTimesParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBefore adds the before to the issue tracked times params
+func (o *IssueTrackedTimesParams) WithBefore(before *strfmt.DateTime) *IssueTrackedTimesParams {
+	o.SetBefore(before)
+	return o
+}
+
+// SetBefore adds the before to the issue tracked times params
+func (o *IssueTrackedTimesParams) SetBefore(before *strfmt.DateTime) {
+	o.Before = before
+}
+
+// WithIndex adds the index to the issue tracked times params
+func (o *IssueTrackedTimesParams) WithIndex(index int64) *IssueTrackedTimesParams {
+	o.SetIndex(index)
+	return o
+}
+
+// SetIndex adds the index to the issue tracked times params
+func (o *IssueTrackedTimesParams) SetIndex(index int64) {
+	o.Index = index
+}
+
+// WithLimit adds the limit to the issue tracked times params
+func (o *IssueTrackedTimesParams) WithLimit(limit *int64) *IssueTrackedTimesParams {
+	o.SetLimit(limit)
+	return o
+}
+
+// SetLimit adds the limit to the issue tracked times params
+func (o *IssueTrackedTimesParams) SetLimit(limit *int64) {
+	o.Limit = limit
+}
+
+// WithOwner adds the owner to the issue tracked times params
+func (o *IssueTrackedTimesParams) WithOwner(owner string) *IssueTrackedTimesParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the issue tracked times params
+func (o *IssueTrackedTimesParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithPage adds the page to the issue tracked times params
+func (o *IssueTrackedTimesParams) WithPage(page *int64) *IssueTrackedTimesParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the issue tracked times params
+func (o *IssueTrackedTimesParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WithRepo adds the repo to the issue tracked times params
+func (o *IssueTrackedTimesParams) WithRepo(repo string) *IssueTrackedTimesParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the issue tracked times params
+func (o *IssueTrackedTimesParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WithSince adds the since to the issue tracked times params
+func (o *IssueTrackedTimesParams) WithSince(since *strfmt.DateTime) *IssueTrackedTimesParams {
+	o.SetSince(since)
+	return o
+}
+
+// SetSince adds the since to the issue tracked times params
+func (o *IssueTrackedTimesParams) SetSince(since *strfmt.DateTime) {
+	o.Since = since
+}
+
+// WithUser adds the user to the issue tracked times params
+func (o *IssueTrackedTimesParams) WithUser(user *string) *IssueTrackedTimesParams {
+	o.SetUser(user)
+	return o
+}
+
+// SetUser adds the user to the issue tracked times params
+func (o *IssueTrackedTimesParams) SetUser(user *string) {
+	o.User = user
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *IssueTrackedTimesParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.Before != nil {
+
+		// query param before
+		var qrBefore strfmt.DateTime
+
+		if o.Before != nil {
+			qrBefore = *o.Before
+		}
+		qBefore := qrBefore.String()
+		if qBefore != "" {
+
+			if err := r.SetQueryParam("before", qBefore); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param index
+	if err := r.SetPathParam("index", swag.FormatInt64(o.Index)); err != nil {
+		return err
+	}
+
+	if o.Limit != nil {
+
+		// query param limit
+		var qrLimit int64
+
+		if o.Limit != nil {
+			qrLimit = *o.Limit
+		}
+		qLimit := swag.FormatInt64(qrLimit)
+		if qLimit != "" {
+
+			if err := r.SetQueryParam("limit", qLimit); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if o.Since != nil {
+
+		// query param since
+		var qrSince strfmt.DateTime
+
+		if o.Since != nil {
+			qrSince = *o.Since
+		}
+		qSince := qrSince.String()
+		if qSince != "" {
+
+			if err := r.SetQueryParam("since", qSince); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.User != nil {
+
+		// query param user
+		var qrUser string
+
+		if o.User != nil {
+			qrUser = *o.User
+		}
+		qUser := qrUser
+		if qUser != "" {
+
+			if err := r.SetQueryParam("user", qUser); err != nil {
+				return err
+			}
+		}
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/issue_tracked_times_responses.go b/bots-common/gitea-generated/client/issue/issue_tracked_times_responses.go
new file mode 100644
index 0000000..bb6b0af
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/issue_tracked_times_responses.go
@@ -0,0 +1,166 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// IssueTrackedTimesReader is a Reader for the IssueTrackedTimes structure.
+type IssueTrackedTimesReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *IssueTrackedTimesReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewIssueTrackedTimesOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewIssueTrackedTimesNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/issues/{index}/times] issueTrackedTimes", response, response.Code())
+	}
+}
+
+// NewIssueTrackedTimesOK creates a IssueTrackedTimesOK with default headers values
+func NewIssueTrackedTimesOK() *IssueTrackedTimesOK {
+	return &IssueTrackedTimesOK{}
+}
+
+/*
+IssueTrackedTimesOK describes a response with status code 200, with default header values.
+
+TrackedTimeList
+*/
+type IssueTrackedTimesOK struct {
+	Payload []*models.TrackedTime
+}
+
+// IsSuccess returns true when this issue tracked times o k response has a 2xx status code
+func (o *IssueTrackedTimesOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this issue tracked times o k response has a 3xx status code
+func (o *IssueTrackedTimesOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue tracked times o k response has a 4xx status code
+func (o *IssueTrackedTimesOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this issue tracked times o k response has a 5xx status code
+func (o *IssueTrackedTimesOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue tracked times o k response a status code equal to that given
+func (o *IssueTrackedTimesOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the issue tracked times o k response
+func (o *IssueTrackedTimesOK) Code() int {
+	return 200
+}
+
+func (o *IssueTrackedTimesOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issues/{index}/times][%d] issueTrackedTimesOK %s", 200, payload)
+}
+
+func (o *IssueTrackedTimesOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issues/{index}/times][%d] issueTrackedTimesOK %s", 200, payload)
+}
+
+func (o *IssueTrackedTimesOK) GetPayload() []*models.TrackedTime {
+	return o.Payload
+}
+
+func (o *IssueTrackedTimesOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewIssueTrackedTimesNotFound creates a IssueTrackedTimesNotFound with default headers values
+func NewIssueTrackedTimesNotFound() *IssueTrackedTimesNotFound {
+	return &IssueTrackedTimesNotFound{}
+}
+
+/*
+IssueTrackedTimesNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type IssueTrackedTimesNotFound struct {
+}
+
+// IsSuccess returns true when this issue tracked times not found response has a 2xx status code
+func (o *IssueTrackedTimesNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this issue tracked times not found response has a 3xx status code
+func (o *IssueTrackedTimesNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this issue tracked times not found response has a 4xx status code
+func (o *IssueTrackedTimesNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this issue tracked times not found response has a 5xx status code
+func (o *IssueTrackedTimesNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this issue tracked times not found response a status code equal to that given
+func (o *IssueTrackedTimesNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the issue tracked times not found response
+func (o *IssueTrackedTimesNotFound) Code() int {
+	return 404
+}
+
+func (o *IssueTrackedTimesNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issues/{index}/times][%d] issueTrackedTimesNotFound", 404)
+}
+
+func (o *IssueTrackedTimesNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issues/{index}/times][%d] issueTrackedTimesNotFound", 404)
+}
+
+func (o *IssueTrackedTimesNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/move_issue_pin_parameters.go b/bots-common/gitea-generated/client/issue/move_issue_pin_parameters.go
new file mode 100644
index 0000000..e909027
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/move_issue_pin_parameters.go
@@ -0,0 +1,222 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewMoveIssuePinParams creates a new MoveIssuePinParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewMoveIssuePinParams() *MoveIssuePinParams {
+	return &MoveIssuePinParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewMoveIssuePinParamsWithTimeout creates a new MoveIssuePinParams object
+// with the ability to set a timeout on a request.
+func NewMoveIssuePinParamsWithTimeout(timeout time.Duration) *MoveIssuePinParams {
+	return &MoveIssuePinParams{
+		timeout: timeout,
+	}
+}
+
+// NewMoveIssuePinParamsWithContext creates a new MoveIssuePinParams object
+// with the ability to set a context for a request.
+func NewMoveIssuePinParamsWithContext(ctx context.Context) *MoveIssuePinParams {
+	return &MoveIssuePinParams{
+		Context: ctx,
+	}
+}
+
+// NewMoveIssuePinParamsWithHTTPClient creates a new MoveIssuePinParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewMoveIssuePinParamsWithHTTPClient(client *http.Client) *MoveIssuePinParams {
+	return &MoveIssuePinParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+MoveIssuePinParams contains all the parameters to send to the API endpoint
+
+	for the move issue pin operation.
+
+	Typically these are written to a http.Request.
+*/
+type MoveIssuePinParams struct {
+
+	/* Index.
+
+	   index of issue
+
+	   Format: int64
+	*/
+	Index int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Position.
+
+	   the new position
+
+	   Format: int64
+	*/
+	Position int64
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the move issue pin params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *MoveIssuePinParams) WithDefaults() *MoveIssuePinParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the move issue pin params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *MoveIssuePinParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the move issue pin params
+func (o *MoveIssuePinParams) WithTimeout(timeout time.Duration) *MoveIssuePinParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the move issue pin params
+func (o *MoveIssuePinParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the move issue pin params
+func (o *MoveIssuePinParams) WithContext(ctx context.Context) *MoveIssuePinParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the move issue pin params
+func (o *MoveIssuePinParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the move issue pin params
+func (o *MoveIssuePinParams) WithHTTPClient(client *http.Client) *MoveIssuePinParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the move issue pin params
+func (o *MoveIssuePinParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithIndex adds the index to the move issue pin params
+func (o *MoveIssuePinParams) WithIndex(index int64) *MoveIssuePinParams {
+	o.SetIndex(index)
+	return o
+}
+
+// SetIndex adds the index to the move issue pin params
+func (o *MoveIssuePinParams) SetIndex(index int64) {
+	o.Index = index
+}
+
+// WithOwner adds the owner to the move issue pin params
+func (o *MoveIssuePinParams) WithOwner(owner string) *MoveIssuePinParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the move issue pin params
+func (o *MoveIssuePinParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithPosition adds the position to the move issue pin params
+func (o *MoveIssuePinParams) WithPosition(position int64) *MoveIssuePinParams {
+	o.SetPosition(position)
+	return o
+}
+
+// SetPosition adds the position to the move issue pin params
+func (o *MoveIssuePinParams) SetPosition(position int64) {
+	o.Position = position
+}
+
+// WithRepo adds the repo to the move issue pin params
+func (o *MoveIssuePinParams) WithRepo(repo string) *MoveIssuePinParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the move issue pin params
+func (o *MoveIssuePinParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *MoveIssuePinParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param index
+	if err := r.SetPathParam("index", swag.FormatInt64(o.Index)); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param position
+	if err := r.SetPathParam("position", swag.FormatInt64(o.Position)); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/move_issue_pin_responses.go b/bots-common/gitea-generated/client/issue/move_issue_pin_responses.go
new file mode 100644
index 0000000..876c63b
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/move_issue_pin_responses.go
@@ -0,0 +1,228 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// MoveIssuePinReader is a Reader for the MoveIssuePin structure.
+type MoveIssuePinReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *MoveIssuePinReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewMoveIssuePinNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 403:
+		result := NewMoveIssuePinForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewMoveIssuePinNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[PATCH /repos/{owner}/{repo}/issues/{index}/pin/{position}] moveIssuePin", response, response.Code())
+	}
+}
+
+// NewMoveIssuePinNoContent creates a MoveIssuePinNoContent with default headers values
+func NewMoveIssuePinNoContent() *MoveIssuePinNoContent {
+	return &MoveIssuePinNoContent{}
+}
+
+/*
+MoveIssuePinNoContent describes a response with status code 204, with default header values.
+
+APIEmpty is an empty response
+*/
+type MoveIssuePinNoContent struct {
+}
+
+// IsSuccess returns true when this move issue pin no content response has a 2xx status code
+func (o *MoveIssuePinNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this move issue pin no content response has a 3xx status code
+func (o *MoveIssuePinNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this move issue pin no content response has a 4xx status code
+func (o *MoveIssuePinNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this move issue pin no content response has a 5xx status code
+func (o *MoveIssuePinNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this move issue pin no content response a status code equal to that given
+func (o *MoveIssuePinNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the move issue pin no content response
+func (o *MoveIssuePinNoContent) Code() int {
+	return 204
+}
+
+func (o *MoveIssuePinNoContent) Error() string {
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/issues/{index}/pin/{position}][%d] moveIssuePinNoContent", 204)
+}
+
+func (o *MoveIssuePinNoContent) String() string {
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/issues/{index}/pin/{position}][%d] moveIssuePinNoContent", 204)
+}
+
+func (o *MoveIssuePinNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewMoveIssuePinForbidden creates a MoveIssuePinForbidden with default headers values
+func NewMoveIssuePinForbidden() *MoveIssuePinForbidden {
+	return &MoveIssuePinForbidden{}
+}
+
+/*
+MoveIssuePinForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type MoveIssuePinForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this move issue pin forbidden response has a 2xx status code
+func (o *MoveIssuePinForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this move issue pin forbidden response has a 3xx status code
+func (o *MoveIssuePinForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this move issue pin forbidden response has a 4xx status code
+func (o *MoveIssuePinForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this move issue pin forbidden response has a 5xx status code
+func (o *MoveIssuePinForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this move issue pin forbidden response a status code equal to that given
+func (o *MoveIssuePinForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the move issue pin forbidden response
+func (o *MoveIssuePinForbidden) Code() int {
+	return 403
+}
+
+func (o *MoveIssuePinForbidden) Error() string {
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/issues/{index}/pin/{position}][%d] moveIssuePinForbidden", 403)
+}
+
+func (o *MoveIssuePinForbidden) String() string {
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/issues/{index}/pin/{position}][%d] moveIssuePinForbidden", 403)
+}
+
+func (o *MoveIssuePinForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewMoveIssuePinNotFound creates a MoveIssuePinNotFound with default headers values
+func NewMoveIssuePinNotFound() *MoveIssuePinNotFound {
+	return &MoveIssuePinNotFound{}
+}
+
+/*
+MoveIssuePinNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type MoveIssuePinNotFound struct {
+}
+
+// IsSuccess returns true when this move issue pin not found response has a 2xx status code
+func (o *MoveIssuePinNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this move issue pin not found response has a 3xx status code
+func (o *MoveIssuePinNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this move issue pin not found response has a 4xx status code
+func (o *MoveIssuePinNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this move issue pin not found response has a 5xx status code
+func (o *MoveIssuePinNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this move issue pin not found response a status code equal to that given
+func (o *MoveIssuePinNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the move issue pin not found response
+func (o *MoveIssuePinNotFound) Code() int {
+	return 404
+}
+
+func (o *MoveIssuePinNotFound) Error() string {
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/issues/{index}/pin/{position}][%d] moveIssuePinNotFound", 404)
+}
+
+func (o *MoveIssuePinNotFound) String() string {
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/issues/{index}/pin/{position}][%d] moveIssuePinNotFound", 404)
+}
+
+func (o *MoveIssuePinNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/pin_issue_parameters.go b/bots-common/gitea-generated/client/issue/pin_issue_parameters.go
new file mode 100644
index 0000000..b98c6cc
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/pin_issue_parameters.go
@@ -0,0 +1,198 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewPinIssueParams creates a new PinIssueParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewPinIssueParams() *PinIssueParams {
+	return &PinIssueParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewPinIssueParamsWithTimeout creates a new PinIssueParams object
+// with the ability to set a timeout on a request.
+func NewPinIssueParamsWithTimeout(timeout time.Duration) *PinIssueParams {
+	return &PinIssueParams{
+		timeout: timeout,
+	}
+}
+
+// NewPinIssueParamsWithContext creates a new PinIssueParams object
+// with the ability to set a context for a request.
+func NewPinIssueParamsWithContext(ctx context.Context) *PinIssueParams {
+	return &PinIssueParams{
+		Context: ctx,
+	}
+}
+
+// NewPinIssueParamsWithHTTPClient creates a new PinIssueParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewPinIssueParamsWithHTTPClient(client *http.Client) *PinIssueParams {
+	return &PinIssueParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+PinIssueParams contains all the parameters to send to the API endpoint
+
+	for the pin issue operation.
+
+	Typically these are written to a http.Request.
+*/
+type PinIssueParams struct {
+
+	/* Index.
+
+	   index of issue to pin
+
+	   Format: int64
+	*/
+	Index int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the pin issue params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *PinIssueParams) WithDefaults() *PinIssueParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the pin issue params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *PinIssueParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the pin issue params
+func (o *PinIssueParams) WithTimeout(timeout time.Duration) *PinIssueParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the pin issue params
+func (o *PinIssueParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the pin issue params
+func (o *PinIssueParams) WithContext(ctx context.Context) *PinIssueParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the pin issue params
+func (o *PinIssueParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the pin issue params
+func (o *PinIssueParams) WithHTTPClient(client *http.Client) *PinIssueParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the pin issue params
+func (o *PinIssueParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithIndex adds the index to the pin issue params
+func (o *PinIssueParams) WithIndex(index int64) *PinIssueParams {
+	o.SetIndex(index)
+	return o
+}
+
+// SetIndex adds the index to the pin issue params
+func (o *PinIssueParams) SetIndex(index int64) {
+	o.Index = index
+}
+
+// WithOwner adds the owner to the pin issue params
+func (o *PinIssueParams) WithOwner(owner string) *PinIssueParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the pin issue params
+func (o *PinIssueParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the pin issue params
+func (o *PinIssueParams) WithRepo(repo string) *PinIssueParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the pin issue params
+func (o *PinIssueParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *PinIssueParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param index
+	if err := r.SetPathParam("index", swag.FormatInt64(o.Index)); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/pin_issue_responses.go b/bots-common/gitea-generated/client/issue/pin_issue_responses.go
new file mode 100644
index 0000000..74f6487
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/pin_issue_responses.go
@@ -0,0 +1,228 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// PinIssueReader is a Reader for the PinIssue structure.
+type PinIssueReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *PinIssueReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewPinIssueNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 403:
+		result := NewPinIssueForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewPinIssueNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[POST /repos/{owner}/{repo}/issues/{index}/pin] pinIssue", response, response.Code())
+	}
+}
+
+// NewPinIssueNoContent creates a PinIssueNoContent with default headers values
+func NewPinIssueNoContent() *PinIssueNoContent {
+	return &PinIssueNoContent{}
+}
+
+/*
+PinIssueNoContent describes a response with status code 204, with default header values.
+
+APIEmpty is an empty response
+*/
+type PinIssueNoContent struct {
+}
+
+// IsSuccess returns true when this pin issue no content response has a 2xx status code
+func (o *PinIssueNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this pin issue no content response has a 3xx status code
+func (o *PinIssueNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this pin issue no content response has a 4xx status code
+func (o *PinIssueNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this pin issue no content response has a 5xx status code
+func (o *PinIssueNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this pin issue no content response a status code equal to that given
+func (o *PinIssueNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the pin issue no content response
+func (o *PinIssueNoContent) Code() int {
+	return 204
+}
+
+func (o *PinIssueNoContent) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/{index}/pin][%d] pinIssueNoContent", 204)
+}
+
+func (o *PinIssueNoContent) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/{index}/pin][%d] pinIssueNoContent", 204)
+}
+
+func (o *PinIssueNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewPinIssueForbidden creates a PinIssueForbidden with default headers values
+func NewPinIssueForbidden() *PinIssueForbidden {
+	return &PinIssueForbidden{}
+}
+
+/*
+PinIssueForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type PinIssueForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this pin issue forbidden response has a 2xx status code
+func (o *PinIssueForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this pin issue forbidden response has a 3xx status code
+func (o *PinIssueForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this pin issue forbidden response has a 4xx status code
+func (o *PinIssueForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this pin issue forbidden response has a 5xx status code
+func (o *PinIssueForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this pin issue forbidden response a status code equal to that given
+func (o *PinIssueForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the pin issue forbidden response
+func (o *PinIssueForbidden) Code() int {
+	return 403
+}
+
+func (o *PinIssueForbidden) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/{index}/pin][%d] pinIssueForbidden", 403)
+}
+
+func (o *PinIssueForbidden) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/{index}/pin][%d] pinIssueForbidden", 403)
+}
+
+func (o *PinIssueForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewPinIssueNotFound creates a PinIssueNotFound with default headers values
+func NewPinIssueNotFound() *PinIssueNotFound {
+	return &PinIssueNotFound{}
+}
+
+/*
+PinIssueNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type PinIssueNotFound struct {
+}
+
+// IsSuccess returns true when this pin issue not found response has a 2xx status code
+func (o *PinIssueNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this pin issue not found response has a 3xx status code
+func (o *PinIssueNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this pin issue not found response has a 4xx status code
+func (o *PinIssueNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this pin issue not found response has a 5xx status code
+func (o *PinIssueNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this pin issue not found response a status code equal to that given
+func (o *PinIssueNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the pin issue not found response
+func (o *PinIssueNotFound) Code() int {
+	return 404
+}
+
+func (o *PinIssueNotFound) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/{index}/pin][%d] pinIssueNotFound", 404)
+}
+
+func (o *PinIssueNotFound) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/issues/{index}/pin][%d] pinIssueNotFound", 404)
+}
+
+func (o *PinIssueNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/unpin_issue_parameters.go b/bots-common/gitea-generated/client/issue/unpin_issue_parameters.go
new file mode 100644
index 0000000..2788f09
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/unpin_issue_parameters.go
@@ -0,0 +1,198 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewUnpinIssueParams creates a new UnpinIssueParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewUnpinIssueParams() *UnpinIssueParams {
+	return &UnpinIssueParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewUnpinIssueParamsWithTimeout creates a new UnpinIssueParams object
+// with the ability to set a timeout on a request.
+func NewUnpinIssueParamsWithTimeout(timeout time.Duration) *UnpinIssueParams {
+	return &UnpinIssueParams{
+		timeout: timeout,
+	}
+}
+
+// NewUnpinIssueParamsWithContext creates a new UnpinIssueParams object
+// with the ability to set a context for a request.
+func NewUnpinIssueParamsWithContext(ctx context.Context) *UnpinIssueParams {
+	return &UnpinIssueParams{
+		Context: ctx,
+	}
+}
+
+// NewUnpinIssueParamsWithHTTPClient creates a new UnpinIssueParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewUnpinIssueParamsWithHTTPClient(client *http.Client) *UnpinIssueParams {
+	return &UnpinIssueParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+UnpinIssueParams contains all the parameters to send to the API endpoint
+
+	for the unpin issue operation.
+
+	Typically these are written to a http.Request.
+*/
+type UnpinIssueParams struct {
+
+	/* Index.
+
+	   index of issue to unpin
+
+	   Format: int64
+	*/
+	Index int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the unpin issue params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UnpinIssueParams) WithDefaults() *UnpinIssueParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the unpin issue params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UnpinIssueParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the unpin issue params
+func (o *UnpinIssueParams) WithTimeout(timeout time.Duration) *UnpinIssueParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the unpin issue params
+func (o *UnpinIssueParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the unpin issue params
+func (o *UnpinIssueParams) WithContext(ctx context.Context) *UnpinIssueParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the unpin issue params
+func (o *UnpinIssueParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the unpin issue params
+func (o *UnpinIssueParams) WithHTTPClient(client *http.Client) *UnpinIssueParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the unpin issue params
+func (o *UnpinIssueParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithIndex adds the index to the unpin issue params
+func (o *UnpinIssueParams) WithIndex(index int64) *UnpinIssueParams {
+	o.SetIndex(index)
+	return o
+}
+
+// SetIndex adds the index to the unpin issue params
+func (o *UnpinIssueParams) SetIndex(index int64) {
+	o.Index = index
+}
+
+// WithOwner adds the owner to the unpin issue params
+func (o *UnpinIssueParams) WithOwner(owner string) *UnpinIssueParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the unpin issue params
+func (o *UnpinIssueParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the unpin issue params
+func (o *UnpinIssueParams) WithRepo(repo string) *UnpinIssueParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the unpin issue params
+func (o *UnpinIssueParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *UnpinIssueParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param index
+	if err := r.SetPathParam("index", swag.FormatInt64(o.Index)); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/issue/unpin_issue_responses.go b/bots-common/gitea-generated/client/issue/unpin_issue_responses.go
new file mode 100644
index 0000000..45ecbbb
--- /dev/null
+++ b/bots-common/gitea-generated/client/issue/unpin_issue_responses.go
@@ -0,0 +1,228 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package issue
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// UnpinIssueReader is a Reader for the UnpinIssue structure.
+type UnpinIssueReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *UnpinIssueReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewUnpinIssueNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 403:
+		result := NewUnpinIssueForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewUnpinIssueNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[DELETE /repos/{owner}/{repo}/issues/{index}/pin] unpinIssue", response, response.Code())
+	}
+}
+
+// NewUnpinIssueNoContent creates a UnpinIssueNoContent with default headers values
+func NewUnpinIssueNoContent() *UnpinIssueNoContent {
+	return &UnpinIssueNoContent{}
+}
+
+/*
+UnpinIssueNoContent describes a response with status code 204, with default header values.
+
+APIEmpty is an empty response
+*/
+type UnpinIssueNoContent struct {
+}
+
+// IsSuccess returns true when this unpin issue no content response has a 2xx status code
+func (o *UnpinIssueNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this unpin issue no content response has a 3xx status code
+func (o *UnpinIssueNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this unpin issue no content response has a 4xx status code
+func (o *UnpinIssueNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this unpin issue no content response has a 5xx status code
+func (o *UnpinIssueNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this unpin issue no content response a status code equal to that given
+func (o *UnpinIssueNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the unpin issue no content response
+func (o *UnpinIssueNoContent) Code() int {
+	return 204
+}
+
+func (o *UnpinIssueNoContent) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/{index}/pin][%d] unpinIssueNoContent", 204)
+}
+
+func (o *UnpinIssueNoContent) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/{index}/pin][%d] unpinIssueNoContent", 204)
+}
+
+func (o *UnpinIssueNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewUnpinIssueForbidden creates a UnpinIssueForbidden with default headers values
+func NewUnpinIssueForbidden() *UnpinIssueForbidden {
+	return &UnpinIssueForbidden{}
+}
+
+/*
+UnpinIssueForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type UnpinIssueForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this unpin issue forbidden response has a 2xx status code
+func (o *UnpinIssueForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this unpin issue forbidden response has a 3xx status code
+func (o *UnpinIssueForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this unpin issue forbidden response has a 4xx status code
+func (o *UnpinIssueForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this unpin issue forbidden response has a 5xx status code
+func (o *UnpinIssueForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this unpin issue forbidden response a status code equal to that given
+func (o *UnpinIssueForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the unpin issue forbidden response
+func (o *UnpinIssueForbidden) Code() int {
+	return 403
+}
+
+func (o *UnpinIssueForbidden) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/{index}/pin][%d] unpinIssueForbidden", 403)
+}
+
+func (o *UnpinIssueForbidden) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/{index}/pin][%d] unpinIssueForbidden", 403)
+}
+
+func (o *UnpinIssueForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewUnpinIssueNotFound creates a UnpinIssueNotFound with default headers values
+func NewUnpinIssueNotFound() *UnpinIssueNotFound {
+	return &UnpinIssueNotFound{}
+}
+
+/*
+UnpinIssueNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type UnpinIssueNotFound struct {
+}
+
+// IsSuccess returns true when this unpin issue not found response has a 2xx status code
+func (o *UnpinIssueNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this unpin issue not found response has a 3xx status code
+func (o *UnpinIssueNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this unpin issue not found response has a 4xx status code
+func (o *UnpinIssueNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this unpin issue not found response has a 5xx status code
+func (o *UnpinIssueNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this unpin issue not found response a status code equal to that given
+func (o *UnpinIssueNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the unpin issue not found response
+func (o *UnpinIssueNotFound) Code() int {
+	return 404
+}
+
+func (o *UnpinIssueNotFound) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/{index}/pin][%d] unpinIssueNotFound", 404)
+}
+
+func (o *UnpinIssueNotFound) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/issues/{index}/pin][%d] unpinIssueNotFound", 404)
+}
+
+func (o *UnpinIssueNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/miscellaneous/get_gitignore_template_info_parameters.go b/bots-common/gitea-generated/client/miscellaneous/get_gitignore_template_info_parameters.go
new file mode 100644
index 0000000..9a49164
--- /dev/null
+++ b/bots-common/gitea-generated/client/miscellaneous/get_gitignore_template_info_parameters.go
@@ -0,0 +1,151 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package miscellaneous
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewGetGitignoreTemplateInfoParams creates a new GetGitignoreTemplateInfoParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewGetGitignoreTemplateInfoParams() *GetGitignoreTemplateInfoParams {
+	return &GetGitignoreTemplateInfoParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewGetGitignoreTemplateInfoParamsWithTimeout creates a new GetGitignoreTemplateInfoParams object
+// with the ability to set a timeout on a request.
+func NewGetGitignoreTemplateInfoParamsWithTimeout(timeout time.Duration) *GetGitignoreTemplateInfoParams {
+	return &GetGitignoreTemplateInfoParams{
+		timeout: timeout,
+	}
+}
+
+// NewGetGitignoreTemplateInfoParamsWithContext creates a new GetGitignoreTemplateInfoParams object
+// with the ability to set a context for a request.
+func NewGetGitignoreTemplateInfoParamsWithContext(ctx context.Context) *GetGitignoreTemplateInfoParams {
+	return &GetGitignoreTemplateInfoParams{
+		Context: ctx,
+	}
+}
+
+// NewGetGitignoreTemplateInfoParamsWithHTTPClient creates a new GetGitignoreTemplateInfoParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewGetGitignoreTemplateInfoParamsWithHTTPClient(client *http.Client) *GetGitignoreTemplateInfoParams {
+	return &GetGitignoreTemplateInfoParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+GetGitignoreTemplateInfoParams contains all the parameters to send to the API endpoint
+
+	for the get gitignore template info operation.
+
+	Typically these are written to a http.Request.
+*/
+type GetGitignoreTemplateInfoParams struct {
+
+	/* Name.
+
+	   name of the template
+	*/
+	Name string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the get gitignore template info params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *GetGitignoreTemplateInfoParams) WithDefaults() *GetGitignoreTemplateInfoParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the get gitignore template info params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *GetGitignoreTemplateInfoParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the get gitignore template info params
+func (o *GetGitignoreTemplateInfoParams) WithTimeout(timeout time.Duration) *GetGitignoreTemplateInfoParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the get gitignore template info params
+func (o *GetGitignoreTemplateInfoParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the get gitignore template info params
+func (o *GetGitignoreTemplateInfoParams) WithContext(ctx context.Context) *GetGitignoreTemplateInfoParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the get gitignore template info params
+func (o *GetGitignoreTemplateInfoParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the get gitignore template info params
+func (o *GetGitignoreTemplateInfoParams) WithHTTPClient(client *http.Client) *GetGitignoreTemplateInfoParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the get gitignore template info params
+func (o *GetGitignoreTemplateInfoParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithName adds the name to the get gitignore template info params
+func (o *GetGitignoreTemplateInfoParams) WithName(name string) *GetGitignoreTemplateInfoParams {
+	o.SetName(name)
+	return o
+}
+
+// SetName adds the name to the get gitignore template info params
+func (o *GetGitignoreTemplateInfoParams) SetName(name string) {
+	o.Name = name
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *GetGitignoreTemplateInfoParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param name
+	if err := r.SetPathParam("name", o.Name); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/miscellaneous/get_gitignore_template_info_responses.go b/bots-common/gitea-generated/client/miscellaneous/get_gitignore_template_info_responses.go
new file mode 100644
index 0000000..ac55428
--- /dev/null
+++ b/bots-common/gitea-generated/client/miscellaneous/get_gitignore_template_info_responses.go
@@ -0,0 +1,168 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package miscellaneous
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// GetGitignoreTemplateInfoReader is a Reader for the GetGitignoreTemplateInfo structure.
+type GetGitignoreTemplateInfoReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *GetGitignoreTemplateInfoReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewGetGitignoreTemplateInfoOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewGetGitignoreTemplateInfoNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /gitignore/templates/{name}] getGitignoreTemplateInfo", response, response.Code())
+	}
+}
+
+// NewGetGitignoreTemplateInfoOK creates a GetGitignoreTemplateInfoOK with default headers values
+func NewGetGitignoreTemplateInfoOK() *GetGitignoreTemplateInfoOK {
+	return &GetGitignoreTemplateInfoOK{}
+}
+
+/*
+GetGitignoreTemplateInfoOK describes a response with status code 200, with default header values.
+
+GitignoreTemplateInfo
+*/
+type GetGitignoreTemplateInfoOK struct {
+	Payload *models.GitignoreTemplateInfo
+}
+
+// IsSuccess returns true when this get gitignore template info o k response has a 2xx status code
+func (o *GetGitignoreTemplateInfoOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this get gitignore template info o k response has a 3xx status code
+func (o *GetGitignoreTemplateInfoOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this get gitignore template info o k response has a 4xx status code
+func (o *GetGitignoreTemplateInfoOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this get gitignore template info o k response has a 5xx status code
+func (o *GetGitignoreTemplateInfoOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this get gitignore template info o k response a status code equal to that given
+func (o *GetGitignoreTemplateInfoOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the get gitignore template info o k response
+func (o *GetGitignoreTemplateInfoOK) Code() int {
+	return 200
+}
+
+func (o *GetGitignoreTemplateInfoOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /gitignore/templates/{name}][%d] getGitignoreTemplateInfoOK %s", 200, payload)
+}
+
+func (o *GetGitignoreTemplateInfoOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /gitignore/templates/{name}][%d] getGitignoreTemplateInfoOK %s", 200, payload)
+}
+
+func (o *GetGitignoreTemplateInfoOK) GetPayload() *models.GitignoreTemplateInfo {
+	return o.Payload
+}
+
+func (o *GetGitignoreTemplateInfoOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.GitignoreTemplateInfo)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewGetGitignoreTemplateInfoNotFound creates a GetGitignoreTemplateInfoNotFound with default headers values
+func NewGetGitignoreTemplateInfoNotFound() *GetGitignoreTemplateInfoNotFound {
+	return &GetGitignoreTemplateInfoNotFound{}
+}
+
+/*
+GetGitignoreTemplateInfoNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type GetGitignoreTemplateInfoNotFound struct {
+}
+
+// IsSuccess returns true when this get gitignore template info not found response has a 2xx status code
+func (o *GetGitignoreTemplateInfoNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this get gitignore template info not found response has a 3xx status code
+func (o *GetGitignoreTemplateInfoNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this get gitignore template info not found response has a 4xx status code
+func (o *GetGitignoreTemplateInfoNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this get gitignore template info not found response has a 5xx status code
+func (o *GetGitignoreTemplateInfoNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this get gitignore template info not found response a status code equal to that given
+func (o *GetGitignoreTemplateInfoNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the get gitignore template info not found response
+func (o *GetGitignoreTemplateInfoNotFound) Code() int {
+	return 404
+}
+
+func (o *GetGitignoreTemplateInfoNotFound) Error() string {
+	return fmt.Sprintf("[GET /gitignore/templates/{name}][%d] getGitignoreTemplateInfoNotFound", 404)
+}
+
+func (o *GetGitignoreTemplateInfoNotFound) String() string {
+	return fmt.Sprintf("[GET /gitignore/templates/{name}][%d] getGitignoreTemplateInfoNotFound", 404)
+}
+
+func (o *GetGitignoreTemplateInfoNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/miscellaneous/get_label_template_info_parameters.go b/bots-common/gitea-generated/client/miscellaneous/get_label_template_info_parameters.go
new file mode 100644
index 0000000..dbc9f08
--- /dev/null
+++ b/bots-common/gitea-generated/client/miscellaneous/get_label_template_info_parameters.go
@@ -0,0 +1,151 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package miscellaneous
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewGetLabelTemplateInfoParams creates a new GetLabelTemplateInfoParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewGetLabelTemplateInfoParams() *GetLabelTemplateInfoParams {
+	return &GetLabelTemplateInfoParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewGetLabelTemplateInfoParamsWithTimeout creates a new GetLabelTemplateInfoParams object
+// with the ability to set a timeout on a request.
+func NewGetLabelTemplateInfoParamsWithTimeout(timeout time.Duration) *GetLabelTemplateInfoParams {
+	return &GetLabelTemplateInfoParams{
+		timeout: timeout,
+	}
+}
+
+// NewGetLabelTemplateInfoParamsWithContext creates a new GetLabelTemplateInfoParams object
+// with the ability to set a context for a request.
+func NewGetLabelTemplateInfoParamsWithContext(ctx context.Context) *GetLabelTemplateInfoParams {
+	return &GetLabelTemplateInfoParams{
+		Context: ctx,
+	}
+}
+
+// NewGetLabelTemplateInfoParamsWithHTTPClient creates a new GetLabelTemplateInfoParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewGetLabelTemplateInfoParamsWithHTTPClient(client *http.Client) *GetLabelTemplateInfoParams {
+	return &GetLabelTemplateInfoParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+GetLabelTemplateInfoParams contains all the parameters to send to the API endpoint
+
+	for the get label template info operation.
+
+	Typically these are written to a http.Request.
+*/
+type GetLabelTemplateInfoParams struct {
+
+	/* Name.
+
+	   name of the template
+	*/
+	Name string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the get label template info params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *GetLabelTemplateInfoParams) WithDefaults() *GetLabelTemplateInfoParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the get label template info params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *GetLabelTemplateInfoParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the get label template info params
+func (o *GetLabelTemplateInfoParams) WithTimeout(timeout time.Duration) *GetLabelTemplateInfoParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the get label template info params
+func (o *GetLabelTemplateInfoParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the get label template info params
+func (o *GetLabelTemplateInfoParams) WithContext(ctx context.Context) *GetLabelTemplateInfoParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the get label template info params
+func (o *GetLabelTemplateInfoParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the get label template info params
+func (o *GetLabelTemplateInfoParams) WithHTTPClient(client *http.Client) *GetLabelTemplateInfoParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the get label template info params
+func (o *GetLabelTemplateInfoParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithName adds the name to the get label template info params
+func (o *GetLabelTemplateInfoParams) WithName(name string) *GetLabelTemplateInfoParams {
+	o.SetName(name)
+	return o
+}
+
+// SetName adds the name to the get label template info params
+func (o *GetLabelTemplateInfoParams) SetName(name string) {
+	o.Name = name
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *GetLabelTemplateInfoParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param name
+	if err := r.SetPathParam("name", o.Name); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/miscellaneous/get_label_template_info_responses.go b/bots-common/gitea-generated/client/miscellaneous/get_label_template_info_responses.go
new file mode 100644
index 0000000..7ffc869
--- /dev/null
+++ b/bots-common/gitea-generated/client/miscellaneous/get_label_template_info_responses.go
@@ -0,0 +1,166 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package miscellaneous
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// GetLabelTemplateInfoReader is a Reader for the GetLabelTemplateInfo structure.
+type GetLabelTemplateInfoReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *GetLabelTemplateInfoReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewGetLabelTemplateInfoOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewGetLabelTemplateInfoNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /label/templates/{name}] getLabelTemplateInfo", response, response.Code())
+	}
+}
+
+// NewGetLabelTemplateInfoOK creates a GetLabelTemplateInfoOK with default headers values
+func NewGetLabelTemplateInfoOK() *GetLabelTemplateInfoOK {
+	return &GetLabelTemplateInfoOK{}
+}
+
+/*
+GetLabelTemplateInfoOK describes a response with status code 200, with default header values.
+
+LabelTemplateInfo
+*/
+type GetLabelTemplateInfoOK struct {
+	Payload []*models.LabelTemplate
+}
+
+// IsSuccess returns true when this get label template info o k response has a 2xx status code
+func (o *GetLabelTemplateInfoOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this get label template info o k response has a 3xx status code
+func (o *GetLabelTemplateInfoOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this get label template info o k response has a 4xx status code
+func (o *GetLabelTemplateInfoOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this get label template info o k response has a 5xx status code
+func (o *GetLabelTemplateInfoOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this get label template info o k response a status code equal to that given
+func (o *GetLabelTemplateInfoOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the get label template info o k response
+func (o *GetLabelTemplateInfoOK) Code() int {
+	return 200
+}
+
+func (o *GetLabelTemplateInfoOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /label/templates/{name}][%d] getLabelTemplateInfoOK %s", 200, payload)
+}
+
+func (o *GetLabelTemplateInfoOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /label/templates/{name}][%d] getLabelTemplateInfoOK %s", 200, payload)
+}
+
+func (o *GetLabelTemplateInfoOK) GetPayload() []*models.LabelTemplate {
+	return o.Payload
+}
+
+func (o *GetLabelTemplateInfoOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewGetLabelTemplateInfoNotFound creates a GetLabelTemplateInfoNotFound with default headers values
+func NewGetLabelTemplateInfoNotFound() *GetLabelTemplateInfoNotFound {
+	return &GetLabelTemplateInfoNotFound{}
+}
+
+/*
+GetLabelTemplateInfoNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type GetLabelTemplateInfoNotFound struct {
+}
+
+// IsSuccess returns true when this get label template info not found response has a 2xx status code
+func (o *GetLabelTemplateInfoNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this get label template info not found response has a 3xx status code
+func (o *GetLabelTemplateInfoNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this get label template info not found response has a 4xx status code
+func (o *GetLabelTemplateInfoNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this get label template info not found response has a 5xx status code
+func (o *GetLabelTemplateInfoNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this get label template info not found response a status code equal to that given
+func (o *GetLabelTemplateInfoNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the get label template info not found response
+func (o *GetLabelTemplateInfoNotFound) Code() int {
+	return 404
+}
+
+func (o *GetLabelTemplateInfoNotFound) Error() string {
+	return fmt.Sprintf("[GET /label/templates/{name}][%d] getLabelTemplateInfoNotFound", 404)
+}
+
+func (o *GetLabelTemplateInfoNotFound) String() string {
+	return fmt.Sprintf("[GET /label/templates/{name}][%d] getLabelTemplateInfoNotFound", 404)
+}
+
+func (o *GetLabelTemplateInfoNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/miscellaneous/get_license_template_info_parameters.go b/bots-common/gitea-generated/client/miscellaneous/get_license_template_info_parameters.go
new file mode 100644
index 0000000..844ab1f
--- /dev/null
+++ b/bots-common/gitea-generated/client/miscellaneous/get_license_template_info_parameters.go
@@ -0,0 +1,151 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package miscellaneous
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewGetLicenseTemplateInfoParams creates a new GetLicenseTemplateInfoParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewGetLicenseTemplateInfoParams() *GetLicenseTemplateInfoParams {
+	return &GetLicenseTemplateInfoParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewGetLicenseTemplateInfoParamsWithTimeout creates a new GetLicenseTemplateInfoParams object
+// with the ability to set a timeout on a request.
+func NewGetLicenseTemplateInfoParamsWithTimeout(timeout time.Duration) *GetLicenseTemplateInfoParams {
+	return &GetLicenseTemplateInfoParams{
+		timeout: timeout,
+	}
+}
+
+// NewGetLicenseTemplateInfoParamsWithContext creates a new GetLicenseTemplateInfoParams object
+// with the ability to set a context for a request.
+func NewGetLicenseTemplateInfoParamsWithContext(ctx context.Context) *GetLicenseTemplateInfoParams {
+	return &GetLicenseTemplateInfoParams{
+		Context: ctx,
+	}
+}
+
+// NewGetLicenseTemplateInfoParamsWithHTTPClient creates a new GetLicenseTemplateInfoParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewGetLicenseTemplateInfoParamsWithHTTPClient(client *http.Client) *GetLicenseTemplateInfoParams {
+	return &GetLicenseTemplateInfoParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+GetLicenseTemplateInfoParams contains all the parameters to send to the API endpoint
+
+	for the get license template info operation.
+
+	Typically these are written to a http.Request.
+*/
+type GetLicenseTemplateInfoParams struct {
+
+	/* Name.
+
+	   name of the license
+	*/
+	Name string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the get license template info params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *GetLicenseTemplateInfoParams) WithDefaults() *GetLicenseTemplateInfoParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the get license template info params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *GetLicenseTemplateInfoParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the get license template info params
+func (o *GetLicenseTemplateInfoParams) WithTimeout(timeout time.Duration) *GetLicenseTemplateInfoParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the get license template info params
+func (o *GetLicenseTemplateInfoParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the get license template info params
+func (o *GetLicenseTemplateInfoParams) WithContext(ctx context.Context) *GetLicenseTemplateInfoParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the get license template info params
+func (o *GetLicenseTemplateInfoParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the get license template info params
+func (o *GetLicenseTemplateInfoParams) WithHTTPClient(client *http.Client) *GetLicenseTemplateInfoParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the get license template info params
+func (o *GetLicenseTemplateInfoParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithName adds the name to the get license template info params
+func (o *GetLicenseTemplateInfoParams) WithName(name string) *GetLicenseTemplateInfoParams {
+	o.SetName(name)
+	return o
+}
+
+// SetName adds the name to the get license template info params
+func (o *GetLicenseTemplateInfoParams) SetName(name string) {
+	o.Name = name
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *GetLicenseTemplateInfoParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param name
+	if err := r.SetPathParam("name", o.Name); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/miscellaneous/get_license_template_info_responses.go b/bots-common/gitea-generated/client/miscellaneous/get_license_template_info_responses.go
new file mode 100644
index 0000000..0f76c59
--- /dev/null
+++ b/bots-common/gitea-generated/client/miscellaneous/get_license_template_info_responses.go
@@ -0,0 +1,168 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package miscellaneous
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// GetLicenseTemplateInfoReader is a Reader for the GetLicenseTemplateInfo structure.
+type GetLicenseTemplateInfoReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *GetLicenseTemplateInfoReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewGetLicenseTemplateInfoOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewGetLicenseTemplateInfoNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /licenses/{name}] getLicenseTemplateInfo", response, response.Code())
+	}
+}
+
+// NewGetLicenseTemplateInfoOK creates a GetLicenseTemplateInfoOK with default headers values
+func NewGetLicenseTemplateInfoOK() *GetLicenseTemplateInfoOK {
+	return &GetLicenseTemplateInfoOK{}
+}
+
+/*
+GetLicenseTemplateInfoOK describes a response with status code 200, with default header values.
+
+LicenseTemplateInfo
+*/
+type GetLicenseTemplateInfoOK struct {
+	Payload *models.LicenseTemplateInfo
+}
+
+// IsSuccess returns true when this get license template info o k response has a 2xx status code
+func (o *GetLicenseTemplateInfoOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this get license template info o k response has a 3xx status code
+func (o *GetLicenseTemplateInfoOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this get license template info o k response has a 4xx status code
+func (o *GetLicenseTemplateInfoOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this get license template info o k response has a 5xx status code
+func (o *GetLicenseTemplateInfoOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this get license template info o k response a status code equal to that given
+func (o *GetLicenseTemplateInfoOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the get license template info o k response
+func (o *GetLicenseTemplateInfoOK) Code() int {
+	return 200
+}
+
+func (o *GetLicenseTemplateInfoOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /licenses/{name}][%d] getLicenseTemplateInfoOK %s", 200, payload)
+}
+
+func (o *GetLicenseTemplateInfoOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /licenses/{name}][%d] getLicenseTemplateInfoOK %s", 200, payload)
+}
+
+func (o *GetLicenseTemplateInfoOK) GetPayload() *models.LicenseTemplateInfo {
+	return o.Payload
+}
+
+func (o *GetLicenseTemplateInfoOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.LicenseTemplateInfo)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewGetLicenseTemplateInfoNotFound creates a GetLicenseTemplateInfoNotFound with default headers values
+func NewGetLicenseTemplateInfoNotFound() *GetLicenseTemplateInfoNotFound {
+	return &GetLicenseTemplateInfoNotFound{}
+}
+
+/*
+GetLicenseTemplateInfoNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type GetLicenseTemplateInfoNotFound struct {
+}
+
+// IsSuccess returns true when this get license template info not found response has a 2xx status code
+func (o *GetLicenseTemplateInfoNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this get license template info not found response has a 3xx status code
+func (o *GetLicenseTemplateInfoNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this get license template info not found response has a 4xx status code
+func (o *GetLicenseTemplateInfoNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this get license template info not found response has a 5xx status code
+func (o *GetLicenseTemplateInfoNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this get license template info not found response a status code equal to that given
+func (o *GetLicenseTemplateInfoNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the get license template info not found response
+func (o *GetLicenseTemplateInfoNotFound) Code() int {
+	return 404
+}
+
+func (o *GetLicenseTemplateInfoNotFound) Error() string {
+	return fmt.Sprintf("[GET /licenses/{name}][%d] getLicenseTemplateInfoNotFound", 404)
+}
+
+func (o *GetLicenseTemplateInfoNotFound) String() string {
+	return fmt.Sprintf("[GET /licenses/{name}][%d] getLicenseTemplateInfoNotFound", 404)
+}
+
+func (o *GetLicenseTemplateInfoNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/miscellaneous/get_node_info_parameters.go b/bots-common/gitea-generated/client/miscellaneous/get_node_info_parameters.go
new file mode 100644
index 0000000..1839289
--- /dev/null
+++ b/bots-common/gitea-generated/client/miscellaneous/get_node_info_parameters.go
@@ -0,0 +1,128 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package miscellaneous
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewGetNodeInfoParams creates a new GetNodeInfoParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewGetNodeInfoParams() *GetNodeInfoParams {
+	return &GetNodeInfoParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewGetNodeInfoParamsWithTimeout creates a new GetNodeInfoParams object
+// with the ability to set a timeout on a request.
+func NewGetNodeInfoParamsWithTimeout(timeout time.Duration) *GetNodeInfoParams {
+	return &GetNodeInfoParams{
+		timeout: timeout,
+	}
+}
+
+// NewGetNodeInfoParamsWithContext creates a new GetNodeInfoParams object
+// with the ability to set a context for a request.
+func NewGetNodeInfoParamsWithContext(ctx context.Context) *GetNodeInfoParams {
+	return &GetNodeInfoParams{
+		Context: ctx,
+	}
+}
+
+// NewGetNodeInfoParamsWithHTTPClient creates a new GetNodeInfoParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewGetNodeInfoParamsWithHTTPClient(client *http.Client) *GetNodeInfoParams {
+	return &GetNodeInfoParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+GetNodeInfoParams contains all the parameters to send to the API endpoint
+
+	for the get node info operation.
+
+	Typically these are written to a http.Request.
+*/
+type GetNodeInfoParams struct {
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the get node info params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *GetNodeInfoParams) WithDefaults() *GetNodeInfoParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the get node info params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *GetNodeInfoParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the get node info params
+func (o *GetNodeInfoParams) WithTimeout(timeout time.Duration) *GetNodeInfoParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the get node info params
+func (o *GetNodeInfoParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the get node info params
+func (o *GetNodeInfoParams) WithContext(ctx context.Context) *GetNodeInfoParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the get node info params
+func (o *GetNodeInfoParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the get node info params
+func (o *GetNodeInfoParams) WithHTTPClient(client *http.Client) *GetNodeInfoParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the get node info params
+func (o *GetNodeInfoParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *GetNodeInfoParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/miscellaneous/get_node_info_responses.go b/bots-common/gitea-generated/client/miscellaneous/get_node_info_responses.go
new file mode 100644
index 0000000..bcca6cb
--- /dev/null
+++ b/bots-common/gitea-generated/client/miscellaneous/get_node_info_responses.go
@@ -0,0 +1,106 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package miscellaneous
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// GetNodeInfoReader is a Reader for the GetNodeInfo structure.
+type GetNodeInfoReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *GetNodeInfoReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewGetNodeInfoOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	default:
+		return nil, runtime.NewAPIError("[GET /nodeinfo] getNodeInfo", response, response.Code())
+	}
+}
+
+// NewGetNodeInfoOK creates a GetNodeInfoOK with default headers values
+func NewGetNodeInfoOK() *GetNodeInfoOK {
+	return &GetNodeInfoOK{}
+}
+
+/*
+GetNodeInfoOK describes a response with status code 200, with default header values.
+
+NodeInfo
+*/
+type GetNodeInfoOK struct {
+	Payload *models.NodeInfo
+}
+
+// IsSuccess returns true when this get node info o k response has a 2xx status code
+func (o *GetNodeInfoOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this get node info o k response has a 3xx status code
+func (o *GetNodeInfoOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this get node info o k response has a 4xx status code
+func (o *GetNodeInfoOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this get node info o k response has a 5xx status code
+func (o *GetNodeInfoOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this get node info o k response a status code equal to that given
+func (o *GetNodeInfoOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the get node info o k response
+func (o *GetNodeInfoOK) Code() int {
+	return 200
+}
+
+func (o *GetNodeInfoOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /nodeinfo][%d] getNodeInfoOK %s", 200, payload)
+}
+
+func (o *GetNodeInfoOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /nodeinfo][%d] getNodeInfoOK %s", 200, payload)
+}
+
+func (o *GetNodeInfoOK) GetPayload() *models.NodeInfo {
+	return o.Payload
+}
+
+func (o *GetNodeInfoOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.NodeInfo)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/miscellaneous/get_signing_key_parameters.go b/bots-common/gitea-generated/client/miscellaneous/get_signing_key_parameters.go
new file mode 100644
index 0000000..f4b292e
--- /dev/null
+++ b/bots-common/gitea-generated/client/miscellaneous/get_signing_key_parameters.go
@@ -0,0 +1,128 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package miscellaneous
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewGetSigningKeyParams creates a new GetSigningKeyParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewGetSigningKeyParams() *GetSigningKeyParams {
+	return &GetSigningKeyParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewGetSigningKeyParamsWithTimeout creates a new GetSigningKeyParams object
+// with the ability to set a timeout on a request.
+func NewGetSigningKeyParamsWithTimeout(timeout time.Duration) *GetSigningKeyParams {
+	return &GetSigningKeyParams{
+		timeout: timeout,
+	}
+}
+
+// NewGetSigningKeyParamsWithContext creates a new GetSigningKeyParams object
+// with the ability to set a context for a request.
+func NewGetSigningKeyParamsWithContext(ctx context.Context) *GetSigningKeyParams {
+	return &GetSigningKeyParams{
+		Context: ctx,
+	}
+}
+
+// NewGetSigningKeyParamsWithHTTPClient creates a new GetSigningKeyParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewGetSigningKeyParamsWithHTTPClient(client *http.Client) *GetSigningKeyParams {
+	return &GetSigningKeyParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+GetSigningKeyParams contains all the parameters to send to the API endpoint
+
+	for the get signing key operation.
+
+	Typically these are written to a http.Request.
+*/
+type GetSigningKeyParams struct {
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the get signing key params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *GetSigningKeyParams) WithDefaults() *GetSigningKeyParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the get signing key params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *GetSigningKeyParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the get signing key params
+func (o *GetSigningKeyParams) WithTimeout(timeout time.Duration) *GetSigningKeyParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the get signing key params
+func (o *GetSigningKeyParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the get signing key params
+func (o *GetSigningKeyParams) WithContext(ctx context.Context) *GetSigningKeyParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the get signing key params
+func (o *GetSigningKeyParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the get signing key params
+func (o *GetSigningKeyParams) WithHTTPClient(client *http.Client) *GetSigningKeyParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the get signing key params
+func (o *GetSigningKeyParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *GetSigningKeyParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/miscellaneous/get_signing_key_responses.go b/bots-common/gitea-generated/client/miscellaneous/get_signing_key_responses.go
new file mode 100644
index 0000000..ace08e2
--- /dev/null
+++ b/bots-common/gitea-generated/client/miscellaneous/get_signing_key_responses.go
@@ -0,0 +1,102 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package miscellaneous
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// GetSigningKeyReader is a Reader for the GetSigningKey structure.
+type GetSigningKeyReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *GetSigningKeyReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewGetSigningKeyOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	default:
+		return nil, runtime.NewAPIError("[GET /signing-key.gpg] getSigningKey", response, response.Code())
+	}
+}
+
+// NewGetSigningKeyOK creates a GetSigningKeyOK with default headers values
+func NewGetSigningKeyOK() *GetSigningKeyOK {
+	return &GetSigningKeyOK{}
+}
+
+/*
+GetSigningKeyOK describes a response with status code 200, with default header values.
+
+GPG armored public key
+*/
+type GetSigningKeyOK struct {
+	Payload string
+}
+
+// IsSuccess returns true when this get signing key o k response has a 2xx status code
+func (o *GetSigningKeyOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this get signing key o k response has a 3xx status code
+func (o *GetSigningKeyOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this get signing key o k response has a 4xx status code
+func (o *GetSigningKeyOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this get signing key o k response has a 5xx status code
+func (o *GetSigningKeyOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this get signing key o k response a status code equal to that given
+func (o *GetSigningKeyOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the get signing key o k response
+func (o *GetSigningKeyOK) Code() int {
+	return 200
+}
+
+func (o *GetSigningKeyOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /signing-key.gpg][%d] getSigningKeyOK %s", 200, payload)
+}
+
+func (o *GetSigningKeyOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /signing-key.gpg][%d] getSigningKeyOK %s", 200, payload)
+}
+
+func (o *GetSigningKeyOK) GetPayload() string {
+	return o.Payload
+}
+
+func (o *GetSigningKeyOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/miscellaneous/get_version_parameters.go b/bots-common/gitea-generated/client/miscellaneous/get_version_parameters.go
new file mode 100644
index 0000000..8ce4522
--- /dev/null
+++ b/bots-common/gitea-generated/client/miscellaneous/get_version_parameters.go
@@ -0,0 +1,128 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package miscellaneous
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewGetVersionParams creates a new GetVersionParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewGetVersionParams() *GetVersionParams {
+	return &GetVersionParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewGetVersionParamsWithTimeout creates a new GetVersionParams object
+// with the ability to set a timeout on a request.
+func NewGetVersionParamsWithTimeout(timeout time.Duration) *GetVersionParams {
+	return &GetVersionParams{
+		timeout: timeout,
+	}
+}
+
+// NewGetVersionParamsWithContext creates a new GetVersionParams object
+// with the ability to set a context for a request.
+func NewGetVersionParamsWithContext(ctx context.Context) *GetVersionParams {
+	return &GetVersionParams{
+		Context: ctx,
+	}
+}
+
+// NewGetVersionParamsWithHTTPClient creates a new GetVersionParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewGetVersionParamsWithHTTPClient(client *http.Client) *GetVersionParams {
+	return &GetVersionParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+GetVersionParams contains all the parameters to send to the API endpoint
+
+	for the get version operation.
+
+	Typically these are written to a http.Request.
+*/
+type GetVersionParams struct {
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the get version params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *GetVersionParams) WithDefaults() *GetVersionParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the get version params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *GetVersionParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the get version params
+func (o *GetVersionParams) WithTimeout(timeout time.Duration) *GetVersionParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the get version params
+func (o *GetVersionParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the get version params
+func (o *GetVersionParams) WithContext(ctx context.Context) *GetVersionParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the get version params
+func (o *GetVersionParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the get version params
+func (o *GetVersionParams) WithHTTPClient(client *http.Client) *GetVersionParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the get version params
+func (o *GetVersionParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *GetVersionParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/miscellaneous/get_version_responses.go b/bots-common/gitea-generated/client/miscellaneous/get_version_responses.go
new file mode 100644
index 0000000..cda13e4
--- /dev/null
+++ b/bots-common/gitea-generated/client/miscellaneous/get_version_responses.go
@@ -0,0 +1,106 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package miscellaneous
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// GetVersionReader is a Reader for the GetVersion structure.
+type GetVersionReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *GetVersionReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewGetVersionOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	default:
+		return nil, runtime.NewAPIError("[GET /version] getVersion", response, response.Code())
+	}
+}
+
+// NewGetVersionOK creates a GetVersionOK with default headers values
+func NewGetVersionOK() *GetVersionOK {
+	return &GetVersionOK{}
+}
+
+/*
+GetVersionOK describes a response with status code 200, with default header values.
+
+ServerVersion
+*/
+type GetVersionOK struct {
+	Payload *models.ServerVersion
+}
+
+// IsSuccess returns true when this get version o k response has a 2xx status code
+func (o *GetVersionOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this get version o k response has a 3xx status code
+func (o *GetVersionOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this get version o k response has a 4xx status code
+func (o *GetVersionOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this get version o k response has a 5xx status code
+func (o *GetVersionOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this get version o k response a status code equal to that given
+func (o *GetVersionOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the get version o k response
+func (o *GetVersionOK) Code() int {
+	return 200
+}
+
+func (o *GetVersionOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /version][%d] getVersionOK %s", 200, payload)
+}
+
+func (o *GetVersionOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /version][%d] getVersionOK %s", 200, payload)
+}
+
+func (o *GetVersionOK) GetPayload() *models.ServerVersion {
+	return o.Payload
+}
+
+func (o *GetVersionOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.ServerVersion)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/miscellaneous/list_gitignores_templates_parameters.go b/bots-common/gitea-generated/client/miscellaneous/list_gitignores_templates_parameters.go
new file mode 100644
index 0000000..663e440
--- /dev/null
+++ b/bots-common/gitea-generated/client/miscellaneous/list_gitignores_templates_parameters.go
@@ -0,0 +1,128 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package miscellaneous
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewListGitignoresTemplatesParams creates a new ListGitignoresTemplatesParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewListGitignoresTemplatesParams() *ListGitignoresTemplatesParams {
+	return &ListGitignoresTemplatesParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewListGitignoresTemplatesParamsWithTimeout creates a new ListGitignoresTemplatesParams object
+// with the ability to set a timeout on a request.
+func NewListGitignoresTemplatesParamsWithTimeout(timeout time.Duration) *ListGitignoresTemplatesParams {
+	return &ListGitignoresTemplatesParams{
+		timeout: timeout,
+	}
+}
+
+// NewListGitignoresTemplatesParamsWithContext creates a new ListGitignoresTemplatesParams object
+// with the ability to set a context for a request.
+func NewListGitignoresTemplatesParamsWithContext(ctx context.Context) *ListGitignoresTemplatesParams {
+	return &ListGitignoresTemplatesParams{
+		Context: ctx,
+	}
+}
+
+// NewListGitignoresTemplatesParamsWithHTTPClient creates a new ListGitignoresTemplatesParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewListGitignoresTemplatesParamsWithHTTPClient(client *http.Client) *ListGitignoresTemplatesParams {
+	return &ListGitignoresTemplatesParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+ListGitignoresTemplatesParams contains all the parameters to send to the API endpoint
+
+	for the list gitignores templates operation.
+
+	Typically these are written to a http.Request.
+*/
+type ListGitignoresTemplatesParams struct {
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the list gitignores templates params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *ListGitignoresTemplatesParams) WithDefaults() *ListGitignoresTemplatesParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the list gitignores templates params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *ListGitignoresTemplatesParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the list gitignores templates params
+func (o *ListGitignoresTemplatesParams) WithTimeout(timeout time.Duration) *ListGitignoresTemplatesParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the list gitignores templates params
+func (o *ListGitignoresTemplatesParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the list gitignores templates params
+func (o *ListGitignoresTemplatesParams) WithContext(ctx context.Context) *ListGitignoresTemplatesParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the list gitignores templates params
+func (o *ListGitignoresTemplatesParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the list gitignores templates params
+func (o *ListGitignoresTemplatesParams) WithHTTPClient(client *http.Client) *ListGitignoresTemplatesParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the list gitignores templates params
+func (o *ListGitignoresTemplatesParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *ListGitignoresTemplatesParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/miscellaneous/list_gitignores_templates_responses.go b/bots-common/gitea-generated/client/miscellaneous/list_gitignores_templates_responses.go
new file mode 100644
index 0000000..06aef24
--- /dev/null
+++ b/bots-common/gitea-generated/client/miscellaneous/list_gitignores_templates_responses.go
@@ -0,0 +1,102 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package miscellaneous
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// ListGitignoresTemplatesReader is a Reader for the ListGitignoresTemplates structure.
+type ListGitignoresTemplatesReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *ListGitignoresTemplatesReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewListGitignoresTemplatesOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	default:
+		return nil, runtime.NewAPIError("[GET /gitignore/templates] listGitignoresTemplates", response, response.Code())
+	}
+}
+
+// NewListGitignoresTemplatesOK creates a ListGitignoresTemplatesOK with default headers values
+func NewListGitignoresTemplatesOK() *ListGitignoresTemplatesOK {
+	return &ListGitignoresTemplatesOK{}
+}
+
+/*
+ListGitignoresTemplatesOK describes a response with status code 200, with default header values.
+
+GitignoreTemplateList
+*/
+type ListGitignoresTemplatesOK struct {
+	Payload []string
+}
+
+// IsSuccess returns true when this list gitignores templates o k response has a 2xx status code
+func (o *ListGitignoresTemplatesOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this list gitignores templates o k response has a 3xx status code
+func (o *ListGitignoresTemplatesOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this list gitignores templates o k response has a 4xx status code
+func (o *ListGitignoresTemplatesOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this list gitignores templates o k response has a 5xx status code
+func (o *ListGitignoresTemplatesOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this list gitignores templates o k response a status code equal to that given
+func (o *ListGitignoresTemplatesOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the list gitignores templates o k response
+func (o *ListGitignoresTemplatesOK) Code() int {
+	return 200
+}
+
+func (o *ListGitignoresTemplatesOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /gitignore/templates][%d] listGitignoresTemplatesOK %s", 200, payload)
+}
+
+func (o *ListGitignoresTemplatesOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /gitignore/templates][%d] listGitignoresTemplatesOK %s", 200, payload)
+}
+
+func (o *ListGitignoresTemplatesOK) GetPayload() []string {
+	return o.Payload
+}
+
+func (o *ListGitignoresTemplatesOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/miscellaneous/list_label_templates_parameters.go b/bots-common/gitea-generated/client/miscellaneous/list_label_templates_parameters.go
new file mode 100644
index 0000000..a016915
--- /dev/null
+++ b/bots-common/gitea-generated/client/miscellaneous/list_label_templates_parameters.go
@@ -0,0 +1,128 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package miscellaneous
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewListLabelTemplatesParams creates a new ListLabelTemplatesParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewListLabelTemplatesParams() *ListLabelTemplatesParams {
+	return &ListLabelTemplatesParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewListLabelTemplatesParamsWithTimeout creates a new ListLabelTemplatesParams object
+// with the ability to set a timeout on a request.
+func NewListLabelTemplatesParamsWithTimeout(timeout time.Duration) *ListLabelTemplatesParams {
+	return &ListLabelTemplatesParams{
+		timeout: timeout,
+	}
+}
+
+// NewListLabelTemplatesParamsWithContext creates a new ListLabelTemplatesParams object
+// with the ability to set a context for a request.
+func NewListLabelTemplatesParamsWithContext(ctx context.Context) *ListLabelTemplatesParams {
+	return &ListLabelTemplatesParams{
+		Context: ctx,
+	}
+}
+
+// NewListLabelTemplatesParamsWithHTTPClient creates a new ListLabelTemplatesParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewListLabelTemplatesParamsWithHTTPClient(client *http.Client) *ListLabelTemplatesParams {
+	return &ListLabelTemplatesParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+ListLabelTemplatesParams contains all the parameters to send to the API endpoint
+
+	for the list label templates operation.
+
+	Typically these are written to a http.Request.
+*/
+type ListLabelTemplatesParams struct {
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the list label templates params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *ListLabelTemplatesParams) WithDefaults() *ListLabelTemplatesParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the list label templates params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *ListLabelTemplatesParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the list label templates params
+func (o *ListLabelTemplatesParams) WithTimeout(timeout time.Duration) *ListLabelTemplatesParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the list label templates params
+func (o *ListLabelTemplatesParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the list label templates params
+func (o *ListLabelTemplatesParams) WithContext(ctx context.Context) *ListLabelTemplatesParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the list label templates params
+func (o *ListLabelTemplatesParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the list label templates params
+func (o *ListLabelTemplatesParams) WithHTTPClient(client *http.Client) *ListLabelTemplatesParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the list label templates params
+func (o *ListLabelTemplatesParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *ListLabelTemplatesParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/miscellaneous/list_label_templates_responses.go b/bots-common/gitea-generated/client/miscellaneous/list_label_templates_responses.go
new file mode 100644
index 0000000..925f060
--- /dev/null
+++ b/bots-common/gitea-generated/client/miscellaneous/list_label_templates_responses.go
@@ -0,0 +1,102 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package miscellaneous
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// ListLabelTemplatesReader is a Reader for the ListLabelTemplates structure.
+type ListLabelTemplatesReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *ListLabelTemplatesReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewListLabelTemplatesOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	default:
+		return nil, runtime.NewAPIError("[GET /label/templates] listLabelTemplates", response, response.Code())
+	}
+}
+
+// NewListLabelTemplatesOK creates a ListLabelTemplatesOK with default headers values
+func NewListLabelTemplatesOK() *ListLabelTemplatesOK {
+	return &ListLabelTemplatesOK{}
+}
+
+/*
+ListLabelTemplatesOK describes a response with status code 200, with default header values.
+
+LabelTemplateList
+*/
+type ListLabelTemplatesOK struct {
+	Payload []string
+}
+
+// IsSuccess returns true when this list label templates o k response has a 2xx status code
+func (o *ListLabelTemplatesOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this list label templates o k response has a 3xx status code
+func (o *ListLabelTemplatesOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this list label templates o k response has a 4xx status code
+func (o *ListLabelTemplatesOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this list label templates o k response has a 5xx status code
+func (o *ListLabelTemplatesOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this list label templates o k response a status code equal to that given
+func (o *ListLabelTemplatesOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the list label templates o k response
+func (o *ListLabelTemplatesOK) Code() int {
+	return 200
+}
+
+func (o *ListLabelTemplatesOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /label/templates][%d] listLabelTemplatesOK %s", 200, payload)
+}
+
+func (o *ListLabelTemplatesOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /label/templates][%d] listLabelTemplatesOK %s", 200, payload)
+}
+
+func (o *ListLabelTemplatesOK) GetPayload() []string {
+	return o.Payload
+}
+
+func (o *ListLabelTemplatesOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/miscellaneous/list_license_templates_parameters.go b/bots-common/gitea-generated/client/miscellaneous/list_license_templates_parameters.go
new file mode 100644
index 0000000..1d4d9b4
--- /dev/null
+++ b/bots-common/gitea-generated/client/miscellaneous/list_license_templates_parameters.go
@@ -0,0 +1,128 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package miscellaneous
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewListLicenseTemplatesParams creates a new ListLicenseTemplatesParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewListLicenseTemplatesParams() *ListLicenseTemplatesParams {
+	return &ListLicenseTemplatesParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewListLicenseTemplatesParamsWithTimeout creates a new ListLicenseTemplatesParams object
+// with the ability to set a timeout on a request.
+func NewListLicenseTemplatesParamsWithTimeout(timeout time.Duration) *ListLicenseTemplatesParams {
+	return &ListLicenseTemplatesParams{
+		timeout: timeout,
+	}
+}
+
+// NewListLicenseTemplatesParamsWithContext creates a new ListLicenseTemplatesParams object
+// with the ability to set a context for a request.
+func NewListLicenseTemplatesParamsWithContext(ctx context.Context) *ListLicenseTemplatesParams {
+	return &ListLicenseTemplatesParams{
+		Context: ctx,
+	}
+}
+
+// NewListLicenseTemplatesParamsWithHTTPClient creates a new ListLicenseTemplatesParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewListLicenseTemplatesParamsWithHTTPClient(client *http.Client) *ListLicenseTemplatesParams {
+	return &ListLicenseTemplatesParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+ListLicenseTemplatesParams contains all the parameters to send to the API endpoint
+
+	for the list license templates operation.
+
+	Typically these are written to a http.Request.
+*/
+type ListLicenseTemplatesParams struct {
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the list license templates params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *ListLicenseTemplatesParams) WithDefaults() *ListLicenseTemplatesParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the list license templates params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *ListLicenseTemplatesParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the list license templates params
+func (o *ListLicenseTemplatesParams) WithTimeout(timeout time.Duration) *ListLicenseTemplatesParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the list license templates params
+func (o *ListLicenseTemplatesParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the list license templates params
+func (o *ListLicenseTemplatesParams) WithContext(ctx context.Context) *ListLicenseTemplatesParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the list license templates params
+func (o *ListLicenseTemplatesParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the list license templates params
+func (o *ListLicenseTemplatesParams) WithHTTPClient(client *http.Client) *ListLicenseTemplatesParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the list license templates params
+func (o *ListLicenseTemplatesParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *ListLicenseTemplatesParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/miscellaneous/list_license_templates_responses.go b/bots-common/gitea-generated/client/miscellaneous/list_license_templates_responses.go
new file mode 100644
index 0000000..943d3a2
--- /dev/null
+++ b/bots-common/gitea-generated/client/miscellaneous/list_license_templates_responses.go
@@ -0,0 +1,104 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package miscellaneous
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// ListLicenseTemplatesReader is a Reader for the ListLicenseTemplates structure.
+type ListLicenseTemplatesReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *ListLicenseTemplatesReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewListLicenseTemplatesOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	default:
+		return nil, runtime.NewAPIError("[GET /licenses] listLicenseTemplates", response, response.Code())
+	}
+}
+
+// NewListLicenseTemplatesOK creates a ListLicenseTemplatesOK with default headers values
+func NewListLicenseTemplatesOK() *ListLicenseTemplatesOK {
+	return &ListLicenseTemplatesOK{}
+}
+
+/*
+ListLicenseTemplatesOK describes a response with status code 200, with default header values.
+
+LicenseTemplateList
+*/
+type ListLicenseTemplatesOK struct {
+	Payload []*models.LicensesTemplateListEntry
+}
+
+// IsSuccess returns true when this list license templates o k response has a 2xx status code
+func (o *ListLicenseTemplatesOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this list license templates o k response has a 3xx status code
+func (o *ListLicenseTemplatesOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this list license templates o k response has a 4xx status code
+func (o *ListLicenseTemplatesOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this list license templates o k response has a 5xx status code
+func (o *ListLicenseTemplatesOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this list license templates o k response a status code equal to that given
+func (o *ListLicenseTemplatesOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the list license templates o k response
+func (o *ListLicenseTemplatesOK) Code() int {
+	return 200
+}
+
+func (o *ListLicenseTemplatesOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /licenses][%d] listLicenseTemplatesOK %s", 200, payload)
+}
+
+func (o *ListLicenseTemplatesOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /licenses][%d] listLicenseTemplatesOK %s", 200, payload)
+}
+
+func (o *ListLicenseTemplatesOK) GetPayload() []*models.LicensesTemplateListEntry {
+	return o.Payload
+}
+
+func (o *ListLicenseTemplatesOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/miscellaneous/miscellaneous_client.go b/bots-common/gitea-generated/client/miscellaneous/miscellaneous_client.go
new file mode 100644
index 0000000..7623a23
--- /dev/null
+++ b/bots-common/gitea-generated/client/miscellaneous/miscellaneous_client.go
@@ -0,0 +1,606 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package miscellaneous
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	httptransport "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// New creates a new miscellaneous API client.
+func New(transport runtime.ClientTransport, formats strfmt.Registry) ClientService {
+	return &Client{transport: transport, formats: formats}
+}
+
+// New creates a new miscellaneous API client with basic auth credentials.
+// It takes the following parameters:
+// - host: http host (github.com).
+// - basePath: any base path for the API client ("/v1", "/v3").
+// - scheme: http scheme ("http", "https").
+// - user: user for basic authentication header.
+// - password: password for basic authentication header.
+func NewClientWithBasicAuth(host, basePath, scheme, user, password string) ClientService {
+	transport := httptransport.New(host, basePath, []string{scheme})
+	transport.DefaultAuthentication = httptransport.BasicAuth(user, password)
+	return &Client{transport: transport, formats: strfmt.Default}
+}
+
+// New creates a new miscellaneous API client with a bearer token for authentication.
+// It takes the following parameters:
+// - host: http host (github.com).
+// - basePath: any base path for the API client ("/v1", "/v3").
+// - scheme: http scheme ("http", "https").
+// - bearerToken: bearer token for Bearer authentication header.
+func NewClientWithBearerToken(host, basePath, scheme, bearerToken string) ClientService {
+	transport := httptransport.New(host, basePath, []string{scheme})
+	transport.DefaultAuthentication = httptransport.BearerToken(bearerToken)
+	return &Client{transport: transport, formats: strfmt.Default}
+}
+
+/*
+Client for miscellaneous API
+*/
+type Client struct {
+	transport runtime.ClientTransport
+	formats   strfmt.Registry
+}
+
+// ClientOption may be used to customize the behavior of Client methods.
+type ClientOption func(*runtime.ClientOperation)
+
+// This client is generated with a few options you might find useful for your swagger spec.
+//
+// Feel free to add you own set of options.
+
+// WithContentType allows the client to force the Content-Type header
+// to negotiate a specific Consumer from the server.
+//
+// You may use this option to set arbitrary extensions to your MIME media type.
+func WithContentType(mime string) ClientOption {
+	return func(r *runtime.ClientOperation) {
+		r.ConsumesMediaTypes = []string{mime}
+	}
+}
+
+// WithContentTypeApplicationJSON sets the Content-Type header to "application/json".
+func WithContentTypeApplicationJSON(r *runtime.ClientOperation) {
+	r.ConsumesMediaTypes = []string{"application/json"}
+}
+
+// WithContentTypeTextPlain sets the Content-Type header to "text/plain".
+func WithContentTypeTextPlain(r *runtime.ClientOperation) {
+	r.ConsumesMediaTypes = []string{"text/plain"}
+}
+
+// WithAccept allows the client to force the Accept header
+// to negotiate a specific Producer from the server.
+//
+// You may use this option to set arbitrary extensions to your MIME media type.
+func WithAccept(mime string) ClientOption {
+	return func(r *runtime.ClientOperation) {
+		r.ProducesMediaTypes = []string{mime}
+	}
+}
+
+// WithAcceptApplicationJSON sets the Accept header to "application/json".
+func WithAcceptApplicationJSON(r *runtime.ClientOperation) {
+	r.ProducesMediaTypes = []string{"application/json"}
+}
+
+// WithAcceptTextHTML sets the Accept header to "text/html".
+func WithAcceptTextHTML(r *runtime.ClientOperation) {
+	r.ProducesMediaTypes = []string{"text/html"}
+}
+
+// WithAcceptTextPlain sets the Accept header to "text/plain".
+func WithAcceptTextPlain(r *runtime.ClientOperation) {
+	r.ProducesMediaTypes = []string{"text/plain"}
+}
+
+// ClientService is the interface for Client methods
+type ClientService interface {
+	GetGitignoreTemplateInfo(params *GetGitignoreTemplateInfoParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*GetGitignoreTemplateInfoOK, error)
+
+	GetLabelTemplateInfo(params *GetLabelTemplateInfoParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*GetLabelTemplateInfoOK, error)
+
+	GetLicenseTemplateInfo(params *GetLicenseTemplateInfoParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*GetLicenseTemplateInfoOK, error)
+
+	GetNodeInfo(params *GetNodeInfoParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*GetNodeInfoOK, error)
+
+	GetSigningKey(params *GetSigningKeyParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*GetSigningKeyOK, error)
+
+	GetVersion(params *GetVersionParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*GetVersionOK, error)
+
+	ListGitignoresTemplates(params *ListGitignoresTemplatesParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*ListGitignoresTemplatesOK, error)
+
+	ListLabelTemplates(params *ListLabelTemplatesParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*ListLabelTemplatesOK, error)
+
+	ListLicenseTemplates(params *ListLicenseTemplatesParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*ListLicenseTemplatesOK, error)
+
+	RenderMarkdown(params *RenderMarkdownParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RenderMarkdownOK, error)
+
+	RenderMarkdownRaw(params *RenderMarkdownRawParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RenderMarkdownRawOK, error)
+
+	RenderMarkup(params *RenderMarkupParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RenderMarkupOK, error)
+
+	SetTransport(transport runtime.ClientTransport)
+}
+
+/*
+GetGitignoreTemplateInfo returns information about a gitignore template
+*/
+func (a *Client) GetGitignoreTemplateInfo(params *GetGitignoreTemplateInfoParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*GetGitignoreTemplateInfoOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewGetGitignoreTemplateInfoParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "getGitignoreTemplateInfo",
+		Method:             "GET",
+		PathPattern:        "/gitignore/templates/{name}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &GetGitignoreTemplateInfoReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*GetGitignoreTemplateInfoOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for getGitignoreTemplateInfo: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+GetLabelTemplateInfo returns all labels in a template
+*/
+func (a *Client) GetLabelTemplateInfo(params *GetLabelTemplateInfoParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*GetLabelTemplateInfoOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewGetLabelTemplateInfoParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "getLabelTemplateInfo",
+		Method:             "GET",
+		PathPattern:        "/label/templates/{name}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &GetLabelTemplateInfoReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*GetLabelTemplateInfoOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for getLabelTemplateInfo: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+GetLicenseTemplateInfo returns information about a license template
+*/
+func (a *Client) GetLicenseTemplateInfo(params *GetLicenseTemplateInfoParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*GetLicenseTemplateInfoOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewGetLicenseTemplateInfoParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "getLicenseTemplateInfo",
+		Method:             "GET",
+		PathPattern:        "/licenses/{name}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &GetLicenseTemplateInfoReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*GetLicenseTemplateInfoOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for getLicenseTemplateInfo: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+GetNodeInfo returns the nodeinfo of the gitea application
+*/
+func (a *Client) GetNodeInfo(params *GetNodeInfoParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*GetNodeInfoOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewGetNodeInfoParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "getNodeInfo",
+		Method:             "GET",
+		PathPattern:        "/nodeinfo",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &GetNodeInfoReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*GetNodeInfoOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for getNodeInfo: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+GetSigningKey gets default signing key gpg
+*/
+func (a *Client) GetSigningKey(params *GetSigningKeyParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*GetSigningKeyOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewGetSigningKeyParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "getSigningKey",
+		Method:             "GET",
+		PathPattern:        "/signing-key.gpg",
+		ProducesMediaTypes: []string{"text/plain"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &GetSigningKeyReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*GetSigningKeyOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for getSigningKey: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+GetVersion returns the version of the gitea application
+*/
+func (a *Client) GetVersion(params *GetVersionParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*GetVersionOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewGetVersionParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "getVersion",
+		Method:             "GET",
+		PathPattern:        "/version",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &GetVersionReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*GetVersionOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for getVersion: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+ListGitignoresTemplates returns a list of all gitignore templates
+*/
+func (a *Client) ListGitignoresTemplates(params *ListGitignoresTemplatesParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*ListGitignoresTemplatesOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewListGitignoresTemplatesParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "listGitignoresTemplates",
+		Method:             "GET",
+		PathPattern:        "/gitignore/templates",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &ListGitignoresTemplatesReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*ListGitignoresTemplatesOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for listGitignoresTemplates: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+ListLabelTemplates returns a list of all label templates
+*/
+func (a *Client) ListLabelTemplates(params *ListLabelTemplatesParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*ListLabelTemplatesOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewListLabelTemplatesParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "listLabelTemplates",
+		Method:             "GET",
+		PathPattern:        "/label/templates",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &ListLabelTemplatesReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*ListLabelTemplatesOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for listLabelTemplates: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+ListLicenseTemplates returns a list of all license templates
+*/
+func (a *Client) ListLicenseTemplates(params *ListLicenseTemplatesParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*ListLicenseTemplatesOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewListLicenseTemplatesParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "listLicenseTemplates",
+		Method:             "GET",
+		PathPattern:        "/licenses",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &ListLicenseTemplatesReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*ListLicenseTemplatesOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for listLicenseTemplates: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RenderMarkdown renders a markdown document as HTML
+*/
+func (a *Client) RenderMarkdown(params *RenderMarkdownParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RenderMarkdownOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRenderMarkdownParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "renderMarkdown",
+		Method:             "POST",
+		PathPattern:        "/markdown",
+		ProducesMediaTypes: []string{"text/html"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RenderMarkdownReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RenderMarkdownOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for renderMarkdown: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RenderMarkdownRaw renders raw markdown as HTML
+*/
+func (a *Client) RenderMarkdownRaw(params *RenderMarkdownRawParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RenderMarkdownRawOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRenderMarkdownRawParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "renderMarkdownRaw",
+		Method:             "POST",
+		PathPattern:        "/markdown/raw",
+		ProducesMediaTypes: []string{"text/html"},
+		ConsumesMediaTypes: []string{"text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RenderMarkdownRawReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RenderMarkdownRawOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for renderMarkdownRaw: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RenderMarkup renders a markup document as HTML
+*/
+func (a *Client) RenderMarkup(params *RenderMarkupParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RenderMarkupOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRenderMarkupParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "renderMarkup",
+		Method:             "POST",
+		PathPattern:        "/markup",
+		ProducesMediaTypes: []string{"text/html"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RenderMarkupReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RenderMarkupOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for renderMarkup: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+// SetTransport changes the transport on the client
+func (a *Client) SetTransport(transport runtime.ClientTransport) {
+	a.transport = transport
+}
diff --git a/bots-common/gitea-generated/client/miscellaneous/render_markdown_parameters.go b/bots-common/gitea-generated/client/miscellaneous/render_markdown_parameters.go
new file mode 100644
index 0000000..7c1ee1a
--- /dev/null
+++ b/bots-common/gitea-generated/client/miscellaneous/render_markdown_parameters.go
@@ -0,0 +1,150 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package miscellaneous
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewRenderMarkdownParams creates a new RenderMarkdownParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRenderMarkdownParams() *RenderMarkdownParams {
+	return &RenderMarkdownParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRenderMarkdownParamsWithTimeout creates a new RenderMarkdownParams object
+// with the ability to set a timeout on a request.
+func NewRenderMarkdownParamsWithTimeout(timeout time.Duration) *RenderMarkdownParams {
+	return &RenderMarkdownParams{
+		timeout: timeout,
+	}
+}
+
+// NewRenderMarkdownParamsWithContext creates a new RenderMarkdownParams object
+// with the ability to set a context for a request.
+func NewRenderMarkdownParamsWithContext(ctx context.Context) *RenderMarkdownParams {
+	return &RenderMarkdownParams{
+		Context: ctx,
+	}
+}
+
+// NewRenderMarkdownParamsWithHTTPClient creates a new RenderMarkdownParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRenderMarkdownParamsWithHTTPClient(client *http.Client) *RenderMarkdownParams {
+	return &RenderMarkdownParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RenderMarkdownParams contains all the parameters to send to the API endpoint
+
+	for the render markdown operation.
+
+	Typically these are written to a http.Request.
+*/
+type RenderMarkdownParams struct {
+
+	// Body.
+	Body *models.MarkdownOption
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the render markdown params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RenderMarkdownParams) WithDefaults() *RenderMarkdownParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the render markdown params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RenderMarkdownParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the render markdown params
+func (o *RenderMarkdownParams) WithTimeout(timeout time.Duration) *RenderMarkdownParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the render markdown params
+func (o *RenderMarkdownParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the render markdown params
+func (o *RenderMarkdownParams) WithContext(ctx context.Context) *RenderMarkdownParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the render markdown params
+func (o *RenderMarkdownParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the render markdown params
+func (o *RenderMarkdownParams) WithHTTPClient(client *http.Client) *RenderMarkdownParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the render markdown params
+func (o *RenderMarkdownParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the render markdown params
+func (o *RenderMarkdownParams) WithBody(body *models.MarkdownOption) *RenderMarkdownParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the render markdown params
+func (o *RenderMarkdownParams) SetBody(body *models.MarkdownOption) {
+	o.Body = body
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RenderMarkdownParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/miscellaneous/render_markdown_raw_parameters.go b/bots-common/gitea-generated/client/miscellaneous/render_markdown_raw_parameters.go
new file mode 100644
index 0000000..24afc62
--- /dev/null
+++ b/bots-common/gitea-generated/client/miscellaneous/render_markdown_raw_parameters.go
@@ -0,0 +1,149 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package miscellaneous
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewRenderMarkdownRawParams creates a new RenderMarkdownRawParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRenderMarkdownRawParams() *RenderMarkdownRawParams {
+	return &RenderMarkdownRawParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRenderMarkdownRawParamsWithTimeout creates a new RenderMarkdownRawParams object
+// with the ability to set a timeout on a request.
+func NewRenderMarkdownRawParamsWithTimeout(timeout time.Duration) *RenderMarkdownRawParams {
+	return &RenderMarkdownRawParams{
+		timeout: timeout,
+	}
+}
+
+// NewRenderMarkdownRawParamsWithContext creates a new RenderMarkdownRawParams object
+// with the ability to set a context for a request.
+func NewRenderMarkdownRawParamsWithContext(ctx context.Context) *RenderMarkdownRawParams {
+	return &RenderMarkdownRawParams{
+		Context: ctx,
+	}
+}
+
+// NewRenderMarkdownRawParamsWithHTTPClient creates a new RenderMarkdownRawParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRenderMarkdownRawParamsWithHTTPClient(client *http.Client) *RenderMarkdownRawParams {
+	return &RenderMarkdownRawParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RenderMarkdownRawParams contains all the parameters to send to the API endpoint
+
+	for the render markdown raw operation.
+
+	Typically these are written to a http.Request.
+*/
+type RenderMarkdownRawParams struct {
+
+	/* Body.
+
+	   Request body to render
+	*/
+	Body string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the render markdown raw params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RenderMarkdownRawParams) WithDefaults() *RenderMarkdownRawParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the render markdown raw params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RenderMarkdownRawParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the render markdown raw params
+func (o *RenderMarkdownRawParams) WithTimeout(timeout time.Duration) *RenderMarkdownRawParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the render markdown raw params
+func (o *RenderMarkdownRawParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the render markdown raw params
+func (o *RenderMarkdownRawParams) WithContext(ctx context.Context) *RenderMarkdownRawParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the render markdown raw params
+func (o *RenderMarkdownRawParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the render markdown raw params
+func (o *RenderMarkdownRawParams) WithHTTPClient(client *http.Client) *RenderMarkdownRawParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the render markdown raw params
+func (o *RenderMarkdownRawParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the render markdown raw params
+func (o *RenderMarkdownRawParams) WithBody(body string) *RenderMarkdownRawParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the render markdown raw params
+func (o *RenderMarkdownRawParams) SetBody(body string) {
+	o.Body = body
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RenderMarkdownRawParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if err := r.SetBodyParam(o.Body); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/miscellaneous/render_markdown_raw_responses.go b/bots-common/gitea-generated/client/miscellaneous/render_markdown_raw_responses.go
new file mode 100644
index 0000000..bdc12ae
--- /dev/null
+++ b/bots-common/gitea-generated/client/miscellaneous/render_markdown_raw_responses.go
@@ -0,0 +1,180 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package miscellaneous
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// RenderMarkdownRawReader is a Reader for the RenderMarkdownRaw structure.
+type RenderMarkdownRawReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RenderMarkdownRawReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRenderMarkdownRawOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 422:
+		result := NewRenderMarkdownRawUnprocessableEntity()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[POST /markdown/raw] renderMarkdownRaw", response, response.Code())
+	}
+}
+
+// NewRenderMarkdownRawOK creates a RenderMarkdownRawOK with default headers values
+func NewRenderMarkdownRawOK() *RenderMarkdownRawOK {
+	return &RenderMarkdownRawOK{}
+}
+
+/*
+RenderMarkdownRawOK describes a response with status code 200, with default header values.
+
+MarkdownRender is a rendered markdown document
+*/
+type RenderMarkdownRawOK struct {
+	Payload string
+}
+
+// IsSuccess returns true when this render markdown raw o k response has a 2xx status code
+func (o *RenderMarkdownRawOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this render markdown raw o k response has a 3xx status code
+func (o *RenderMarkdownRawOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this render markdown raw o k response has a 4xx status code
+func (o *RenderMarkdownRawOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this render markdown raw o k response has a 5xx status code
+func (o *RenderMarkdownRawOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this render markdown raw o k response a status code equal to that given
+func (o *RenderMarkdownRawOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the render markdown raw o k response
+func (o *RenderMarkdownRawOK) Code() int {
+	return 200
+}
+
+func (o *RenderMarkdownRawOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /markdown/raw][%d] renderMarkdownRawOK %s", 200, payload)
+}
+
+func (o *RenderMarkdownRawOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /markdown/raw][%d] renderMarkdownRawOK %s", 200, payload)
+}
+
+func (o *RenderMarkdownRawOK) GetPayload() string {
+	return o.Payload
+}
+
+func (o *RenderMarkdownRawOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRenderMarkdownRawUnprocessableEntity creates a RenderMarkdownRawUnprocessableEntity with default headers values
+func NewRenderMarkdownRawUnprocessableEntity() *RenderMarkdownRawUnprocessableEntity {
+	return &RenderMarkdownRawUnprocessableEntity{}
+}
+
+/*
+RenderMarkdownRawUnprocessableEntity describes a response with status code 422, with default header values.
+
+APIValidationError is error format response related to input validation
+*/
+type RenderMarkdownRawUnprocessableEntity struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this render markdown raw unprocessable entity response has a 2xx status code
+func (o *RenderMarkdownRawUnprocessableEntity) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this render markdown raw unprocessable entity response has a 3xx status code
+func (o *RenderMarkdownRawUnprocessableEntity) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this render markdown raw unprocessable entity response has a 4xx status code
+func (o *RenderMarkdownRawUnprocessableEntity) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this render markdown raw unprocessable entity response has a 5xx status code
+func (o *RenderMarkdownRawUnprocessableEntity) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this render markdown raw unprocessable entity response a status code equal to that given
+func (o *RenderMarkdownRawUnprocessableEntity) IsCode(code int) bool {
+	return code == 422
+}
+
+// Code gets the status code for the render markdown raw unprocessable entity response
+func (o *RenderMarkdownRawUnprocessableEntity) Code() int {
+	return 422
+}
+
+func (o *RenderMarkdownRawUnprocessableEntity) Error() string {
+	return fmt.Sprintf("[POST /markdown/raw][%d] renderMarkdownRawUnprocessableEntity", 422)
+}
+
+func (o *RenderMarkdownRawUnprocessableEntity) String() string {
+	return fmt.Sprintf("[POST /markdown/raw][%d] renderMarkdownRawUnprocessableEntity", 422)
+}
+
+func (o *RenderMarkdownRawUnprocessableEntity) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/miscellaneous/render_markdown_responses.go b/bots-common/gitea-generated/client/miscellaneous/render_markdown_responses.go
new file mode 100644
index 0000000..f9f62a5
--- /dev/null
+++ b/bots-common/gitea-generated/client/miscellaneous/render_markdown_responses.go
@@ -0,0 +1,180 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package miscellaneous
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// RenderMarkdownReader is a Reader for the RenderMarkdown structure.
+type RenderMarkdownReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RenderMarkdownReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRenderMarkdownOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 422:
+		result := NewRenderMarkdownUnprocessableEntity()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[POST /markdown] renderMarkdown", response, response.Code())
+	}
+}
+
+// NewRenderMarkdownOK creates a RenderMarkdownOK with default headers values
+func NewRenderMarkdownOK() *RenderMarkdownOK {
+	return &RenderMarkdownOK{}
+}
+
+/*
+RenderMarkdownOK describes a response with status code 200, with default header values.
+
+MarkdownRender is a rendered markdown document
+*/
+type RenderMarkdownOK struct {
+	Payload string
+}
+
+// IsSuccess returns true when this render markdown o k response has a 2xx status code
+func (o *RenderMarkdownOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this render markdown o k response has a 3xx status code
+func (o *RenderMarkdownOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this render markdown o k response has a 4xx status code
+func (o *RenderMarkdownOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this render markdown o k response has a 5xx status code
+func (o *RenderMarkdownOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this render markdown o k response a status code equal to that given
+func (o *RenderMarkdownOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the render markdown o k response
+func (o *RenderMarkdownOK) Code() int {
+	return 200
+}
+
+func (o *RenderMarkdownOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /markdown][%d] renderMarkdownOK %s", 200, payload)
+}
+
+func (o *RenderMarkdownOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /markdown][%d] renderMarkdownOK %s", 200, payload)
+}
+
+func (o *RenderMarkdownOK) GetPayload() string {
+	return o.Payload
+}
+
+func (o *RenderMarkdownOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRenderMarkdownUnprocessableEntity creates a RenderMarkdownUnprocessableEntity with default headers values
+func NewRenderMarkdownUnprocessableEntity() *RenderMarkdownUnprocessableEntity {
+	return &RenderMarkdownUnprocessableEntity{}
+}
+
+/*
+RenderMarkdownUnprocessableEntity describes a response with status code 422, with default header values.
+
+APIValidationError is error format response related to input validation
+*/
+type RenderMarkdownUnprocessableEntity struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this render markdown unprocessable entity response has a 2xx status code
+func (o *RenderMarkdownUnprocessableEntity) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this render markdown unprocessable entity response has a 3xx status code
+func (o *RenderMarkdownUnprocessableEntity) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this render markdown unprocessable entity response has a 4xx status code
+func (o *RenderMarkdownUnprocessableEntity) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this render markdown unprocessable entity response has a 5xx status code
+func (o *RenderMarkdownUnprocessableEntity) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this render markdown unprocessable entity response a status code equal to that given
+func (o *RenderMarkdownUnprocessableEntity) IsCode(code int) bool {
+	return code == 422
+}
+
+// Code gets the status code for the render markdown unprocessable entity response
+func (o *RenderMarkdownUnprocessableEntity) Code() int {
+	return 422
+}
+
+func (o *RenderMarkdownUnprocessableEntity) Error() string {
+	return fmt.Sprintf("[POST /markdown][%d] renderMarkdownUnprocessableEntity", 422)
+}
+
+func (o *RenderMarkdownUnprocessableEntity) String() string {
+	return fmt.Sprintf("[POST /markdown][%d] renderMarkdownUnprocessableEntity", 422)
+}
+
+func (o *RenderMarkdownUnprocessableEntity) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/miscellaneous/render_markup_parameters.go b/bots-common/gitea-generated/client/miscellaneous/render_markup_parameters.go
new file mode 100644
index 0000000..2e350d4
--- /dev/null
+++ b/bots-common/gitea-generated/client/miscellaneous/render_markup_parameters.go
@@ -0,0 +1,150 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package miscellaneous
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewRenderMarkupParams creates a new RenderMarkupParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRenderMarkupParams() *RenderMarkupParams {
+	return &RenderMarkupParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRenderMarkupParamsWithTimeout creates a new RenderMarkupParams object
+// with the ability to set a timeout on a request.
+func NewRenderMarkupParamsWithTimeout(timeout time.Duration) *RenderMarkupParams {
+	return &RenderMarkupParams{
+		timeout: timeout,
+	}
+}
+
+// NewRenderMarkupParamsWithContext creates a new RenderMarkupParams object
+// with the ability to set a context for a request.
+func NewRenderMarkupParamsWithContext(ctx context.Context) *RenderMarkupParams {
+	return &RenderMarkupParams{
+		Context: ctx,
+	}
+}
+
+// NewRenderMarkupParamsWithHTTPClient creates a new RenderMarkupParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRenderMarkupParamsWithHTTPClient(client *http.Client) *RenderMarkupParams {
+	return &RenderMarkupParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RenderMarkupParams contains all the parameters to send to the API endpoint
+
+	for the render markup operation.
+
+	Typically these are written to a http.Request.
+*/
+type RenderMarkupParams struct {
+
+	// Body.
+	Body *models.MarkupOption
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the render markup params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RenderMarkupParams) WithDefaults() *RenderMarkupParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the render markup params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RenderMarkupParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the render markup params
+func (o *RenderMarkupParams) WithTimeout(timeout time.Duration) *RenderMarkupParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the render markup params
+func (o *RenderMarkupParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the render markup params
+func (o *RenderMarkupParams) WithContext(ctx context.Context) *RenderMarkupParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the render markup params
+func (o *RenderMarkupParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the render markup params
+func (o *RenderMarkupParams) WithHTTPClient(client *http.Client) *RenderMarkupParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the render markup params
+func (o *RenderMarkupParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the render markup params
+func (o *RenderMarkupParams) WithBody(body *models.MarkupOption) *RenderMarkupParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the render markup params
+func (o *RenderMarkupParams) SetBody(body *models.MarkupOption) {
+	o.Body = body
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RenderMarkupParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/miscellaneous/render_markup_responses.go b/bots-common/gitea-generated/client/miscellaneous/render_markup_responses.go
new file mode 100644
index 0000000..851bbbb
--- /dev/null
+++ b/bots-common/gitea-generated/client/miscellaneous/render_markup_responses.go
@@ -0,0 +1,180 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package miscellaneous
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// RenderMarkupReader is a Reader for the RenderMarkup structure.
+type RenderMarkupReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RenderMarkupReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRenderMarkupOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 422:
+		result := NewRenderMarkupUnprocessableEntity()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[POST /markup] renderMarkup", response, response.Code())
+	}
+}
+
+// NewRenderMarkupOK creates a RenderMarkupOK with default headers values
+func NewRenderMarkupOK() *RenderMarkupOK {
+	return &RenderMarkupOK{}
+}
+
+/*
+RenderMarkupOK describes a response with status code 200, with default header values.
+
+MarkupRender is a rendered markup document
+*/
+type RenderMarkupOK struct {
+	Payload string
+}
+
+// IsSuccess returns true when this render markup o k response has a 2xx status code
+func (o *RenderMarkupOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this render markup o k response has a 3xx status code
+func (o *RenderMarkupOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this render markup o k response has a 4xx status code
+func (o *RenderMarkupOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this render markup o k response has a 5xx status code
+func (o *RenderMarkupOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this render markup o k response a status code equal to that given
+func (o *RenderMarkupOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the render markup o k response
+func (o *RenderMarkupOK) Code() int {
+	return 200
+}
+
+func (o *RenderMarkupOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /markup][%d] renderMarkupOK %s", 200, payload)
+}
+
+func (o *RenderMarkupOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /markup][%d] renderMarkupOK %s", 200, payload)
+}
+
+func (o *RenderMarkupOK) GetPayload() string {
+	return o.Payload
+}
+
+func (o *RenderMarkupOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRenderMarkupUnprocessableEntity creates a RenderMarkupUnprocessableEntity with default headers values
+func NewRenderMarkupUnprocessableEntity() *RenderMarkupUnprocessableEntity {
+	return &RenderMarkupUnprocessableEntity{}
+}
+
+/*
+RenderMarkupUnprocessableEntity describes a response with status code 422, with default header values.
+
+APIValidationError is error format response related to input validation
+*/
+type RenderMarkupUnprocessableEntity struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this render markup unprocessable entity response has a 2xx status code
+func (o *RenderMarkupUnprocessableEntity) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this render markup unprocessable entity response has a 3xx status code
+func (o *RenderMarkupUnprocessableEntity) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this render markup unprocessable entity response has a 4xx status code
+func (o *RenderMarkupUnprocessableEntity) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this render markup unprocessable entity response has a 5xx status code
+func (o *RenderMarkupUnprocessableEntity) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this render markup unprocessable entity response a status code equal to that given
+func (o *RenderMarkupUnprocessableEntity) IsCode(code int) bool {
+	return code == 422
+}
+
+// Code gets the status code for the render markup unprocessable entity response
+func (o *RenderMarkupUnprocessableEntity) Code() int {
+	return 422
+}
+
+func (o *RenderMarkupUnprocessableEntity) Error() string {
+	return fmt.Sprintf("[POST /markup][%d] renderMarkupUnprocessableEntity", 422)
+}
+
+func (o *RenderMarkupUnprocessableEntity) String() string {
+	return fmt.Sprintf("[POST /markup][%d] renderMarkupUnprocessableEntity", 422)
+}
+
+func (o *RenderMarkupUnprocessableEntity) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/notification/notification_client.go b/bots-common/gitea-generated/client/notification/notification_client.go
new file mode 100644
index 0000000..199b2f5
--- /dev/null
+++ b/bots-common/gitea-generated/client/notification/notification_client.go
@@ -0,0 +1,396 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package notification
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	httptransport "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// New creates a new notification API client.
+func New(transport runtime.ClientTransport, formats strfmt.Registry) ClientService {
+	return &Client{transport: transport, formats: formats}
+}
+
+// New creates a new notification API client with basic auth credentials.
+// It takes the following parameters:
+// - host: http host (github.com).
+// - basePath: any base path for the API client ("/v1", "/v3").
+// - scheme: http scheme ("http", "https").
+// - user: user for basic authentication header.
+// - password: password for basic authentication header.
+func NewClientWithBasicAuth(host, basePath, scheme, user, password string) ClientService {
+	transport := httptransport.New(host, basePath, []string{scheme})
+	transport.DefaultAuthentication = httptransport.BasicAuth(user, password)
+	return &Client{transport: transport, formats: strfmt.Default}
+}
+
+// New creates a new notification API client with a bearer token for authentication.
+// It takes the following parameters:
+// - host: http host (github.com).
+// - basePath: any base path for the API client ("/v1", "/v3").
+// - scheme: http scheme ("http", "https").
+// - bearerToken: bearer token for Bearer authentication header.
+func NewClientWithBearerToken(host, basePath, scheme, bearerToken string) ClientService {
+	transport := httptransport.New(host, basePath, []string{scheme})
+	transport.DefaultAuthentication = httptransport.BearerToken(bearerToken)
+	return &Client{transport: transport, formats: strfmt.Default}
+}
+
+/*
+Client for notification API
+*/
+type Client struct {
+	transport runtime.ClientTransport
+	formats   strfmt.Registry
+}
+
+// ClientOption may be used to customize the behavior of Client methods.
+type ClientOption func(*runtime.ClientOperation)
+
+// This client is generated with a few options you might find useful for your swagger spec.
+//
+// Feel free to add you own set of options.
+
+// WithContentType allows the client to force the Content-Type header
+// to negotiate a specific Consumer from the server.
+//
+// You may use this option to set arbitrary extensions to your MIME media type.
+func WithContentType(mime string) ClientOption {
+	return func(r *runtime.ClientOperation) {
+		r.ConsumesMediaTypes = []string{mime}
+	}
+}
+
+// WithContentTypeApplicationJSON sets the Content-Type header to "application/json".
+func WithContentTypeApplicationJSON(r *runtime.ClientOperation) {
+	r.ConsumesMediaTypes = []string{"application/json"}
+}
+
+// WithContentTypeTextPlain sets the Content-Type header to "text/plain".
+func WithContentTypeTextPlain(r *runtime.ClientOperation) {
+	r.ConsumesMediaTypes = []string{"text/plain"}
+}
+
+// WithAccept allows the client to force the Accept header
+// to negotiate a specific Producer from the server.
+//
+// You may use this option to set arbitrary extensions to your MIME media type.
+func WithAccept(mime string) ClientOption {
+	return func(r *runtime.ClientOperation) {
+		r.ProducesMediaTypes = []string{mime}
+	}
+}
+
+// WithAcceptApplicationJSON sets the Accept header to "application/json".
+func WithAcceptApplicationJSON(r *runtime.ClientOperation) {
+	r.ProducesMediaTypes = []string{"application/json"}
+}
+
+// WithAcceptTextHTML sets the Accept header to "text/html".
+func WithAcceptTextHTML(r *runtime.ClientOperation) {
+	r.ProducesMediaTypes = []string{"text/html"}
+}
+
+// ClientService is the interface for Client methods
+type ClientService interface {
+	NotifyGetList(params *NotifyGetListParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*NotifyGetListOK, error)
+
+	NotifyGetRepoList(params *NotifyGetRepoListParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*NotifyGetRepoListOK, error)
+
+	NotifyGetThread(params *NotifyGetThreadParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*NotifyGetThreadOK, error)
+
+	NotifyNewAvailable(params *NotifyNewAvailableParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*NotifyNewAvailableOK, error)
+
+	NotifyReadList(params *NotifyReadListParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*NotifyReadListResetContent, error)
+
+	NotifyReadRepoList(params *NotifyReadRepoListParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*NotifyReadRepoListResetContent, error)
+
+	NotifyReadThread(params *NotifyReadThreadParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*NotifyReadThreadResetContent, error)
+
+	SetTransport(transport runtime.ClientTransport)
+}
+
+/*
+NotifyGetList lists users s notification threads
+*/
+func (a *Client) NotifyGetList(params *NotifyGetListParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*NotifyGetListOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewNotifyGetListParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "notifyGetList",
+		Method:             "GET",
+		PathPattern:        "/notifications",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &NotifyGetListReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*NotifyGetListOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for notifyGetList: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+NotifyGetRepoList lists users s notification threads on a specific repo
+*/
+func (a *Client) NotifyGetRepoList(params *NotifyGetRepoListParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*NotifyGetRepoListOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewNotifyGetRepoListParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "notifyGetRepoList",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/notifications",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &NotifyGetRepoListReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*NotifyGetRepoListOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for notifyGetRepoList: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+NotifyGetThread gets notification thread by ID
+*/
+func (a *Client) NotifyGetThread(params *NotifyGetThreadParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*NotifyGetThreadOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewNotifyGetThreadParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "notifyGetThread",
+		Method:             "GET",
+		PathPattern:        "/notifications/threads/{id}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &NotifyGetThreadReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*NotifyGetThreadOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for notifyGetThread: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+NotifyNewAvailable checks if unread notifications exist
+*/
+func (a *Client) NotifyNewAvailable(params *NotifyNewAvailableParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*NotifyNewAvailableOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewNotifyNewAvailableParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "notifyNewAvailable",
+		Method:             "GET",
+		PathPattern:        "/notifications/new",
+		ProducesMediaTypes: []string{"application/json", "text/html"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &NotifyNewAvailableReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*NotifyNewAvailableOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for notifyNewAvailable: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+NotifyReadList marks notification threads as read pinned or unread
+*/
+func (a *Client) NotifyReadList(params *NotifyReadListParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*NotifyReadListResetContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewNotifyReadListParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "notifyReadList",
+		Method:             "PUT",
+		PathPattern:        "/notifications",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &NotifyReadListReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*NotifyReadListResetContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for notifyReadList: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+NotifyReadRepoList marks notification threads as read pinned or unread on a specific repo
+*/
+func (a *Client) NotifyReadRepoList(params *NotifyReadRepoListParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*NotifyReadRepoListResetContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewNotifyReadRepoListParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "notifyReadRepoList",
+		Method:             "PUT",
+		PathPattern:        "/repos/{owner}/{repo}/notifications",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &NotifyReadRepoListReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*NotifyReadRepoListResetContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for notifyReadRepoList: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+NotifyReadThread marks notification thread as read by ID
+*/
+func (a *Client) NotifyReadThread(params *NotifyReadThreadParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*NotifyReadThreadResetContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewNotifyReadThreadParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "notifyReadThread",
+		Method:             "PATCH",
+		PathPattern:        "/notifications/threads/{id}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &NotifyReadThreadReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*NotifyReadThreadResetContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for notifyReadThread: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+// SetTransport changes the transport on the client
+func (a *Client) SetTransport(transport runtime.ClientTransport) {
+	a.transport = transport
+}
diff --git a/bots-common/gitea-generated/client/notification/notify_get_list_parameters.go b/bots-common/gitea-generated/client/notification/notify_get_list_parameters.go
new file mode 100644
index 0000000..aa62695
--- /dev/null
+++ b/bots-common/gitea-generated/client/notification/notify_get_list_parameters.go
@@ -0,0 +1,394 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package notification
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewNotifyGetListParams creates a new NotifyGetListParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewNotifyGetListParams() *NotifyGetListParams {
+	return &NotifyGetListParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewNotifyGetListParamsWithTimeout creates a new NotifyGetListParams object
+// with the ability to set a timeout on a request.
+func NewNotifyGetListParamsWithTimeout(timeout time.Duration) *NotifyGetListParams {
+	return &NotifyGetListParams{
+		timeout: timeout,
+	}
+}
+
+// NewNotifyGetListParamsWithContext creates a new NotifyGetListParams object
+// with the ability to set a context for a request.
+func NewNotifyGetListParamsWithContext(ctx context.Context) *NotifyGetListParams {
+	return &NotifyGetListParams{
+		Context: ctx,
+	}
+}
+
+// NewNotifyGetListParamsWithHTTPClient creates a new NotifyGetListParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewNotifyGetListParamsWithHTTPClient(client *http.Client) *NotifyGetListParams {
+	return &NotifyGetListParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+NotifyGetListParams contains all the parameters to send to the API endpoint
+
+	for the notify get list operation.
+
+	Typically these are written to a http.Request.
+*/
+type NotifyGetListParams struct {
+
+	/* All.
+
+	   If true, show notifications marked as read. Default value is false
+	*/
+	All *bool
+
+	/* Before.
+
+	   Only show notifications updated before the given time. This is a timestamp in RFC 3339 format
+
+	   Format: date-time
+	*/
+	Before *strfmt.DateTime
+
+	/* Limit.
+
+	   page size of results
+	*/
+	Limit *int64
+
+	/* Page.
+
+	   page number of results to return (1-based)
+	*/
+	Page *int64
+
+	/* Since.
+
+	   Only show notifications updated after the given time. This is a timestamp in RFC 3339 format
+
+	   Format: date-time
+	*/
+	Since *strfmt.DateTime
+
+	/* StatusTypes.
+
+	   Show notifications with the provided status types. Options are: unread, read and/or pinned. Defaults to unread & pinned.
+	*/
+	StatusTypes []string
+
+	/* SubjectType.
+
+	   filter notifications by subject type
+	*/
+	SubjectType []string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the notify get list params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *NotifyGetListParams) WithDefaults() *NotifyGetListParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the notify get list params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *NotifyGetListParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the notify get list params
+func (o *NotifyGetListParams) WithTimeout(timeout time.Duration) *NotifyGetListParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the notify get list params
+func (o *NotifyGetListParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the notify get list params
+func (o *NotifyGetListParams) WithContext(ctx context.Context) *NotifyGetListParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the notify get list params
+func (o *NotifyGetListParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the notify get list params
+func (o *NotifyGetListParams) WithHTTPClient(client *http.Client) *NotifyGetListParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the notify get list params
+func (o *NotifyGetListParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithAll adds the all to the notify get list params
+func (o *NotifyGetListParams) WithAll(all *bool) *NotifyGetListParams {
+	o.SetAll(all)
+	return o
+}
+
+// SetAll adds the all to the notify get list params
+func (o *NotifyGetListParams) SetAll(all *bool) {
+	o.All = all
+}
+
+// WithBefore adds the before to the notify get list params
+func (o *NotifyGetListParams) WithBefore(before *strfmt.DateTime) *NotifyGetListParams {
+	o.SetBefore(before)
+	return o
+}
+
+// SetBefore adds the before to the notify get list params
+func (o *NotifyGetListParams) SetBefore(before *strfmt.DateTime) {
+	o.Before = before
+}
+
+// WithLimit adds the limit to the notify get list params
+func (o *NotifyGetListParams) WithLimit(limit *int64) *NotifyGetListParams {
+	o.SetLimit(limit)
+	return o
+}
+
+// SetLimit adds the limit to the notify get list params
+func (o *NotifyGetListParams) SetLimit(limit *int64) {
+	o.Limit = limit
+}
+
+// WithPage adds the page to the notify get list params
+func (o *NotifyGetListParams) WithPage(page *int64) *NotifyGetListParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the notify get list params
+func (o *NotifyGetListParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WithSince adds the since to the notify get list params
+func (o *NotifyGetListParams) WithSince(since *strfmt.DateTime) *NotifyGetListParams {
+	o.SetSince(since)
+	return o
+}
+
+// SetSince adds the since to the notify get list params
+func (o *NotifyGetListParams) SetSince(since *strfmt.DateTime) {
+	o.Since = since
+}
+
+// WithStatusTypes adds the statusTypes to the notify get list params
+func (o *NotifyGetListParams) WithStatusTypes(statusTypes []string) *NotifyGetListParams {
+	o.SetStatusTypes(statusTypes)
+	return o
+}
+
+// SetStatusTypes adds the statusTypes to the notify get list params
+func (o *NotifyGetListParams) SetStatusTypes(statusTypes []string) {
+	o.StatusTypes = statusTypes
+}
+
+// WithSubjectType adds the subjectType to the notify get list params
+func (o *NotifyGetListParams) WithSubjectType(subjectType []string) *NotifyGetListParams {
+	o.SetSubjectType(subjectType)
+	return o
+}
+
+// SetSubjectType adds the subjectType to the notify get list params
+func (o *NotifyGetListParams) SetSubjectType(subjectType []string) {
+	o.SubjectType = subjectType
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *NotifyGetListParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.All != nil {
+
+		// query param all
+		var qrAll bool
+
+		if o.All != nil {
+			qrAll = *o.All
+		}
+		qAll := swag.FormatBool(qrAll)
+		if qAll != "" {
+
+			if err := r.SetQueryParam("all", qAll); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Before != nil {
+
+		// query param before
+		var qrBefore strfmt.DateTime
+
+		if o.Before != nil {
+			qrBefore = *o.Before
+		}
+		qBefore := qrBefore.String()
+		if qBefore != "" {
+
+			if err := r.SetQueryParam("before", qBefore); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Limit != nil {
+
+		// query param limit
+		var qrLimit int64
+
+		if o.Limit != nil {
+			qrLimit = *o.Limit
+		}
+		qLimit := swag.FormatInt64(qrLimit)
+		if qLimit != "" {
+
+			if err := r.SetQueryParam("limit", qLimit); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Since != nil {
+
+		// query param since
+		var qrSince strfmt.DateTime
+
+		if o.Since != nil {
+			qrSince = *o.Since
+		}
+		qSince := qrSince.String()
+		if qSince != "" {
+
+			if err := r.SetQueryParam("since", qSince); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.StatusTypes != nil {
+
+		// binding items for status-types
+		joinedStatusTypes := o.bindParamStatusTypes(reg)
+
+		// query array param status-types
+		if err := r.SetQueryParam("status-types", joinedStatusTypes...); err != nil {
+			return err
+		}
+	}
+
+	if o.SubjectType != nil {
+
+		// binding items for subject-type
+		joinedSubjectType := o.bindParamSubjectType(reg)
+
+		// query array param subject-type
+		if err := r.SetQueryParam("subject-type", joinedSubjectType...); err != nil {
+			return err
+		}
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+// bindParamNotifyGetList binds the parameter status-types
+func (o *NotifyGetListParams) bindParamStatusTypes(formats strfmt.Registry) []string {
+	statusTypesIR := o.StatusTypes
+
+	var statusTypesIC []string
+	for _, statusTypesIIR := range statusTypesIR { // explode []string
+
+		statusTypesIIV := statusTypesIIR // string as string
+		statusTypesIC = append(statusTypesIC, statusTypesIIV)
+	}
+
+	// items.CollectionFormat: "multi"
+	statusTypesIS := swag.JoinByFormat(statusTypesIC, "multi")
+
+	return statusTypesIS
+}
+
+// bindParamNotifyGetList binds the parameter subject-type
+func (o *NotifyGetListParams) bindParamSubjectType(formats strfmt.Registry) []string {
+	subjectTypeIR := o.SubjectType
+
+	var subjectTypeIC []string
+	for _, subjectTypeIIR := range subjectTypeIR { // explode []string
+
+		subjectTypeIIV := subjectTypeIIR // string as string
+		subjectTypeIC = append(subjectTypeIC, subjectTypeIIV)
+	}
+
+	// items.CollectionFormat: "multi"
+	subjectTypeIS := swag.JoinByFormat(subjectTypeIC, "multi")
+
+	return subjectTypeIS
+}
diff --git a/bots-common/gitea-generated/client/notification/notify_get_list_responses.go b/bots-common/gitea-generated/client/notification/notify_get_list_responses.go
new file mode 100644
index 0000000..37aeaa2
--- /dev/null
+++ b/bots-common/gitea-generated/client/notification/notify_get_list_responses.go
@@ -0,0 +1,104 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package notification
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NotifyGetListReader is a Reader for the NotifyGetList structure.
+type NotifyGetListReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *NotifyGetListReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewNotifyGetListOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	default:
+		return nil, runtime.NewAPIError("[GET /notifications] notifyGetList", response, response.Code())
+	}
+}
+
+// NewNotifyGetListOK creates a NotifyGetListOK with default headers values
+func NewNotifyGetListOK() *NotifyGetListOK {
+	return &NotifyGetListOK{}
+}
+
+/*
+NotifyGetListOK describes a response with status code 200, with default header values.
+
+NotificationThreadList
+*/
+type NotifyGetListOK struct {
+	Payload []*models.NotificationThread
+}
+
+// IsSuccess returns true when this notify get list o k response has a 2xx status code
+func (o *NotifyGetListOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this notify get list o k response has a 3xx status code
+func (o *NotifyGetListOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this notify get list o k response has a 4xx status code
+func (o *NotifyGetListOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this notify get list o k response has a 5xx status code
+func (o *NotifyGetListOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this notify get list o k response a status code equal to that given
+func (o *NotifyGetListOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the notify get list o k response
+func (o *NotifyGetListOK) Code() int {
+	return 200
+}
+
+func (o *NotifyGetListOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /notifications][%d] notifyGetListOK %s", 200, payload)
+}
+
+func (o *NotifyGetListOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /notifications][%d] notifyGetListOK %s", 200, payload)
+}
+
+func (o *NotifyGetListOK) GetPayload() []*models.NotificationThread {
+	return o.Payload
+}
+
+func (o *NotifyGetListOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/notification/notify_get_repo_list_parameters.go b/bots-common/gitea-generated/client/notification/notify_get_repo_list_parameters.go
new file mode 100644
index 0000000..935d5fc
--- /dev/null
+++ b/bots-common/gitea-generated/client/notification/notify_get_repo_list_parameters.go
@@ -0,0 +1,438 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package notification
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewNotifyGetRepoListParams creates a new NotifyGetRepoListParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewNotifyGetRepoListParams() *NotifyGetRepoListParams {
+	return &NotifyGetRepoListParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewNotifyGetRepoListParamsWithTimeout creates a new NotifyGetRepoListParams object
+// with the ability to set a timeout on a request.
+func NewNotifyGetRepoListParamsWithTimeout(timeout time.Duration) *NotifyGetRepoListParams {
+	return &NotifyGetRepoListParams{
+		timeout: timeout,
+	}
+}
+
+// NewNotifyGetRepoListParamsWithContext creates a new NotifyGetRepoListParams object
+// with the ability to set a context for a request.
+func NewNotifyGetRepoListParamsWithContext(ctx context.Context) *NotifyGetRepoListParams {
+	return &NotifyGetRepoListParams{
+		Context: ctx,
+	}
+}
+
+// NewNotifyGetRepoListParamsWithHTTPClient creates a new NotifyGetRepoListParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewNotifyGetRepoListParamsWithHTTPClient(client *http.Client) *NotifyGetRepoListParams {
+	return &NotifyGetRepoListParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+NotifyGetRepoListParams contains all the parameters to send to the API endpoint
+
+	for the notify get repo list operation.
+
+	Typically these are written to a http.Request.
+*/
+type NotifyGetRepoListParams struct {
+
+	/* All.
+
+	   If true, show notifications marked as read. Default value is false
+	*/
+	All *bool
+
+	/* Before.
+
+	   Only show notifications updated before the given time. This is a timestamp in RFC 3339 format
+
+	   Format: date-time
+	*/
+	Before *strfmt.DateTime
+
+	/* Limit.
+
+	   page size of results
+	*/
+	Limit *int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Page.
+
+	   page number of results to return (1-based)
+	*/
+	Page *int64
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	/* Since.
+
+	   Only show notifications updated after the given time. This is a timestamp in RFC 3339 format
+
+	   Format: date-time
+	*/
+	Since *strfmt.DateTime
+
+	/* StatusTypes.
+
+	   Show notifications with the provided status types. Options are: unread, read and/or pinned. Defaults to unread & pinned
+	*/
+	StatusTypes []string
+
+	/* SubjectType.
+
+	   filter notifications by subject type
+	*/
+	SubjectType []string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the notify get repo list params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *NotifyGetRepoListParams) WithDefaults() *NotifyGetRepoListParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the notify get repo list params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *NotifyGetRepoListParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the notify get repo list params
+func (o *NotifyGetRepoListParams) WithTimeout(timeout time.Duration) *NotifyGetRepoListParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the notify get repo list params
+func (o *NotifyGetRepoListParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the notify get repo list params
+func (o *NotifyGetRepoListParams) WithContext(ctx context.Context) *NotifyGetRepoListParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the notify get repo list params
+func (o *NotifyGetRepoListParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the notify get repo list params
+func (o *NotifyGetRepoListParams) WithHTTPClient(client *http.Client) *NotifyGetRepoListParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the notify get repo list params
+func (o *NotifyGetRepoListParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithAll adds the all to the notify get repo list params
+func (o *NotifyGetRepoListParams) WithAll(all *bool) *NotifyGetRepoListParams {
+	o.SetAll(all)
+	return o
+}
+
+// SetAll adds the all to the notify get repo list params
+func (o *NotifyGetRepoListParams) SetAll(all *bool) {
+	o.All = all
+}
+
+// WithBefore adds the before to the notify get repo list params
+func (o *NotifyGetRepoListParams) WithBefore(before *strfmt.DateTime) *NotifyGetRepoListParams {
+	o.SetBefore(before)
+	return o
+}
+
+// SetBefore adds the before to the notify get repo list params
+func (o *NotifyGetRepoListParams) SetBefore(before *strfmt.DateTime) {
+	o.Before = before
+}
+
+// WithLimit adds the limit to the notify get repo list params
+func (o *NotifyGetRepoListParams) WithLimit(limit *int64) *NotifyGetRepoListParams {
+	o.SetLimit(limit)
+	return o
+}
+
+// SetLimit adds the limit to the notify get repo list params
+func (o *NotifyGetRepoListParams) SetLimit(limit *int64) {
+	o.Limit = limit
+}
+
+// WithOwner adds the owner to the notify get repo list params
+func (o *NotifyGetRepoListParams) WithOwner(owner string) *NotifyGetRepoListParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the notify get repo list params
+func (o *NotifyGetRepoListParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithPage adds the page to the notify get repo list params
+func (o *NotifyGetRepoListParams) WithPage(page *int64) *NotifyGetRepoListParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the notify get repo list params
+func (o *NotifyGetRepoListParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WithRepo adds the repo to the notify get repo list params
+func (o *NotifyGetRepoListParams) WithRepo(repo string) *NotifyGetRepoListParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the notify get repo list params
+func (o *NotifyGetRepoListParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WithSince adds the since to the notify get repo list params
+func (o *NotifyGetRepoListParams) WithSince(since *strfmt.DateTime) *NotifyGetRepoListParams {
+	o.SetSince(since)
+	return o
+}
+
+// SetSince adds the since to the notify get repo list params
+func (o *NotifyGetRepoListParams) SetSince(since *strfmt.DateTime) {
+	o.Since = since
+}
+
+// WithStatusTypes adds the statusTypes to the notify get repo list params
+func (o *NotifyGetRepoListParams) WithStatusTypes(statusTypes []string) *NotifyGetRepoListParams {
+	o.SetStatusTypes(statusTypes)
+	return o
+}
+
+// SetStatusTypes adds the statusTypes to the notify get repo list params
+func (o *NotifyGetRepoListParams) SetStatusTypes(statusTypes []string) {
+	o.StatusTypes = statusTypes
+}
+
+// WithSubjectType adds the subjectType to the notify get repo list params
+func (o *NotifyGetRepoListParams) WithSubjectType(subjectType []string) *NotifyGetRepoListParams {
+	o.SetSubjectType(subjectType)
+	return o
+}
+
+// SetSubjectType adds the subjectType to the notify get repo list params
+func (o *NotifyGetRepoListParams) SetSubjectType(subjectType []string) {
+	o.SubjectType = subjectType
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *NotifyGetRepoListParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.All != nil {
+
+		// query param all
+		var qrAll bool
+
+		if o.All != nil {
+			qrAll = *o.All
+		}
+		qAll := swag.FormatBool(qrAll)
+		if qAll != "" {
+
+			if err := r.SetQueryParam("all", qAll); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Before != nil {
+
+		// query param before
+		var qrBefore strfmt.DateTime
+
+		if o.Before != nil {
+			qrBefore = *o.Before
+		}
+		qBefore := qrBefore.String()
+		if qBefore != "" {
+
+			if err := r.SetQueryParam("before", qBefore); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Limit != nil {
+
+		// query param limit
+		var qrLimit int64
+
+		if o.Limit != nil {
+			qrLimit = *o.Limit
+		}
+		qLimit := swag.FormatInt64(qrLimit)
+		if qLimit != "" {
+
+			if err := r.SetQueryParam("limit", qLimit); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if o.Since != nil {
+
+		// query param since
+		var qrSince strfmt.DateTime
+
+		if o.Since != nil {
+			qrSince = *o.Since
+		}
+		qSince := qrSince.String()
+		if qSince != "" {
+
+			if err := r.SetQueryParam("since", qSince); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.StatusTypes != nil {
+
+		// binding items for status-types
+		joinedStatusTypes := o.bindParamStatusTypes(reg)
+
+		// query array param status-types
+		if err := r.SetQueryParam("status-types", joinedStatusTypes...); err != nil {
+			return err
+		}
+	}
+
+	if o.SubjectType != nil {
+
+		// binding items for subject-type
+		joinedSubjectType := o.bindParamSubjectType(reg)
+
+		// query array param subject-type
+		if err := r.SetQueryParam("subject-type", joinedSubjectType...); err != nil {
+			return err
+		}
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+// bindParamNotifyGetRepoList binds the parameter status-types
+func (o *NotifyGetRepoListParams) bindParamStatusTypes(formats strfmt.Registry) []string {
+	statusTypesIR := o.StatusTypes
+
+	var statusTypesIC []string
+	for _, statusTypesIIR := range statusTypesIR { // explode []string
+
+		statusTypesIIV := statusTypesIIR // string as string
+		statusTypesIC = append(statusTypesIC, statusTypesIIV)
+	}
+
+	// items.CollectionFormat: "multi"
+	statusTypesIS := swag.JoinByFormat(statusTypesIC, "multi")
+
+	return statusTypesIS
+}
+
+// bindParamNotifyGetRepoList binds the parameter subject-type
+func (o *NotifyGetRepoListParams) bindParamSubjectType(formats strfmt.Registry) []string {
+	subjectTypeIR := o.SubjectType
+
+	var subjectTypeIC []string
+	for _, subjectTypeIIR := range subjectTypeIR { // explode []string
+
+		subjectTypeIIV := subjectTypeIIR // string as string
+		subjectTypeIC = append(subjectTypeIC, subjectTypeIIV)
+	}
+
+	// items.CollectionFormat: "multi"
+	subjectTypeIS := swag.JoinByFormat(subjectTypeIC, "multi")
+
+	return subjectTypeIS
+}
diff --git a/bots-common/gitea-generated/client/notification/notify_get_repo_list_responses.go b/bots-common/gitea-generated/client/notification/notify_get_repo_list_responses.go
new file mode 100644
index 0000000..e96b47b
--- /dev/null
+++ b/bots-common/gitea-generated/client/notification/notify_get_repo_list_responses.go
@@ -0,0 +1,104 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package notification
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NotifyGetRepoListReader is a Reader for the NotifyGetRepoList structure.
+type NotifyGetRepoListReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *NotifyGetRepoListReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewNotifyGetRepoListOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/notifications] notifyGetRepoList", response, response.Code())
+	}
+}
+
+// NewNotifyGetRepoListOK creates a NotifyGetRepoListOK with default headers values
+func NewNotifyGetRepoListOK() *NotifyGetRepoListOK {
+	return &NotifyGetRepoListOK{}
+}
+
+/*
+NotifyGetRepoListOK describes a response with status code 200, with default header values.
+
+NotificationThreadList
+*/
+type NotifyGetRepoListOK struct {
+	Payload []*models.NotificationThread
+}
+
+// IsSuccess returns true when this notify get repo list o k response has a 2xx status code
+func (o *NotifyGetRepoListOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this notify get repo list o k response has a 3xx status code
+func (o *NotifyGetRepoListOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this notify get repo list o k response has a 4xx status code
+func (o *NotifyGetRepoListOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this notify get repo list o k response has a 5xx status code
+func (o *NotifyGetRepoListOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this notify get repo list o k response a status code equal to that given
+func (o *NotifyGetRepoListOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the notify get repo list o k response
+func (o *NotifyGetRepoListOK) Code() int {
+	return 200
+}
+
+func (o *NotifyGetRepoListOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/notifications][%d] notifyGetRepoListOK %s", 200, payload)
+}
+
+func (o *NotifyGetRepoListOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/notifications][%d] notifyGetRepoListOK %s", 200, payload)
+}
+
+func (o *NotifyGetRepoListOK) GetPayload() []*models.NotificationThread {
+	return o.Payload
+}
+
+func (o *NotifyGetRepoListOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/notification/notify_get_thread_parameters.go b/bots-common/gitea-generated/client/notification/notify_get_thread_parameters.go
new file mode 100644
index 0000000..ee078bc
--- /dev/null
+++ b/bots-common/gitea-generated/client/notification/notify_get_thread_parameters.go
@@ -0,0 +1,151 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package notification
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewNotifyGetThreadParams creates a new NotifyGetThreadParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewNotifyGetThreadParams() *NotifyGetThreadParams {
+	return &NotifyGetThreadParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewNotifyGetThreadParamsWithTimeout creates a new NotifyGetThreadParams object
+// with the ability to set a timeout on a request.
+func NewNotifyGetThreadParamsWithTimeout(timeout time.Duration) *NotifyGetThreadParams {
+	return &NotifyGetThreadParams{
+		timeout: timeout,
+	}
+}
+
+// NewNotifyGetThreadParamsWithContext creates a new NotifyGetThreadParams object
+// with the ability to set a context for a request.
+func NewNotifyGetThreadParamsWithContext(ctx context.Context) *NotifyGetThreadParams {
+	return &NotifyGetThreadParams{
+		Context: ctx,
+	}
+}
+
+// NewNotifyGetThreadParamsWithHTTPClient creates a new NotifyGetThreadParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewNotifyGetThreadParamsWithHTTPClient(client *http.Client) *NotifyGetThreadParams {
+	return &NotifyGetThreadParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+NotifyGetThreadParams contains all the parameters to send to the API endpoint
+
+	for the notify get thread operation.
+
+	Typically these are written to a http.Request.
+*/
+type NotifyGetThreadParams struct {
+
+	/* ID.
+
+	   id of notification thread
+	*/
+	ID string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the notify get thread params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *NotifyGetThreadParams) WithDefaults() *NotifyGetThreadParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the notify get thread params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *NotifyGetThreadParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the notify get thread params
+func (o *NotifyGetThreadParams) WithTimeout(timeout time.Duration) *NotifyGetThreadParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the notify get thread params
+func (o *NotifyGetThreadParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the notify get thread params
+func (o *NotifyGetThreadParams) WithContext(ctx context.Context) *NotifyGetThreadParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the notify get thread params
+func (o *NotifyGetThreadParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the notify get thread params
+func (o *NotifyGetThreadParams) WithHTTPClient(client *http.Client) *NotifyGetThreadParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the notify get thread params
+func (o *NotifyGetThreadParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithID adds the id to the notify get thread params
+func (o *NotifyGetThreadParams) WithID(id string) *NotifyGetThreadParams {
+	o.SetID(id)
+	return o
+}
+
+// SetID adds the id to the notify get thread params
+func (o *NotifyGetThreadParams) SetID(id string) {
+	o.ID = id
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *NotifyGetThreadParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param id
+	if err := r.SetPathParam("id", o.ID); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/notification/notify_get_thread_responses.go b/bots-common/gitea-generated/client/notification/notify_get_thread_responses.go
new file mode 100644
index 0000000..7f2e654
--- /dev/null
+++ b/bots-common/gitea-generated/client/notification/notify_get_thread_responses.go
@@ -0,0 +1,246 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package notification
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NotifyGetThreadReader is a Reader for the NotifyGetThread structure.
+type NotifyGetThreadReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *NotifyGetThreadReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewNotifyGetThreadOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 403:
+		result := NewNotifyGetThreadForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewNotifyGetThreadNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /notifications/threads/{id}] notifyGetThread", response, response.Code())
+	}
+}
+
+// NewNotifyGetThreadOK creates a NotifyGetThreadOK with default headers values
+func NewNotifyGetThreadOK() *NotifyGetThreadOK {
+	return &NotifyGetThreadOK{}
+}
+
+/*
+NotifyGetThreadOK describes a response with status code 200, with default header values.
+
+NotificationThread
+*/
+type NotifyGetThreadOK struct {
+	Payload *models.NotificationThread
+}
+
+// IsSuccess returns true when this notify get thread o k response has a 2xx status code
+func (o *NotifyGetThreadOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this notify get thread o k response has a 3xx status code
+func (o *NotifyGetThreadOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this notify get thread o k response has a 4xx status code
+func (o *NotifyGetThreadOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this notify get thread o k response has a 5xx status code
+func (o *NotifyGetThreadOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this notify get thread o k response a status code equal to that given
+func (o *NotifyGetThreadOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the notify get thread o k response
+func (o *NotifyGetThreadOK) Code() int {
+	return 200
+}
+
+func (o *NotifyGetThreadOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /notifications/threads/{id}][%d] notifyGetThreadOK %s", 200, payload)
+}
+
+func (o *NotifyGetThreadOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /notifications/threads/{id}][%d] notifyGetThreadOK %s", 200, payload)
+}
+
+func (o *NotifyGetThreadOK) GetPayload() *models.NotificationThread {
+	return o.Payload
+}
+
+func (o *NotifyGetThreadOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.NotificationThread)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewNotifyGetThreadForbidden creates a NotifyGetThreadForbidden with default headers values
+func NewNotifyGetThreadForbidden() *NotifyGetThreadForbidden {
+	return &NotifyGetThreadForbidden{}
+}
+
+/*
+NotifyGetThreadForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type NotifyGetThreadForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this notify get thread forbidden response has a 2xx status code
+func (o *NotifyGetThreadForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this notify get thread forbidden response has a 3xx status code
+func (o *NotifyGetThreadForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this notify get thread forbidden response has a 4xx status code
+func (o *NotifyGetThreadForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this notify get thread forbidden response has a 5xx status code
+func (o *NotifyGetThreadForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this notify get thread forbidden response a status code equal to that given
+func (o *NotifyGetThreadForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the notify get thread forbidden response
+func (o *NotifyGetThreadForbidden) Code() int {
+	return 403
+}
+
+func (o *NotifyGetThreadForbidden) Error() string {
+	return fmt.Sprintf("[GET /notifications/threads/{id}][%d] notifyGetThreadForbidden", 403)
+}
+
+func (o *NotifyGetThreadForbidden) String() string {
+	return fmt.Sprintf("[GET /notifications/threads/{id}][%d] notifyGetThreadForbidden", 403)
+}
+
+func (o *NotifyGetThreadForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewNotifyGetThreadNotFound creates a NotifyGetThreadNotFound with default headers values
+func NewNotifyGetThreadNotFound() *NotifyGetThreadNotFound {
+	return &NotifyGetThreadNotFound{}
+}
+
+/*
+NotifyGetThreadNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type NotifyGetThreadNotFound struct {
+}
+
+// IsSuccess returns true when this notify get thread not found response has a 2xx status code
+func (o *NotifyGetThreadNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this notify get thread not found response has a 3xx status code
+func (o *NotifyGetThreadNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this notify get thread not found response has a 4xx status code
+func (o *NotifyGetThreadNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this notify get thread not found response has a 5xx status code
+func (o *NotifyGetThreadNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this notify get thread not found response a status code equal to that given
+func (o *NotifyGetThreadNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the notify get thread not found response
+func (o *NotifyGetThreadNotFound) Code() int {
+	return 404
+}
+
+func (o *NotifyGetThreadNotFound) Error() string {
+	return fmt.Sprintf("[GET /notifications/threads/{id}][%d] notifyGetThreadNotFound", 404)
+}
+
+func (o *NotifyGetThreadNotFound) String() string {
+	return fmt.Sprintf("[GET /notifications/threads/{id}][%d] notifyGetThreadNotFound", 404)
+}
+
+func (o *NotifyGetThreadNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/notification/notify_new_available_parameters.go b/bots-common/gitea-generated/client/notification/notify_new_available_parameters.go
new file mode 100644
index 0000000..01e18c3
--- /dev/null
+++ b/bots-common/gitea-generated/client/notification/notify_new_available_parameters.go
@@ -0,0 +1,128 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package notification
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewNotifyNewAvailableParams creates a new NotifyNewAvailableParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewNotifyNewAvailableParams() *NotifyNewAvailableParams {
+	return &NotifyNewAvailableParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewNotifyNewAvailableParamsWithTimeout creates a new NotifyNewAvailableParams object
+// with the ability to set a timeout on a request.
+func NewNotifyNewAvailableParamsWithTimeout(timeout time.Duration) *NotifyNewAvailableParams {
+	return &NotifyNewAvailableParams{
+		timeout: timeout,
+	}
+}
+
+// NewNotifyNewAvailableParamsWithContext creates a new NotifyNewAvailableParams object
+// with the ability to set a context for a request.
+func NewNotifyNewAvailableParamsWithContext(ctx context.Context) *NotifyNewAvailableParams {
+	return &NotifyNewAvailableParams{
+		Context: ctx,
+	}
+}
+
+// NewNotifyNewAvailableParamsWithHTTPClient creates a new NotifyNewAvailableParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewNotifyNewAvailableParamsWithHTTPClient(client *http.Client) *NotifyNewAvailableParams {
+	return &NotifyNewAvailableParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+NotifyNewAvailableParams contains all the parameters to send to the API endpoint
+
+	for the notify new available operation.
+
+	Typically these are written to a http.Request.
+*/
+type NotifyNewAvailableParams struct {
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the notify new available params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *NotifyNewAvailableParams) WithDefaults() *NotifyNewAvailableParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the notify new available params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *NotifyNewAvailableParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the notify new available params
+func (o *NotifyNewAvailableParams) WithTimeout(timeout time.Duration) *NotifyNewAvailableParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the notify new available params
+func (o *NotifyNewAvailableParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the notify new available params
+func (o *NotifyNewAvailableParams) WithContext(ctx context.Context) *NotifyNewAvailableParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the notify new available params
+func (o *NotifyNewAvailableParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the notify new available params
+func (o *NotifyNewAvailableParams) WithHTTPClient(client *http.Client) *NotifyNewAvailableParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the notify new available params
+func (o *NotifyNewAvailableParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *NotifyNewAvailableParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/notification/notify_new_available_responses.go b/bots-common/gitea-generated/client/notification/notify_new_available_responses.go
new file mode 100644
index 0000000..19682df
--- /dev/null
+++ b/bots-common/gitea-generated/client/notification/notify_new_available_responses.go
@@ -0,0 +1,106 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package notification
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NotifyNewAvailableReader is a Reader for the NotifyNewAvailable structure.
+type NotifyNewAvailableReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *NotifyNewAvailableReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewNotifyNewAvailableOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	default:
+		return nil, runtime.NewAPIError("[GET /notifications/new] notifyNewAvailable", response, response.Code())
+	}
+}
+
+// NewNotifyNewAvailableOK creates a NotifyNewAvailableOK with default headers values
+func NewNotifyNewAvailableOK() *NotifyNewAvailableOK {
+	return &NotifyNewAvailableOK{}
+}
+
+/*
+NotifyNewAvailableOK describes a response with status code 200, with default header values.
+
+Number of unread notifications
+*/
+type NotifyNewAvailableOK struct {
+	Payload *models.NotificationCount
+}
+
+// IsSuccess returns true when this notify new available o k response has a 2xx status code
+func (o *NotifyNewAvailableOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this notify new available o k response has a 3xx status code
+func (o *NotifyNewAvailableOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this notify new available o k response has a 4xx status code
+func (o *NotifyNewAvailableOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this notify new available o k response has a 5xx status code
+func (o *NotifyNewAvailableOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this notify new available o k response a status code equal to that given
+func (o *NotifyNewAvailableOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the notify new available o k response
+func (o *NotifyNewAvailableOK) Code() int {
+	return 200
+}
+
+func (o *NotifyNewAvailableOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /notifications/new][%d] notifyNewAvailableOK %s", 200, payload)
+}
+
+func (o *NotifyNewAvailableOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /notifications/new][%d] notifyNewAvailableOK %s", 200, payload)
+}
+
+func (o *NotifyNewAvailableOK) GetPayload() *models.NotificationCount {
+	return o.Payload
+}
+
+func (o *NotifyNewAvailableOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.NotificationCount)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/notification/notify_read_list_parameters.go b/bots-common/gitea-generated/client/notification/notify_read_list_parameters.go
new file mode 100644
index 0000000..2258124
--- /dev/null
+++ b/bots-common/gitea-generated/client/notification/notify_read_list_parameters.go
@@ -0,0 +1,279 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package notification
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewNotifyReadListParams creates a new NotifyReadListParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewNotifyReadListParams() *NotifyReadListParams {
+	return &NotifyReadListParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewNotifyReadListParamsWithTimeout creates a new NotifyReadListParams object
+// with the ability to set a timeout on a request.
+func NewNotifyReadListParamsWithTimeout(timeout time.Duration) *NotifyReadListParams {
+	return &NotifyReadListParams{
+		timeout: timeout,
+	}
+}
+
+// NewNotifyReadListParamsWithContext creates a new NotifyReadListParams object
+// with the ability to set a context for a request.
+func NewNotifyReadListParamsWithContext(ctx context.Context) *NotifyReadListParams {
+	return &NotifyReadListParams{
+		Context: ctx,
+	}
+}
+
+// NewNotifyReadListParamsWithHTTPClient creates a new NotifyReadListParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewNotifyReadListParamsWithHTTPClient(client *http.Client) *NotifyReadListParams {
+	return &NotifyReadListParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+NotifyReadListParams contains all the parameters to send to the API endpoint
+
+	for the notify read list operation.
+
+	Typically these are written to a http.Request.
+*/
+type NotifyReadListParams struct {
+
+	/* All.
+
+	   If true, mark all notifications on this repo. Default value is false
+	*/
+	All *string
+
+	/* LastReadAt.
+
+	   Describes the last point that notifications were checked. Anything updated since this time will not be updated.
+
+	   Format: date-time
+	*/
+	LastReadAt *strfmt.DateTime
+
+	/* StatusTypes.
+
+	   Mark notifications with the provided status types. Options are: unread, read and/or pinned. Defaults to unread.
+	*/
+	StatusTypes []string
+
+	/* ToStatus.
+
+	   Status to mark notifications as, Defaults to read.
+	*/
+	ToStatus *string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the notify read list params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *NotifyReadListParams) WithDefaults() *NotifyReadListParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the notify read list params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *NotifyReadListParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the notify read list params
+func (o *NotifyReadListParams) WithTimeout(timeout time.Duration) *NotifyReadListParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the notify read list params
+func (o *NotifyReadListParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the notify read list params
+func (o *NotifyReadListParams) WithContext(ctx context.Context) *NotifyReadListParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the notify read list params
+func (o *NotifyReadListParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the notify read list params
+func (o *NotifyReadListParams) WithHTTPClient(client *http.Client) *NotifyReadListParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the notify read list params
+func (o *NotifyReadListParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithAll adds the all to the notify read list params
+func (o *NotifyReadListParams) WithAll(all *string) *NotifyReadListParams {
+	o.SetAll(all)
+	return o
+}
+
+// SetAll adds the all to the notify read list params
+func (o *NotifyReadListParams) SetAll(all *string) {
+	o.All = all
+}
+
+// WithLastReadAt adds the lastReadAt to the notify read list params
+func (o *NotifyReadListParams) WithLastReadAt(lastReadAt *strfmt.DateTime) *NotifyReadListParams {
+	o.SetLastReadAt(lastReadAt)
+	return o
+}
+
+// SetLastReadAt adds the lastReadAt to the notify read list params
+func (o *NotifyReadListParams) SetLastReadAt(lastReadAt *strfmt.DateTime) {
+	o.LastReadAt = lastReadAt
+}
+
+// WithStatusTypes adds the statusTypes to the notify read list params
+func (o *NotifyReadListParams) WithStatusTypes(statusTypes []string) *NotifyReadListParams {
+	o.SetStatusTypes(statusTypes)
+	return o
+}
+
+// SetStatusTypes adds the statusTypes to the notify read list params
+func (o *NotifyReadListParams) SetStatusTypes(statusTypes []string) {
+	o.StatusTypes = statusTypes
+}
+
+// WithToStatus adds the toStatus to the notify read list params
+func (o *NotifyReadListParams) WithToStatus(toStatus *string) *NotifyReadListParams {
+	o.SetToStatus(toStatus)
+	return o
+}
+
+// SetToStatus adds the toStatus to the notify read list params
+func (o *NotifyReadListParams) SetToStatus(toStatus *string) {
+	o.ToStatus = toStatus
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *NotifyReadListParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.All != nil {
+
+		// query param all
+		var qrAll string
+
+		if o.All != nil {
+			qrAll = *o.All
+		}
+		qAll := qrAll
+		if qAll != "" {
+
+			if err := r.SetQueryParam("all", qAll); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.LastReadAt != nil {
+
+		// query param last_read_at
+		var qrLastReadAt strfmt.DateTime
+
+		if o.LastReadAt != nil {
+			qrLastReadAt = *o.LastReadAt
+		}
+		qLastReadAt := qrLastReadAt.String()
+		if qLastReadAt != "" {
+
+			if err := r.SetQueryParam("last_read_at", qLastReadAt); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.StatusTypes != nil {
+
+		// binding items for status-types
+		joinedStatusTypes := o.bindParamStatusTypes(reg)
+
+		// query array param status-types
+		if err := r.SetQueryParam("status-types", joinedStatusTypes...); err != nil {
+			return err
+		}
+	}
+
+	if o.ToStatus != nil {
+
+		// query param to-status
+		var qrToStatus string
+
+		if o.ToStatus != nil {
+			qrToStatus = *o.ToStatus
+		}
+		qToStatus := qrToStatus
+		if qToStatus != "" {
+
+			if err := r.SetQueryParam("to-status", qToStatus); err != nil {
+				return err
+			}
+		}
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+// bindParamNotifyReadList binds the parameter status-types
+func (o *NotifyReadListParams) bindParamStatusTypes(formats strfmt.Registry) []string {
+	statusTypesIR := o.StatusTypes
+
+	var statusTypesIC []string
+	for _, statusTypesIIR := range statusTypesIR { // explode []string
+
+		statusTypesIIV := statusTypesIIR // string as string
+		statusTypesIC = append(statusTypesIC, statusTypesIIV)
+	}
+
+	// items.CollectionFormat: "multi"
+	statusTypesIS := swag.JoinByFormat(statusTypesIC, "multi")
+
+	return statusTypesIS
+}
diff --git a/bots-common/gitea-generated/client/notification/notify_read_list_responses.go b/bots-common/gitea-generated/client/notification/notify_read_list_responses.go
new file mode 100644
index 0000000..735862f
--- /dev/null
+++ b/bots-common/gitea-generated/client/notification/notify_read_list_responses.go
@@ -0,0 +1,104 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package notification
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NotifyReadListReader is a Reader for the NotifyReadList structure.
+type NotifyReadListReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *NotifyReadListReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 205:
+		result := NewNotifyReadListResetContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	default:
+		return nil, runtime.NewAPIError("[PUT /notifications] notifyReadList", response, response.Code())
+	}
+}
+
+// NewNotifyReadListResetContent creates a NotifyReadListResetContent with default headers values
+func NewNotifyReadListResetContent() *NotifyReadListResetContent {
+	return &NotifyReadListResetContent{}
+}
+
+/*
+NotifyReadListResetContent describes a response with status code 205, with default header values.
+
+NotificationThreadList
+*/
+type NotifyReadListResetContent struct {
+	Payload []*models.NotificationThread
+}
+
+// IsSuccess returns true when this notify read list reset content response has a 2xx status code
+func (o *NotifyReadListResetContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this notify read list reset content response has a 3xx status code
+func (o *NotifyReadListResetContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this notify read list reset content response has a 4xx status code
+func (o *NotifyReadListResetContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this notify read list reset content response has a 5xx status code
+func (o *NotifyReadListResetContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this notify read list reset content response a status code equal to that given
+func (o *NotifyReadListResetContent) IsCode(code int) bool {
+	return code == 205
+}
+
+// Code gets the status code for the notify read list reset content response
+func (o *NotifyReadListResetContent) Code() int {
+	return 205
+}
+
+func (o *NotifyReadListResetContent) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[PUT /notifications][%d] notifyReadListResetContent %s", 205, payload)
+}
+
+func (o *NotifyReadListResetContent) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[PUT /notifications][%d] notifyReadListResetContent %s", 205, payload)
+}
+
+func (o *NotifyReadListResetContent) GetPayload() []*models.NotificationThread {
+	return o.Payload
+}
+
+func (o *NotifyReadListResetContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/notification/notify_read_repo_list_parameters.go b/bots-common/gitea-generated/client/notification/notify_read_repo_list_parameters.go
new file mode 100644
index 0000000..658a64b
--- /dev/null
+++ b/bots-common/gitea-generated/client/notification/notify_read_repo_list_parameters.go
@@ -0,0 +1,323 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package notification
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewNotifyReadRepoListParams creates a new NotifyReadRepoListParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewNotifyReadRepoListParams() *NotifyReadRepoListParams {
+	return &NotifyReadRepoListParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewNotifyReadRepoListParamsWithTimeout creates a new NotifyReadRepoListParams object
+// with the ability to set a timeout on a request.
+func NewNotifyReadRepoListParamsWithTimeout(timeout time.Duration) *NotifyReadRepoListParams {
+	return &NotifyReadRepoListParams{
+		timeout: timeout,
+	}
+}
+
+// NewNotifyReadRepoListParamsWithContext creates a new NotifyReadRepoListParams object
+// with the ability to set a context for a request.
+func NewNotifyReadRepoListParamsWithContext(ctx context.Context) *NotifyReadRepoListParams {
+	return &NotifyReadRepoListParams{
+		Context: ctx,
+	}
+}
+
+// NewNotifyReadRepoListParamsWithHTTPClient creates a new NotifyReadRepoListParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewNotifyReadRepoListParamsWithHTTPClient(client *http.Client) *NotifyReadRepoListParams {
+	return &NotifyReadRepoListParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+NotifyReadRepoListParams contains all the parameters to send to the API endpoint
+
+	for the notify read repo list operation.
+
+	Typically these are written to a http.Request.
+*/
+type NotifyReadRepoListParams struct {
+
+	/* All.
+
+	   If true, mark all notifications on this repo. Default value is false
+	*/
+	All *string
+
+	/* LastReadAt.
+
+	   Describes the last point that notifications were checked. Anything updated since this time will not be updated.
+
+	   Format: date-time
+	*/
+	LastReadAt *strfmt.DateTime
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	/* StatusTypes.
+
+	   Mark notifications with the provided status types. Options are: unread, read and/or pinned. Defaults to unread.
+	*/
+	StatusTypes []string
+
+	/* ToStatus.
+
+	   Status to mark notifications as. Defaults to read.
+	*/
+	ToStatus *string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the notify read repo list params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *NotifyReadRepoListParams) WithDefaults() *NotifyReadRepoListParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the notify read repo list params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *NotifyReadRepoListParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the notify read repo list params
+func (o *NotifyReadRepoListParams) WithTimeout(timeout time.Duration) *NotifyReadRepoListParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the notify read repo list params
+func (o *NotifyReadRepoListParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the notify read repo list params
+func (o *NotifyReadRepoListParams) WithContext(ctx context.Context) *NotifyReadRepoListParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the notify read repo list params
+func (o *NotifyReadRepoListParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the notify read repo list params
+func (o *NotifyReadRepoListParams) WithHTTPClient(client *http.Client) *NotifyReadRepoListParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the notify read repo list params
+func (o *NotifyReadRepoListParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithAll adds the all to the notify read repo list params
+func (o *NotifyReadRepoListParams) WithAll(all *string) *NotifyReadRepoListParams {
+	o.SetAll(all)
+	return o
+}
+
+// SetAll adds the all to the notify read repo list params
+func (o *NotifyReadRepoListParams) SetAll(all *string) {
+	o.All = all
+}
+
+// WithLastReadAt adds the lastReadAt to the notify read repo list params
+func (o *NotifyReadRepoListParams) WithLastReadAt(lastReadAt *strfmt.DateTime) *NotifyReadRepoListParams {
+	o.SetLastReadAt(lastReadAt)
+	return o
+}
+
+// SetLastReadAt adds the lastReadAt to the notify read repo list params
+func (o *NotifyReadRepoListParams) SetLastReadAt(lastReadAt *strfmt.DateTime) {
+	o.LastReadAt = lastReadAt
+}
+
+// WithOwner adds the owner to the notify read repo list params
+func (o *NotifyReadRepoListParams) WithOwner(owner string) *NotifyReadRepoListParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the notify read repo list params
+func (o *NotifyReadRepoListParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the notify read repo list params
+func (o *NotifyReadRepoListParams) WithRepo(repo string) *NotifyReadRepoListParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the notify read repo list params
+func (o *NotifyReadRepoListParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WithStatusTypes adds the statusTypes to the notify read repo list params
+func (o *NotifyReadRepoListParams) WithStatusTypes(statusTypes []string) *NotifyReadRepoListParams {
+	o.SetStatusTypes(statusTypes)
+	return o
+}
+
+// SetStatusTypes adds the statusTypes to the notify read repo list params
+func (o *NotifyReadRepoListParams) SetStatusTypes(statusTypes []string) {
+	o.StatusTypes = statusTypes
+}
+
+// WithToStatus adds the toStatus to the notify read repo list params
+func (o *NotifyReadRepoListParams) WithToStatus(toStatus *string) *NotifyReadRepoListParams {
+	o.SetToStatus(toStatus)
+	return o
+}
+
+// SetToStatus adds the toStatus to the notify read repo list params
+func (o *NotifyReadRepoListParams) SetToStatus(toStatus *string) {
+	o.ToStatus = toStatus
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *NotifyReadRepoListParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.All != nil {
+
+		// query param all
+		var qrAll string
+
+		if o.All != nil {
+			qrAll = *o.All
+		}
+		qAll := qrAll
+		if qAll != "" {
+
+			if err := r.SetQueryParam("all", qAll); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.LastReadAt != nil {
+
+		// query param last_read_at
+		var qrLastReadAt strfmt.DateTime
+
+		if o.LastReadAt != nil {
+			qrLastReadAt = *o.LastReadAt
+		}
+		qLastReadAt := qrLastReadAt.String()
+		if qLastReadAt != "" {
+
+			if err := r.SetQueryParam("last_read_at", qLastReadAt); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if o.StatusTypes != nil {
+
+		// binding items for status-types
+		joinedStatusTypes := o.bindParamStatusTypes(reg)
+
+		// query array param status-types
+		if err := r.SetQueryParam("status-types", joinedStatusTypes...); err != nil {
+			return err
+		}
+	}
+
+	if o.ToStatus != nil {
+
+		// query param to-status
+		var qrToStatus string
+
+		if o.ToStatus != nil {
+			qrToStatus = *o.ToStatus
+		}
+		qToStatus := qrToStatus
+		if qToStatus != "" {
+
+			if err := r.SetQueryParam("to-status", qToStatus); err != nil {
+				return err
+			}
+		}
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+// bindParamNotifyReadRepoList binds the parameter status-types
+func (o *NotifyReadRepoListParams) bindParamStatusTypes(formats strfmt.Registry) []string {
+	statusTypesIR := o.StatusTypes
+
+	var statusTypesIC []string
+	for _, statusTypesIIR := range statusTypesIR { // explode []string
+
+		statusTypesIIV := statusTypesIIR // string as string
+		statusTypesIC = append(statusTypesIC, statusTypesIIV)
+	}
+
+	// items.CollectionFormat: "multi"
+	statusTypesIS := swag.JoinByFormat(statusTypesIC, "multi")
+
+	return statusTypesIS
+}
diff --git a/bots-common/gitea-generated/client/notification/notify_read_repo_list_responses.go b/bots-common/gitea-generated/client/notification/notify_read_repo_list_responses.go
new file mode 100644
index 0000000..dcaca4c
--- /dev/null
+++ b/bots-common/gitea-generated/client/notification/notify_read_repo_list_responses.go
@@ -0,0 +1,104 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package notification
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NotifyReadRepoListReader is a Reader for the NotifyReadRepoList structure.
+type NotifyReadRepoListReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *NotifyReadRepoListReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 205:
+		result := NewNotifyReadRepoListResetContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	default:
+		return nil, runtime.NewAPIError("[PUT /repos/{owner}/{repo}/notifications] notifyReadRepoList", response, response.Code())
+	}
+}
+
+// NewNotifyReadRepoListResetContent creates a NotifyReadRepoListResetContent with default headers values
+func NewNotifyReadRepoListResetContent() *NotifyReadRepoListResetContent {
+	return &NotifyReadRepoListResetContent{}
+}
+
+/*
+NotifyReadRepoListResetContent describes a response with status code 205, with default header values.
+
+NotificationThreadList
+*/
+type NotifyReadRepoListResetContent struct {
+	Payload []*models.NotificationThread
+}
+
+// IsSuccess returns true when this notify read repo list reset content response has a 2xx status code
+func (o *NotifyReadRepoListResetContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this notify read repo list reset content response has a 3xx status code
+func (o *NotifyReadRepoListResetContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this notify read repo list reset content response has a 4xx status code
+func (o *NotifyReadRepoListResetContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this notify read repo list reset content response has a 5xx status code
+func (o *NotifyReadRepoListResetContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this notify read repo list reset content response a status code equal to that given
+func (o *NotifyReadRepoListResetContent) IsCode(code int) bool {
+	return code == 205
+}
+
+// Code gets the status code for the notify read repo list reset content response
+func (o *NotifyReadRepoListResetContent) Code() int {
+	return 205
+}
+
+func (o *NotifyReadRepoListResetContent) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[PUT /repos/{owner}/{repo}/notifications][%d] notifyReadRepoListResetContent %s", 205, payload)
+}
+
+func (o *NotifyReadRepoListResetContent) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[PUT /repos/{owner}/{repo}/notifications][%d] notifyReadRepoListResetContent %s", 205, payload)
+}
+
+func (o *NotifyReadRepoListResetContent) GetPayload() []*models.NotificationThread {
+	return o.Payload
+}
+
+func (o *NotifyReadRepoListResetContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/notification/notify_read_thread_parameters.go b/bots-common/gitea-generated/client/notification/notify_read_thread_parameters.go
new file mode 100644
index 0000000..162df70
--- /dev/null
+++ b/bots-common/gitea-generated/client/notification/notify_read_thread_parameters.go
@@ -0,0 +1,198 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package notification
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewNotifyReadThreadParams creates a new NotifyReadThreadParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewNotifyReadThreadParams() *NotifyReadThreadParams {
+	return &NotifyReadThreadParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewNotifyReadThreadParamsWithTimeout creates a new NotifyReadThreadParams object
+// with the ability to set a timeout on a request.
+func NewNotifyReadThreadParamsWithTimeout(timeout time.Duration) *NotifyReadThreadParams {
+	return &NotifyReadThreadParams{
+		timeout: timeout,
+	}
+}
+
+// NewNotifyReadThreadParamsWithContext creates a new NotifyReadThreadParams object
+// with the ability to set a context for a request.
+func NewNotifyReadThreadParamsWithContext(ctx context.Context) *NotifyReadThreadParams {
+	return &NotifyReadThreadParams{
+		Context: ctx,
+	}
+}
+
+// NewNotifyReadThreadParamsWithHTTPClient creates a new NotifyReadThreadParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewNotifyReadThreadParamsWithHTTPClient(client *http.Client) *NotifyReadThreadParams {
+	return &NotifyReadThreadParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+NotifyReadThreadParams contains all the parameters to send to the API endpoint
+
+	for the notify read thread operation.
+
+	Typically these are written to a http.Request.
+*/
+type NotifyReadThreadParams struct {
+
+	/* ID.
+
+	   id of notification thread
+	*/
+	ID string
+
+	/* ToStatus.
+
+	   Status to mark notifications as
+
+	   Default: "read"
+	*/
+	ToStatus *string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the notify read thread params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *NotifyReadThreadParams) WithDefaults() *NotifyReadThreadParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the notify read thread params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *NotifyReadThreadParams) SetDefaults() {
+	var (
+		toStatusDefault = string("read")
+	)
+
+	val := NotifyReadThreadParams{
+		ToStatus: &toStatusDefault,
+	}
+
+	val.timeout = o.timeout
+	val.Context = o.Context
+	val.HTTPClient = o.HTTPClient
+	*o = val
+}
+
+// WithTimeout adds the timeout to the notify read thread params
+func (o *NotifyReadThreadParams) WithTimeout(timeout time.Duration) *NotifyReadThreadParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the notify read thread params
+func (o *NotifyReadThreadParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the notify read thread params
+func (o *NotifyReadThreadParams) WithContext(ctx context.Context) *NotifyReadThreadParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the notify read thread params
+func (o *NotifyReadThreadParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the notify read thread params
+func (o *NotifyReadThreadParams) WithHTTPClient(client *http.Client) *NotifyReadThreadParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the notify read thread params
+func (o *NotifyReadThreadParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithID adds the id to the notify read thread params
+func (o *NotifyReadThreadParams) WithID(id string) *NotifyReadThreadParams {
+	o.SetID(id)
+	return o
+}
+
+// SetID adds the id to the notify read thread params
+func (o *NotifyReadThreadParams) SetID(id string) {
+	o.ID = id
+}
+
+// WithToStatus adds the toStatus to the notify read thread params
+func (o *NotifyReadThreadParams) WithToStatus(toStatus *string) *NotifyReadThreadParams {
+	o.SetToStatus(toStatus)
+	return o
+}
+
+// SetToStatus adds the toStatus to the notify read thread params
+func (o *NotifyReadThreadParams) SetToStatus(toStatus *string) {
+	o.ToStatus = toStatus
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *NotifyReadThreadParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param id
+	if err := r.SetPathParam("id", o.ID); err != nil {
+		return err
+	}
+
+	if o.ToStatus != nil {
+
+		// query param to-status
+		var qrToStatus string
+
+		if o.ToStatus != nil {
+			qrToStatus = *o.ToStatus
+		}
+		qToStatus := qrToStatus
+		if qToStatus != "" {
+
+			if err := r.SetQueryParam("to-status", qToStatus); err != nil {
+				return err
+			}
+		}
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/notification/notify_read_thread_responses.go b/bots-common/gitea-generated/client/notification/notify_read_thread_responses.go
new file mode 100644
index 0000000..7a5b908
--- /dev/null
+++ b/bots-common/gitea-generated/client/notification/notify_read_thread_responses.go
@@ -0,0 +1,246 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package notification
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NotifyReadThreadReader is a Reader for the NotifyReadThread structure.
+type NotifyReadThreadReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *NotifyReadThreadReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 205:
+		result := NewNotifyReadThreadResetContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 403:
+		result := NewNotifyReadThreadForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewNotifyReadThreadNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[PATCH /notifications/threads/{id}] notifyReadThread", response, response.Code())
+	}
+}
+
+// NewNotifyReadThreadResetContent creates a NotifyReadThreadResetContent with default headers values
+func NewNotifyReadThreadResetContent() *NotifyReadThreadResetContent {
+	return &NotifyReadThreadResetContent{}
+}
+
+/*
+NotifyReadThreadResetContent describes a response with status code 205, with default header values.
+
+NotificationThread
+*/
+type NotifyReadThreadResetContent struct {
+	Payload *models.NotificationThread
+}
+
+// IsSuccess returns true when this notify read thread reset content response has a 2xx status code
+func (o *NotifyReadThreadResetContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this notify read thread reset content response has a 3xx status code
+func (o *NotifyReadThreadResetContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this notify read thread reset content response has a 4xx status code
+func (o *NotifyReadThreadResetContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this notify read thread reset content response has a 5xx status code
+func (o *NotifyReadThreadResetContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this notify read thread reset content response a status code equal to that given
+func (o *NotifyReadThreadResetContent) IsCode(code int) bool {
+	return code == 205
+}
+
+// Code gets the status code for the notify read thread reset content response
+func (o *NotifyReadThreadResetContent) Code() int {
+	return 205
+}
+
+func (o *NotifyReadThreadResetContent) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[PATCH /notifications/threads/{id}][%d] notifyReadThreadResetContent %s", 205, payload)
+}
+
+func (o *NotifyReadThreadResetContent) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[PATCH /notifications/threads/{id}][%d] notifyReadThreadResetContent %s", 205, payload)
+}
+
+func (o *NotifyReadThreadResetContent) GetPayload() *models.NotificationThread {
+	return o.Payload
+}
+
+func (o *NotifyReadThreadResetContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.NotificationThread)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewNotifyReadThreadForbidden creates a NotifyReadThreadForbidden with default headers values
+func NewNotifyReadThreadForbidden() *NotifyReadThreadForbidden {
+	return &NotifyReadThreadForbidden{}
+}
+
+/*
+NotifyReadThreadForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type NotifyReadThreadForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this notify read thread forbidden response has a 2xx status code
+func (o *NotifyReadThreadForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this notify read thread forbidden response has a 3xx status code
+func (o *NotifyReadThreadForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this notify read thread forbidden response has a 4xx status code
+func (o *NotifyReadThreadForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this notify read thread forbidden response has a 5xx status code
+func (o *NotifyReadThreadForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this notify read thread forbidden response a status code equal to that given
+func (o *NotifyReadThreadForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the notify read thread forbidden response
+func (o *NotifyReadThreadForbidden) Code() int {
+	return 403
+}
+
+func (o *NotifyReadThreadForbidden) Error() string {
+	return fmt.Sprintf("[PATCH /notifications/threads/{id}][%d] notifyReadThreadForbidden", 403)
+}
+
+func (o *NotifyReadThreadForbidden) String() string {
+	return fmt.Sprintf("[PATCH /notifications/threads/{id}][%d] notifyReadThreadForbidden", 403)
+}
+
+func (o *NotifyReadThreadForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewNotifyReadThreadNotFound creates a NotifyReadThreadNotFound with default headers values
+func NewNotifyReadThreadNotFound() *NotifyReadThreadNotFound {
+	return &NotifyReadThreadNotFound{}
+}
+
+/*
+NotifyReadThreadNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type NotifyReadThreadNotFound struct {
+}
+
+// IsSuccess returns true when this notify read thread not found response has a 2xx status code
+func (o *NotifyReadThreadNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this notify read thread not found response has a 3xx status code
+func (o *NotifyReadThreadNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this notify read thread not found response has a 4xx status code
+func (o *NotifyReadThreadNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this notify read thread not found response has a 5xx status code
+func (o *NotifyReadThreadNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this notify read thread not found response a status code equal to that given
+func (o *NotifyReadThreadNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the notify read thread not found response
+func (o *NotifyReadThreadNotFound) Code() int {
+	return 404
+}
+
+func (o *NotifyReadThreadNotFound) Error() string {
+	return fmt.Sprintf("[PATCH /notifications/threads/{id}][%d] notifyReadThreadNotFound", 404)
+}
+
+func (o *NotifyReadThreadNotFound) String() string {
+	return fmt.Sprintf("[PATCH /notifications/threads/{id}][%d] notifyReadThreadNotFound", 404)
+}
+
+func (o *NotifyReadThreadNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/create_org_repo_deprecated_parameters.go b/bots-common/gitea-generated/client/organization/create_org_repo_deprecated_parameters.go
new file mode 100644
index 0000000..04fa75e
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/create_org_repo_deprecated_parameters.go
@@ -0,0 +1,172 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewCreateOrgRepoDeprecatedParams creates a new CreateOrgRepoDeprecatedParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewCreateOrgRepoDeprecatedParams() *CreateOrgRepoDeprecatedParams {
+	return &CreateOrgRepoDeprecatedParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewCreateOrgRepoDeprecatedParamsWithTimeout creates a new CreateOrgRepoDeprecatedParams object
+// with the ability to set a timeout on a request.
+func NewCreateOrgRepoDeprecatedParamsWithTimeout(timeout time.Duration) *CreateOrgRepoDeprecatedParams {
+	return &CreateOrgRepoDeprecatedParams{
+		timeout: timeout,
+	}
+}
+
+// NewCreateOrgRepoDeprecatedParamsWithContext creates a new CreateOrgRepoDeprecatedParams object
+// with the ability to set a context for a request.
+func NewCreateOrgRepoDeprecatedParamsWithContext(ctx context.Context) *CreateOrgRepoDeprecatedParams {
+	return &CreateOrgRepoDeprecatedParams{
+		Context: ctx,
+	}
+}
+
+// NewCreateOrgRepoDeprecatedParamsWithHTTPClient creates a new CreateOrgRepoDeprecatedParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewCreateOrgRepoDeprecatedParamsWithHTTPClient(client *http.Client) *CreateOrgRepoDeprecatedParams {
+	return &CreateOrgRepoDeprecatedParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+CreateOrgRepoDeprecatedParams contains all the parameters to send to the API endpoint
+
+	for the create org repo deprecated operation.
+
+	Typically these are written to a http.Request.
+*/
+type CreateOrgRepoDeprecatedParams struct {
+
+	// Body.
+	Body *models.CreateRepoOption
+
+	/* Org.
+
+	   name of organization
+	*/
+	Org string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the create org repo deprecated params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *CreateOrgRepoDeprecatedParams) WithDefaults() *CreateOrgRepoDeprecatedParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the create org repo deprecated params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *CreateOrgRepoDeprecatedParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the create org repo deprecated params
+func (o *CreateOrgRepoDeprecatedParams) WithTimeout(timeout time.Duration) *CreateOrgRepoDeprecatedParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the create org repo deprecated params
+func (o *CreateOrgRepoDeprecatedParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the create org repo deprecated params
+func (o *CreateOrgRepoDeprecatedParams) WithContext(ctx context.Context) *CreateOrgRepoDeprecatedParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the create org repo deprecated params
+func (o *CreateOrgRepoDeprecatedParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the create org repo deprecated params
+func (o *CreateOrgRepoDeprecatedParams) WithHTTPClient(client *http.Client) *CreateOrgRepoDeprecatedParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the create org repo deprecated params
+func (o *CreateOrgRepoDeprecatedParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the create org repo deprecated params
+func (o *CreateOrgRepoDeprecatedParams) WithBody(body *models.CreateRepoOption) *CreateOrgRepoDeprecatedParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the create org repo deprecated params
+func (o *CreateOrgRepoDeprecatedParams) SetBody(body *models.CreateRepoOption) {
+	o.Body = body
+}
+
+// WithOrg adds the org to the create org repo deprecated params
+func (o *CreateOrgRepoDeprecatedParams) WithOrg(org string) *CreateOrgRepoDeprecatedParams {
+	o.SetOrg(org)
+	return o
+}
+
+// SetOrg adds the org to the create org repo deprecated params
+func (o *CreateOrgRepoDeprecatedParams) SetOrg(org string) {
+	o.Org = org
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *CreateOrgRepoDeprecatedParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	// path param org
+	if err := r.SetPathParam("org", o.Org); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/create_org_repo_deprecated_responses.go b/bots-common/gitea-generated/client/organization/create_org_repo_deprecated_responses.go
new file mode 100644
index 0000000..822707a
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/create_org_repo_deprecated_responses.go
@@ -0,0 +1,324 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// CreateOrgRepoDeprecatedReader is a Reader for the CreateOrgRepoDeprecated structure.
+type CreateOrgRepoDeprecatedReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *CreateOrgRepoDeprecatedReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 201:
+		result := NewCreateOrgRepoDeprecatedCreated()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 403:
+		result := NewCreateOrgRepoDeprecatedForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewCreateOrgRepoDeprecatedNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 422:
+		result := NewCreateOrgRepoDeprecatedUnprocessableEntity()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[POST /org/{org}/repos] createOrgRepoDeprecated", response, response.Code())
+	}
+}
+
+// NewCreateOrgRepoDeprecatedCreated creates a CreateOrgRepoDeprecatedCreated with default headers values
+func NewCreateOrgRepoDeprecatedCreated() *CreateOrgRepoDeprecatedCreated {
+	return &CreateOrgRepoDeprecatedCreated{}
+}
+
+/*
+CreateOrgRepoDeprecatedCreated describes a response with status code 201, with default header values.
+
+Repository
+*/
+type CreateOrgRepoDeprecatedCreated struct {
+	Payload *models.Repository
+}
+
+// IsSuccess returns true when this create org repo deprecated created response has a 2xx status code
+func (o *CreateOrgRepoDeprecatedCreated) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this create org repo deprecated created response has a 3xx status code
+func (o *CreateOrgRepoDeprecatedCreated) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this create org repo deprecated created response has a 4xx status code
+func (o *CreateOrgRepoDeprecatedCreated) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this create org repo deprecated created response has a 5xx status code
+func (o *CreateOrgRepoDeprecatedCreated) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this create org repo deprecated created response a status code equal to that given
+func (o *CreateOrgRepoDeprecatedCreated) IsCode(code int) bool {
+	return code == 201
+}
+
+// Code gets the status code for the create org repo deprecated created response
+func (o *CreateOrgRepoDeprecatedCreated) Code() int {
+	return 201
+}
+
+func (o *CreateOrgRepoDeprecatedCreated) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /org/{org}/repos][%d] createOrgRepoDeprecatedCreated %s", 201, payload)
+}
+
+func (o *CreateOrgRepoDeprecatedCreated) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /org/{org}/repos][%d] createOrgRepoDeprecatedCreated %s", 201, payload)
+}
+
+func (o *CreateOrgRepoDeprecatedCreated) GetPayload() *models.Repository {
+	return o.Payload
+}
+
+func (o *CreateOrgRepoDeprecatedCreated) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.Repository)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewCreateOrgRepoDeprecatedForbidden creates a CreateOrgRepoDeprecatedForbidden with default headers values
+func NewCreateOrgRepoDeprecatedForbidden() *CreateOrgRepoDeprecatedForbidden {
+	return &CreateOrgRepoDeprecatedForbidden{}
+}
+
+/*
+CreateOrgRepoDeprecatedForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type CreateOrgRepoDeprecatedForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this create org repo deprecated forbidden response has a 2xx status code
+func (o *CreateOrgRepoDeprecatedForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this create org repo deprecated forbidden response has a 3xx status code
+func (o *CreateOrgRepoDeprecatedForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this create org repo deprecated forbidden response has a 4xx status code
+func (o *CreateOrgRepoDeprecatedForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this create org repo deprecated forbidden response has a 5xx status code
+func (o *CreateOrgRepoDeprecatedForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this create org repo deprecated forbidden response a status code equal to that given
+func (o *CreateOrgRepoDeprecatedForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the create org repo deprecated forbidden response
+func (o *CreateOrgRepoDeprecatedForbidden) Code() int {
+	return 403
+}
+
+func (o *CreateOrgRepoDeprecatedForbidden) Error() string {
+	return fmt.Sprintf("[POST /org/{org}/repos][%d] createOrgRepoDeprecatedForbidden", 403)
+}
+
+func (o *CreateOrgRepoDeprecatedForbidden) String() string {
+	return fmt.Sprintf("[POST /org/{org}/repos][%d] createOrgRepoDeprecatedForbidden", 403)
+}
+
+func (o *CreateOrgRepoDeprecatedForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewCreateOrgRepoDeprecatedNotFound creates a CreateOrgRepoDeprecatedNotFound with default headers values
+func NewCreateOrgRepoDeprecatedNotFound() *CreateOrgRepoDeprecatedNotFound {
+	return &CreateOrgRepoDeprecatedNotFound{}
+}
+
+/*
+CreateOrgRepoDeprecatedNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type CreateOrgRepoDeprecatedNotFound struct {
+}
+
+// IsSuccess returns true when this create org repo deprecated not found response has a 2xx status code
+func (o *CreateOrgRepoDeprecatedNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this create org repo deprecated not found response has a 3xx status code
+func (o *CreateOrgRepoDeprecatedNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this create org repo deprecated not found response has a 4xx status code
+func (o *CreateOrgRepoDeprecatedNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this create org repo deprecated not found response has a 5xx status code
+func (o *CreateOrgRepoDeprecatedNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this create org repo deprecated not found response a status code equal to that given
+func (o *CreateOrgRepoDeprecatedNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the create org repo deprecated not found response
+func (o *CreateOrgRepoDeprecatedNotFound) Code() int {
+	return 404
+}
+
+func (o *CreateOrgRepoDeprecatedNotFound) Error() string {
+	return fmt.Sprintf("[POST /org/{org}/repos][%d] createOrgRepoDeprecatedNotFound", 404)
+}
+
+func (o *CreateOrgRepoDeprecatedNotFound) String() string {
+	return fmt.Sprintf("[POST /org/{org}/repos][%d] createOrgRepoDeprecatedNotFound", 404)
+}
+
+func (o *CreateOrgRepoDeprecatedNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewCreateOrgRepoDeprecatedUnprocessableEntity creates a CreateOrgRepoDeprecatedUnprocessableEntity with default headers values
+func NewCreateOrgRepoDeprecatedUnprocessableEntity() *CreateOrgRepoDeprecatedUnprocessableEntity {
+	return &CreateOrgRepoDeprecatedUnprocessableEntity{}
+}
+
+/*
+CreateOrgRepoDeprecatedUnprocessableEntity describes a response with status code 422, with default header values.
+
+APIValidationError is error format response related to input validation
+*/
+type CreateOrgRepoDeprecatedUnprocessableEntity struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this create org repo deprecated unprocessable entity response has a 2xx status code
+func (o *CreateOrgRepoDeprecatedUnprocessableEntity) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this create org repo deprecated unprocessable entity response has a 3xx status code
+func (o *CreateOrgRepoDeprecatedUnprocessableEntity) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this create org repo deprecated unprocessable entity response has a 4xx status code
+func (o *CreateOrgRepoDeprecatedUnprocessableEntity) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this create org repo deprecated unprocessable entity response has a 5xx status code
+func (o *CreateOrgRepoDeprecatedUnprocessableEntity) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this create org repo deprecated unprocessable entity response a status code equal to that given
+func (o *CreateOrgRepoDeprecatedUnprocessableEntity) IsCode(code int) bool {
+	return code == 422
+}
+
+// Code gets the status code for the create org repo deprecated unprocessable entity response
+func (o *CreateOrgRepoDeprecatedUnprocessableEntity) Code() int {
+	return 422
+}
+
+func (o *CreateOrgRepoDeprecatedUnprocessableEntity) Error() string {
+	return fmt.Sprintf("[POST /org/{org}/repos][%d] createOrgRepoDeprecatedUnprocessableEntity", 422)
+}
+
+func (o *CreateOrgRepoDeprecatedUnprocessableEntity) String() string {
+	return fmt.Sprintf("[POST /org/{org}/repos][%d] createOrgRepoDeprecatedUnprocessableEntity", 422)
+}
+
+func (o *CreateOrgRepoDeprecatedUnprocessableEntity) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/create_org_repo_parameters.go b/bots-common/gitea-generated/client/organization/create_org_repo_parameters.go
new file mode 100644
index 0000000..36f0fa2
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/create_org_repo_parameters.go
@@ -0,0 +1,172 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewCreateOrgRepoParams creates a new CreateOrgRepoParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewCreateOrgRepoParams() *CreateOrgRepoParams {
+	return &CreateOrgRepoParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewCreateOrgRepoParamsWithTimeout creates a new CreateOrgRepoParams object
+// with the ability to set a timeout on a request.
+func NewCreateOrgRepoParamsWithTimeout(timeout time.Duration) *CreateOrgRepoParams {
+	return &CreateOrgRepoParams{
+		timeout: timeout,
+	}
+}
+
+// NewCreateOrgRepoParamsWithContext creates a new CreateOrgRepoParams object
+// with the ability to set a context for a request.
+func NewCreateOrgRepoParamsWithContext(ctx context.Context) *CreateOrgRepoParams {
+	return &CreateOrgRepoParams{
+		Context: ctx,
+	}
+}
+
+// NewCreateOrgRepoParamsWithHTTPClient creates a new CreateOrgRepoParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewCreateOrgRepoParamsWithHTTPClient(client *http.Client) *CreateOrgRepoParams {
+	return &CreateOrgRepoParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+CreateOrgRepoParams contains all the parameters to send to the API endpoint
+
+	for the create org repo operation.
+
+	Typically these are written to a http.Request.
+*/
+type CreateOrgRepoParams struct {
+
+	// Body.
+	Body *models.CreateRepoOption
+
+	/* Org.
+
+	   name of organization
+	*/
+	Org string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the create org repo params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *CreateOrgRepoParams) WithDefaults() *CreateOrgRepoParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the create org repo params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *CreateOrgRepoParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the create org repo params
+func (o *CreateOrgRepoParams) WithTimeout(timeout time.Duration) *CreateOrgRepoParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the create org repo params
+func (o *CreateOrgRepoParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the create org repo params
+func (o *CreateOrgRepoParams) WithContext(ctx context.Context) *CreateOrgRepoParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the create org repo params
+func (o *CreateOrgRepoParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the create org repo params
+func (o *CreateOrgRepoParams) WithHTTPClient(client *http.Client) *CreateOrgRepoParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the create org repo params
+func (o *CreateOrgRepoParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the create org repo params
+func (o *CreateOrgRepoParams) WithBody(body *models.CreateRepoOption) *CreateOrgRepoParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the create org repo params
+func (o *CreateOrgRepoParams) SetBody(body *models.CreateRepoOption) {
+	o.Body = body
+}
+
+// WithOrg adds the org to the create org repo params
+func (o *CreateOrgRepoParams) WithOrg(org string) *CreateOrgRepoParams {
+	o.SetOrg(org)
+	return o
+}
+
+// SetOrg adds the org to the create org repo params
+func (o *CreateOrgRepoParams) SetOrg(org string) {
+	o.Org = org
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *CreateOrgRepoParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	// path param org
+	if err := r.SetPathParam("org", o.Org); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/create_org_repo_responses.go b/bots-common/gitea-generated/client/organization/create_org_repo_responses.go
new file mode 100644
index 0000000..1074e4f
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/create_org_repo_responses.go
@@ -0,0 +1,324 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// CreateOrgRepoReader is a Reader for the CreateOrgRepo structure.
+type CreateOrgRepoReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *CreateOrgRepoReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 201:
+		result := NewCreateOrgRepoCreated()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 400:
+		result := NewCreateOrgRepoBadRequest()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 403:
+		result := NewCreateOrgRepoForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewCreateOrgRepoNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[POST /orgs/{org}/repos] createOrgRepo", response, response.Code())
+	}
+}
+
+// NewCreateOrgRepoCreated creates a CreateOrgRepoCreated with default headers values
+func NewCreateOrgRepoCreated() *CreateOrgRepoCreated {
+	return &CreateOrgRepoCreated{}
+}
+
+/*
+CreateOrgRepoCreated describes a response with status code 201, with default header values.
+
+Repository
+*/
+type CreateOrgRepoCreated struct {
+	Payload *models.Repository
+}
+
+// IsSuccess returns true when this create org repo created response has a 2xx status code
+func (o *CreateOrgRepoCreated) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this create org repo created response has a 3xx status code
+func (o *CreateOrgRepoCreated) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this create org repo created response has a 4xx status code
+func (o *CreateOrgRepoCreated) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this create org repo created response has a 5xx status code
+func (o *CreateOrgRepoCreated) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this create org repo created response a status code equal to that given
+func (o *CreateOrgRepoCreated) IsCode(code int) bool {
+	return code == 201
+}
+
+// Code gets the status code for the create org repo created response
+func (o *CreateOrgRepoCreated) Code() int {
+	return 201
+}
+
+func (o *CreateOrgRepoCreated) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /orgs/{org}/repos][%d] createOrgRepoCreated %s", 201, payload)
+}
+
+func (o *CreateOrgRepoCreated) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /orgs/{org}/repos][%d] createOrgRepoCreated %s", 201, payload)
+}
+
+func (o *CreateOrgRepoCreated) GetPayload() *models.Repository {
+	return o.Payload
+}
+
+func (o *CreateOrgRepoCreated) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.Repository)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewCreateOrgRepoBadRequest creates a CreateOrgRepoBadRequest with default headers values
+func NewCreateOrgRepoBadRequest() *CreateOrgRepoBadRequest {
+	return &CreateOrgRepoBadRequest{}
+}
+
+/*
+CreateOrgRepoBadRequest describes a response with status code 400, with default header values.
+
+APIError is error format response
+*/
+type CreateOrgRepoBadRequest struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this create org repo bad request response has a 2xx status code
+func (o *CreateOrgRepoBadRequest) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this create org repo bad request response has a 3xx status code
+func (o *CreateOrgRepoBadRequest) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this create org repo bad request response has a 4xx status code
+func (o *CreateOrgRepoBadRequest) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this create org repo bad request response has a 5xx status code
+func (o *CreateOrgRepoBadRequest) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this create org repo bad request response a status code equal to that given
+func (o *CreateOrgRepoBadRequest) IsCode(code int) bool {
+	return code == 400
+}
+
+// Code gets the status code for the create org repo bad request response
+func (o *CreateOrgRepoBadRequest) Code() int {
+	return 400
+}
+
+func (o *CreateOrgRepoBadRequest) Error() string {
+	return fmt.Sprintf("[POST /orgs/{org}/repos][%d] createOrgRepoBadRequest", 400)
+}
+
+func (o *CreateOrgRepoBadRequest) String() string {
+	return fmt.Sprintf("[POST /orgs/{org}/repos][%d] createOrgRepoBadRequest", 400)
+}
+
+func (o *CreateOrgRepoBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewCreateOrgRepoForbidden creates a CreateOrgRepoForbidden with default headers values
+func NewCreateOrgRepoForbidden() *CreateOrgRepoForbidden {
+	return &CreateOrgRepoForbidden{}
+}
+
+/*
+CreateOrgRepoForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type CreateOrgRepoForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this create org repo forbidden response has a 2xx status code
+func (o *CreateOrgRepoForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this create org repo forbidden response has a 3xx status code
+func (o *CreateOrgRepoForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this create org repo forbidden response has a 4xx status code
+func (o *CreateOrgRepoForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this create org repo forbidden response has a 5xx status code
+func (o *CreateOrgRepoForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this create org repo forbidden response a status code equal to that given
+func (o *CreateOrgRepoForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the create org repo forbidden response
+func (o *CreateOrgRepoForbidden) Code() int {
+	return 403
+}
+
+func (o *CreateOrgRepoForbidden) Error() string {
+	return fmt.Sprintf("[POST /orgs/{org}/repos][%d] createOrgRepoForbidden", 403)
+}
+
+func (o *CreateOrgRepoForbidden) String() string {
+	return fmt.Sprintf("[POST /orgs/{org}/repos][%d] createOrgRepoForbidden", 403)
+}
+
+func (o *CreateOrgRepoForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewCreateOrgRepoNotFound creates a CreateOrgRepoNotFound with default headers values
+func NewCreateOrgRepoNotFound() *CreateOrgRepoNotFound {
+	return &CreateOrgRepoNotFound{}
+}
+
+/*
+CreateOrgRepoNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type CreateOrgRepoNotFound struct {
+}
+
+// IsSuccess returns true when this create org repo not found response has a 2xx status code
+func (o *CreateOrgRepoNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this create org repo not found response has a 3xx status code
+func (o *CreateOrgRepoNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this create org repo not found response has a 4xx status code
+func (o *CreateOrgRepoNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this create org repo not found response has a 5xx status code
+func (o *CreateOrgRepoNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this create org repo not found response a status code equal to that given
+func (o *CreateOrgRepoNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the create org repo not found response
+func (o *CreateOrgRepoNotFound) Code() int {
+	return 404
+}
+
+func (o *CreateOrgRepoNotFound) Error() string {
+	return fmt.Sprintf("[POST /orgs/{org}/repos][%d] createOrgRepoNotFound", 404)
+}
+
+func (o *CreateOrgRepoNotFound) String() string {
+	return fmt.Sprintf("[POST /orgs/{org}/repos][%d] createOrgRepoNotFound", 404)
+}
+
+func (o *CreateOrgRepoNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/create_org_variable_parameters.go b/bots-common/gitea-generated/client/organization/create_org_variable_parameters.go
new file mode 100644
index 0000000..7814913
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/create_org_variable_parameters.go
@@ -0,0 +1,194 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewCreateOrgVariableParams creates a new CreateOrgVariableParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewCreateOrgVariableParams() *CreateOrgVariableParams {
+	return &CreateOrgVariableParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewCreateOrgVariableParamsWithTimeout creates a new CreateOrgVariableParams object
+// with the ability to set a timeout on a request.
+func NewCreateOrgVariableParamsWithTimeout(timeout time.Duration) *CreateOrgVariableParams {
+	return &CreateOrgVariableParams{
+		timeout: timeout,
+	}
+}
+
+// NewCreateOrgVariableParamsWithContext creates a new CreateOrgVariableParams object
+// with the ability to set a context for a request.
+func NewCreateOrgVariableParamsWithContext(ctx context.Context) *CreateOrgVariableParams {
+	return &CreateOrgVariableParams{
+		Context: ctx,
+	}
+}
+
+// NewCreateOrgVariableParamsWithHTTPClient creates a new CreateOrgVariableParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewCreateOrgVariableParamsWithHTTPClient(client *http.Client) *CreateOrgVariableParams {
+	return &CreateOrgVariableParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+CreateOrgVariableParams contains all the parameters to send to the API endpoint
+
+	for the create org variable operation.
+
+	Typically these are written to a http.Request.
+*/
+type CreateOrgVariableParams struct {
+
+	// Body.
+	Body *models.CreateVariableOption
+
+	/* Org.
+
+	   name of the organization
+	*/
+	Org string
+
+	/* Variablename.
+
+	   name of the variable
+	*/
+	Variablename string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the create org variable params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *CreateOrgVariableParams) WithDefaults() *CreateOrgVariableParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the create org variable params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *CreateOrgVariableParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the create org variable params
+func (o *CreateOrgVariableParams) WithTimeout(timeout time.Duration) *CreateOrgVariableParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the create org variable params
+func (o *CreateOrgVariableParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the create org variable params
+func (o *CreateOrgVariableParams) WithContext(ctx context.Context) *CreateOrgVariableParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the create org variable params
+func (o *CreateOrgVariableParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the create org variable params
+func (o *CreateOrgVariableParams) WithHTTPClient(client *http.Client) *CreateOrgVariableParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the create org variable params
+func (o *CreateOrgVariableParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the create org variable params
+func (o *CreateOrgVariableParams) WithBody(body *models.CreateVariableOption) *CreateOrgVariableParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the create org variable params
+func (o *CreateOrgVariableParams) SetBody(body *models.CreateVariableOption) {
+	o.Body = body
+}
+
+// WithOrg adds the org to the create org variable params
+func (o *CreateOrgVariableParams) WithOrg(org string) *CreateOrgVariableParams {
+	o.SetOrg(org)
+	return o
+}
+
+// SetOrg adds the org to the create org variable params
+func (o *CreateOrgVariableParams) SetOrg(org string) {
+	o.Org = org
+}
+
+// WithVariablename adds the variablename to the create org variable params
+func (o *CreateOrgVariableParams) WithVariablename(variablename string) *CreateOrgVariableParams {
+	o.SetVariablename(variablename)
+	return o
+}
+
+// SetVariablename adds the variablename to the create org variable params
+func (o *CreateOrgVariableParams) SetVariablename(variablename string) {
+	o.Variablename = variablename
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *CreateOrgVariableParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	// path param org
+	if err := r.SetPathParam("org", o.Org); err != nil {
+		return err
+	}
+
+	// path param variablename
+	if err := r.SetPathParam("variablename", o.Variablename); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/create_org_variable_responses.go b/bots-common/gitea-generated/client/organization/create_org_variable_responses.go
new file mode 100644
index 0000000..63a3ec3
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/create_org_variable_responses.go
@@ -0,0 +1,290 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// CreateOrgVariableReader is a Reader for the CreateOrgVariable structure.
+type CreateOrgVariableReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *CreateOrgVariableReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 201:
+		result := NewCreateOrgVariableCreated()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 204:
+		result := NewCreateOrgVariableNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 400:
+		result := NewCreateOrgVariableBadRequest()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewCreateOrgVariableNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[POST /orgs/{org}/actions/variables/{variablename}] createOrgVariable", response, response.Code())
+	}
+}
+
+// NewCreateOrgVariableCreated creates a CreateOrgVariableCreated with default headers values
+func NewCreateOrgVariableCreated() *CreateOrgVariableCreated {
+	return &CreateOrgVariableCreated{}
+}
+
+/*
+CreateOrgVariableCreated describes a response with status code 201, with default header values.
+
+response when creating an org-level variable
+*/
+type CreateOrgVariableCreated struct {
+}
+
+// IsSuccess returns true when this create org variable created response has a 2xx status code
+func (o *CreateOrgVariableCreated) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this create org variable created response has a 3xx status code
+func (o *CreateOrgVariableCreated) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this create org variable created response has a 4xx status code
+func (o *CreateOrgVariableCreated) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this create org variable created response has a 5xx status code
+func (o *CreateOrgVariableCreated) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this create org variable created response a status code equal to that given
+func (o *CreateOrgVariableCreated) IsCode(code int) bool {
+	return code == 201
+}
+
+// Code gets the status code for the create org variable created response
+func (o *CreateOrgVariableCreated) Code() int {
+	return 201
+}
+
+func (o *CreateOrgVariableCreated) Error() string {
+	return fmt.Sprintf("[POST /orgs/{org}/actions/variables/{variablename}][%d] createOrgVariableCreated", 201)
+}
+
+func (o *CreateOrgVariableCreated) String() string {
+	return fmt.Sprintf("[POST /orgs/{org}/actions/variables/{variablename}][%d] createOrgVariableCreated", 201)
+}
+
+func (o *CreateOrgVariableCreated) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewCreateOrgVariableNoContent creates a CreateOrgVariableNoContent with default headers values
+func NewCreateOrgVariableNoContent() *CreateOrgVariableNoContent {
+	return &CreateOrgVariableNoContent{}
+}
+
+/*
+CreateOrgVariableNoContent describes a response with status code 204, with default header values.
+
+response when creating an org-level variable
+*/
+type CreateOrgVariableNoContent struct {
+}
+
+// IsSuccess returns true when this create org variable no content response has a 2xx status code
+func (o *CreateOrgVariableNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this create org variable no content response has a 3xx status code
+func (o *CreateOrgVariableNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this create org variable no content response has a 4xx status code
+func (o *CreateOrgVariableNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this create org variable no content response has a 5xx status code
+func (o *CreateOrgVariableNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this create org variable no content response a status code equal to that given
+func (o *CreateOrgVariableNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the create org variable no content response
+func (o *CreateOrgVariableNoContent) Code() int {
+	return 204
+}
+
+func (o *CreateOrgVariableNoContent) Error() string {
+	return fmt.Sprintf("[POST /orgs/{org}/actions/variables/{variablename}][%d] createOrgVariableNoContent", 204)
+}
+
+func (o *CreateOrgVariableNoContent) String() string {
+	return fmt.Sprintf("[POST /orgs/{org}/actions/variables/{variablename}][%d] createOrgVariableNoContent", 204)
+}
+
+func (o *CreateOrgVariableNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewCreateOrgVariableBadRequest creates a CreateOrgVariableBadRequest with default headers values
+func NewCreateOrgVariableBadRequest() *CreateOrgVariableBadRequest {
+	return &CreateOrgVariableBadRequest{}
+}
+
+/*
+CreateOrgVariableBadRequest describes a response with status code 400, with default header values.
+
+APIError is error format response
+*/
+type CreateOrgVariableBadRequest struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this create org variable bad request response has a 2xx status code
+func (o *CreateOrgVariableBadRequest) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this create org variable bad request response has a 3xx status code
+func (o *CreateOrgVariableBadRequest) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this create org variable bad request response has a 4xx status code
+func (o *CreateOrgVariableBadRequest) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this create org variable bad request response has a 5xx status code
+func (o *CreateOrgVariableBadRequest) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this create org variable bad request response a status code equal to that given
+func (o *CreateOrgVariableBadRequest) IsCode(code int) bool {
+	return code == 400
+}
+
+// Code gets the status code for the create org variable bad request response
+func (o *CreateOrgVariableBadRequest) Code() int {
+	return 400
+}
+
+func (o *CreateOrgVariableBadRequest) Error() string {
+	return fmt.Sprintf("[POST /orgs/{org}/actions/variables/{variablename}][%d] createOrgVariableBadRequest", 400)
+}
+
+func (o *CreateOrgVariableBadRequest) String() string {
+	return fmt.Sprintf("[POST /orgs/{org}/actions/variables/{variablename}][%d] createOrgVariableBadRequest", 400)
+}
+
+func (o *CreateOrgVariableBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewCreateOrgVariableNotFound creates a CreateOrgVariableNotFound with default headers values
+func NewCreateOrgVariableNotFound() *CreateOrgVariableNotFound {
+	return &CreateOrgVariableNotFound{}
+}
+
+/*
+CreateOrgVariableNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type CreateOrgVariableNotFound struct {
+}
+
+// IsSuccess returns true when this create org variable not found response has a 2xx status code
+func (o *CreateOrgVariableNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this create org variable not found response has a 3xx status code
+func (o *CreateOrgVariableNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this create org variable not found response has a 4xx status code
+func (o *CreateOrgVariableNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this create org variable not found response has a 5xx status code
+func (o *CreateOrgVariableNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this create org variable not found response a status code equal to that given
+func (o *CreateOrgVariableNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the create org variable not found response
+func (o *CreateOrgVariableNotFound) Code() int {
+	return 404
+}
+
+func (o *CreateOrgVariableNotFound) Error() string {
+	return fmt.Sprintf("[POST /orgs/{org}/actions/variables/{variablename}][%d] createOrgVariableNotFound", 404)
+}
+
+func (o *CreateOrgVariableNotFound) String() string {
+	return fmt.Sprintf("[POST /orgs/{org}/actions/variables/{variablename}][%d] createOrgVariableNotFound", 404)
+}
+
+func (o *CreateOrgVariableNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/delete_org_secret_parameters.go b/bots-common/gitea-generated/client/organization/delete_org_secret_parameters.go
new file mode 100644
index 0000000..5058507
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/delete_org_secret_parameters.go
@@ -0,0 +1,173 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewDeleteOrgSecretParams creates a new DeleteOrgSecretParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewDeleteOrgSecretParams() *DeleteOrgSecretParams {
+	return &DeleteOrgSecretParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewDeleteOrgSecretParamsWithTimeout creates a new DeleteOrgSecretParams object
+// with the ability to set a timeout on a request.
+func NewDeleteOrgSecretParamsWithTimeout(timeout time.Duration) *DeleteOrgSecretParams {
+	return &DeleteOrgSecretParams{
+		timeout: timeout,
+	}
+}
+
+// NewDeleteOrgSecretParamsWithContext creates a new DeleteOrgSecretParams object
+// with the ability to set a context for a request.
+func NewDeleteOrgSecretParamsWithContext(ctx context.Context) *DeleteOrgSecretParams {
+	return &DeleteOrgSecretParams{
+		Context: ctx,
+	}
+}
+
+// NewDeleteOrgSecretParamsWithHTTPClient creates a new DeleteOrgSecretParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewDeleteOrgSecretParamsWithHTTPClient(client *http.Client) *DeleteOrgSecretParams {
+	return &DeleteOrgSecretParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+DeleteOrgSecretParams contains all the parameters to send to the API endpoint
+
+	for the delete org secret operation.
+
+	Typically these are written to a http.Request.
+*/
+type DeleteOrgSecretParams struct {
+
+	/* Org.
+
+	   name of organization
+	*/
+	Org string
+
+	/* Secretname.
+
+	   name of the secret
+	*/
+	Secretname string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the delete org secret params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *DeleteOrgSecretParams) WithDefaults() *DeleteOrgSecretParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the delete org secret params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *DeleteOrgSecretParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the delete org secret params
+func (o *DeleteOrgSecretParams) WithTimeout(timeout time.Duration) *DeleteOrgSecretParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the delete org secret params
+func (o *DeleteOrgSecretParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the delete org secret params
+func (o *DeleteOrgSecretParams) WithContext(ctx context.Context) *DeleteOrgSecretParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the delete org secret params
+func (o *DeleteOrgSecretParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the delete org secret params
+func (o *DeleteOrgSecretParams) WithHTTPClient(client *http.Client) *DeleteOrgSecretParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the delete org secret params
+func (o *DeleteOrgSecretParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithOrg adds the org to the delete org secret params
+func (o *DeleteOrgSecretParams) WithOrg(org string) *DeleteOrgSecretParams {
+	o.SetOrg(org)
+	return o
+}
+
+// SetOrg adds the org to the delete org secret params
+func (o *DeleteOrgSecretParams) SetOrg(org string) {
+	o.Org = org
+}
+
+// WithSecretname adds the secretname to the delete org secret params
+func (o *DeleteOrgSecretParams) WithSecretname(secretname string) *DeleteOrgSecretParams {
+	o.SetSecretname(secretname)
+	return o
+}
+
+// SetSecretname adds the secretname to the delete org secret params
+func (o *DeleteOrgSecretParams) SetSecretname(secretname string) {
+	o.Secretname = secretname
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *DeleteOrgSecretParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param org
+	if err := r.SetPathParam("org", o.Org); err != nil {
+		return err
+	}
+
+	// path param secretname
+	if err := r.SetPathParam("secretname", o.Secretname); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/delete_org_secret_responses.go b/bots-common/gitea-generated/client/organization/delete_org_secret_responses.go
new file mode 100644
index 0000000..d27aac6
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/delete_org_secret_responses.go
@@ -0,0 +1,228 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// DeleteOrgSecretReader is a Reader for the DeleteOrgSecret structure.
+type DeleteOrgSecretReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *DeleteOrgSecretReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewDeleteOrgSecretNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 400:
+		result := NewDeleteOrgSecretBadRequest()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewDeleteOrgSecretNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[DELETE /orgs/{org}/actions/secrets/{secretname}] deleteOrgSecret", response, response.Code())
+	}
+}
+
+// NewDeleteOrgSecretNoContent creates a DeleteOrgSecretNoContent with default headers values
+func NewDeleteOrgSecretNoContent() *DeleteOrgSecretNoContent {
+	return &DeleteOrgSecretNoContent{}
+}
+
+/*
+DeleteOrgSecretNoContent describes a response with status code 204, with default header values.
+
+delete one secret of the organization
+*/
+type DeleteOrgSecretNoContent struct {
+}
+
+// IsSuccess returns true when this delete org secret no content response has a 2xx status code
+func (o *DeleteOrgSecretNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this delete org secret no content response has a 3xx status code
+func (o *DeleteOrgSecretNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this delete org secret no content response has a 4xx status code
+func (o *DeleteOrgSecretNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this delete org secret no content response has a 5xx status code
+func (o *DeleteOrgSecretNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this delete org secret no content response a status code equal to that given
+func (o *DeleteOrgSecretNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the delete org secret no content response
+func (o *DeleteOrgSecretNoContent) Code() int {
+	return 204
+}
+
+func (o *DeleteOrgSecretNoContent) Error() string {
+	return fmt.Sprintf("[DELETE /orgs/{org}/actions/secrets/{secretname}][%d] deleteOrgSecretNoContent", 204)
+}
+
+func (o *DeleteOrgSecretNoContent) String() string {
+	return fmt.Sprintf("[DELETE /orgs/{org}/actions/secrets/{secretname}][%d] deleteOrgSecretNoContent", 204)
+}
+
+func (o *DeleteOrgSecretNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewDeleteOrgSecretBadRequest creates a DeleteOrgSecretBadRequest with default headers values
+func NewDeleteOrgSecretBadRequest() *DeleteOrgSecretBadRequest {
+	return &DeleteOrgSecretBadRequest{}
+}
+
+/*
+DeleteOrgSecretBadRequest describes a response with status code 400, with default header values.
+
+APIError is error format response
+*/
+type DeleteOrgSecretBadRequest struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this delete org secret bad request response has a 2xx status code
+func (o *DeleteOrgSecretBadRequest) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this delete org secret bad request response has a 3xx status code
+func (o *DeleteOrgSecretBadRequest) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this delete org secret bad request response has a 4xx status code
+func (o *DeleteOrgSecretBadRequest) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this delete org secret bad request response has a 5xx status code
+func (o *DeleteOrgSecretBadRequest) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this delete org secret bad request response a status code equal to that given
+func (o *DeleteOrgSecretBadRequest) IsCode(code int) bool {
+	return code == 400
+}
+
+// Code gets the status code for the delete org secret bad request response
+func (o *DeleteOrgSecretBadRequest) Code() int {
+	return 400
+}
+
+func (o *DeleteOrgSecretBadRequest) Error() string {
+	return fmt.Sprintf("[DELETE /orgs/{org}/actions/secrets/{secretname}][%d] deleteOrgSecretBadRequest", 400)
+}
+
+func (o *DeleteOrgSecretBadRequest) String() string {
+	return fmt.Sprintf("[DELETE /orgs/{org}/actions/secrets/{secretname}][%d] deleteOrgSecretBadRequest", 400)
+}
+
+func (o *DeleteOrgSecretBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewDeleteOrgSecretNotFound creates a DeleteOrgSecretNotFound with default headers values
+func NewDeleteOrgSecretNotFound() *DeleteOrgSecretNotFound {
+	return &DeleteOrgSecretNotFound{}
+}
+
+/*
+DeleteOrgSecretNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type DeleteOrgSecretNotFound struct {
+}
+
+// IsSuccess returns true when this delete org secret not found response has a 2xx status code
+func (o *DeleteOrgSecretNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this delete org secret not found response has a 3xx status code
+func (o *DeleteOrgSecretNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this delete org secret not found response has a 4xx status code
+func (o *DeleteOrgSecretNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this delete org secret not found response has a 5xx status code
+func (o *DeleteOrgSecretNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this delete org secret not found response a status code equal to that given
+func (o *DeleteOrgSecretNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the delete org secret not found response
+func (o *DeleteOrgSecretNotFound) Code() int {
+	return 404
+}
+
+func (o *DeleteOrgSecretNotFound) Error() string {
+	return fmt.Sprintf("[DELETE /orgs/{org}/actions/secrets/{secretname}][%d] deleteOrgSecretNotFound", 404)
+}
+
+func (o *DeleteOrgSecretNotFound) String() string {
+	return fmt.Sprintf("[DELETE /orgs/{org}/actions/secrets/{secretname}][%d] deleteOrgSecretNotFound", 404)
+}
+
+func (o *DeleteOrgSecretNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/delete_org_variable_parameters.go b/bots-common/gitea-generated/client/organization/delete_org_variable_parameters.go
new file mode 100644
index 0000000..b74ffe2
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/delete_org_variable_parameters.go
@@ -0,0 +1,173 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewDeleteOrgVariableParams creates a new DeleteOrgVariableParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewDeleteOrgVariableParams() *DeleteOrgVariableParams {
+	return &DeleteOrgVariableParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewDeleteOrgVariableParamsWithTimeout creates a new DeleteOrgVariableParams object
+// with the ability to set a timeout on a request.
+func NewDeleteOrgVariableParamsWithTimeout(timeout time.Duration) *DeleteOrgVariableParams {
+	return &DeleteOrgVariableParams{
+		timeout: timeout,
+	}
+}
+
+// NewDeleteOrgVariableParamsWithContext creates a new DeleteOrgVariableParams object
+// with the ability to set a context for a request.
+func NewDeleteOrgVariableParamsWithContext(ctx context.Context) *DeleteOrgVariableParams {
+	return &DeleteOrgVariableParams{
+		Context: ctx,
+	}
+}
+
+// NewDeleteOrgVariableParamsWithHTTPClient creates a new DeleteOrgVariableParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewDeleteOrgVariableParamsWithHTTPClient(client *http.Client) *DeleteOrgVariableParams {
+	return &DeleteOrgVariableParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+DeleteOrgVariableParams contains all the parameters to send to the API endpoint
+
+	for the delete org variable operation.
+
+	Typically these are written to a http.Request.
+*/
+type DeleteOrgVariableParams struct {
+
+	/* Org.
+
+	   name of the organization
+	*/
+	Org string
+
+	/* Variablename.
+
+	   name of the variable
+	*/
+	Variablename string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the delete org variable params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *DeleteOrgVariableParams) WithDefaults() *DeleteOrgVariableParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the delete org variable params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *DeleteOrgVariableParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the delete org variable params
+func (o *DeleteOrgVariableParams) WithTimeout(timeout time.Duration) *DeleteOrgVariableParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the delete org variable params
+func (o *DeleteOrgVariableParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the delete org variable params
+func (o *DeleteOrgVariableParams) WithContext(ctx context.Context) *DeleteOrgVariableParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the delete org variable params
+func (o *DeleteOrgVariableParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the delete org variable params
+func (o *DeleteOrgVariableParams) WithHTTPClient(client *http.Client) *DeleteOrgVariableParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the delete org variable params
+func (o *DeleteOrgVariableParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithOrg adds the org to the delete org variable params
+func (o *DeleteOrgVariableParams) WithOrg(org string) *DeleteOrgVariableParams {
+	o.SetOrg(org)
+	return o
+}
+
+// SetOrg adds the org to the delete org variable params
+func (o *DeleteOrgVariableParams) SetOrg(org string) {
+	o.Org = org
+}
+
+// WithVariablename adds the variablename to the delete org variable params
+func (o *DeleteOrgVariableParams) WithVariablename(variablename string) *DeleteOrgVariableParams {
+	o.SetVariablename(variablename)
+	return o
+}
+
+// SetVariablename adds the variablename to the delete org variable params
+func (o *DeleteOrgVariableParams) SetVariablename(variablename string) {
+	o.Variablename = variablename
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *DeleteOrgVariableParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param org
+	if err := r.SetPathParam("org", o.Org); err != nil {
+		return err
+	}
+
+	// path param variablename
+	if err := r.SetPathParam("variablename", o.Variablename); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/delete_org_variable_responses.go b/bots-common/gitea-generated/client/organization/delete_org_variable_responses.go
new file mode 100644
index 0000000..88c1587
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/delete_org_variable_responses.go
@@ -0,0 +1,370 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// DeleteOrgVariableReader is a Reader for the DeleteOrgVariable structure.
+type DeleteOrgVariableReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *DeleteOrgVariableReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewDeleteOrgVariableOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 201:
+		result := NewDeleteOrgVariableCreated()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 204:
+		result := NewDeleteOrgVariableNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 400:
+		result := NewDeleteOrgVariableBadRequest()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewDeleteOrgVariableNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[DELETE /orgs/{org}/actions/variables/{variablename}] deleteOrgVariable", response, response.Code())
+	}
+}
+
+// NewDeleteOrgVariableOK creates a DeleteOrgVariableOK with default headers values
+func NewDeleteOrgVariableOK() *DeleteOrgVariableOK {
+	return &DeleteOrgVariableOK{}
+}
+
+/*
+DeleteOrgVariableOK describes a response with status code 200, with default header values.
+
+ActionVariable
+*/
+type DeleteOrgVariableOK struct {
+	Payload *models.ActionVariable
+}
+
+// IsSuccess returns true when this delete org variable o k response has a 2xx status code
+func (o *DeleteOrgVariableOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this delete org variable o k response has a 3xx status code
+func (o *DeleteOrgVariableOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this delete org variable o k response has a 4xx status code
+func (o *DeleteOrgVariableOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this delete org variable o k response has a 5xx status code
+func (o *DeleteOrgVariableOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this delete org variable o k response a status code equal to that given
+func (o *DeleteOrgVariableOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the delete org variable o k response
+func (o *DeleteOrgVariableOK) Code() int {
+	return 200
+}
+
+func (o *DeleteOrgVariableOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[DELETE /orgs/{org}/actions/variables/{variablename}][%d] deleteOrgVariableOK %s", 200, payload)
+}
+
+func (o *DeleteOrgVariableOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[DELETE /orgs/{org}/actions/variables/{variablename}][%d] deleteOrgVariableOK %s", 200, payload)
+}
+
+func (o *DeleteOrgVariableOK) GetPayload() *models.ActionVariable {
+	return o.Payload
+}
+
+func (o *DeleteOrgVariableOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.ActionVariable)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewDeleteOrgVariableCreated creates a DeleteOrgVariableCreated with default headers values
+func NewDeleteOrgVariableCreated() *DeleteOrgVariableCreated {
+	return &DeleteOrgVariableCreated{}
+}
+
+/*
+DeleteOrgVariableCreated describes a response with status code 201, with default header values.
+
+response when deleting a variable
+*/
+type DeleteOrgVariableCreated struct {
+}
+
+// IsSuccess returns true when this delete org variable created response has a 2xx status code
+func (o *DeleteOrgVariableCreated) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this delete org variable created response has a 3xx status code
+func (o *DeleteOrgVariableCreated) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this delete org variable created response has a 4xx status code
+func (o *DeleteOrgVariableCreated) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this delete org variable created response has a 5xx status code
+func (o *DeleteOrgVariableCreated) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this delete org variable created response a status code equal to that given
+func (o *DeleteOrgVariableCreated) IsCode(code int) bool {
+	return code == 201
+}
+
+// Code gets the status code for the delete org variable created response
+func (o *DeleteOrgVariableCreated) Code() int {
+	return 201
+}
+
+func (o *DeleteOrgVariableCreated) Error() string {
+	return fmt.Sprintf("[DELETE /orgs/{org}/actions/variables/{variablename}][%d] deleteOrgVariableCreated", 201)
+}
+
+func (o *DeleteOrgVariableCreated) String() string {
+	return fmt.Sprintf("[DELETE /orgs/{org}/actions/variables/{variablename}][%d] deleteOrgVariableCreated", 201)
+}
+
+func (o *DeleteOrgVariableCreated) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewDeleteOrgVariableNoContent creates a DeleteOrgVariableNoContent with default headers values
+func NewDeleteOrgVariableNoContent() *DeleteOrgVariableNoContent {
+	return &DeleteOrgVariableNoContent{}
+}
+
+/*
+DeleteOrgVariableNoContent describes a response with status code 204, with default header values.
+
+response when deleting a variable
+*/
+type DeleteOrgVariableNoContent struct {
+}
+
+// IsSuccess returns true when this delete org variable no content response has a 2xx status code
+func (o *DeleteOrgVariableNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this delete org variable no content response has a 3xx status code
+func (o *DeleteOrgVariableNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this delete org variable no content response has a 4xx status code
+func (o *DeleteOrgVariableNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this delete org variable no content response has a 5xx status code
+func (o *DeleteOrgVariableNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this delete org variable no content response a status code equal to that given
+func (o *DeleteOrgVariableNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the delete org variable no content response
+func (o *DeleteOrgVariableNoContent) Code() int {
+	return 204
+}
+
+func (o *DeleteOrgVariableNoContent) Error() string {
+	return fmt.Sprintf("[DELETE /orgs/{org}/actions/variables/{variablename}][%d] deleteOrgVariableNoContent", 204)
+}
+
+func (o *DeleteOrgVariableNoContent) String() string {
+	return fmt.Sprintf("[DELETE /orgs/{org}/actions/variables/{variablename}][%d] deleteOrgVariableNoContent", 204)
+}
+
+func (o *DeleteOrgVariableNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewDeleteOrgVariableBadRequest creates a DeleteOrgVariableBadRequest with default headers values
+func NewDeleteOrgVariableBadRequest() *DeleteOrgVariableBadRequest {
+	return &DeleteOrgVariableBadRequest{}
+}
+
+/*
+DeleteOrgVariableBadRequest describes a response with status code 400, with default header values.
+
+APIError is error format response
+*/
+type DeleteOrgVariableBadRequest struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this delete org variable bad request response has a 2xx status code
+func (o *DeleteOrgVariableBadRequest) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this delete org variable bad request response has a 3xx status code
+func (o *DeleteOrgVariableBadRequest) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this delete org variable bad request response has a 4xx status code
+func (o *DeleteOrgVariableBadRequest) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this delete org variable bad request response has a 5xx status code
+func (o *DeleteOrgVariableBadRequest) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this delete org variable bad request response a status code equal to that given
+func (o *DeleteOrgVariableBadRequest) IsCode(code int) bool {
+	return code == 400
+}
+
+// Code gets the status code for the delete org variable bad request response
+func (o *DeleteOrgVariableBadRequest) Code() int {
+	return 400
+}
+
+func (o *DeleteOrgVariableBadRequest) Error() string {
+	return fmt.Sprintf("[DELETE /orgs/{org}/actions/variables/{variablename}][%d] deleteOrgVariableBadRequest", 400)
+}
+
+func (o *DeleteOrgVariableBadRequest) String() string {
+	return fmt.Sprintf("[DELETE /orgs/{org}/actions/variables/{variablename}][%d] deleteOrgVariableBadRequest", 400)
+}
+
+func (o *DeleteOrgVariableBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewDeleteOrgVariableNotFound creates a DeleteOrgVariableNotFound with default headers values
+func NewDeleteOrgVariableNotFound() *DeleteOrgVariableNotFound {
+	return &DeleteOrgVariableNotFound{}
+}
+
+/*
+DeleteOrgVariableNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type DeleteOrgVariableNotFound struct {
+}
+
+// IsSuccess returns true when this delete org variable not found response has a 2xx status code
+func (o *DeleteOrgVariableNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this delete org variable not found response has a 3xx status code
+func (o *DeleteOrgVariableNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this delete org variable not found response has a 4xx status code
+func (o *DeleteOrgVariableNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this delete org variable not found response has a 5xx status code
+func (o *DeleteOrgVariableNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this delete org variable not found response a status code equal to that given
+func (o *DeleteOrgVariableNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the delete org variable not found response
+func (o *DeleteOrgVariableNotFound) Code() int {
+	return 404
+}
+
+func (o *DeleteOrgVariableNotFound) Error() string {
+	return fmt.Sprintf("[DELETE /orgs/{org}/actions/variables/{variablename}][%d] deleteOrgVariableNotFound", 404)
+}
+
+func (o *DeleteOrgVariableNotFound) String() string {
+	return fmt.Sprintf("[DELETE /orgs/{org}/actions/variables/{variablename}][%d] deleteOrgVariableNotFound", 404)
+}
+
+func (o *DeleteOrgVariableNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/get_org_variable_parameters.go b/bots-common/gitea-generated/client/organization/get_org_variable_parameters.go
new file mode 100644
index 0000000..c8fc493
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/get_org_variable_parameters.go
@@ -0,0 +1,173 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewGetOrgVariableParams creates a new GetOrgVariableParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewGetOrgVariableParams() *GetOrgVariableParams {
+	return &GetOrgVariableParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewGetOrgVariableParamsWithTimeout creates a new GetOrgVariableParams object
+// with the ability to set a timeout on a request.
+func NewGetOrgVariableParamsWithTimeout(timeout time.Duration) *GetOrgVariableParams {
+	return &GetOrgVariableParams{
+		timeout: timeout,
+	}
+}
+
+// NewGetOrgVariableParamsWithContext creates a new GetOrgVariableParams object
+// with the ability to set a context for a request.
+func NewGetOrgVariableParamsWithContext(ctx context.Context) *GetOrgVariableParams {
+	return &GetOrgVariableParams{
+		Context: ctx,
+	}
+}
+
+// NewGetOrgVariableParamsWithHTTPClient creates a new GetOrgVariableParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewGetOrgVariableParamsWithHTTPClient(client *http.Client) *GetOrgVariableParams {
+	return &GetOrgVariableParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+GetOrgVariableParams contains all the parameters to send to the API endpoint
+
+	for the get org variable operation.
+
+	Typically these are written to a http.Request.
+*/
+type GetOrgVariableParams struct {
+
+	/* Org.
+
+	   name of the organization
+	*/
+	Org string
+
+	/* Variablename.
+
+	   name of the variable
+	*/
+	Variablename string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the get org variable params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *GetOrgVariableParams) WithDefaults() *GetOrgVariableParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the get org variable params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *GetOrgVariableParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the get org variable params
+func (o *GetOrgVariableParams) WithTimeout(timeout time.Duration) *GetOrgVariableParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the get org variable params
+func (o *GetOrgVariableParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the get org variable params
+func (o *GetOrgVariableParams) WithContext(ctx context.Context) *GetOrgVariableParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the get org variable params
+func (o *GetOrgVariableParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the get org variable params
+func (o *GetOrgVariableParams) WithHTTPClient(client *http.Client) *GetOrgVariableParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the get org variable params
+func (o *GetOrgVariableParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithOrg adds the org to the get org variable params
+func (o *GetOrgVariableParams) WithOrg(org string) *GetOrgVariableParams {
+	o.SetOrg(org)
+	return o
+}
+
+// SetOrg adds the org to the get org variable params
+func (o *GetOrgVariableParams) SetOrg(org string) {
+	o.Org = org
+}
+
+// WithVariablename adds the variablename to the get org variable params
+func (o *GetOrgVariableParams) WithVariablename(variablename string) *GetOrgVariableParams {
+	o.SetVariablename(variablename)
+	return o
+}
+
+// SetVariablename adds the variablename to the get org variable params
+func (o *GetOrgVariableParams) SetVariablename(variablename string) {
+	o.Variablename = variablename
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *GetOrgVariableParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param org
+	if err := r.SetPathParam("org", o.Org); err != nil {
+		return err
+	}
+
+	// path param variablename
+	if err := r.SetPathParam("variablename", o.Variablename); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/get_org_variable_responses.go b/bots-common/gitea-generated/client/organization/get_org_variable_responses.go
new file mode 100644
index 0000000..4c5458f
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/get_org_variable_responses.go
@@ -0,0 +1,246 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// GetOrgVariableReader is a Reader for the GetOrgVariable structure.
+type GetOrgVariableReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *GetOrgVariableReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewGetOrgVariableOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 400:
+		result := NewGetOrgVariableBadRequest()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewGetOrgVariableNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /orgs/{org}/actions/variables/{variablename}] getOrgVariable", response, response.Code())
+	}
+}
+
+// NewGetOrgVariableOK creates a GetOrgVariableOK with default headers values
+func NewGetOrgVariableOK() *GetOrgVariableOK {
+	return &GetOrgVariableOK{}
+}
+
+/*
+GetOrgVariableOK describes a response with status code 200, with default header values.
+
+ActionVariable
+*/
+type GetOrgVariableOK struct {
+	Payload *models.ActionVariable
+}
+
+// IsSuccess returns true when this get org variable o k response has a 2xx status code
+func (o *GetOrgVariableOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this get org variable o k response has a 3xx status code
+func (o *GetOrgVariableOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this get org variable o k response has a 4xx status code
+func (o *GetOrgVariableOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this get org variable o k response has a 5xx status code
+func (o *GetOrgVariableOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this get org variable o k response a status code equal to that given
+func (o *GetOrgVariableOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the get org variable o k response
+func (o *GetOrgVariableOK) Code() int {
+	return 200
+}
+
+func (o *GetOrgVariableOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /orgs/{org}/actions/variables/{variablename}][%d] getOrgVariableOK %s", 200, payload)
+}
+
+func (o *GetOrgVariableOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /orgs/{org}/actions/variables/{variablename}][%d] getOrgVariableOK %s", 200, payload)
+}
+
+func (o *GetOrgVariableOK) GetPayload() *models.ActionVariable {
+	return o.Payload
+}
+
+func (o *GetOrgVariableOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.ActionVariable)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewGetOrgVariableBadRequest creates a GetOrgVariableBadRequest with default headers values
+func NewGetOrgVariableBadRequest() *GetOrgVariableBadRequest {
+	return &GetOrgVariableBadRequest{}
+}
+
+/*
+GetOrgVariableBadRequest describes a response with status code 400, with default header values.
+
+APIError is error format response
+*/
+type GetOrgVariableBadRequest struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this get org variable bad request response has a 2xx status code
+func (o *GetOrgVariableBadRequest) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this get org variable bad request response has a 3xx status code
+func (o *GetOrgVariableBadRequest) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this get org variable bad request response has a 4xx status code
+func (o *GetOrgVariableBadRequest) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this get org variable bad request response has a 5xx status code
+func (o *GetOrgVariableBadRequest) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this get org variable bad request response a status code equal to that given
+func (o *GetOrgVariableBadRequest) IsCode(code int) bool {
+	return code == 400
+}
+
+// Code gets the status code for the get org variable bad request response
+func (o *GetOrgVariableBadRequest) Code() int {
+	return 400
+}
+
+func (o *GetOrgVariableBadRequest) Error() string {
+	return fmt.Sprintf("[GET /orgs/{org}/actions/variables/{variablename}][%d] getOrgVariableBadRequest", 400)
+}
+
+func (o *GetOrgVariableBadRequest) String() string {
+	return fmt.Sprintf("[GET /orgs/{org}/actions/variables/{variablename}][%d] getOrgVariableBadRequest", 400)
+}
+
+func (o *GetOrgVariableBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewGetOrgVariableNotFound creates a GetOrgVariableNotFound with default headers values
+func NewGetOrgVariableNotFound() *GetOrgVariableNotFound {
+	return &GetOrgVariableNotFound{}
+}
+
+/*
+GetOrgVariableNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type GetOrgVariableNotFound struct {
+}
+
+// IsSuccess returns true when this get org variable not found response has a 2xx status code
+func (o *GetOrgVariableNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this get org variable not found response has a 3xx status code
+func (o *GetOrgVariableNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this get org variable not found response has a 4xx status code
+func (o *GetOrgVariableNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this get org variable not found response has a 5xx status code
+func (o *GetOrgVariableNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this get org variable not found response a status code equal to that given
+func (o *GetOrgVariableNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the get org variable not found response
+func (o *GetOrgVariableNotFound) Code() int {
+	return 404
+}
+
+func (o *GetOrgVariableNotFound) Error() string {
+	return fmt.Sprintf("[GET /orgs/{org}/actions/variables/{variablename}][%d] getOrgVariableNotFound", 404)
+}
+
+func (o *GetOrgVariableNotFound) String() string {
+	return fmt.Sprintf("[GET /orgs/{org}/actions/variables/{variablename}][%d] getOrgVariableNotFound", 404)
+}
+
+func (o *GetOrgVariableNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/get_org_variables_list_parameters.go b/bots-common/gitea-generated/client/organization/get_org_variables_list_parameters.go
new file mode 100644
index 0000000..53a0194
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/get_org_variables_list_parameters.go
@@ -0,0 +1,220 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewGetOrgVariablesListParams creates a new GetOrgVariablesListParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewGetOrgVariablesListParams() *GetOrgVariablesListParams {
+	return &GetOrgVariablesListParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewGetOrgVariablesListParamsWithTimeout creates a new GetOrgVariablesListParams object
+// with the ability to set a timeout on a request.
+func NewGetOrgVariablesListParamsWithTimeout(timeout time.Duration) *GetOrgVariablesListParams {
+	return &GetOrgVariablesListParams{
+		timeout: timeout,
+	}
+}
+
+// NewGetOrgVariablesListParamsWithContext creates a new GetOrgVariablesListParams object
+// with the ability to set a context for a request.
+func NewGetOrgVariablesListParamsWithContext(ctx context.Context) *GetOrgVariablesListParams {
+	return &GetOrgVariablesListParams{
+		Context: ctx,
+	}
+}
+
+// NewGetOrgVariablesListParamsWithHTTPClient creates a new GetOrgVariablesListParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewGetOrgVariablesListParamsWithHTTPClient(client *http.Client) *GetOrgVariablesListParams {
+	return &GetOrgVariablesListParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+GetOrgVariablesListParams contains all the parameters to send to the API endpoint
+
+	for the get org variables list operation.
+
+	Typically these are written to a http.Request.
+*/
+type GetOrgVariablesListParams struct {
+
+	/* Limit.
+
+	   page size of results
+	*/
+	Limit *int64
+
+	/* Org.
+
+	   name of the organization
+	*/
+	Org string
+
+	/* Page.
+
+	   page number of results to return (1-based)
+	*/
+	Page *int64
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the get org variables list params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *GetOrgVariablesListParams) WithDefaults() *GetOrgVariablesListParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the get org variables list params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *GetOrgVariablesListParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the get org variables list params
+func (o *GetOrgVariablesListParams) WithTimeout(timeout time.Duration) *GetOrgVariablesListParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the get org variables list params
+func (o *GetOrgVariablesListParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the get org variables list params
+func (o *GetOrgVariablesListParams) WithContext(ctx context.Context) *GetOrgVariablesListParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the get org variables list params
+func (o *GetOrgVariablesListParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the get org variables list params
+func (o *GetOrgVariablesListParams) WithHTTPClient(client *http.Client) *GetOrgVariablesListParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the get org variables list params
+func (o *GetOrgVariablesListParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithLimit adds the limit to the get org variables list params
+func (o *GetOrgVariablesListParams) WithLimit(limit *int64) *GetOrgVariablesListParams {
+	o.SetLimit(limit)
+	return o
+}
+
+// SetLimit adds the limit to the get org variables list params
+func (o *GetOrgVariablesListParams) SetLimit(limit *int64) {
+	o.Limit = limit
+}
+
+// WithOrg adds the org to the get org variables list params
+func (o *GetOrgVariablesListParams) WithOrg(org string) *GetOrgVariablesListParams {
+	o.SetOrg(org)
+	return o
+}
+
+// SetOrg adds the org to the get org variables list params
+func (o *GetOrgVariablesListParams) SetOrg(org string) {
+	o.Org = org
+}
+
+// WithPage adds the page to the get org variables list params
+func (o *GetOrgVariablesListParams) WithPage(page *int64) *GetOrgVariablesListParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the get org variables list params
+func (o *GetOrgVariablesListParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *GetOrgVariablesListParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.Limit != nil {
+
+		// query param limit
+		var qrLimit int64
+
+		if o.Limit != nil {
+			qrLimit = *o.Limit
+		}
+		qLimit := swag.FormatInt64(qrLimit)
+		if qLimit != "" {
+
+			if err := r.SetQueryParam("limit", qLimit); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param org
+	if err := r.SetPathParam("org", o.Org); err != nil {
+		return err
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/get_org_variables_list_responses.go b/bots-common/gitea-generated/client/organization/get_org_variables_list_responses.go
new file mode 100644
index 0000000..34606f9
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/get_org_variables_list_responses.go
@@ -0,0 +1,244 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// GetOrgVariablesListReader is a Reader for the GetOrgVariablesList structure.
+type GetOrgVariablesListReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *GetOrgVariablesListReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewGetOrgVariablesListOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 400:
+		result := NewGetOrgVariablesListBadRequest()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewGetOrgVariablesListNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /orgs/{org}/actions/variables] getOrgVariablesList", response, response.Code())
+	}
+}
+
+// NewGetOrgVariablesListOK creates a GetOrgVariablesListOK with default headers values
+func NewGetOrgVariablesListOK() *GetOrgVariablesListOK {
+	return &GetOrgVariablesListOK{}
+}
+
+/*
+GetOrgVariablesListOK describes a response with status code 200, with default header values.
+
+VariableList
+*/
+type GetOrgVariablesListOK struct {
+	Payload []*models.ActionVariable
+}
+
+// IsSuccess returns true when this get org variables list o k response has a 2xx status code
+func (o *GetOrgVariablesListOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this get org variables list o k response has a 3xx status code
+func (o *GetOrgVariablesListOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this get org variables list o k response has a 4xx status code
+func (o *GetOrgVariablesListOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this get org variables list o k response has a 5xx status code
+func (o *GetOrgVariablesListOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this get org variables list o k response a status code equal to that given
+func (o *GetOrgVariablesListOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the get org variables list o k response
+func (o *GetOrgVariablesListOK) Code() int {
+	return 200
+}
+
+func (o *GetOrgVariablesListOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /orgs/{org}/actions/variables][%d] getOrgVariablesListOK %s", 200, payload)
+}
+
+func (o *GetOrgVariablesListOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /orgs/{org}/actions/variables][%d] getOrgVariablesListOK %s", 200, payload)
+}
+
+func (o *GetOrgVariablesListOK) GetPayload() []*models.ActionVariable {
+	return o.Payload
+}
+
+func (o *GetOrgVariablesListOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewGetOrgVariablesListBadRequest creates a GetOrgVariablesListBadRequest with default headers values
+func NewGetOrgVariablesListBadRequest() *GetOrgVariablesListBadRequest {
+	return &GetOrgVariablesListBadRequest{}
+}
+
+/*
+GetOrgVariablesListBadRequest describes a response with status code 400, with default header values.
+
+APIError is error format response
+*/
+type GetOrgVariablesListBadRequest struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this get org variables list bad request response has a 2xx status code
+func (o *GetOrgVariablesListBadRequest) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this get org variables list bad request response has a 3xx status code
+func (o *GetOrgVariablesListBadRequest) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this get org variables list bad request response has a 4xx status code
+func (o *GetOrgVariablesListBadRequest) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this get org variables list bad request response has a 5xx status code
+func (o *GetOrgVariablesListBadRequest) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this get org variables list bad request response a status code equal to that given
+func (o *GetOrgVariablesListBadRequest) IsCode(code int) bool {
+	return code == 400
+}
+
+// Code gets the status code for the get org variables list bad request response
+func (o *GetOrgVariablesListBadRequest) Code() int {
+	return 400
+}
+
+func (o *GetOrgVariablesListBadRequest) Error() string {
+	return fmt.Sprintf("[GET /orgs/{org}/actions/variables][%d] getOrgVariablesListBadRequest", 400)
+}
+
+func (o *GetOrgVariablesListBadRequest) String() string {
+	return fmt.Sprintf("[GET /orgs/{org}/actions/variables][%d] getOrgVariablesListBadRequest", 400)
+}
+
+func (o *GetOrgVariablesListBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewGetOrgVariablesListNotFound creates a GetOrgVariablesListNotFound with default headers values
+func NewGetOrgVariablesListNotFound() *GetOrgVariablesListNotFound {
+	return &GetOrgVariablesListNotFound{}
+}
+
+/*
+GetOrgVariablesListNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type GetOrgVariablesListNotFound struct {
+}
+
+// IsSuccess returns true when this get org variables list not found response has a 2xx status code
+func (o *GetOrgVariablesListNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this get org variables list not found response has a 3xx status code
+func (o *GetOrgVariablesListNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this get org variables list not found response has a 4xx status code
+func (o *GetOrgVariablesListNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this get org variables list not found response has a 5xx status code
+func (o *GetOrgVariablesListNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this get org variables list not found response a status code equal to that given
+func (o *GetOrgVariablesListNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the get org variables list not found response
+func (o *GetOrgVariablesListNotFound) Code() int {
+	return 404
+}
+
+func (o *GetOrgVariablesListNotFound) Error() string {
+	return fmt.Sprintf("[GET /orgs/{org}/actions/variables][%d] getOrgVariablesListNotFound", 404)
+}
+
+func (o *GetOrgVariablesListNotFound) String() string {
+	return fmt.Sprintf("[GET /orgs/{org}/actions/variables][%d] getOrgVariablesListNotFound", 404)
+}
+
+func (o *GetOrgVariablesListNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_add_team_member_parameters.go b/bots-common/gitea-generated/client/organization/org_add_team_member_parameters.go
new file mode 100644
index 0000000..cb572ea
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_add_team_member_parameters.go
@@ -0,0 +1,176 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewOrgAddTeamMemberParams creates a new OrgAddTeamMemberParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewOrgAddTeamMemberParams() *OrgAddTeamMemberParams {
+	return &OrgAddTeamMemberParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewOrgAddTeamMemberParamsWithTimeout creates a new OrgAddTeamMemberParams object
+// with the ability to set a timeout on a request.
+func NewOrgAddTeamMemberParamsWithTimeout(timeout time.Duration) *OrgAddTeamMemberParams {
+	return &OrgAddTeamMemberParams{
+		timeout: timeout,
+	}
+}
+
+// NewOrgAddTeamMemberParamsWithContext creates a new OrgAddTeamMemberParams object
+// with the ability to set a context for a request.
+func NewOrgAddTeamMemberParamsWithContext(ctx context.Context) *OrgAddTeamMemberParams {
+	return &OrgAddTeamMemberParams{
+		Context: ctx,
+	}
+}
+
+// NewOrgAddTeamMemberParamsWithHTTPClient creates a new OrgAddTeamMemberParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewOrgAddTeamMemberParamsWithHTTPClient(client *http.Client) *OrgAddTeamMemberParams {
+	return &OrgAddTeamMemberParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+OrgAddTeamMemberParams contains all the parameters to send to the API endpoint
+
+	for the org add team member operation.
+
+	Typically these are written to a http.Request.
+*/
+type OrgAddTeamMemberParams struct {
+
+	/* ID.
+
+	   id of the team
+
+	   Format: int64
+	*/
+	ID int64
+
+	/* Username.
+
+	   username of the user to add
+	*/
+	Username string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the org add team member params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgAddTeamMemberParams) WithDefaults() *OrgAddTeamMemberParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the org add team member params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgAddTeamMemberParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the org add team member params
+func (o *OrgAddTeamMemberParams) WithTimeout(timeout time.Duration) *OrgAddTeamMemberParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the org add team member params
+func (o *OrgAddTeamMemberParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the org add team member params
+func (o *OrgAddTeamMemberParams) WithContext(ctx context.Context) *OrgAddTeamMemberParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the org add team member params
+func (o *OrgAddTeamMemberParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the org add team member params
+func (o *OrgAddTeamMemberParams) WithHTTPClient(client *http.Client) *OrgAddTeamMemberParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the org add team member params
+func (o *OrgAddTeamMemberParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithID adds the id to the org add team member params
+func (o *OrgAddTeamMemberParams) WithID(id int64) *OrgAddTeamMemberParams {
+	o.SetID(id)
+	return o
+}
+
+// SetID adds the id to the org add team member params
+func (o *OrgAddTeamMemberParams) SetID(id int64) {
+	o.ID = id
+}
+
+// WithUsername adds the username to the org add team member params
+func (o *OrgAddTeamMemberParams) WithUsername(username string) *OrgAddTeamMemberParams {
+	o.SetUsername(username)
+	return o
+}
+
+// SetUsername adds the username to the org add team member params
+func (o *OrgAddTeamMemberParams) SetUsername(username string) {
+	o.Username = username
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *OrgAddTeamMemberParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param id
+	if err := r.SetPathParam("id", swag.FormatInt64(o.ID)); err != nil {
+		return err
+	}
+
+	// path param username
+	if err := r.SetPathParam("username", o.Username); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_add_team_member_responses.go b/bots-common/gitea-generated/client/organization/org_add_team_member_responses.go
new file mode 100644
index 0000000..e254e86
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_add_team_member_responses.go
@@ -0,0 +1,228 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// OrgAddTeamMemberReader is a Reader for the OrgAddTeamMember structure.
+type OrgAddTeamMemberReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *OrgAddTeamMemberReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewOrgAddTeamMemberNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 403:
+		result := NewOrgAddTeamMemberForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewOrgAddTeamMemberNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[PUT /teams/{id}/members/{username}] orgAddTeamMember", response, response.Code())
+	}
+}
+
+// NewOrgAddTeamMemberNoContent creates a OrgAddTeamMemberNoContent with default headers values
+func NewOrgAddTeamMemberNoContent() *OrgAddTeamMemberNoContent {
+	return &OrgAddTeamMemberNoContent{}
+}
+
+/*
+OrgAddTeamMemberNoContent describes a response with status code 204, with default header values.
+
+APIEmpty is an empty response
+*/
+type OrgAddTeamMemberNoContent struct {
+}
+
+// IsSuccess returns true when this org add team member no content response has a 2xx status code
+func (o *OrgAddTeamMemberNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this org add team member no content response has a 3xx status code
+func (o *OrgAddTeamMemberNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org add team member no content response has a 4xx status code
+func (o *OrgAddTeamMemberNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this org add team member no content response has a 5xx status code
+func (o *OrgAddTeamMemberNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org add team member no content response a status code equal to that given
+func (o *OrgAddTeamMemberNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the org add team member no content response
+func (o *OrgAddTeamMemberNoContent) Code() int {
+	return 204
+}
+
+func (o *OrgAddTeamMemberNoContent) Error() string {
+	return fmt.Sprintf("[PUT /teams/{id}/members/{username}][%d] orgAddTeamMemberNoContent", 204)
+}
+
+func (o *OrgAddTeamMemberNoContent) String() string {
+	return fmt.Sprintf("[PUT /teams/{id}/members/{username}][%d] orgAddTeamMemberNoContent", 204)
+}
+
+func (o *OrgAddTeamMemberNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewOrgAddTeamMemberForbidden creates a OrgAddTeamMemberForbidden with default headers values
+func NewOrgAddTeamMemberForbidden() *OrgAddTeamMemberForbidden {
+	return &OrgAddTeamMemberForbidden{}
+}
+
+/*
+OrgAddTeamMemberForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type OrgAddTeamMemberForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this org add team member forbidden response has a 2xx status code
+func (o *OrgAddTeamMemberForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this org add team member forbidden response has a 3xx status code
+func (o *OrgAddTeamMemberForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org add team member forbidden response has a 4xx status code
+func (o *OrgAddTeamMemberForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this org add team member forbidden response has a 5xx status code
+func (o *OrgAddTeamMemberForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org add team member forbidden response a status code equal to that given
+func (o *OrgAddTeamMemberForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the org add team member forbidden response
+func (o *OrgAddTeamMemberForbidden) Code() int {
+	return 403
+}
+
+func (o *OrgAddTeamMemberForbidden) Error() string {
+	return fmt.Sprintf("[PUT /teams/{id}/members/{username}][%d] orgAddTeamMemberForbidden", 403)
+}
+
+func (o *OrgAddTeamMemberForbidden) String() string {
+	return fmt.Sprintf("[PUT /teams/{id}/members/{username}][%d] orgAddTeamMemberForbidden", 403)
+}
+
+func (o *OrgAddTeamMemberForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewOrgAddTeamMemberNotFound creates a OrgAddTeamMemberNotFound with default headers values
+func NewOrgAddTeamMemberNotFound() *OrgAddTeamMemberNotFound {
+	return &OrgAddTeamMemberNotFound{}
+}
+
+/*
+OrgAddTeamMemberNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type OrgAddTeamMemberNotFound struct {
+}
+
+// IsSuccess returns true when this org add team member not found response has a 2xx status code
+func (o *OrgAddTeamMemberNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this org add team member not found response has a 3xx status code
+func (o *OrgAddTeamMemberNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org add team member not found response has a 4xx status code
+func (o *OrgAddTeamMemberNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this org add team member not found response has a 5xx status code
+func (o *OrgAddTeamMemberNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org add team member not found response a status code equal to that given
+func (o *OrgAddTeamMemberNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the org add team member not found response
+func (o *OrgAddTeamMemberNotFound) Code() int {
+	return 404
+}
+
+func (o *OrgAddTeamMemberNotFound) Error() string {
+	return fmt.Sprintf("[PUT /teams/{id}/members/{username}][%d] orgAddTeamMemberNotFound", 404)
+}
+
+func (o *OrgAddTeamMemberNotFound) String() string {
+	return fmt.Sprintf("[PUT /teams/{id}/members/{username}][%d] orgAddTeamMemberNotFound", 404)
+}
+
+func (o *OrgAddTeamMemberNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_add_team_repository_parameters.go b/bots-common/gitea-generated/client/organization/org_add_team_repository_parameters.go
new file mode 100644
index 0000000..f1f0ea5
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_add_team_repository_parameters.go
@@ -0,0 +1,198 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewOrgAddTeamRepositoryParams creates a new OrgAddTeamRepositoryParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewOrgAddTeamRepositoryParams() *OrgAddTeamRepositoryParams {
+	return &OrgAddTeamRepositoryParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewOrgAddTeamRepositoryParamsWithTimeout creates a new OrgAddTeamRepositoryParams object
+// with the ability to set a timeout on a request.
+func NewOrgAddTeamRepositoryParamsWithTimeout(timeout time.Duration) *OrgAddTeamRepositoryParams {
+	return &OrgAddTeamRepositoryParams{
+		timeout: timeout,
+	}
+}
+
+// NewOrgAddTeamRepositoryParamsWithContext creates a new OrgAddTeamRepositoryParams object
+// with the ability to set a context for a request.
+func NewOrgAddTeamRepositoryParamsWithContext(ctx context.Context) *OrgAddTeamRepositoryParams {
+	return &OrgAddTeamRepositoryParams{
+		Context: ctx,
+	}
+}
+
+// NewOrgAddTeamRepositoryParamsWithHTTPClient creates a new OrgAddTeamRepositoryParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewOrgAddTeamRepositoryParamsWithHTTPClient(client *http.Client) *OrgAddTeamRepositoryParams {
+	return &OrgAddTeamRepositoryParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+OrgAddTeamRepositoryParams contains all the parameters to send to the API endpoint
+
+	for the org add team repository operation.
+
+	Typically these are written to a http.Request.
+*/
+type OrgAddTeamRepositoryParams struct {
+
+	/* ID.
+
+	   id of the team
+
+	   Format: int64
+	*/
+	ID int64
+
+	/* Org.
+
+	   organization that owns the repo to add
+	*/
+	Org string
+
+	/* Repo.
+
+	   name of the repo to add
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the org add team repository params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgAddTeamRepositoryParams) WithDefaults() *OrgAddTeamRepositoryParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the org add team repository params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgAddTeamRepositoryParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the org add team repository params
+func (o *OrgAddTeamRepositoryParams) WithTimeout(timeout time.Duration) *OrgAddTeamRepositoryParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the org add team repository params
+func (o *OrgAddTeamRepositoryParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the org add team repository params
+func (o *OrgAddTeamRepositoryParams) WithContext(ctx context.Context) *OrgAddTeamRepositoryParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the org add team repository params
+func (o *OrgAddTeamRepositoryParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the org add team repository params
+func (o *OrgAddTeamRepositoryParams) WithHTTPClient(client *http.Client) *OrgAddTeamRepositoryParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the org add team repository params
+func (o *OrgAddTeamRepositoryParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithID adds the id to the org add team repository params
+func (o *OrgAddTeamRepositoryParams) WithID(id int64) *OrgAddTeamRepositoryParams {
+	o.SetID(id)
+	return o
+}
+
+// SetID adds the id to the org add team repository params
+func (o *OrgAddTeamRepositoryParams) SetID(id int64) {
+	o.ID = id
+}
+
+// WithOrg adds the org to the org add team repository params
+func (o *OrgAddTeamRepositoryParams) WithOrg(org string) *OrgAddTeamRepositoryParams {
+	o.SetOrg(org)
+	return o
+}
+
+// SetOrg adds the org to the org add team repository params
+func (o *OrgAddTeamRepositoryParams) SetOrg(org string) {
+	o.Org = org
+}
+
+// WithRepo adds the repo to the org add team repository params
+func (o *OrgAddTeamRepositoryParams) WithRepo(repo string) *OrgAddTeamRepositoryParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the org add team repository params
+func (o *OrgAddTeamRepositoryParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *OrgAddTeamRepositoryParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param id
+	if err := r.SetPathParam("id", swag.FormatInt64(o.ID)); err != nil {
+		return err
+	}
+
+	// path param org
+	if err := r.SetPathParam("org", o.Org); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_add_team_repository_responses.go b/bots-common/gitea-generated/client/organization/org_add_team_repository_responses.go
new file mode 100644
index 0000000..00cf1ac
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_add_team_repository_responses.go
@@ -0,0 +1,228 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// OrgAddTeamRepositoryReader is a Reader for the OrgAddTeamRepository structure.
+type OrgAddTeamRepositoryReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *OrgAddTeamRepositoryReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewOrgAddTeamRepositoryNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 403:
+		result := NewOrgAddTeamRepositoryForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewOrgAddTeamRepositoryNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[PUT /teams/{id}/repos/{org}/{repo}] orgAddTeamRepository", response, response.Code())
+	}
+}
+
+// NewOrgAddTeamRepositoryNoContent creates a OrgAddTeamRepositoryNoContent with default headers values
+func NewOrgAddTeamRepositoryNoContent() *OrgAddTeamRepositoryNoContent {
+	return &OrgAddTeamRepositoryNoContent{}
+}
+
+/*
+OrgAddTeamRepositoryNoContent describes a response with status code 204, with default header values.
+
+APIEmpty is an empty response
+*/
+type OrgAddTeamRepositoryNoContent struct {
+}
+
+// IsSuccess returns true when this org add team repository no content response has a 2xx status code
+func (o *OrgAddTeamRepositoryNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this org add team repository no content response has a 3xx status code
+func (o *OrgAddTeamRepositoryNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org add team repository no content response has a 4xx status code
+func (o *OrgAddTeamRepositoryNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this org add team repository no content response has a 5xx status code
+func (o *OrgAddTeamRepositoryNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org add team repository no content response a status code equal to that given
+func (o *OrgAddTeamRepositoryNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the org add team repository no content response
+func (o *OrgAddTeamRepositoryNoContent) Code() int {
+	return 204
+}
+
+func (o *OrgAddTeamRepositoryNoContent) Error() string {
+	return fmt.Sprintf("[PUT /teams/{id}/repos/{org}/{repo}][%d] orgAddTeamRepositoryNoContent", 204)
+}
+
+func (o *OrgAddTeamRepositoryNoContent) String() string {
+	return fmt.Sprintf("[PUT /teams/{id}/repos/{org}/{repo}][%d] orgAddTeamRepositoryNoContent", 204)
+}
+
+func (o *OrgAddTeamRepositoryNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewOrgAddTeamRepositoryForbidden creates a OrgAddTeamRepositoryForbidden with default headers values
+func NewOrgAddTeamRepositoryForbidden() *OrgAddTeamRepositoryForbidden {
+	return &OrgAddTeamRepositoryForbidden{}
+}
+
+/*
+OrgAddTeamRepositoryForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type OrgAddTeamRepositoryForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this org add team repository forbidden response has a 2xx status code
+func (o *OrgAddTeamRepositoryForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this org add team repository forbidden response has a 3xx status code
+func (o *OrgAddTeamRepositoryForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org add team repository forbidden response has a 4xx status code
+func (o *OrgAddTeamRepositoryForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this org add team repository forbidden response has a 5xx status code
+func (o *OrgAddTeamRepositoryForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org add team repository forbidden response a status code equal to that given
+func (o *OrgAddTeamRepositoryForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the org add team repository forbidden response
+func (o *OrgAddTeamRepositoryForbidden) Code() int {
+	return 403
+}
+
+func (o *OrgAddTeamRepositoryForbidden) Error() string {
+	return fmt.Sprintf("[PUT /teams/{id}/repos/{org}/{repo}][%d] orgAddTeamRepositoryForbidden", 403)
+}
+
+func (o *OrgAddTeamRepositoryForbidden) String() string {
+	return fmt.Sprintf("[PUT /teams/{id}/repos/{org}/{repo}][%d] orgAddTeamRepositoryForbidden", 403)
+}
+
+func (o *OrgAddTeamRepositoryForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewOrgAddTeamRepositoryNotFound creates a OrgAddTeamRepositoryNotFound with default headers values
+func NewOrgAddTeamRepositoryNotFound() *OrgAddTeamRepositoryNotFound {
+	return &OrgAddTeamRepositoryNotFound{}
+}
+
+/*
+OrgAddTeamRepositoryNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type OrgAddTeamRepositoryNotFound struct {
+}
+
+// IsSuccess returns true when this org add team repository not found response has a 2xx status code
+func (o *OrgAddTeamRepositoryNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this org add team repository not found response has a 3xx status code
+func (o *OrgAddTeamRepositoryNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org add team repository not found response has a 4xx status code
+func (o *OrgAddTeamRepositoryNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this org add team repository not found response has a 5xx status code
+func (o *OrgAddTeamRepositoryNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org add team repository not found response a status code equal to that given
+func (o *OrgAddTeamRepositoryNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the org add team repository not found response
+func (o *OrgAddTeamRepositoryNotFound) Code() int {
+	return 404
+}
+
+func (o *OrgAddTeamRepositoryNotFound) Error() string {
+	return fmt.Sprintf("[PUT /teams/{id}/repos/{org}/{repo}][%d] orgAddTeamRepositoryNotFound", 404)
+}
+
+func (o *OrgAddTeamRepositoryNotFound) String() string {
+	return fmt.Sprintf("[PUT /teams/{id}/repos/{org}/{repo}][%d] orgAddTeamRepositoryNotFound", 404)
+}
+
+func (o *OrgAddTeamRepositoryNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_conceal_member_parameters.go b/bots-common/gitea-generated/client/organization/org_conceal_member_parameters.go
new file mode 100644
index 0000000..0fc661e
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_conceal_member_parameters.go
@@ -0,0 +1,173 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewOrgConcealMemberParams creates a new OrgConcealMemberParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewOrgConcealMemberParams() *OrgConcealMemberParams {
+	return &OrgConcealMemberParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewOrgConcealMemberParamsWithTimeout creates a new OrgConcealMemberParams object
+// with the ability to set a timeout on a request.
+func NewOrgConcealMemberParamsWithTimeout(timeout time.Duration) *OrgConcealMemberParams {
+	return &OrgConcealMemberParams{
+		timeout: timeout,
+	}
+}
+
+// NewOrgConcealMemberParamsWithContext creates a new OrgConcealMemberParams object
+// with the ability to set a context for a request.
+func NewOrgConcealMemberParamsWithContext(ctx context.Context) *OrgConcealMemberParams {
+	return &OrgConcealMemberParams{
+		Context: ctx,
+	}
+}
+
+// NewOrgConcealMemberParamsWithHTTPClient creates a new OrgConcealMemberParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewOrgConcealMemberParamsWithHTTPClient(client *http.Client) *OrgConcealMemberParams {
+	return &OrgConcealMemberParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+OrgConcealMemberParams contains all the parameters to send to the API endpoint
+
+	for the org conceal member operation.
+
+	Typically these are written to a http.Request.
+*/
+type OrgConcealMemberParams struct {
+
+	/* Org.
+
+	   name of the organization
+	*/
+	Org string
+
+	/* Username.
+
+	   username of the user
+	*/
+	Username string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the org conceal member params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgConcealMemberParams) WithDefaults() *OrgConcealMemberParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the org conceal member params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgConcealMemberParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the org conceal member params
+func (o *OrgConcealMemberParams) WithTimeout(timeout time.Duration) *OrgConcealMemberParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the org conceal member params
+func (o *OrgConcealMemberParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the org conceal member params
+func (o *OrgConcealMemberParams) WithContext(ctx context.Context) *OrgConcealMemberParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the org conceal member params
+func (o *OrgConcealMemberParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the org conceal member params
+func (o *OrgConcealMemberParams) WithHTTPClient(client *http.Client) *OrgConcealMemberParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the org conceal member params
+func (o *OrgConcealMemberParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithOrg adds the org to the org conceal member params
+func (o *OrgConcealMemberParams) WithOrg(org string) *OrgConcealMemberParams {
+	o.SetOrg(org)
+	return o
+}
+
+// SetOrg adds the org to the org conceal member params
+func (o *OrgConcealMemberParams) SetOrg(org string) {
+	o.Org = org
+}
+
+// WithUsername adds the username to the org conceal member params
+func (o *OrgConcealMemberParams) WithUsername(username string) *OrgConcealMemberParams {
+	o.SetUsername(username)
+	return o
+}
+
+// SetUsername adds the username to the org conceal member params
+func (o *OrgConcealMemberParams) SetUsername(username string) {
+	o.Username = username
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *OrgConcealMemberParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param org
+	if err := r.SetPathParam("org", o.Org); err != nil {
+		return err
+	}
+
+	// path param username
+	if err := r.SetPathParam("username", o.Username); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_conceal_member_responses.go b/bots-common/gitea-generated/client/organization/org_conceal_member_responses.go
new file mode 100644
index 0000000..b2ea94f
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_conceal_member_responses.go
@@ -0,0 +1,228 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// OrgConcealMemberReader is a Reader for the OrgConcealMember structure.
+type OrgConcealMemberReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *OrgConcealMemberReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewOrgConcealMemberNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 403:
+		result := NewOrgConcealMemberForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewOrgConcealMemberNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[DELETE /orgs/{org}/public_members/{username}] orgConcealMember", response, response.Code())
+	}
+}
+
+// NewOrgConcealMemberNoContent creates a OrgConcealMemberNoContent with default headers values
+func NewOrgConcealMemberNoContent() *OrgConcealMemberNoContent {
+	return &OrgConcealMemberNoContent{}
+}
+
+/*
+OrgConcealMemberNoContent describes a response with status code 204, with default header values.
+
+APIEmpty is an empty response
+*/
+type OrgConcealMemberNoContent struct {
+}
+
+// IsSuccess returns true when this org conceal member no content response has a 2xx status code
+func (o *OrgConcealMemberNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this org conceal member no content response has a 3xx status code
+func (o *OrgConcealMemberNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org conceal member no content response has a 4xx status code
+func (o *OrgConcealMemberNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this org conceal member no content response has a 5xx status code
+func (o *OrgConcealMemberNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org conceal member no content response a status code equal to that given
+func (o *OrgConcealMemberNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the org conceal member no content response
+func (o *OrgConcealMemberNoContent) Code() int {
+	return 204
+}
+
+func (o *OrgConcealMemberNoContent) Error() string {
+	return fmt.Sprintf("[DELETE /orgs/{org}/public_members/{username}][%d] orgConcealMemberNoContent", 204)
+}
+
+func (o *OrgConcealMemberNoContent) String() string {
+	return fmt.Sprintf("[DELETE /orgs/{org}/public_members/{username}][%d] orgConcealMemberNoContent", 204)
+}
+
+func (o *OrgConcealMemberNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewOrgConcealMemberForbidden creates a OrgConcealMemberForbidden with default headers values
+func NewOrgConcealMemberForbidden() *OrgConcealMemberForbidden {
+	return &OrgConcealMemberForbidden{}
+}
+
+/*
+OrgConcealMemberForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type OrgConcealMemberForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this org conceal member forbidden response has a 2xx status code
+func (o *OrgConcealMemberForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this org conceal member forbidden response has a 3xx status code
+func (o *OrgConcealMemberForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org conceal member forbidden response has a 4xx status code
+func (o *OrgConcealMemberForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this org conceal member forbidden response has a 5xx status code
+func (o *OrgConcealMemberForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org conceal member forbidden response a status code equal to that given
+func (o *OrgConcealMemberForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the org conceal member forbidden response
+func (o *OrgConcealMemberForbidden) Code() int {
+	return 403
+}
+
+func (o *OrgConcealMemberForbidden) Error() string {
+	return fmt.Sprintf("[DELETE /orgs/{org}/public_members/{username}][%d] orgConcealMemberForbidden", 403)
+}
+
+func (o *OrgConcealMemberForbidden) String() string {
+	return fmt.Sprintf("[DELETE /orgs/{org}/public_members/{username}][%d] orgConcealMemberForbidden", 403)
+}
+
+func (o *OrgConcealMemberForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewOrgConcealMemberNotFound creates a OrgConcealMemberNotFound with default headers values
+func NewOrgConcealMemberNotFound() *OrgConcealMemberNotFound {
+	return &OrgConcealMemberNotFound{}
+}
+
+/*
+OrgConcealMemberNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type OrgConcealMemberNotFound struct {
+}
+
+// IsSuccess returns true when this org conceal member not found response has a 2xx status code
+func (o *OrgConcealMemberNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this org conceal member not found response has a 3xx status code
+func (o *OrgConcealMemberNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org conceal member not found response has a 4xx status code
+func (o *OrgConcealMemberNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this org conceal member not found response has a 5xx status code
+func (o *OrgConcealMemberNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org conceal member not found response a status code equal to that given
+func (o *OrgConcealMemberNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the org conceal member not found response
+func (o *OrgConcealMemberNotFound) Code() int {
+	return 404
+}
+
+func (o *OrgConcealMemberNotFound) Error() string {
+	return fmt.Sprintf("[DELETE /orgs/{org}/public_members/{username}][%d] orgConcealMemberNotFound", 404)
+}
+
+func (o *OrgConcealMemberNotFound) String() string {
+	return fmt.Sprintf("[DELETE /orgs/{org}/public_members/{username}][%d] orgConcealMemberNotFound", 404)
+}
+
+func (o *OrgConcealMemberNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_create_hook_parameters.go b/bots-common/gitea-generated/client/organization/org_create_hook_parameters.go
new file mode 100644
index 0000000..461a890
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_create_hook_parameters.go
@@ -0,0 +1,172 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewOrgCreateHookParams creates a new OrgCreateHookParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewOrgCreateHookParams() *OrgCreateHookParams {
+	return &OrgCreateHookParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewOrgCreateHookParamsWithTimeout creates a new OrgCreateHookParams object
+// with the ability to set a timeout on a request.
+func NewOrgCreateHookParamsWithTimeout(timeout time.Duration) *OrgCreateHookParams {
+	return &OrgCreateHookParams{
+		timeout: timeout,
+	}
+}
+
+// NewOrgCreateHookParamsWithContext creates a new OrgCreateHookParams object
+// with the ability to set a context for a request.
+func NewOrgCreateHookParamsWithContext(ctx context.Context) *OrgCreateHookParams {
+	return &OrgCreateHookParams{
+		Context: ctx,
+	}
+}
+
+// NewOrgCreateHookParamsWithHTTPClient creates a new OrgCreateHookParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewOrgCreateHookParamsWithHTTPClient(client *http.Client) *OrgCreateHookParams {
+	return &OrgCreateHookParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+OrgCreateHookParams contains all the parameters to send to the API endpoint
+
+	for the org create hook operation.
+
+	Typically these are written to a http.Request.
+*/
+type OrgCreateHookParams struct {
+
+	// Body.
+	Body *models.CreateHookOption
+
+	/* Org.
+
+	   name of the organization
+	*/
+	Org string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the org create hook params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgCreateHookParams) WithDefaults() *OrgCreateHookParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the org create hook params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgCreateHookParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the org create hook params
+func (o *OrgCreateHookParams) WithTimeout(timeout time.Duration) *OrgCreateHookParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the org create hook params
+func (o *OrgCreateHookParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the org create hook params
+func (o *OrgCreateHookParams) WithContext(ctx context.Context) *OrgCreateHookParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the org create hook params
+func (o *OrgCreateHookParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the org create hook params
+func (o *OrgCreateHookParams) WithHTTPClient(client *http.Client) *OrgCreateHookParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the org create hook params
+func (o *OrgCreateHookParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the org create hook params
+func (o *OrgCreateHookParams) WithBody(body *models.CreateHookOption) *OrgCreateHookParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the org create hook params
+func (o *OrgCreateHookParams) SetBody(body *models.CreateHookOption) {
+	o.Body = body
+}
+
+// WithOrg adds the org to the org create hook params
+func (o *OrgCreateHookParams) WithOrg(org string) *OrgCreateHookParams {
+	o.SetOrg(org)
+	return o
+}
+
+// SetOrg adds the org to the org create hook params
+func (o *OrgCreateHookParams) SetOrg(org string) {
+	o.Org = org
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *OrgCreateHookParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	// path param org
+	if err := r.SetPathParam("org", o.Org); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_create_hook_responses.go b/bots-common/gitea-generated/client/organization/org_create_hook_responses.go
new file mode 100644
index 0000000..4afc117
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_create_hook_responses.go
@@ -0,0 +1,168 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// OrgCreateHookReader is a Reader for the OrgCreateHook structure.
+type OrgCreateHookReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *OrgCreateHookReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 201:
+		result := NewOrgCreateHookCreated()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewOrgCreateHookNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[POST /orgs/{org}/hooks] orgCreateHook", response, response.Code())
+	}
+}
+
+// NewOrgCreateHookCreated creates a OrgCreateHookCreated with default headers values
+func NewOrgCreateHookCreated() *OrgCreateHookCreated {
+	return &OrgCreateHookCreated{}
+}
+
+/*
+OrgCreateHookCreated describes a response with status code 201, with default header values.
+
+Hook
+*/
+type OrgCreateHookCreated struct {
+	Payload *models.Hook
+}
+
+// IsSuccess returns true when this org create hook created response has a 2xx status code
+func (o *OrgCreateHookCreated) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this org create hook created response has a 3xx status code
+func (o *OrgCreateHookCreated) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org create hook created response has a 4xx status code
+func (o *OrgCreateHookCreated) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this org create hook created response has a 5xx status code
+func (o *OrgCreateHookCreated) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org create hook created response a status code equal to that given
+func (o *OrgCreateHookCreated) IsCode(code int) bool {
+	return code == 201
+}
+
+// Code gets the status code for the org create hook created response
+func (o *OrgCreateHookCreated) Code() int {
+	return 201
+}
+
+func (o *OrgCreateHookCreated) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /orgs/{org}/hooks][%d] orgCreateHookCreated %s", 201, payload)
+}
+
+func (o *OrgCreateHookCreated) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /orgs/{org}/hooks][%d] orgCreateHookCreated %s", 201, payload)
+}
+
+func (o *OrgCreateHookCreated) GetPayload() *models.Hook {
+	return o.Payload
+}
+
+func (o *OrgCreateHookCreated) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.Hook)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewOrgCreateHookNotFound creates a OrgCreateHookNotFound with default headers values
+func NewOrgCreateHookNotFound() *OrgCreateHookNotFound {
+	return &OrgCreateHookNotFound{}
+}
+
+/*
+OrgCreateHookNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type OrgCreateHookNotFound struct {
+}
+
+// IsSuccess returns true when this org create hook not found response has a 2xx status code
+func (o *OrgCreateHookNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this org create hook not found response has a 3xx status code
+func (o *OrgCreateHookNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org create hook not found response has a 4xx status code
+func (o *OrgCreateHookNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this org create hook not found response has a 5xx status code
+func (o *OrgCreateHookNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org create hook not found response a status code equal to that given
+func (o *OrgCreateHookNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the org create hook not found response
+func (o *OrgCreateHookNotFound) Code() int {
+	return 404
+}
+
+func (o *OrgCreateHookNotFound) Error() string {
+	return fmt.Sprintf("[POST /orgs/{org}/hooks][%d] orgCreateHookNotFound", 404)
+}
+
+func (o *OrgCreateHookNotFound) String() string {
+	return fmt.Sprintf("[POST /orgs/{org}/hooks][%d] orgCreateHookNotFound", 404)
+}
+
+func (o *OrgCreateHookNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_create_label_parameters.go b/bots-common/gitea-generated/client/organization/org_create_label_parameters.go
new file mode 100644
index 0000000..78b49b9
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_create_label_parameters.go
@@ -0,0 +1,172 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewOrgCreateLabelParams creates a new OrgCreateLabelParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewOrgCreateLabelParams() *OrgCreateLabelParams {
+	return &OrgCreateLabelParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewOrgCreateLabelParamsWithTimeout creates a new OrgCreateLabelParams object
+// with the ability to set a timeout on a request.
+func NewOrgCreateLabelParamsWithTimeout(timeout time.Duration) *OrgCreateLabelParams {
+	return &OrgCreateLabelParams{
+		timeout: timeout,
+	}
+}
+
+// NewOrgCreateLabelParamsWithContext creates a new OrgCreateLabelParams object
+// with the ability to set a context for a request.
+func NewOrgCreateLabelParamsWithContext(ctx context.Context) *OrgCreateLabelParams {
+	return &OrgCreateLabelParams{
+		Context: ctx,
+	}
+}
+
+// NewOrgCreateLabelParamsWithHTTPClient creates a new OrgCreateLabelParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewOrgCreateLabelParamsWithHTTPClient(client *http.Client) *OrgCreateLabelParams {
+	return &OrgCreateLabelParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+OrgCreateLabelParams contains all the parameters to send to the API endpoint
+
+	for the org create label operation.
+
+	Typically these are written to a http.Request.
+*/
+type OrgCreateLabelParams struct {
+
+	// Body.
+	Body *models.CreateLabelOption
+
+	/* Org.
+
+	   name of the organization
+	*/
+	Org string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the org create label params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgCreateLabelParams) WithDefaults() *OrgCreateLabelParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the org create label params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgCreateLabelParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the org create label params
+func (o *OrgCreateLabelParams) WithTimeout(timeout time.Duration) *OrgCreateLabelParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the org create label params
+func (o *OrgCreateLabelParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the org create label params
+func (o *OrgCreateLabelParams) WithContext(ctx context.Context) *OrgCreateLabelParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the org create label params
+func (o *OrgCreateLabelParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the org create label params
+func (o *OrgCreateLabelParams) WithHTTPClient(client *http.Client) *OrgCreateLabelParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the org create label params
+func (o *OrgCreateLabelParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the org create label params
+func (o *OrgCreateLabelParams) WithBody(body *models.CreateLabelOption) *OrgCreateLabelParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the org create label params
+func (o *OrgCreateLabelParams) SetBody(body *models.CreateLabelOption) {
+	o.Body = body
+}
+
+// WithOrg adds the org to the org create label params
+func (o *OrgCreateLabelParams) WithOrg(org string) *OrgCreateLabelParams {
+	o.SetOrg(org)
+	return o
+}
+
+// SetOrg adds the org to the org create label params
+func (o *OrgCreateLabelParams) SetOrg(org string) {
+	o.Org = org
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *OrgCreateLabelParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	// path param org
+	if err := r.SetPathParam("org", o.Org); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_create_label_responses.go b/bots-common/gitea-generated/client/organization/org_create_label_responses.go
new file mode 100644
index 0000000..bb5c07f
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_create_label_responses.go
@@ -0,0 +1,246 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// OrgCreateLabelReader is a Reader for the OrgCreateLabel structure.
+type OrgCreateLabelReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *OrgCreateLabelReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 201:
+		result := NewOrgCreateLabelCreated()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewOrgCreateLabelNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 422:
+		result := NewOrgCreateLabelUnprocessableEntity()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[POST /orgs/{org}/labels] orgCreateLabel", response, response.Code())
+	}
+}
+
+// NewOrgCreateLabelCreated creates a OrgCreateLabelCreated with default headers values
+func NewOrgCreateLabelCreated() *OrgCreateLabelCreated {
+	return &OrgCreateLabelCreated{}
+}
+
+/*
+OrgCreateLabelCreated describes a response with status code 201, with default header values.
+
+Label
+*/
+type OrgCreateLabelCreated struct {
+	Payload *models.Label
+}
+
+// IsSuccess returns true when this org create label created response has a 2xx status code
+func (o *OrgCreateLabelCreated) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this org create label created response has a 3xx status code
+func (o *OrgCreateLabelCreated) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org create label created response has a 4xx status code
+func (o *OrgCreateLabelCreated) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this org create label created response has a 5xx status code
+func (o *OrgCreateLabelCreated) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org create label created response a status code equal to that given
+func (o *OrgCreateLabelCreated) IsCode(code int) bool {
+	return code == 201
+}
+
+// Code gets the status code for the org create label created response
+func (o *OrgCreateLabelCreated) Code() int {
+	return 201
+}
+
+func (o *OrgCreateLabelCreated) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /orgs/{org}/labels][%d] orgCreateLabelCreated %s", 201, payload)
+}
+
+func (o *OrgCreateLabelCreated) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /orgs/{org}/labels][%d] orgCreateLabelCreated %s", 201, payload)
+}
+
+func (o *OrgCreateLabelCreated) GetPayload() *models.Label {
+	return o.Payload
+}
+
+func (o *OrgCreateLabelCreated) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.Label)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewOrgCreateLabelNotFound creates a OrgCreateLabelNotFound with default headers values
+func NewOrgCreateLabelNotFound() *OrgCreateLabelNotFound {
+	return &OrgCreateLabelNotFound{}
+}
+
+/*
+OrgCreateLabelNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type OrgCreateLabelNotFound struct {
+}
+
+// IsSuccess returns true when this org create label not found response has a 2xx status code
+func (o *OrgCreateLabelNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this org create label not found response has a 3xx status code
+func (o *OrgCreateLabelNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org create label not found response has a 4xx status code
+func (o *OrgCreateLabelNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this org create label not found response has a 5xx status code
+func (o *OrgCreateLabelNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org create label not found response a status code equal to that given
+func (o *OrgCreateLabelNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the org create label not found response
+func (o *OrgCreateLabelNotFound) Code() int {
+	return 404
+}
+
+func (o *OrgCreateLabelNotFound) Error() string {
+	return fmt.Sprintf("[POST /orgs/{org}/labels][%d] orgCreateLabelNotFound", 404)
+}
+
+func (o *OrgCreateLabelNotFound) String() string {
+	return fmt.Sprintf("[POST /orgs/{org}/labels][%d] orgCreateLabelNotFound", 404)
+}
+
+func (o *OrgCreateLabelNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewOrgCreateLabelUnprocessableEntity creates a OrgCreateLabelUnprocessableEntity with default headers values
+func NewOrgCreateLabelUnprocessableEntity() *OrgCreateLabelUnprocessableEntity {
+	return &OrgCreateLabelUnprocessableEntity{}
+}
+
+/*
+OrgCreateLabelUnprocessableEntity describes a response with status code 422, with default header values.
+
+APIValidationError is error format response related to input validation
+*/
+type OrgCreateLabelUnprocessableEntity struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this org create label unprocessable entity response has a 2xx status code
+func (o *OrgCreateLabelUnprocessableEntity) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this org create label unprocessable entity response has a 3xx status code
+func (o *OrgCreateLabelUnprocessableEntity) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org create label unprocessable entity response has a 4xx status code
+func (o *OrgCreateLabelUnprocessableEntity) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this org create label unprocessable entity response has a 5xx status code
+func (o *OrgCreateLabelUnprocessableEntity) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org create label unprocessable entity response a status code equal to that given
+func (o *OrgCreateLabelUnprocessableEntity) IsCode(code int) bool {
+	return code == 422
+}
+
+// Code gets the status code for the org create label unprocessable entity response
+func (o *OrgCreateLabelUnprocessableEntity) Code() int {
+	return 422
+}
+
+func (o *OrgCreateLabelUnprocessableEntity) Error() string {
+	return fmt.Sprintf("[POST /orgs/{org}/labels][%d] orgCreateLabelUnprocessableEntity", 422)
+}
+
+func (o *OrgCreateLabelUnprocessableEntity) String() string {
+	return fmt.Sprintf("[POST /orgs/{org}/labels][%d] orgCreateLabelUnprocessableEntity", 422)
+}
+
+func (o *OrgCreateLabelUnprocessableEntity) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_create_parameters.go b/bots-common/gitea-generated/client/organization/org_create_parameters.go
new file mode 100644
index 0000000..e327038
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_create_parameters.go
@@ -0,0 +1,150 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewOrgCreateParams creates a new OrgCreateParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewOrgCreateParams() *OrgCreateParams {
+	return &OrgCreateParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewOrgCreateParamsWithTimeout creates a new OrgCreateParams object
+// with the ability to set a timeout on a request.
+func NewOrgCreateParamsWithTimeout(timeout time.Duration) *OrgCreateParams {
+	return &OrgCreateParams{
+		timeout: timeout,
+	}
+}
+
+// NewOrgCreateParamsWithContext creates a new OrgCreateParams object
+// with the ability to set a context for a request.
+func NewOrgCreateParamsWithContext(ctx context.Context) *OrgCreateParams {
+	return &OrgCreateParams{
+		Context: ctx,
+	}
+}
+
+// NewOrgCreateParamsWithHTTPClient creates a new OrgCreateParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewOrgCreateParamsWithHTTPClient(client *http.Client) *OrgCreateParams {
+	return &OrgCreateParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+OrgCreateParams contains all the parameters to send to the API endpoint
+
+	for the org create operation.
+
+	Typically these are written to a http.Request.
+*/
+type OrgCreateParams struct {
+
+	// Organization.
+	Organization *models.CreateOrgOption
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the org create params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgCreateParams) WithDefaults() *OrgCreateParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the org create params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgCreateParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the org create params
+func (o *OrgCreateParams) WithTimeout(timeout time.Duration) *OrgCreateParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the org create params
+func (o *OrgCreateParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the org create params
+func (o *OrgCreateParams) WithContext(ctx context.Context) *OrgCreateParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the org create params
+func (o *OrgCreateParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the org create params
+func (o *OrgCreateParams) WithHTTPClient(client *http.Client) *OrgCreateParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the org create params
+func (o *OrgCreateParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithOrganization adds the organization to the org create params
+func (o *OrgCreateParams) WithOrganization(organization *models.CreateOrgOption) *OrgCreateParams {
+	o.SetOrganization(organization)
+	return o
+}
+
+// SetOrganization adds the organization to the org create params
+func (o *OrgCreateParams) SetOrganization(organization *models.CreateOrgOption) {
+	o.Organization = organization
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *OrgCreateParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Organization != nil {
+		if err := r.SetBodyParam(o.Organization); err != nil {
+			return err
+		}
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_create_responses.go b/bots-common/gitea-generated/client/organization/org_create_responses.go
new file mode 100644
index 0000000..ff8ffa7
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_create_responses.go
@@ -0,0 +1,262 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// OrgCreateReader is a Reader for the OrgCreate structure.
+type OrgCreateReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *OrgCreateReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 201:
+		result := NewOrgCreateCreated()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 403:
+		result := NewOrgCreateForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 422:
+		result := NewOrgCreateUnprocessableEntity()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[POST /orgs] orgCreate", response, response.Code())
+	}
+}
+
+// NewOrgCreateCreated creates a OrgCreateCreated with default headers values
+func NewOrgCreateCreated() *OrgCreateCreated {
+	return &OrgCreateCreated{}
+}
+
+/*
+OrgCreateCreated describes a response with status code 201, with default header values.
+
+Organization
+*/
+type OrgCreateCreated struct {
+	Payload *models.Organization
+}
+
+// IsSuccess returns true when this org create created response has a 2xx status code
+func (o *OrgCreateCreated) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this org create created response has a 3xx status code
+func (o *OrgCreateCreated) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org create created response has a 4xx status code
+func (o *OrgCreateCreated) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this org create created response has a 5xx status code
+func (o *OrgCreateCreated) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org create created response a status code equal to that given
+func (o *OrgCreateCreated) IsCode(code int) bool {
+	return code == 201
+}
+
+// Code gets the status code for the org create created response
+func (o *OrgCreateCreated) Code() int {
+	return 201
+}
+
+func (o *OrgCreateCreated) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /orgs][%d] orgCreateCreated %s", 201, payload)
+}
+
+func (o *OrgCreateCreated) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /orgs][%d] orgCreateCreated %s", 201, payload)
+}
+
+func (o *OrgCreateCreated) GetPayload() *models.Organization {
+	return o.Payload
+}
+
+func (o *OrgCreateCreated) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.Organization)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewOrgCreateForbidden creates a OrgCreateForbidden with default headers values
+func NewOrgCreateForbidden() *OrgCreateForbidden {
+	return &OrgCreateForbidden{}
+}
+
+/*
+OrgCreateForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type OrgCreateForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this org create forbidden response has a 2xx status code
+func (o *OrgCreateForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this org create forbidden response has a 3xx status code
+func (o *OrgCreateForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org create forbidden response has a 4xx status code
+func (o *OrgCreateForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this org create forbidden response has a 5xx status code
+func (o *OrgCreateForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org create forbidden response a status code equal to that given
+func (o *OrgCreateForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the org create forbidden response
+func (o *OrgCreateForbidden) Code() int {
+	return 403
+}
+
+func (o *OrgCreateForbidden) Error() string {
+	return fmt.Sprintf("[POST /orgs][%d] orgCreateForbidden", 403)
+}
+
+func (o *OrgCreateForbidden) String() string {
+	return fmt.Sprintf("[POST /orgs][%d] orgCreateForbidden", 403)
+}
+
+func (o *OrgCreateForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewOrgCreateUnprocessableEntity creates a OrgCreateUnprocessableEntity with default headers values
+func NewOrgCreateUnprocessableEntity() *OrgCreateUnprocessableEntity {
+	return &OrgCreateUnprocessableEntity{}
+}
+
+/*
+OrgCreateUnprocessableEntity describes a response with status code 422, with default header values.
+
+APIValidationError is error format response related to input validation
+*/
+type OrgCreateUnprocessableEntity struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this org create unprocessable entity response has a 2xx status code
+func (o *OrgCreateUnprocessableEntity) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this org create unprocessable entity response has a 3xx status code
+func (o *OrgCreateUnprocessableEntity) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org create unprocessable entity response has a 4xx status code
+func (o *OrgCreateUnprocessableEntity) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this org create unprocessable entity response has a 5xx status code
+func (o *OrgCreateUnprocessableEntity) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org create unprocessable entity response a status code equal to that given
+func (o *OrgCreateUnprocessableEntity) IsCode(code int) bool {
+	return code == 422
+}
+
+// Code gets the status code for the org create unprocessable entity response
+func (o *OrgCreateUnprocessableEntity) Code() int {
+	return 422
+}
+
+func (o *OrgCreateUnprocessableEntity) Error() string {
+	return fmt.Sprintf("[POST /orgs][%d] orgCreateUnprocessableEntity", 422)
+}
+
+func (o *OrgCreateUnprocessableEntity) String() string {
+	return fmt.Sprintf("[POST /orgs][%d] orgCreateUnprocessableEntity", 422)
+}
+
+func (o *OrgCreateUnprocessableEntity) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_create_team_parameters.go b/bots-common/gitea-generated/client/organization/org_create_team_parameters.go
new file mode 100644
index 0000000..06a24e8
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_create_team_parameters.go
@@ -0,0 +1,172 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewOrgCreateTeamParams creates a new OrgCreateTeamParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewOrgCreateTeamParams() *OrgCreateTeamParams {
+	return &OrgCreateTeamParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewOrgCreateTeamParamsWithTimeout creates a new OrgCreateTeamParams object
+// with the ability to set a timeout on a request.
+func NewOrgCreateTeamParamsWithTimeout(timeout time.Duration) *OrgCreateTeamParams {
+	return &OrgCreateTeamParams{
+		timeout: timeout,
+	}
+}
+
+// NewOrgCreateTeamParamsWithContext creates a new OrgCreateTeamParams object
+// with the ability to set a context for a request.
+func NewOrgCreateTeamParamsWithContext(ctx context.Context) *OrgCreateTeamParams {
+	return &OrgCreateTeamParams{
+		Context: ctx,
+	}
+}
+
+// NewOrgCreateTeamParamsWithHTTPClient creates a new OrgCreateTeamParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewOrgCreateTeamParamsWithHTTPClient(client *http.Client) *OrgCreateTeamParams {
+	return &OrgCreateTeamParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+OrgCreateTeamParams contains all the parameters to send to the API endpoint
+
+	for the org create team operation.
+
+	Typically these are written to a http.Request.
+*/
+type OrgCreateTeamParams struct {
+
+	// Body.
+	Body *models.CreateTeamOption
+
+	/* Org.
+
+	   name of the organization
+	*/
+	Org string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the org create team params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgCreateTeamParams) WithDefaults() *OrgCreateTeamParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the org create team params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgCreateTeamParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the org create team params
+func (o *OrgCreateTeamParams) WithTimeout(timeout time.Duration) *OrgCreateTeamParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the org create team params
+func (o *OrgCreateTeamParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the org create team params
+func (o *OrgCreateTeamParams) WithContext(ctx context.Context) *OrgCreateTeamParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the org create team params
+func (o *OrgCreateTeamParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the org create team params
+func (o *OrgCreateTeamParams) WithHTTPClient(client *http.Client) *OrgCreateTeamParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the org create team params
+func (o *OrgCreateTeamParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the org create team params
+func (o *OrgCreateTeamParams) WithBody(body *models.CreateTeamOption) *OrgCreateTeamParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the org create team params
+func (o *OrgCreateTeamParams) SetBody(body *models.CreateTeamOption) {
+	o.Body = body
+}
+
+// WithOrg adds the org to the org create team params
+func (o *OrgCreateTeamParams) WithOrg(org string) *OrgCreateTeamParams {
+	o.SetOrg(org)
+	return o
+}
+
+// SetOrg adds the org to the org create team params
+func (o *OrgCreateTeamParams) SetOrg(org string) {
+	o.Org = org
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *OrgCreateTeamParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	// path param org
+	if err := r.SetPathParam("org", o.Org); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_create_team_responses.go b/bots-common/gitea-generated/client/organization/org_create_team_responses.go
new file mode 100644
index 0000000..9eb26a9
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_create_team_responses.go
@@ -0,0 +1,246 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// OrgCreateTeamReader is a Reader for the OrgCreateTeam structure.
+type OrgCreateTeamReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *OrgCreateTeamReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 201:
+		result := NewOrgCreateTeamCreated()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewOrgCreateTeamNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 422:
+		result := NewOrgCreateTeamUnprocessableEntity()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[POST /orgs/{org}/teams] orgCreateTeam", response, response.Code())
+	}
+}
+
+// NewOrgCreateTeamCreated creates a OrgCreateTeamCreated with default headers values
+func NewOrgCreateTeamCreated() *OrgCreateTeamCreated {
+	return &OrgCreateTeamCreated{}
+}
+
+/*
+OrgCreateTeamCreated describes a response with status code 201, with default header values.
+
+Team
+*/
+type OrgCreateTeamCreated struct {
+	Payload *models.Team
+}
+
+// IsSuccess returns true when this org create team created response has a 2xx status code
+func (o *OrgCreateTeamCreated) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this org create team created response has a 3xx status code
+func (o *OrgCreateTeamCreated) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org create team created response has a 4xx status code
+func (o *OrgCreateTeamCreated) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this org create team created response has a 5xx status code
+func (o *OrgCreateTeamCreated) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org create team created response a status code equal to that given
+func (o *OrgCreateTeamCreated) IsCode(code int) bool {
+	return code == 201
+}
+
+// Code gets the status code for the org create team created response
+func (o *OrgCreateTeamCreated) Code() int {
+	return 201
+}
+
+func (o *OrgCreateTeamCreated) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /orgs/{org}/teams][%d] orgCreateTeamCreated %s", 201, payload)
+}
+
+func (o *OrgCreateTeamCreated) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /orgs/{org}/teams][%d] orgCreateTeamCreated %s", 201, payload)
+}
+
+func (o *OrgCreateTeamCreated) GetPayload() *models.Team {
+	return o.Payload
+}
+
+func (o *OrgCreateTeamCreated) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.Team)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewOrgCreateTeamNotFound creates a OrgCreateTeamNotFound with default headers values
+func NewOrgCreateTeamNotFound() *OrgCreateTeamNotFound {
+	return &OrgCreateTeamNotFound{}
+}
+
+/*
+OrgCreateTeamNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type OrgCreateTeamNotFound struct {
+}
+
+// IsSuccess returns true when this org create team not found response has a 2xx status code
+func (o *OrgCreateTeamNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this org create team not found response has a 3xx status code
+func (o *OrgCreateTeamNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org create team not found response has a 4xx status code
+func (o *OrgCreateTeamNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this org create team not found response has a 5xx status code
+func (o *OrgCreateTeamNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org create team not found response a status code equal to that given
+func (o *OrgCreateTeamNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the org create team not found response
+func (o *OrgCreateTeamNotFound) Code() int {
+	return 404
+}
+
+func (o *OrgCreateTeamNotFound) Error() string {
+	return fmt.Sprintf("[POST /orgs/{org}/teams][%d] orgCreateTeamNotFound", 404)
+}
+
+func (o *OrgCreateTeamNotFound) String() string {
+	return fmt.Sprintf("[POST /orgs/{org}/teams][%d] orgCreateTeamNotFound", 404)
+}
+
+func (o *OrgCreateTeamNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewOrgCreateTeamUnprocessableEntity creates a OrgCreateTeamUnprocessableEntity with default headers values
+func NewOrgCreateTeamUnprocessableEntity() *OrgCreateTeamUnprocessableEntity {
+	return &OrgCreateTeamUnprocessableEntity{}
+}
+
+/*
+OrgCreateTeamUnprocessableEntity describes a response with status code 422, with default header values.
+
+APIValidationError is error format response related to input validation
+*/
+type OrgCreateTeamUnprocessableEntity struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this org create team unprocessable entity response has a 2xx status code
+func (o *OrgCreateTeamUnprocessableEntity) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this org create team unprocessable entity response has a 3xx status code
+func (o *OrgCreateTeamUnprocessableEntity) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org create team unprocessable entity response has a 4xx status code
+func (o *OrgCreateTeamUnprocessableEntity) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this org create team unprocessable entity response has a 5xx status code
+func (o *OrgCreateTeamUnprocessableEntity) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org create team unprocessable entity response a status code equal to that given
+func (o *OrgCreateTeamUnprocessableEntity) IsCode(code int) bool {
+	return code == 422
+}
+
+// Code gets the status code for the org create team unprocessable entity response
+func (o *OrgCreateTeamUnprocessableEntity) Code() int {
+	return 422
+}
+
+func (o *OrgCreateTeamUnprocessableEntity) Error() string {
+	return fmt.Sprintf("[POST /orgs/{org}/teams][%d] orgCreateTeamUnprocessableEntity", 422)
+}
+
+func (o *OrgCreateTeamUnprocessableEntity) String() string {
+	return fmt.Sprintf("[POST /orgs/{org}/teams][%d] orgCreateTeamUnprocessableEntity", 422)
+}
+
+func (o *OrgCreateTeamUnprocessableEntity) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_delete_avatar_parameters.go b/bots-common/gitea-generated/client/organization/org_delete_avatar_parameters.go
new file mode 100644
index 0000000..3ffaead
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_delete_avatar_parameters.go
@@ -0,0 +1,151 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewOrgDeleteAvatarParams creates a new OrgDeleteAvatarParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewOrgDeleteAvatarParams() *OrgDeleteAvatarParams {
+	return &OrgDeleteAvatarParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewOrgDeleteAvatarParamsWithTimeout creates a new OrgDeleteAvatarParams object
+// with the ability to set a timeout on a request.
+func NewOrgDeleteAvatarParamsWithTimeout(timeout time.Duration) *OrgDeleteAvatarParams {
+	return &OrgDeleteAvatarParams{
+		timeout: timeout,
+	}
+}
+
+// NewOrgDeleteAvatarParamsWithContext creates a new OrgDeleteAvatarParams object
+// with the ability to set a context for a request.
+func NewOrgDeleteAvatarParamsWithContext(ctx context.Context) *OrgDeleteAvatarParams {
+	return &OrgDeleteAvatarParams{
+		Context: ctx,
+	}
+}
+
+// NewOrgDeleteAvatarParamsWithHTTPClient creates a new OrgDeleteAvatarParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewOrgDeleteAvatarParamsWithHTTPClient(client *http.Client) *OrgDeleteAvatarParams {
+	return &OrgDeleteAvatarParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+OrgDeleteAvatarParams contains all the parameters to send to the API endpoint
+
+	for the org delete avatar operation.
+
+	Typically these are written to a http.Request.
+*/
+type OrgDeleteAvatarParams struct {
+
+	/* Org.
+
+	   name of the organization
+	*/
+	Org string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the org delete avatar params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgDeleteAvatarParams) WithDefaults() *OrgDeleteAvatarParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the org delete avatar params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgDeleteAvatarParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the org delete avatar params
+func (o *OrgDeleteAvatarParams) WithTimeout(timeout time.Duration) *OrgDeleteAvatarParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the org delete avatar params
+func (o *OrgDeleteAvatarParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the org delete avatar params
+func (o *OrgDeleteAvatarParams) WithContext(ctx context.Context) *OrgDeleteAvatarParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the org delete avatar params
+func (o *OrgDeleteAvatarParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the org delete avatar params
+func (o *OrgDeleteAvatarParams) WithHTTPClient(client *http.Client) *OrgDeleteAvatarParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the org delete avatar params
+func (o *OrgDeleteAvatarParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithOrg adds the org to the org delete avatar params
+func (o *OrgDeleteAvatarParams) WithOrg(org string) *OrgDeleteAvatarParams {
+	o.SetOrg(org)
+	return o
+}
+
+// SetOrg adds the org to the org delete avatar params
+func (o *OrgDeleteAvatarParams) SetOrg(org string) {
+	o.Org = org
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *OrgDeleteAvatarParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param org
+	if err := r.SetPathParam("org", o.Org); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_delete_avatar_responses.go b/bots-common/gitea-generated/client/organization/org_delete_avatar_responses.go
new file mode 100644
index 0000000..de675fe
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_delete_avatar_responses.go
@@ -0,0 +1,150 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// OrgDeleteAvatarReader is a Reader for the OrgDeleteAvatar structure.
+type OrgDeleteAvatarReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *OrgDeleteAvatarReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewOrgDeleteAvatarNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewOrgDeleteAvatarNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[DELETE /orgs/{org}/avatar] orgDeleteAvatar", response, response.Code())
+	}
+}
+
+// NewOrgDeleteAvatarNoContent creates a OrgDeleteAvatarNoContent with default headers values
+func NewOrgDeleteAvatarNoContent() *OrgDeleteAvatarNoContent {
+	return &OrgDeleteAvatarNoContent{}
+}
+
+/*
+OrgDeleteAvatarNoContent describes a response with status code 204, with default header values.
+
+APIEmpty is an empty response
+*/
+type OrgDeleteAvatarNoContent struct {
+}
+
+// IsSuccess returns true when this org delete avatar no content response has a 2xx status code
+func (o *OrgDeleteAvatarNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this org delete avatar no content response has a 3xx status code
+func (o *OrgDeleteAvatarNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org delete avatar no content response has a 4xx status code
+func (o *OrgDeleteAvatarNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this org delete avatar no content response has a 5xx status code
+func (o *OrgDeleteAvatarNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org delete avatar no content response a status code equal to that given
+func (o *OrgDeleteAvatarNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the org delete avatar no content response
+func (o *OrgDeleteAvatarNoContent) Code() int {
+	return 204
+}
+
+func (o *OrgDeleteAvatarNoContent) Error() string {
+	return fmt.Sprintf("[DELETE /orgs/{org}/avatar][%d] orgDeleteAvatarNoContent", 204)
+}
+
+func (o *OrgDeleteAvatarNoContent) String() string {
+	return fmt.Sprintf("[DELETE /orgs/{org}/avatar][%d] orgDeleteAvatarNoContent", 204)
+}
+
+func (o *OrgDeleteAvatarNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewOrgDeleteAvatarNotFound creates a OrgDeleteAvatarNotFound with default headers values
+func NewOrgDeleteAvatarNotFound() *OrgDeleteAvatarNotFound {
+	return &OrgDeleteAvatarNotFound{}
+}
+
+/*
+OrgDeleteAvatarNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type OrgDeleteAvatarNotFound struct {
+}
+
+// IsSuccess returns true when this org delete avatar not found response has a 2xx status code
+func (o *OrgDeleteAvatarNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this org delete avatar not found response has a 3xx status code
+func (o *OrgDeleteAvatarNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org delete avatar not found response has a 4xx status code
+func (o *OrgDeleteAvatarNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this org delete avatar not found response has a 5xx status code
+func (o *OrgDeleteAvatarNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org delete avatar not found response a status code equal to that given
+func (o *OrgDeleteAvatarNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the org delete avatar not found response
+func (o *OrgDeleteAvatarNotFound) Code() int {
+	return 404
+}
+
+func (o *OrgDeleteAvatarNotFound) Error() string {
+	return fmt.Sprintf("[DELETE /orgs/{org}/avatar][%d] orgDeleteAvatarNotFound", 404)
+}
+
+func (o *OrgDeleteAvatarNotFound) String() string {
+	return fmt.Sprintf("[DELETE /orgs/{org}/avatar][%d] orgDeleteAvatarNotFound", 404)
+}
+
+func (o *OrgDeleteAvatarNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_delete_hook_parameters.go b/bots-common/gitea-generated/client/organization/org_delete_hook_parameters.go
new file mode 100644
index 0000000..67091c8
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_delete_hook_parameters.go
@@ -0,0 +1,176 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewOrgDeleteHookParams creates a new OrgDeleteHookParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewOrgDeleteHookParams() *OrgDeleteHookParams {
+	return &OrgDeleteHookParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewOrgDeleteHookParamsWithTimeout creates a new OrgDeleteHookParams object
+// with the ability to set a timeout on a request.
+func NewOrgDeleteHookParamsWithTimeout(timeout time.Duration) *OrgDeleteHookParams {
+	return &OrgDeleteHookParams{
+		timeout: timeout,
+	}
+}
+
+// NewOrgDeleteHookParamsWithContext creates a new OrgDeleteHookParams object
+// with the ability to set a context for a request.
+func NewOrgDeleteHookParamsWithContext(ctx context.Context) *OrgDeleteHookParams {
+	return &OrgDeleteHookParams{
+		Context: ctx,
+	}
+}
+
+// NewOrgDeleteHookParamsWithHTTPClient creates a new OrgDeleteHookParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewOrgDeleteHookParamsWithHTTPClient(client *http.Client) *OrgDeleteHookParams {
+	return &OrgDeleteHookParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+OrgDeleteHookParams contains all the parameters to send to the API endpoint
+
+	for the org delete hook operation.
+
+	Typically these are written to a http.Request.
+*/
+type OrgDeleteHookParams struct {
+
+	/* ID.
+
+	   id of the hook to delete
+
+	   Format: int64
+	*/
+	ID int64
+
+	/* Org.
+
+	   name of the organization
+	*/
+	Org string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the org delete hook params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgDeleteHookParams) WithDefaults() *OrgDeleteHookParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the org delete hook params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgDeleteHookParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the org delete hook params
+func (o *OrgDeleteHookParams) WithTimeout(timeout time.Duration) *OrgDeleteHookParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the org delete hook params
+func (o *OrgDeleteHookParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the org delete hook params
+func (o *OrgDeleteHookParams) WithContext(ctx context.Context) *OrgDeleteHookParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the org delete hook params
+func (o *OrgDeleteHookParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the org delete hook params
+func (o *OrgDeleteHookParams) WithHTTPClient(client *http.Client) *OrgDeleteHookParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the org delete hook params
+func (o *OrgDeleteHookParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithID adds the id to the org delete hook params
+func (o *OrgDeleteHookParams) WithID(id int64) *OrgDeleteHookParams {
+	o.SetID(id)
+	return o
+}
+
+// SetID adds the id to the org delete hook params
+func (o *OrgDeleteHookParams) SetID(id int64) {
+	o.ID = id
+}
+
+// WithOrg adds the org to the org delete hook params
+func (o *OrgDeleteHookParams) WithOrg(org string) *OrgDeleteHookParams {
+	o.SetOrg(org)
+	return o
+}
+
+// SetOrg adds the org to the org delete hook params
+func (o *OrgDeleteHookParams) SetOrg(org string) {
+	o.Org = org
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *OrgDeleteHookParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param id
+	if err := r.SetPathParam("id", swag.FormatInt64(o.ID)); err != nil {
+		return err
+	}
+
+	// path param org
+	if err := r.SetPathParam("org", o.Org); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_delete_hook_responses.go b/bots-common/gitea-generated/client/organization/org_delete_hook_responses.go
new file mode 100644
index 0000000..6e3f30a
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_delete_hook_responses.go
@@ -0,0 +1,150 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// OrgDeleteHookReader is a Reader for the OrgDeleteHook structure.
+type OrgDeleteHookReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *OrgDeleteHookReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewOrgDeleteHookNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewOrgDeleteHookNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[DELETE /orgs/{org}/hooks/{id}] orgDeleteHook", response, response.Code())
+	}
+}
+
+// NewOrgDeleteHookNoContent creates a OrgDeleteHookNoContent with default headers values
+func NewOrgDeleteHookNoContent() *OrgDeleteHookNoContent {
+	return &OrgDeleteHookNoContent{}
+}
+
+/*
+OrgDeleteHookNoContent describes a response with status code 204, with default header values.
+
+APIEmpty is an empty response
+*/
+type OrgDeleteHookNoContent struct {
+}
+
+// IsSuccess returns true when this org delete hook no content response has a 2xx status code
+func (o *OrgDeleteHookNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this org delete hook no content response has a 3xx status code
+func (o *OrgDeleteHookNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org delete hook no content response has a 4xx status code
+func (o *OrgDeleteHookNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this org delete hook no content response has a 5xx status code
+func (o *OrgDeleteHookNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org delete hook no content response a status code equal to that given
+func (o *OrgDeleteHookNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the org delete hook no content response
+func (o *OrgDeleteHookNoContent) Code() int {
+	return 204
+}
+
+func (o *OrgDeleteHookNoContent) Error() string {
+	return fmt.Sprintf("[DELETE /orgs/{org}/hooks/{id}][%d] orgDeleteHookNoContent", 204)
+}
+
+func (o *OrgDeleteHookNoContent) String() string {
+	return fmt.Sprintf("[DELETE /orgs/{org}/hooks/{id}][%d] orgDeleteHookNoContent", 204)
+}
+
+func (o *OrgDeleteHookNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewOrgDeleteHookNotFound creates a OrgDeleteHookNotFound with default headers values
+func NewOrgDeleteHookNotFound() *OrgDeleteHookNotFound {
+	return &OrgDeleteHookNotFound{}
+}
+
+/*
+OrgDeleteHookNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type OrgDeleteHookNotFound struct {
+}
+
+// IsSuccess returns true when this org delete hook not found response has a 2xx status code
+func (o *OrgDeleteHookNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this org delete hook not found response has a 3xx status code
+func (o *OrgDeleteHookNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org delete hook not found response has a 4xx status code
+func (o *OrgDeleteHookNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this org delete hook not found response has a 5xx status code
+func (o *OrgDeleteHookNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org delete hook not found response a status code equal to that given
+func (o *OrgDeleteHookNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the org delete hook not found response
+func (o *OrgDeleteHookNotFound) Code() int {
+	return 404
+}
+
+func (o *OrgDeleteHookNotFound) Error() string {
+	return fmt.Sprintf("[DELETE /orgs/{org}/hooks/{id}][%d] orgDeleteHookNotFound", 404)
+}
+
+func (o *OrgDeleteHookNotFound) String() string {
+	return fmt.Sprintf("[DELETE /orgs/{org}/hooks/{id}][%d] orgDeleteHookNotFound", 404)
+}
+
+func (o *OrgDeleteHookNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_delete_label_parameters.go b/bots-common/gitea-generated/client/organization/org_delete_label_parameters.go
new file mode 100644
index 0000000..9d866b4
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_delete_label_parameters.go
@@ -0,0 +1,176 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewOrgDeleteLabelParams creates a new OrgDeleteLabelParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewOrgDeleteLabelParams() *OrgDeleteLabelParams {
+	return &OrgDeleteLabelParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewOrgDeleteLabelParamsWithTimeout creates a new OrgDeleteLabelParams object
+// with the ability to set a timeout on a request.
+func NewOrgDeleteLabelParamsWithTimeout(timeout time.Duration) *OrgDeleteLabelParams {
+	return &OrgDeleteLabelParams{
+		timeout: timeout,
+	}
+}
+
+// NewOrgDeleteLabelParamsWithContext creates a new OrgDeleteLabelParams object
+// with the ability to set a context for a request.
+func NewOrgDeleteLabelParamsWithContext(ctx context.Context) *OrgDeleteLabelParams {
+	return &OrgDeleteLabelParams{
+		Context: ctx,
+	}
+}
+
+// NewOrgDeleteLabelParamsWithHTTPClient creates a new OrgDeleteLabelParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewOrgDeleteLabelParamsWithHTTPClient(client *http.Client) *OrgDeleteLabelParams {
+	return &OrgDeleteLabelParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+OrgDeleteLabelParams contains all the parameters to send to the API endpoint
+
+	for the org delete label operation.
+
+	Typically these are written to a http.Request.
+*/
+type OrgDeleteLabelParams struct {
+
+	/* ID.
+
+	   id of the label to delete
+
+	   Format: int64
+	*/
+	ID int64
+
+	/* Org.
+
+	   name of the organization
+	*/
+	Org string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the org delete label params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgDeleteLabelParams) WithDefaults() *OrgDeleteLabelParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the org delete label params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgDeleteLabelParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the org delete label params
+func (o *OrgDeleteLabelParams) WithTimeout(timeout time.Duration) *OrgDeleteLabelParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the org delete label params
+func (o *OrgDeleteLabelParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the org delete label params
+func (o *OrgDeleteLabelParams) WithContext(ctx context.Context) *OrgDeleteLabelParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the org delete label params
+func (o *OrgDeleteLabelParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the org delete label params
+func (o *OrgDeleteLabelParams) WithHTTPClient(client *http.Client) *OrgDeleteLabelParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the org delete label params
+func (o *OrgDeleteLabelParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithID adds the id to the org delete label params
+func (o *OrgDeleteLabelParams) WithID(id int64) *OrgDeleteLabelParams {
+	o.SetID(id)
+	return o
+}
+
+// SetID adds the id to the org delete label params
+func (o *OrgDeleteLabelParams) SetID(id int64) {
+	o.ID = id
+}
+
+// WithOrg adds the org to the org delete label params
+func (o *OrgDeleteLabelParams) WithOrg(org string) *OrgDeleteLabelParams {
+	o.SetOrg(org)
+	return o
+}
+
+// SetOrg adds the org to the org delete label params
+func (o *OrgDeleteLabelParams) SetOrg(org string) {
+	o.Org = org
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *OrgDeleteLabelParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param id
+	if err := r.SetPathParam("id", swag.FormatInt64(o.ID)); err != nil {
+		return err
+	}
+
+	// path param org
+	if err := r.SetPathParam("org", o.Org); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_delete_label_responses.go b/bots-common/gitea-generated/client/organization/org_delete_label_responses.go
new file mode 100644
index 0000000..49a09d3
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_delete_label_responses.go
@@ -0,0 +1,150 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// OrgDeleteLabelReader is a Reader for the OrgDeleteLabel structure.
+type OrgDeleteLabelReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *OrgDeleteLabelReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewOrgDeleteLabelNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewOrgDeleteLabelNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[DELETE /orgs/{org}/labels/{id}] orgDeleteLabel", response, response.Code())
+	}
+}
+
+// NewOrgDeleteLabelNoContent creates a OrgDeleteLabelNoContent with default headers values
+func NewOrgDeleteLabelNoContent() *OrgDeleteLabelNoContent {
+	return &OrgDeleteLabelNoContent{}
+}
+
+/*
+OrgDeleteLabelNoContent describes a response with status code 204, with default header values.
+
+APIEmpty is an empty response
+*/
+type OrgDeleteLabelNoContent struct {
+}
+
+// IsSuccess returns true when this org delete label no content response has a 2xx status code
+func (o *OrgDeleteLabelNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this org delete label no content response has a 3xx status code
+func (o *OrgDeleteLabelNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org delete label no content response has a 4xx status code
+func (o *OrgDeleteLabelNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this org delete label no content response has a 5xx status code
+func (o *OrgDeleteLabelNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org delete label no content response a status code equal to that given
+func (o *OrgDeleteLabelNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the org delete label no content response
+func (o *OrgDeleteLabelNoContent) Code() int {
+	return 204
+}
+
+func (o *OrgDeleteLabelNoContent) Error() string {
+	return fmt.Sprintf("[DELETE /orgs/{org}/labels/{id}][%d] orgDeleteLabelNoContent", 204)
+}
+
+func (o *OrgDeleteLabelNoContent) String() string {
+	return fmt.Sprintf("[DELETE /orgs/{org}/labels/{id}][%d] orgDeleteLabelNoContent", 204)
+}
+
+func (o *OrgDeleteLabelNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewOrgDeleteLabelNotFound creates a OrgDeleteLabelNotFound with default headers values
+func NewOrgDeleteLabelNotFound() *OrgDeleteLabelNotFound {
+	return &OrgDeleteLabelNotFound{}
+}
+
+/*
+OrgDeleteLabelNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type OrgDeleteLabelNotFound struct {
+}
+
+// IsSuccess returns true when this org delete label not found response has a 2xx status code
+func (o *OrgDeleteLabelNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this org delete label not found response has a 3xx status code
+func (o *OrgDeleteLabelNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org delete label not found response has a 4xx status code
+func (o *OrgDeleteLabelNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this org delete label not found response has a 5xx status code
+func (o *OrgDeleteLabelNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org delete label not found response a status code equal to that given
+func (o *OrgDeleteLabelNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the org delete label not found response
+func (o *OrgDeleteLabelNotFound) Code() int {
+	return 404
+}
+
+func (o *OrgDeleteLabelNotFound) Error() string {
+	return fmt.Sprintf("[DELETE /orgs/{org}/labels/{id}][%d] orgDeleteLabelNotFound", 404)
+}
+
+func (o *OrgDeleteLabelNotFound) String() string {
+	return fmt.Sprintf("[DELETE /orgs/{org}/labels/{id}][%d] orgDeleteLabelNotFound", 404)
+}
+
+func (o *OrgDeleteLabelNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_delete_member_parameters.go b/bots-common/gitea-generated/client/organization/org_delete_member_parameters.go
new file mode 100644
index 0000000..98219c6
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_delete_member_parameters.go
@@ -0,0 +1,173 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewOrgDeleteMemberParams creates a new OrgDeleteMemberParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewOrgDeleteMemberParams() *OrgDeleteMemberParams {
+	return &OrgDeleteMemberParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewOrgDeleteMemberParamsWithTimeout creates a new OrgDeleteMemberParams object
+// with the ability to set a timeout on a request.
+func NewOrgDeleteMemberParamsWithTimeout(timeout time.Duration) *OrgDeleteMemberParams {
+	return &OrgDeleteMemberParams{
+		timeout: timeout,
+	}
+}
+
+// NewOrgDeleteMemberParamsWithContext creates a new OrgDeleteMemberParams object
+// with the ability to set a context for a request.
+func NewOrgDeleteMemberParamsWithContext(ctx context.Context) *OrgDeleteMemberParams {
+	return &OrgDeleteMemberParams{
+		Context: ctx,
+	}
+}
+
+// NewOrgDeleteMemberParamsWithHTTPClient creates a new OrgDeleteMemberParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewOrgDeleteMemberParamsWithHTTPClient(client *http.Client) *OrgDeleteMemberParams {
+	return &OrgDeleteMemberParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+OrgDeleteMemberParams contains all the parameters to send to the API endpoint
+
+	for the org delete member operation.
+
+	Typically these are written to a http.Request.
+*/
+type OrgDeleteMemberParams struct {
+
+	/* Org.
+
+	   name of the organization
+	*/
+	Org string
+
+	/* Username.
+
+	   username of the user
+	*/
+	Username string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the org delete member params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgDeleteMemberParams) WithDefaults() *OrgDeleteMemberParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the org delete member params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgDeleteMemberParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the org delete member params
+func (o *OrgDeleteMemberParams) WithTimeout(timeout time.Duration) *OrgDeleteMemberParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the org delete member params
+func (o *OrgDeleteMemberParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the org delete member params
+func (o *OrgDeleteMemberParams) WithContext(ctx context.Context) *OrgDeleteMemberParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the org delete member params
+func (o *OrgDeleteMemberParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the org delete member params
+func (o *OrgDeleteMemberParams) WithHTTPClient(client *http.Client) *OrgDeleteMemberParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the org delete member params
+func (o *OrgDeleteMemberParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithOrg adds the org to the org delete member params
+func (o *OrgDeleteMemberParams) WithOrg(org string) *OrgDeleteMemberParams {
+	o.SetOrg(org)
+	return o
+}
+
+// SetOrg adds the org to the org delete member params
+func (o *OrgDeleteMemberParams) SetOrg(org string) {
+	o.Org = org
+}
+
+// WithUsername adds the username to the org delete member params
+func (o *OrgDeleteMemberParams) WithUsername(username string) *OrgDeleteMemberParams {
+	o.SetUsername(username)
+	return o
+}
+
+// SetUsername adds the username to the org delete member params
+func (o *OrgDeleteMemberParams) SetUsername(username string) {
+	o.Username = username
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *OrgDeleteMemberParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param org
+	if err := r.SetPathParam("org", o.Org); err != nil {
+		return err
+	}
+
+	// path param username
+	if err := r.SetPathParam("username", o.Username); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_delete_member_responses.go b/bots-common/gitea-generated/client/organization/org_delete_member_responses.go
new file mode 100644
index 0000000..b02c740
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_delete_member_responses.go
@@ -0,0 +1,150 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// OrgDeleteMemberReader is a Reader for the OrgDeleteMember structure.
+type OrgDeleteMemberReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *OrgDeleteMemberReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewOrgDeleteMemberNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewOrgDeleteMemberNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[DELETE /orgs/{org}/members/{username}] orgDeleteMember", response, response.Code())
+	}
+}
+
+// NewOrgDeleteMemberNoContent creates a OrgDeleteMemberNoContent with default headers values
+func NewOrgDeleteMemberNoContent() *OrgDeleteMemberNoContent {
+	return &OrgDeleteMemberNoContent{}
+}
+
+/*
+OrgDeleteMemberNoContent describes a response with status code 204, with default header values.
+
+member removed
+*/
+type OrgDeleteMemberNoContent struct {
+}
+
+// IsSuccess returns true when this org delete member no content response has a 2xx status code
+func (o *OrgDeleteMemberNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this org delete member no content response has a 3xx status code
+func (o *OrgDeleteMemberNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org delete member no content response has a 4xx status code
+func (o *OrgDeleteMemberNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this org delete member no content response has a 5xx status code
+func (o *OrgDeleteMemberNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org delete member no content response a status code equal to that given
+func (o *OrgDeleteMemberNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the org delete member no content response
+func (o *OrgDeleteMemberNoContent) Code() int {
+	return 204
+}
+
+func (o *OrgDeleteMemberNoContent) Error() string {
+	return fmt.Sprintf("[DELETE /orgs/{org}/members/{username}][%d] orgDeleteMemberNoContent", 204)
+}
+
+func (o *OrgDeleteMemberNoContent) String() string {
+	return fmt.Sprintf("[DELETE /orgs/{org}/members/{username}][%d] orgDeleteMemberNoContent", 204)
+}
+
+func (o *OrgDeleteMemberNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewOrgDeleteMemberNotFound creates a OrgDeleteMemberNotFound with default headers values
+func NewOrgDeleteMemberNotFound() *OrgDeleteMemberNotFound {
+	return &OrgDeleteMemberNotFound{}
+}
+
+/*
+OrgDeleteMemberNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type OrgDeleteMemberNotFound struct {
+}
+
+// IsSuccess returns true when this org delete member not found response has a 2xx status code
+func (o *OrgDeleteMemberNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this org delete member not found response has a 3xx status code
+func (o *OrgDeleteMemberNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org delete member not found response has a 4xx status code
+func (o *OrgDeleteMemberNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this org delete member not found response has a 5xx status code
+func (o *OrgDeleteMemberNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org delete member not found response a status code equal to that given
+func (o *OrgDeleteMemberNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the org delete member not found response
+func (o *OrgDeleteMemberNotFound) Code() int {
+	return 404
+}
+
+func (o *OrgDeleteMemberNotFound) Error() string {
+	return fmt.Sprintf("[DELETE /orgs/{org}/members/{username}][%d] orgDeleteMemberNotFound", 404)
+}
+
+func (o *OrgDeleteMemberNotFound) String() string {
+	return fmt.Sprintf("[DELETE /orgs/{org}/members/{username}][%d] orgDeleteMemberNotFound", 404)
+}
+
+func (o *OrgDeleteMemberNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_delete_parameters.go b/bots-common/gitea-generated/client/organization/org_delete_parameters.go
new file mode 100644
index 0000000..7ba6087
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_delete_parameters.go
@@ -0,0 +1,151 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewOrgDeleteParams creates a new OrgDeleteParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewOrgDeleteParams() *OrgDeleteParams {
+	return &OrgDeleteParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewOrgDeleteParamsWithTimeout creates a new OrgDeleteParams object
+// with the ability to set a timeout on a request.
+func NewOrgDeleteParamsWithTimeout(timeout time.Duration) *OrgDeleteParams {
+	return &OrgDeleteParams{
+		timeout: timeout,
+	}
+}
+
+// NewOrgDeleteParamsWithContext creates a new OrgDeleteParams object
+// with the ability to set a context for a request.
+func NewOrgDeleteParamsWithContext(ctx context.Context) *OrgDeleteParams {
+	return &OrgDeleteParams{
+		Context: ctx,
+	}
+}
+
+// NewOrgDeleteParamsWithHTTPClient creates a new OrgDeleteParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewOrgDeleteParamsWithHTTPClient(client *http.Client) *OrgDeleteParams {
+	return &OrgDeleteParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+OrgDeleteParams contains all the parameters to send to the API endpoint
+
+	for the org delete operation.
+
+	Typically these are written to a http.Request.
+*/
+type OrgDeleteParams struct {
+
+	/* Org.
+
+	   organization that is to be deleted
+	*/
+	Org string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the org delete params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgDeleteParams) WithDefaults() *OrgDeleteParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the org delete params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgDeleteParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the org delete params
+func (o *OrgDeleteParams) WithTimeout(timeout time.Duration) *OrgDeleteParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the org delete params
+func (o *OrgDeleteParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the org delete params
+func (o *OrgDeleteParams) WithContext(ctx context.Context) *OrgDeleteParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the org delete params
+func (o *OrgDeleteParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the org delete params
+func (o *OrgDeleteParams) WithHTTPClient(client *http.Client) *OrgDeleteParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the org delete params
+func (o *OrgDeleteParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithOrg adds the org to the org delete params
+func (o *OrgDeleteParams) WithOrg(org string) *OrgDeleteParams {
+	o.SetOrg(org)
+	return o
+}
+
+// SetOrg adds the org to the org delete params
+func (o *OrgDeleteParams) SetOrg(org string) {
+	o.Org = org
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *OrgDeleteParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param org
+	if err := r.SetPathParam("org", o.Org); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_delete_responses.go b/bots-common/gitea-generated/client/organization/org_delete_responses.go
new file mode 100644
index 0000000..ace4e99
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_delete_responses.go
@@ -0,0 +1,150 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// OrgDeleteReader is a Reader for the OrgDelete structure.
+type OrgDeleteReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *OrgDeleteReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewOrgDeleteNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewOrgDeleteNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[DELETE /orgs/{org}] orgDelete", response, response.Code())
+	}
+}
+
+// NewOrgDeleteNoContent creates a OrgDeleteNoContent with default headers values
+func NewOrgDeleteNoContent() *OrgDeleteNoContent {
+	return &OrgDeleteNoContent{}
+}
+
+/*
+OrgDeleteNoContent describes a response with status code 204, with default header values.
+
+APIEmpty is an empty response
+*/
+type OrgDeleteNoContent struct {
+}
+
+// IsSuccess returns true when this org delete no content response has a 2xx status code
+func (o *OrgDeleteNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this org delete no content response has a 3xx status code
+func (o *OrgDeleteNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org delete no content response has a 4xx status code
+func (o *OrgDeleteNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this org delete no content response has a 5xx status code
+func (o *OrgDeleteNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org delete no content response a status code equal to that given
+func (o *OrgDeleteNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the org delete no content response
+func (o *OrgDeleteNoContent) Code() int {
+	return 204
+}
+
+func (o *OrgDeleteNoContent) Error() string {
+	return fmt.Sprintf("[DELETE /orgs/{org}][%d] orgDeleteNoContent", 204)
+}
+
+func (o *OrgDeleteNoContent) String() string {
+	return fmt.Sprintf("[DELETE /orgs/{org}][%d] orgDeleteNoContent", 204)
+}
+
+func (o *OrgDeleteNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewOrgDeleteNotFound creates a OrgDeleteNotFound with default headers values
+func NewOrgDeleteNotFound() *OrgDeleteNotFound {
+	return &OrgDeleteNotFound{}
+}
+
+/*
+OrgDeleteNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type OrgDeleteNotFound struct {
+}
+
+// IsSuccess returns true when this org delete not found response has a 2xx status code
+func (o *OrgDeleteNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this org delete not found response has a 3xx status code
+func (o *OrgDeleteNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org delete not found response has a 4xx status code
+func (o *OrgDeleteNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this org delete not found response has a 5xx status code
+func (o *OrgDeleteNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org delete not found response a status code equal to that given
+func (o *OrgDeleteNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the org delete not found response
+func (o *OrgDeleteNotFound) Code() int {
+	return 404
+}
+
+func (o *OrgDeleteNotFound) Error() string {
+	return fmt.Sprintf("[DELETE /orgs/{org}][%d] orgDeleteNotFound", 404)
+}
+
+func (o *OrgDeleteNotFound) String() string {
+	return fmt.Sprintf("[DELETE /orgs/{org}][%d] orgDeleteNotFound", 404)
+}
+
+func (o *OrgDeleteNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_delete_team_parameters.go b/bots-common/gitea-generated/client/organization/org_delete_team_parameters.go
new file mode 100644
index 0000000..07a8ac1
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_delete_team_parameters.go
@@ -0,0 +1,154 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewOrgDeleteTeamParams creates a new OrgDeleteTeamParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewOrgDeleteTeamParams() *OrgDeleteTeamParams {
+	return &OrgDeleteTeamParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewOrgDeleteTeamParamsWithTimeout creates a new OrgDeleteTeamParams object
+// with the ability to set a timeout on a request.
+func NewOrgDeleteTeamParamsWithTimeout(timeout time.Duration) *OrgDeleteTeamParams {
+	return &OrgDeleteTeamParams{
+		timeout: timeout,
+	}
+}
+
+// NewOrgDeleteTeamParamsWithContext creates a new OrgDeleteTeamParams object
+// with the ability to set a context for a request.
+func NewOrgDeleteTeamParamsWithContext(ctx context.Context) *OrgDeleteTeamParams {
+	return &OrgDeleteTeamParams{
+		Context: ctx,
+	}
+}
+
+// NewOrgDeleteTeamParamsWithHTTPClient creates a new OrgDeleteTeamParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewOrgDeleteTeamParamsWithHTTPClient(client *http.Client) *OrgDeleteTeamParams {
+	return &OrgDeleteTeamParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+OrgDeleteTeamParams contains all the parameters to send to the API endpoint
+
+	for the org delete team operation.
+
+	Typically these are written to a http.Request.
+*/
+type OrgDeleteTeamParams struct {
+
+	/* ID.
+
+	   id of the team to delete
+
+	   Format: int64
+	*/
+	ID int64
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the org delete team params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgDeleteTeamParams) WithDefaults() *OrgDeleteTeamParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the org delete team params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgDeleteTeamParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the org delete team params
+func (o *OrgDeleteTeamParams) WithTimeout(timeout time.Duration) *OrgDeleteTeamParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the org delete team params
+func (o *OrgDeleteTeamParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the org delete team params
+func (o *OrgDeleteTeamParams) WithContext(ctx context.Context) *OrgDeleteTeamParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the org delete team params
+func (o *OrgDeleteTeamParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the org delete team params
+func (o *OrgDeleteTeamParams) WithHTTPClient(client *http.Client) *OrgDeleteTeamParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the org delete team params
+func (o *OrgDeleteTeamParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithID adds the id to the org delete team params
+func (o *OrgDeleteTeamParams) WithID(id int64) *OrgDeleteTeamParams {
+	o.SetID(id)
+	return o
+}
+
+// SetID adds the id to the org delete team params
+func (o *OrgDeleteTeamParams) SetID(id int64) {
+	o.ID = id
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *OrgDeleteTeamParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param id
+	if err := r.SetPathParam("id", swag.FormatInt64(o.ID)); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_delete_team_responses.go b/bots-common/gitea-generated/client/organization/org_delete_team_responses.go
new file mode 100644
index 0000000..c328e20
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_delete_team_responses.go
@@ -0,0 +1,150 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// OrgDeleteTeamReader is a Reader for the OrgDeleteTeam structure.
+type OrgDeleteTeamReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *OrgDeleteTeamReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewOrgDeleteTeamNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewOrgDeleteTeamNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[DELETE /teams/{id}] orgDeleteTeam", response, response.Code())
+	}
+}
+
+// NewOrgDeleteTeamNoContent creates a OrgDeleteTeamNoContent with default headers values
+func NewOrgDeleteTeamNoContent() *OrgDeleteTeamNoContent {
+	return &OrgDeleteTeamNoContent{}
+}
+
+/*
+OrgDeleteTeamNoContent describes a response with status code 204, with default header values.
+
+team deleted
+*/
+type OrgDeleteTeamNoContent struct {
+}
+
+// IsSuccess returns true when this org delete team no content response has a 2xx status code
+func (o *OrgDeleteTeamNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this org delete team no content response has a 3xx status code
+func (o *OrgDeleteTeamNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org delete team no content response has a 4xx status code
+func (o *OrgDeleteTeamNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this org delete team no content response has a 5xx status code
+func (o *OrgDeleteTeamNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org delete team no content response a status code equal to that given
+func (o *OrgDeleteTeamNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the org delete team no content response
+func (o *OrgDeleteTeamNoContent) Code() int {
+	return 204
+}
+
+func (o *OrgDeleteTeamNoContent) Error() string {
+	return fmt.Sprintf("[DELETE /teams/{id}][%d] orgDeleteTeamNoContent", 204)
+}
+
+func (o *OrgDeleteTeamNoContent) String() string {
+	return fmt.Sprintf("[DELETE /teams/{id}][%d] orgDeleteTeamNoContent", 204)
+}
+
+func (o *OrgDeleteTeamNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewOrgDeleteTeamNotFound creates a OrgDeleteTeamNotFound with default headers values
+func NewOrgDeleteTeamNotFound() *OrgDeleteTeamNotFound {
+	return &OrgDeleteTeamNotFound{}
+}
+
+/*
+OrgDeleteTeamNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type OrgDeleteTeamNotFound struct {
+}
+
+// IsSuccess returns true when this org delete team not found response has a 2xx status code
+func (o *OrgDeleteTeamNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this org delete team not found response has a 3xx status code
+func (o *OrgDeleteTeamNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org delete team not found response has a 4xx status code
+func (o *OrgDeleteTeamNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this org delete team not found response has a 5xx status code
+func (o *OrgDeleteTeamNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org delete team not found response a status code equal to that given
+func (o *OrgDeleteTeamNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the org delete team not found response
+func (o *OrgDeleteTeamNotFound) Code() int {
+	return 404
+}
+
+func (o *OrgDeleteTeamNotFound) Error() string {
+	return fmt.Sprintf("[DELETE /teams/{id}][%d] orgDeleteTeamNotFound", 404)
+}
+
+func (o *OrgDeleteTeamNotFound) String() string {
+	return fmt.Sprintf("[DELETE /teams/{id}][%d] orgDeleteTeamNotFound", 404)
+}
+
+func (o *OrgDeleteTeamNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_edit_hook_parameters.go b/bots-common/gitea-generated/client/organization/org_edit_hook_parameters.go
new file mode 100644
index 0000000..7d0d035
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_edit_hook_parameters.go
@@ -0,0 +1,197 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewOrgEditHookParams creates a new OrgEditHookParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewOrgEditHookParams() *OrgEditHookParams {
+	return &OrgEditHookParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewOrgEditHookParamsWithTimeout creates a new OrgEditHookParams object
+// with the ability to set a timeout on a request.
+func NewOrgEditHookParamsWithTimeout(timeout time.Duration) *OrgEditHookParams {
+	return &OrgEditHookParams{
+		timeout: timeout,
+	}
+}
+
+// NewOrgEditHookParamsWithContext creates a new OrgEditHookParams object
+// with the ability to set a context for a request.
+func NewOrgEditHookParamsWithContext(ctx context.Context) *OrgEditHookParams {
+	return &OrgEditHookParams{
+		Context: ctx,
+	}
+}
+
+// NewOrgEditHookParamsWithHTTPClient creates a new OrgEditHookParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewOrgEditHookParamsWithHTTPClient(client *http.Client) *OrgEditHookParams {
+	return &OrgEditHookParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+OrgEditHookParams contains all the parameters to send to the API endpoint
+
+	for the org edit hook operation.
+
+	Typically these are written to a http.Request.
+*/
+type OrgEditHookParams struct {
+
+	// Body.
+	Body *models.EditHookOption
+
+	/* ID.
+
+	   id of the hook to update
+
+	   Format: int64
+	*/
+	ID int64
+
+	/* Org.
+
+	   name of the organization
+	*/
+	Org string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the org edit hook params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgEditHookParams) WithDefaults() *OrgEditHookParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the org edit hook params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgEditHookParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the org edit hook params
+func (o *OrgEditHookParams) WithTimeout(timeout time.Duration) *OrgEditHookParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the org edit hook params
+func (o *OrgEditHookParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the org edit hook params
+func (o *OrgEditHookParams) WithContext(ctx context.Context) *OrgEditHookParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the org edit hook params
+func (o *OrgEditHookParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the org edit hook params
+func (o *OrgEditHookParams) WithHTTPClient(client *http.Client) *OrgEditHookParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the org edit hook params
+func (o *OrgEditHookParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the org edit hook params
+func (o *OrgEditHookParams) WithBody(body *models.EditHookOption) *OrgEditHookParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the org edit hook params
+func (o *OrgEditHookParams) SetBody(body *models.EditHookOption) {
+	o.Body = body
+}
+
+// WithID adds the id to the org edit hook params
+func (o *OrgEditHookParams) WithID(id int64) *OrgEditHookParams {
+	o.SetID(id)
+	return o
+}
+
+// SetID adds the id to the org edit hook params
+func (o *OrgEditHookParams) SetID(id int64) {
+	o.ID = id
+}
+
+// WithOrg adds the org to the org edit hook params
+func (o *OrgEditHookParams) WithOrg(org string) *OrgEditHookParams {
+	o.SetOrg(org)
+	return o
+}
+
+// SetOrg adds the org to the org edit hook params
+func (o *OrgEditHookParams) SetOrg(org string) {
+	o.Org = org
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *OrgEditHookParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	// path param id
+	if err := r.SetPathParam("id", swag.FormatInt64(o.ID)); err != nil {
+		return err
+	}
+
+	// path param org
+	if err := r.SetPathParam("org", o.Org); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_edit_hook_responses.go b/bots-common/gitea-generated/client/organization/org_edit_hook_responses.go
new file mode 100644
index 0000000..37cc503
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_edit_hook_responses.go
@@ -0,0 +1,168 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// OrgEditHookReader is a Reader for the OrgEditHook structure.
+type OrgEditHookReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *OrgEditHookReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewOrgEditHookOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewOrgEditHookNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[PATCH /orgs/{org}/hooks/{id}] orgEditHook", response, response.Code())
+	}
+}
+
+// NewOrgEditHookOK creates a OrgEditHookOK with default headers values
+func NewOrgEditHookOK() *OrgEditHookOK {
+	return &OrgEditHookOK{}
+}
+
+/*
+OrgEditHookOK describes a response with status code 200, with default header values.
+
+Hook
+*/
+type OrgEditHookOK struct {
+	Payload *models.Hook
+}
+
+// IsSuccess returns true when this org edit hook o k response has a 2xx status code
+func (o *OrgEditHookOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this org edit hook o k response has a 3xx status code
+func (o *OrgEditHookOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org edit hook o k response has a 4xx status code
+func (o *OrgEditHookOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this org edit hook o k response has a 5xx status code
+func (o *OrgEditHookOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org edit hook o k response a status code equal to that given
+func (o *OrgEditHookOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the org edit hook o k response
+func (o *OrgEditHookOK) Code() int {
+	return 200
+}
+
+func (o *OrgEditHookOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[PATCH /orgs/{org}/hooks/{id}][%d] orgEditHookOK %s", 200, payload)
+}
+
+func (o *OrgEditHookOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[PATCH /orgs/{org}/hooks/{id}][%d] orgEditHookOK %s", 200, payload)
+}
+
+func (o *OrgEditHookOK) GetPayload() *models.Hook {
+	return o.Payload
+}
+
+func (o *OrgEditHookOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.Hook)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewOrgEditHookNotFound creates a OrgEditHookNotFound with default headers values
+func NewOrgEditHookNotFound() *OrgEditHookNotFound {
+	return &OrgEditHookNotFound{}
+}
+
+/*
+OrgEditHookNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type OrgEditHookNotFound struct {
+}
+
+// IsSuccess returns true when this org edit hook not found response has a 2xx status code
+func (o *OrgEditHookNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this org edit hook not found response has a 3xx status code
+func (o *OrgEditHookNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org edit hook not found response has a 4xx status code
+func (o *OrgEditHookNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this org edit hook not found response has a 5xx status code
+func (o *OrgEditHookNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org edit hook not found response a status code equal to that given
+func (o *OrgEditHookNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the org edit hook not found response
+func (o *OrgEditHookNotFound) Code() int {
+	return 404
+}
+
+func (o *OrgEditHookNotFound) Error() string {
+	return fmt.Sprintf("[PATCH /orgs/{org}/hooks/{id}][%d] orgEditHookNotFound", 404)
+}
+
+func (o *OrgEditHookNotFound) String() string {
+	return fmt.Sprintf("[PATCH /orgs/{org}/hooks/{id}][%d] orgEditHookNotFound", 404)
+}
+
+func (o *OrgEditHookNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_edit_label_parameters.go b/bots-common/gitea-generated/client/organization/org_edit_label_parameters.go
new file mode 100644
index 0000000..6695f02
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_edit_label_parameters.go
@@ -0,0 +1,197 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewOrgEditLabelParams creates a new OrgEditLabelParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewOrgEditLabelParams() *OrgEditLabelParams {
+	return &OrgEditLabelParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewOrgEditLabelParamsWithTimeout creates a new OrgEditLabelParams object
+// with the ability to set a timeout on a request.
+func NewOrgEditLabelParamsWithTimeout(timeout time.Duration) *OrgEditLabelParams {
+	return &OrgEditLabelParams{
+		timeout: timeout,
+	}
+}
+
+// NewOrgEditLabelParamsWithContext creates a new OrgEditLabelParams object
+// with the ability to set a context for a request.
+func NewOrgEditLabelParamsWithContext(ctx context.Context) *OrgEditLabelParams {
+	return &OrgEditLabelParams{
+		Context: ctx,
+	}
+}
+
+// NewOrgEditLabelParamsWithHTTPClient creates a new OrgEditLabelParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewOrgEditLabelParamsWithHTTPClient(client *http.Client) *OrgEditLabelParams {
+	return &OrgEditLabelParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+OrgEditLabelParams contains all the parameters to send to the API endpoint
+
+	for the org edit label operation.
+
+	Typically these are written to a http.Request.
+*/
+type OrgEditLabelParams struct {
+
+	// Body.
+	Body *models.EditLabelOption
+
+	/* ID.
+
+	   id of the label to edit
+
+	   Format: int64
+	*/
+	ID int64
+
+	/* Org.
+
+	   name of the organization
+	*/
+	Org string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the org edit label params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgEditLabelParams) WithDefaults() *OrgEditLabelParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the org edit label params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgEditLabelParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the org edit label params
+func (o *OrgEditLabelParams) WithTimeout(timeout time.Duration) *OrgEditLabelParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the org edit label params
+func (o *OrgEditLabelParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the org edit label params
+func (o *OrgEditLabelParams) WithContext(ctx context.Context) *OrgEditLabelParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the org edit label params
+func (o *OrgEditLabelParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the org edit label params
+func (o *OrgEditLabelParams) WithHTTPClient(client *http.Client) *OrgEditLabelParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the org edit label params
+func (o *OrgEditLabelParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the org edit label params
+func (o *OrgEditLabelParams) WithBody(body *models.EditLabelOption) *OrgEditLabelParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the org edit label params
+func (o *OrgEditLabelParams) SetBody(body *models.EditLabelOption) {
+	o.Body = body
+}
+
+// WithID adds the id to the org edit label params
+func (o *OrgEditLabelParams) WithID(id int64) *OrgEditLabelParams {
+	o.SetID(id)
+	return o
+}
+
+// SetID adds the id to the org edit label params
+func (o *OrgEditLabelParams) SetID(id int64) {
+	o.ID = id
+}
+
+// WithOrg adds the org to the org edit label params
+func (o *OrgEditLabelParams) WithOrg(org string) *OrgEditLabelParams {
+	o.SetOrg(org)
+	return o
+}
+
+// SetOrg adds the org to the org edit label params
+func (o *OrgEditLabelParams) SetOrg(org string) {
+	o.Org = org
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *OrgEditLabelParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	// path param id
+	if err := r.SetPathParam("id", swag.FormatInt64(o.ID)); err != nil {
+		return err
+	}
+
+	// path param org
+	if err := r.SetPathParam("org", o.Org); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_edit_label_responses.go b/bots-common/gitea-generated/client/organization/org_edit_label_responses.go
new file mode 100644
index 0000000..0b39e1d
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_edit_label_responses.go
@@ -0,0 +1,246 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// OrgEditLabelReader is a Reader for the OrgEditLabel structure.
+type OrgEditLabelReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *OrgEditLabelReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewOrgEditLabelOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewOrgEditLabelNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 422:
+		result := NewOrgEditLabelUnprocessableEntity()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[PATCH /orgs/{org}/labels/{id}] orgEditLabel", response, response.Code())
+	}
+}
+
+// NewOrgEditLabelOK creates a OrgEditLabelOK with default headers values
+func NewOrgEditLabelOK() *OrgEditLabelOK {
+	return &OrgEditLabelOK{}
+}
+
+/*
+OrgEditLabelOK describes a response with status code 200, with default header values.
+
+Label
+*/
+type OrgEditLabelOK struct {
+	Payload *models.Label
+}
+
+// IsSuccess returns true when this org edit label o k response has a 2xx status code
+func (o *OrgEditLabelOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this org edit label o k response has a 3xx status code
+func (o *OrgEditLabelOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org edit label o k response has a 4xx status code
+func (o *OrgEditLabelOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this org edit label o k response has a 5xx status code
+func (o *OrgEditLabelOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org edit label o k response a status code equal to that given
+func (o *OrgEditLabelOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the org edit label o k response
+func (o *OrgEditLabelOK) Code() int {
+	return 200
+}
+
+func (o *OrgEditLabelOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[PATCH /orgs/{org}/labels/{id}][%d] orgEditLabelOK %s", 200, payload)
+}
+
+func (o *OrgEditLabelOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[PATCH /orgs/{org}/labels/{id}][%d] orgEditLabelOK %s", 200, payload)
+}
+
+func (o *OrgEditLabelOK) GetPayload() *models.Label {
+	return o.Payload
+}
+
+func (o *OrgEditLabelOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.Label)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewOrgEditLabelNotFound creates a OrgEditLabelNotFound with default headers values
+func NewOrgEditLabelNotFound() *OrgEditLabelNotFound {
+	return &OrgEditLabelNotFound{}
+}
+
+/*
+OrgEditLabelNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type OrgEditLabelNotFound struct {
+}
+
+// IsSuccess returns true when this org edit label not found response has a 2xx status code
+func (o *OrgEditLabelNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this org edit label not found response has a 3xx status code
+func (o *OrgEditLabelNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org edit label not found response has a 4xx status code
+func (o *OrgEditLabelNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this org edit label not found response has a 5xx status code
+func (o *OrgEditLabelNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org edit label not found response a status code equal to that given
+func (o *OrgEditLabelNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the org edit label not found response
+func (o *OrgEditLabelNotFound) Code() int {
+	return 404
+}
+
+func (o *OrgEditLabelNotFound) Error() string {
+	return fmt.Sprintf("[PATCH /orgs/{org}/labels/{id}][%d] orgEditLabelNotFound", 404)
+}
+
+func (o *OrgEditLabelNotFound) String() string {
+	return fmt.Sprintf("[PATCH /orgs/{org}/labels/{id}][%d] orgEditLabelNotFound", 404)
+}
+
+func (o *OrgEditLabelNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewOrgEditLabelUnprocessableEntity creates a OrgEditLabelUnprocessableEntity with default headers values
+func NewOrgEditLabelUnprocessableEntity() *OrgEditLabelUnprocessableEntity {
+	return &OrgEditLabelUnprocessableEntity{}
+}
+
+/*
+OrgEditLabelUnprocessableEntity describes a response with status code 422, with default header values.
+
+APIValidationError is error format response related to input validation
+*/
+type OrgEditLabelUnprocessableEntity struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this org edit label unprocessable entity response has a 2xx status code
+func (o *OrgEditLabelUnprocessableEntity) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this org edit label unprocessable entity response has a 3xx status code
+func (o *OrgEditLabelUnprocessableEntity) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org edit label unprocessable entity response has a 4xx status code
+func (o *OrgEditLabelUnprocessableEntity) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this org edit label unprocessable entity response has a 5xx status code
+func (o *OrgEditLabelUnprocessableEntity) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org edit label unprocessable entity response a status code equal to that given
+func (o *OrgEditLabelUnprocessableEntity) IsCode(code int) bool {
+	return code == 422
+}
+
+// Code gets the status code for the org edit label unprocessable entity response
+func (o *OrgEditLabelUnprocessableEntity) Code() int {
+	return 422
+}
+
+func (o *OrgEditLabelUnprocessableEntity) Error() string {
+	return fmt.Sprintf("[PATCH /orgs/{org}/labels/{id}][%d] orgEditLabelUnprocessableEntity", 422)
+}
+
+func (o *OrgEditLabelUnprocessableEntity) String() string {
+	return fmt.Sprintf("[PATCH /orgs/{org}/labels/{id}][%d] orgEditLabelUnprocessableEntity", 422)
+}
+
+func (o *OrgEditLabelUnprocessableEntity) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_edit_parameters.go b/bots-common/gitea-generated/client/organization/org_edit_parameters.go
new file mode 100644
index 0000000..17fc76e
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_edit_parameters.go
@@ -0,0 +1,172 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewOrgEditParams creates a new OrgEditParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewOrgEditParams() *OrgEditParams {
+	return &OrgEditParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewOrgEditParamsWithTimeout creates a new OrgEditParams object
+// with the ability to set a timeout on a request.
+func NewOrgEditParamsWithTimeout(timeout time.Duration) *OrgEditParams {
+	return &OrgEditParams{
+		timeout: timeout,
+	}
+}
+
+// NewOrgEditParamsWithContext creates a new OrgEditParams object
+// with the ability to set a context for a request.
+func NewOrgEditParamsWithContext(ctx context.Context) *OrgEditParams {
+	return &OrgEditParams{
+		Context: ctx,
+	}
+}
+
+// NewOrgEditParamsWithHTTPClient creates a new OrgEditParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewOrgEditParamsWithHTTPClient(client *http.Client) *OrgEditParams {
+	return &OrgEditParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+OrgEditParams contains all the parameters to send to the API endpoint
+
+	for the org edit operation.
+
+	Typically these are written to a http.Request.
+*/
+type OrgEditParams struct {
+
+	// Body.
+	Body *models.EditOrgOption
+
+	/* Org.
+
+	   name of the organization to edit
+	*/
+	Org string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the org edit params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgEditParams) WithDefaults() *OrgEditParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the org edit params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgEditParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the org edit params
+func (o *OrgEditParams) WithTimeout(timeout time.Duration) *OrgEditParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the org edit params
+func (o *OrgEditParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the org edit params
+func (o *OrgEditParams) WithContext(ctx context.Context) *OrgEditParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the org edit params
+func (o *OrgEditParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the org edit params
+func (o *OrgEditParams) WithHTTPClient(client *http.Client) *OrgEditParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the org edit params
+func (o *OrgEditParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the org edit params
+func (o *OrgEditParams) WithBody(body *models.EditOrgOption) *OrgEditParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the org edit params
+func (o *OrgEditParams) SetBody(body *models.EditOrgOption) {
+	o.Body = body
+}
+
+// WithOrg adds the org to the org edit params
+func (o *OrgEditParams) WithOrg(org string) *OrgEditParams {
+	o.SetOrg(org)
+	return o
+}
+
+// SetOrg adds the org to the org edit params
+func (o *OrgEditParams) SetOrg(org string) {
+	o.Org = org
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *OrgEditParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	// path param org
+	if err := r.SetPathParam("org", o.Org); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_edit_responses.go b/bots-common/gitea-generated/client/organization/org_edit_responses.go
new file mode 100644
index 0000000..234c3dd
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_edit_responses.go
@@ -0,0 +1,168 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// OrgEditReader is a Reader for the OrgEdit structure.
+type OrgEditReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *OrgEditReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewOrgEditOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewOrgEditNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[PATCH /orgs/{org}] orgEdit", response, response.Code())
+	}
+}
+
+// NewOrgEditOK creates a OrgEditOK with default headers values
+func NewOrgEditOK() *OrgEditOK {
+	return &OrgEditOK{}
+}
+
+/*
+OrgEditOK describes a response with status code 200, with default header values.
+
+Organization
+*/
+type OrgEditOK struct {
+	Payload *models.Organization
+}
+
+// IsSuccess returns true when this org edit o k response has a 2xx status code
+func (o *OrgEditOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this org edit o k response has a 3xx status code
+func (o *OrgEditOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org edit o k response has a 4xx status code
+func (o *OrgEditOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this org edit o k response has a 5xx status code
+func (o *OrgEditOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org edit o k response a status code equal to that given
+func (o *OrgEditOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the org edit o k response
+func (o *OrgEditOK) Code() int {
+	return 200
+}
+
+func (o *OrgEditOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[PATCH /orgs/{org}][%d] orgEditOK %s", 200, payload)
+}
+
+func (o *OrgEditOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[PATCH /orgs/{org}][%d] orgEditOK %s", 200, payload)
+}
+
+func (o *OrgEditOK) GetPayload() *models.Organization {
+	return o.Payload
+}
+
+func (o *OrgEditOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.Organization)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewOrgEditNotFound creates a OrgEditNotFound with default headers values
+func NewOrgEditNotFound() *OrgEditNotFound {
+	return &OrgEditNotFound{}
+}
+
+/*
+OrgEditNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type OrgEditNotFound struct {
+}
+
+// IsSuccess returns true when this org edit not found response has a 2xx status code
+func (o *OrgEditNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this org edit not found response has a 3xx status code
+func (o *OrgEditNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org edit not found response has a 4xx status code
+func (o *OrgEditNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this org edit not found response has a 5xx status code
+func (o *OrgEditNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org edit not found response a status code equal to that given
+func (o *OrgEditNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the org edit not found response
+func (o *OrgEditNotFound) Code() int {
+	return 404
+}
+
+func (o *OrgEditNotFound) Error() string {
+	return fmt.Sprintf("[PATCH /orgs/{org}][%d] orgEditNotFound", 404)
+}
+
+func (o *OrgEditNotFound) String() string {
+	return fmt.Sprintf("[PATCH /orgs/{org}][%d] orgEditNotFound", 404)
+}
+
+func (o *OrgEditNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_edit_team_parameters.go b/bots-common/gitea-generated/client/organization/org_edit_team_parameters.go
new file mode 100644
index 0000000..8eb7c6d
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_edit_team_parameters.go
@@ -0,0 +1,173 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewOrgEditTeamParams creates a new OrgEditTeamParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewOrgEditTeamParams() *OrgEditTeamParams {
+	return &OrgEditTeamParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewOrgEditTeamParamsWithTimeout creates a new OrgEditTeamParams object
+// with the ability to set a timeout on a request.
+func NewOrgEditTeamParamsWithTimeout(timeout time.Duration) *OrgEditTeamParams {
+	return &OrgEditTeamParams{
+		timeout: timeout,
+	}
+}
+
+// NewOrgEditTeamParamsWithContext creates a new OrgEditTeamParams object
+// with the ability to set a context for a request.
+func NewOrgEditTeamParamsWithContext(ctx context.Context) *OrgEditTeamParams {
+	return &OrgEditTeamParams{
+		Context: ctx,
+	}
+}
+
+// NewOrgEditTeamParamsWithHTTPClient creates a new OrgEditTeamParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewOrgEditTeamParamsWithHTTPClient(client *http.Client) *OrgEditTeamParams {
+	return &OrgEditTeamParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+OrgEditTeamParams contains all the parameters to send to the API endpoint
+
+	for the org edit team operation.
+
+	Typically these are written to a http.Request.
+*/
+type OrgEditTeamParams struct {
+
+	// Body.
+	Body *models.EditTeamOption
+
+	/* ID.
+
+	   id of the team to edit
+	*/
+	ID int64
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the org edit team params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgEditTeamParams) WithDefaults() *OrgEditTeamParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the org edit team params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgEditTeamParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the org edit team params
+func (o *OrgEditTeamParams) WithTimeout(timeout time.Duration) *OrgEditTeamParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the org edit team params
+func (o *OrgEditTeamParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the org edit team params
+func (o *OrgEditTeamParams) WithContext(ctx context.Context) *OrgEditTeamParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the org edit team params
+func (o *OrgEditTeamParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the org edit team params
+func (o *OrgEditTeamParams) WithHTTPClient(client *http.Client) *OrgEditTeamParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the org edit team params
+func (o *OrgEditTeamParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the org edit team params
+func (o *OrgEditTeamParams) WithBody(body *models.EditTeamOption) *OrgEditTeamParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the org edit team params
+func (o *OrgEditTeamParams) SetBody(body *models.EditTeamOption) {
+	o.Body = body
+}
+
+// WithID adds the id to the org edit team params
+func (o *OrgEditTeamParams) WithID(id int64) *OrgEditTeamParams {
+	o.SetID(id)
+	return o
+}
+
+// SetID adds the id to the org edit team params
+func (o *OrgEditTeamParams) SetID(id int64) {
+	o.ID = id
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *OrgEditTeamParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	// path param id
+	if err := r.SetPathParam("id", swag.FormatInt64(o.ID)); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_edit_team_responses.go b/bots-common/gitea-generated/client/organization/org_edit_team_responses.go
new file mode 100644
index 0000000..1fec678
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_edit_team_responses.go
@@ -0,0 +1,168 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// OrgEditTeamReader is a Reader for the OrgEditTeam structure.
+type OrgEditTeamReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *OrgEditTeamReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewOrgEditTeamOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewOrgEditTeamNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[PATCH /teams/{id}] orgEditTeam", response, response.Code())
+	}
+}
+
+// NewOrgEditTeamOK creates a OrgEditTeamOK with default headers values
+func NewOrgEditTeamOK() *OrgEditTeamOK {
+	return &OrgEditTeamOK{}
+}
+
+/*
+OrgEditTeamOK describes a response with status code 200, with default header values.
+
+Team
+*/
+type OrgEditTeamOK struct {
+	Payload *models.Team
+}
+
+// IsSuccess returns true when this org edit team o k response has a 2xx status code
+func (o *OrgEditTeamOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this org edit team o k response has a 3xx status code
+func (o *OrgEditTeamOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org edit team o k response has a 4xx status code
+func (o *OrgEditTeamOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this org edit team o k response has a 5xx status code
+func (o *OrgEditTeamOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org edit team o k response a status code equal to that given
+func (o *OrgEditTeamOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the org edit team o k response
+func (o *OrgEditTeamOK) Code() int {
+	return 200
+}
+
+func (o *OrgEditTeamOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[PATCH /teams/{id}][%d] orgEditTeamOK %s", 200, payload)
+}
+
+func (o *OrgEditTeamOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[PATCH /teams/{id}][%d] orgEditTeamOK %s", 200, payload)
+}
+
+func (o *OrgEditTeamOK) GetPayload() *models.Team {
+	return o.Payload
+}
+
+func (o *OrgEditTeamOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.Team)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewOrgEditTeamNotFound creates a OrgEditTeamNotFound with default headers values
+func NewOrgEditTeamNotFound() *OrgEditTeamNotFound {
+	return &OrgEditTeamNotFound{}
+}
+
+/*
+OrgEditTeamNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type OrgEditTeamNotFound struct {
+}
+
+// IsSuccess returns true when this org edit team not found response has a 2xx status code
+func (o *OrgEditTeamNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this org edit team not found response has a 3xx status code
+func (o *OrgEditTeamNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org edit team not found response has a 4xx status code
+func (o *OrgEditTeamNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this org edit team not found response has a 5xx status code
+func (o *OrgEditTeamNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org edit team not found response a status code equal to that given
+func (o *OrgEditTeamNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the org edit team not found response
+func (o *OrgEditTeamNotFound) Code() int {
+	return 404
+}
+
+func (o *OrgEditTeamNotFound) Error() string {
+	return fmt.Sprintf("[PATCH /teams/{id}][%d] orgEditTeamNotFound", 404)
+}
+
+func (o *OrgEditTeamNotFound) String() string {
+	return fmt.Sprintf("[PATCH /teams/{id}][%d] orgEditTeamNotFound", 404)
+}
+
+func (o *OrgEditTeamNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_get_all_parameters.go b/bots-common/gitea-generated/client/organization/org_get_all_parameters.go
new file mode 100644
index 0000000..871e415
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_get_all_parameters.go
@@ -0,0 +1,198 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewOrgGetAllParams creates a new OrgGetAllParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewOrgGetAllParams() *OrgGetAllParams {
+	return &OrgGetAllParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewOrgGetAllParamsWithTimeout creates a new OrgGetAllParams object
+// with the ability to set a timeout on a request.
+func NewOrgGetAllParamsWithTimeout(timeout time.Duration) *OrgGetAllParams {
+	return &OrgGetAllParams{
+		timeout: timeout,
+	}
+}
+
+// NewOrgGetAllParamsWithContext creates a new OrgGetAllParams object
+// with the ability to set a context for a request.
+func NewOrgGetAllParamsWithContext(ctx context.Context) *OrgGetAllParams {
+	return &OrgGetAllParams{
+		Context: ctx,
+	}
+}
+
+// NewOrgGetAllParamsWithHTTPClient creates a new OrgGetAllParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewOrgGetAllParamsWithHTTPClient(client *http.Client) *OrgGetAllParams {
+	return &OrgGetAllParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+OrgGetAllParams contains all the parameters to send to the API endpoint
+
+	for the org get all operation.
+
+	Typically these are written to a http.Request.
+*/
+type OrgGetAllParams struct {
+
+	/* Limit.
+
+	   page size of results
+	*/
+	Limit *int64
+
+	/* Page.
+
+	   page number of results to return (1-based)
+	*/
+	Page *int64
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the org get all params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgGetAllParams) WithDefaults() *OrgGetAllParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the org get all params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgGetAllParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the org get all params
+func (o *OrgGetAllParams) WithTimeout(timeout time.Duration) *OrgGetAllParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the org get all params
+func (o *OrgGetAllParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the org get all params
+func (o *OrgGetAllParams) WithContext(ctx context.Context) *OrgGetAllParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the org get all params
+func (o *OrgGetAllParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the org get all params
+func (o *OrgGetAllParams) WithHTTPClient(client *http.Client) *OrgGetAllParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the org get all params
+func (o *OrgGetAllParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithLimit adds the limit to the org get all params
+func (o *OrgGetAllParams) WithLimit(limit *int64) *OrgGetAllParams {
+	o.SetLimit(limit)
+	return o
+}
+
+// SetLimit adds the limit to the org get all params
+func (o *OrgGetAllParams) SetLimit(limit *int64) {
+	o.Limit = limit
+}
+
+// WithPage adds the page to the org get all params
+func (o *OrgGetAllParams) WithPage(page *int64) *OrgGetAllParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the org get all params
+func (o *OrgGetAllParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *OrgGetAllParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.Limit != nil {
+
+		// query param limit
+		var qrLimit int64
+
+		if o.Limit != nil {
+			qrLimit = *o.Limit
+		}
+		qLimit := swag.FormatInt64(qrLimit)
+		if qLimit != "" {
+
+			if err := r.SetQueryParam("limit", qLimit); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_get_all_responses.go b/bots-common/gitea-generated/client/organization/org_get_all_responses.go
new file mode 100644
index 0000000..bee743a
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_get_all_responses.go
@@ -0,0 +1,104 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// OrgGetAllReader is a Reader for the OrgGetAll structure.
+type OrgGetAllReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *OrgGetAllReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewOrgGetAllOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	default:
+		return nil, runtime.NewAPIError("[GET /orgs] orgGetAll", response, response.Code())
+	}
+}
+
+// NewOrgGetAllOK creates a OrgGetAllOK with default headers values
+func NewOrgGetAllOK() *OrgGetAllOK {
+	return &OrgGetAllOK{}
+}
+
+/*
+OrgGetAllOK describes a response with status code 200, with default header values.
+
+OrganizationList
+*/
+type OrgGetAllOK struct {
+	Payload []*models.Organization
+}
+
+// IsSuccess returns true when this org get all o k response has a 2xx status code
+func (o *OrgGetAllOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this org get all o k response has a 3xx status code
+func (o *OrgGetAllOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org get all o k response has a 4xx status code
+func (o *OrgGetAllOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this org get all o k response has a 5xx status code
+func (o *OrgGetAllOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org get all o k response a status code equal to that given
+func (o *OrgGetAllOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the org get all o k response
+func (o *OrgGetAllOK) Code() int {
+	return 200
+}
+
+func (o *OrgGetAllOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /orgs][%d] orgGetAllOK %s", 200, payload)
+}
+
+func (o *OrgGetAllOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /orgs][%d] orgGetAllOK %s", 200, payload)
+}
+
+func (o *OrgGetAllOK) GetPayload() []*models.Organization {
+	return o.Payload
+}
+
+func (o *OrgGetAllOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_get_hook_parameters.go b/bots-common/gitea-generated/client/organization/org_get_hook_parameters.go
new file mode 100644
index 0000000..a54e8f0
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_get_hook_parameters.go
@@ -0,0 +1,176 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewOrgGetHookParams creates a new OrgGetHookParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewOrgGetHookParams() *OrgGetHookParams {
+	return &OrgGetHookParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewOrgGetHookParamsWithTimeout creates a new OrgGetHookParams object
+// with the ability to set a timeout on a request.
+func NewOrgGetHookParamsWithTimeout(timeout time.Duration) *OrgGetHookParams {
+	return &OrgGetHookParams{
+		timeout: timeout,
+	}
+}
+
+// NewOrgGetHookParamsWithContext creates a new OrgGetHookParams object
+// with the ability to set a context for a request.
+func NewOrgGetHookParamsWithContext(ctx context.Context) *OrgGetHookParams {
+	return &OrgGetHookParams{
+		Context: ctx,
+	}
+}
+
+// NewOrgGetHookParamsWithHTTPClient creates a new OrgGetHookParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewOrgGetHookParamsWithHTTPClient(client *http.Client) *OrgGetHookParams {
+	return &OrgGetHookParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+OrgGetHookParams contains all the parameters to send to the API endpoint
+
+	for the org get hook operation.
+
+	Typically these are written to a http.Request.
+*/
+type OrgGetHookParams struct {
+
+	/* ID.
+
+	   id of the hook to get
+
+	   Format: int64
+	*/
+	ID int64
+
+	/* Org.
+
+	   name of the organization
+	*/
+	Org string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the org get hook params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgGetHookParams) WithDefaults() *OrgGetHookParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the org get hook params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgGetHookParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the org get hook params
+func (o *OrgGetHookParams) WithTimeout(timeout time.Duration) *OrgGetHookParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the org get hook params
+func (o *OrgGetHookParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the org get hook params
+func (o *OrgGetHookParams) WithContext(ctx context.Context) *OrgGetHookParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the org get hook params
+func (o *OrgGetHookParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the org get hook params
+func (o *OrgGetHookParams) WithHTTPClient(client *http.Client) *OrgGetHookParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the org get hook params
+func (o *OrgGetHookParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithID adds the id to the org get hook params
+func (o *OrgGetHookParams) WithID(id int64) *OrgGetHookParams {
+	o.SetID(id)
+	return o
+}
+
+// SetID adds the id to the org get hook params
+func (o *OrgGetHookParams) SetID(id int64) {
+	o.ID = id
+}
+
+// WithOrg adds the org to the org get hook params
+func (o *OrgGetHookParams) WithOrg(org string) *OrgGetHookParams {
+	o.SetOrg(org)
+	return o
+}
+
+// SetOrg adds the org to the org get hook params
+func (o *OrgGetHookParams) SetOrg(org string) {
+	o.Org = org
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *OrgGetHookParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param id
+	if err := r.SetPathParam("id", swag.FormatInt64(o.ID)); err != nil {
+		return err
+	}
+
+	// path param org
+	if err := r.SetPathParam("org", o.Org); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_get_hook_responses.go b/bots-common/gitea-generated/client/organization/org_get_hook_responses.go
new file mode 100644
index 0000000..aeea87d
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_get_hook_responses.go
@@ -0,0 +1,168 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// OrgGetHookReader is a Reader for the OrgGetHook structure.
+type OrgGetHookReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *OrgGetHookReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewOrgGetHookOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewOrgGetHookNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /orgs/{org}/hooks/{id}] orgGetHook", response, response.Code())
+	}
+}
+
+// NewOrgGetHookOK creates a OrgGetHookOK with default headers values
+func NewOrgGetHookOK() *OrgGetHookOK {
+	return &OrgGetHookOK{}
+}
+
+/*
+OrgGetHookOK describes a response with status code 200, with default header values.
+
+Hook
+*/
+type OrgGetHookOK struct {
+	Payload *models.Hook
+}
+
+// IsSuccess returns true when this org get hook o k response has a 2xx status code
+func (o *OrgGetHookOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this org get hook o k response has a 3xx status code
+func (o *OrgGetHookOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org get hook o k response has a 4xx status code
+func (o *OrgGetHookOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this org get hook o k response has a 5xx status code
+func (o *OrgGetHookOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org get hook o k response a status code equal to that given
+func (o *OrgGetHookOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the org get hook o k response
+func (o *OrgGetHookOK) Code() int {
+	return 200
+}
+
+func (o *OrgGetHookOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /orgs/{org}/hooks/{id}][%d] orgGetHookOK %s", 200, payload)
+}
+
+func (o *OrgGetHookOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /orgs/{org}/hooks/{id}][%d] orgGetHookOK %s", 200, payload)
+}
+
+func (o *OrgGetHookOK) GetPayload() *models.Hook {
+	return o.Payload
+}
+
+func (o *OrgGetHookOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.Hook)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewOrgGetHookNotFound creates a OrgGetHookNotFound with default headers values
+func NewOrgGetHookNotFound() *OrgGetHookNotFound {
+	return &OrgGetHookNotFound{}
+}
+
+/*
+OrgGetHookNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type OrgGetHookNotFound struct {
+}
+
+// IsSuccess returns true when this org get hook not found response has a 2xx status code
+func (o *OrgGetHookNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this org get hook not found response has a 3xx status code
+func (o *OrgGetHookNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org get hook not found response has a 4xx status code
+func (o *OrgGetHookNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this org get hook not found response has a 5xx status code
+func (o *OrgGetHookNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org get hook not found response a status code equal to that given
+func (o *OrgGetHookNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the org get hook not found response
+func (o *OrgGetHookNotFound) Code() int {
+	return 404
+}
+
+func (o *OrgGetHookNotFound) Error() string {
+	return fmt.Sprintf("[GET /orgs/{org}/hooks/{id}][%d] orgGetHookNotFound", 404)
+}
+
+func (o *OrgGetHookNotFound) String() string {
+	return fmt.Sprintf("[GET /orgs/{org}/hooks/{id}][%d] orgGetHookNotFound", 404)
+}
+
+func (o *OrgGetHookNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_get_label_parameters.go b/bots-common/gitea-generated/client/organization/org_get_label_parameters.go
new file mode 100644
index 0000000..4b2be4f
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_get_label_parameters.go
@@ -0,0 +1,176 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewOrgGetLabelParams creates a new OrgGetLabelParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewOrgGetLabelParams() *OrgGetLabelParams {
+	return &OrgGetLabelParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewOrgGetLabelParamsWithTimeout creates a new OrgGetLabelParams object
+// with the ability to set a timeout on a request.
+func NewOrgGetLabelParamsWithTimeout(timeout time.Duration) *OrgGetLabelParams {
+	return &OrgGetLabelParams{
+		timeout: timeout,
+	}
+}
+
+// NewOrgGetLabelParamsWithContext creates a new OrgGetLabelParams object
+// with the ability to set a context for a request.
+func NewOrgGetLabelParamsWithContext(ctx context.Context) *OrgGetLabelParams {
+	return &OrgGetLabelParams{
+		Context: ctx,
+	}
+}
+
+// NewOrgGetLabelParamsWithHTTPClient creates a new OrgGetLabelParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewOrgGetLabelParamsWithHTTPClient(client *http.Client) *OrgGetLabelParams {
+	return &OrgGetLabelParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+OrgGetLabelParams contains all the parameters to send to the API endpoint
+
+	for the org get label operation.
+
+	Typically these are written to a http.Request.
+*/
+type OrgGetLabelParams struct {
+
+	/* ID.
+
+	   id of the label to get
+
+	   Format: int64
+	*/
+	ID int64
+
+	/* Org.
+
+	   name of the organization
+	*/
+	Org string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the org get label params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgGetLabelParams) WithDefaults() *OrgGetLabelParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the org get label params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgGetLabelParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the org get label params
+func (o *OrgGetLabelParams) WithTimeout(timeout time.Duration) *OrgGetLabelParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the org get label params
+func (o *OrgGetLabelParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the org get label params
+func (o *OrgGetLabelParams) WithContext(ctx context.Context) *OrgGetLabelParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the org get label params
+func (o *OrgGetLabelParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the org get label params
+func (o *OrgGetLabelParams) WithHTTPClient(client *http.Client) *OrgGetLabelParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the org get label params
+func (o *OrgGetLabelParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithID adds the id to the org get label params
+func (o *OrgGetLabelParams) WithID(id int64) *OrgGetLabelParams {
+	o.SetID(id)
+	return o
+}
+
+// SetID adds the id to the org get label params
+func (o *OrgGetLabelParams) SetID(id int64) {
+	o.ID = id
+}
+
+// WithOrg adds the org to the org get label params
+func (o *OrgGetLabelParams) WithOrg(org string) *OrgGetLabelParams {
+	o.SetOrg(org)
+	return o
+}
+
+// SetOrg adds the org to the org get label params
+func (o *OrgGetLabelParams) SetOrg(org string) {
+	o.Org = org
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *OrgGetLabelParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param id
+	if err := r.SetPathParam("id", swag.FormatInt64(o.ID)); err != nil {
+		return err
+	}
+
+	// path param org
+	if err := r.SetPathParam("org", o.Org); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_get_label_responses.go b/bots-common/gitea-generated/client/organization/org_get_label_responses.go
new file mode 100644
index 0000000..d11170e
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_get_label_responses.go
@@ -0,0 +1,168 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// OrgGetLabelReader is a Reader for the OrgGetLabel structure.
+type OrgGetLabelReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *OrgGetLabelReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewOrgGetLabelOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewOrgGetLabelNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /orgs/{org}/labels/{id}] orgGetLabel", response, response.Code())
+	}
+}
+
+// NewOrgGetLabelOK creates a OrgGetLabelOK with default headers values
+func NewOrgGetLabelOK() *OrgGetLabelOK {
+	return &OrgGetLabelOK{}
+}
+
+/*
+OrgGetLabelOK describes a response with status code 200, with default header values.
+
+Label
+*/
+type OrgGetLabelOK struct {
+	Payload *models.Label
+}
+
+// IsSuccess returns true when this org get label o k response has a 2xx status code
+func (o *OrgGetLabelOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this org get label o k response has a 3xx status code
+func (o *OrgGetLabelOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org get label o k response has a 4xx status code
+func (o *OrgGetLabelOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this org get label o k response has a 5xx status code
+func (o *OrgGetLabelOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org get label o k response a status code equal to that given
+func (o *OrgGetLabelOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the org get label o k response
+func (o *OrgGetLabelOK) Code() int {
+	return 200
+}
+
+func (o *OrgGetLabelOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /orgs/{org}/labels/{id}][%d] orgGetLabelOK %s", 200, payload)
+}
+
+func (o *OrgGetLabelOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /orgs/{org}/labels/{id}][%d] orgGetLabelOK %s", 200, payload)
+}
+
+func (o *OrgGetLabelOK) GetPayload() *models.Label {
+	return o.Payload
+}
+
+func (o *OrgGetLabelOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.Label)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewOrgGetLabelNotFound creates a OrgGetLabelNotFound with default headers values
+func NewOrgGetLabelNotFound() *OrgGetLabelNotFound {
+	return &OrgGetLabelNotFound{}
+}
+
+/*
+OrgGetLabelNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type OrgGetLabelNotFound struct {
+}
+
+// IsSuccess returns true when this org get label not found response has a 2xx status code
+func (o *OrgGetLabelNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this org get label not found response has a 3xx status code
+func (o *OrgGetLabelNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org get label not found response has a 4xx status code
+func (o *OrgGetLabelNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this org get label not found response has a 5xx status code
+func (o *OrgGetLabelNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org get label not found response a status code equal to that given
+func (o *OrgGetLabelNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the org get label not found response
+func (o *OrgGetLabelNotFound) Code() int {
+	return 404
+}
+
+func (o *OrgGetLabelNotFound) Error() string {
+	return fmt.Sprintf("[GET /orgs/{org}/labels/{id}][%d] orgGetLabelNotFound", 404)
+}
+
+func (o *OrgGetLabelNotFound) String() string {
+	return fmt.Sprintf("[GET /orgs/{org}/labels/{id}][%d] orgGetLabelNotFound", 404)
+}
+
+func (o *OrgGetLabelNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_get_parameters.go b/bots-common/gitea-generated/client/organization/org_get_parameters.go
new file mode 100644
index 0000000..7863969
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_get_parameters.go
@@ -0,0 +1,151 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewOrgGetParams creates a new OrgGetParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewOrgGetParams() *OrgGetParams {
+	return &OrgGetParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewOrgGetParamsWithTimeout creates a new OrgGetParams object
+// with the ability to set a timeout on a request.
+func NewOrgGetParamsWithTimeout(timeout time.Duration) *OrgGetParams {
+	return &OrgGetParams{
+		timeout: timeout,
+	}
+}
+
+// NewOrgGetParamsWithContext creates a new OrgGetParams object
+// with the ability to set a context for a request.
+func NewOrgGetParamsWithContext(ctx context.Context) *OrgGetParams {
+	return &OrgGetParams{
+		Context: ctx,
+	}
+}
+
+// NewOrgGetParamsWithHTTPClient creates a new OrgGetParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewOrgGetParamsWithHTTPClient(client *http.Client) *OrgGetParams {
+	return &OrgGetParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+OrgGetParams contains all the parameters to send to the API endpoint
+
+	for the org get operation.
+
+	Typically these are written to a http.Request.
+*/
+type OrgGetParams struct {
+
+	/* Org.
+
+	   name of the organization to get
+	*/
+	Org string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the org get params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgGetParams) WithDefaults() *OrgGetParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the org get params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgGetParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the org get params
+func (o *OrgGetParams) WithTimeout(timeout time.Duration) *OrgGetParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the org get params
+func (o *OrgGetParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the org get params
+func (o *OrgGetParams) WithContext(ctx context.Context) *OrgGetParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the org get params
+func (o *OrgGetParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the org get params
+func (o *OrgGetParams) WithHTTPClient(client *http.Client) *OrgGetParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the org get params
+func (o *OrgGetParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithOrg adds the org to the org get params
+func (o *OrgGetParams) WithOrg(org string) *OrgGetParams {
+	o.SetOrg(org)
+	return o
+}
+
+// SetOrg adds the org to the org get params
+func (o *OrgGetParams) SetOrg(org string) {
+	o.Org = org
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *OrgGetParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param org
+	if err := r.SetPathParam("org", o.Org); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_get_responses.go b/bots-common/gitea-generated/client/organization/org_get_responses.go
new file mode 100644
index 0000000..0ef7063
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_get_responses.go
@@ -0,0 +1,168 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// OrgGetReader is a Reader for the OrgGet structure.
+type OrgGetReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *OrgGetReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewOrgGetOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewOrgGetNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /orgs/{org}] orgGet", response, response.Code())
+	}
+}
+
+// NewOrgGetOK creates a OrgGetOK with default headers values
+func NewOrgGetOK() *OrgGetOK {
+	return &OrgGetOK{}
+}
+
+/*
+OrgGetOK describes a response with status code 200, with default header values.
+
+Organization
+*/
+type OrgGetOK struct {
+	Payload *models.Organization
+}
+
+// IsSuccess returns true when this org get o k response has a 2xx status code
+func (o *OrgGetOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this org get o k response has a 3xx status code
+func (o *OrgGetOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org get o k response has a 4xx status code
+func (o *OrgGetOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this org get o k response has a 5xx status code
+func (o *OrgGetOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org get o k response a status code equal to that given
+func (o *OrgGetOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the org get o k response
+func (o *OrgGetOK) Code() int {
+	return 200
+}
+
+func (o *OrgGetOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /orgs/{org}][%d] orgGetOK %s", 200, payload)
+}
+
+func (o *OrgGetOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /orgs/{org}][%d] orgGetOK %s", 200, payload)
+}
+
+func (o *OrgGetOK) GetPayload() *models.Organization {
+	return o.Payload
+}
+
+func (o *OrgGetOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.Organization)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewOrgGetNotFound creates a OrgGetNotFound with default headers values
+func NewOrgGetNotFound() *OrgGetNotFound {
+	return &OrgGetNotFound{}
+}
+
+/*
+OrgGetNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type OrgGetNotFound struct {
+}
+
+// IsSuccess returns true when this org get not found response has a 2xx status code
+func (o *OrgGetNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this org get not found response has a 3xx status code
+func (o *OrgGetNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org get not found response has a 4xx status code
+func (o *OrgGetNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this org get not found response has a 5xx status code
+func (o *OrgGetNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org get not found response a status code equal to that given
+func (o *OrgGetNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the org get not found response
+func (o *OrgGetNotFound) Code() int {
+	return 404
+}
+
+func (o *OrgGetNotFound) Error() string {
+	return fmt.Sprintf("[GET /orgs/{org}][%d] orgGetNotFound", 404)
+}
+
+func (o *OrgGetNotFound) String() string {
+	return fmt.Sprintf("[GET /orgs/{org}][%d] orgGetNotFound", 404)
+}
+
+func (o *OrgGetNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_get_runner_registration_token_parameters.go b/bots-common/gitea-generated/client/organization/org_get_runner_registration_token_parameters.go
new file mode 100644
index 0000000..a2932a0
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_get_runner_registration_token_parameters.go
@@ -0,0 +1,151 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewOrgGetRunnerRegistrationTokenParams creates a new OrgGetRunnerRegistrationTokenParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewOrgGetRunnerRegistrationTokenParams() *OrgGetRunnerRegistrationTokenParams {
+	return &OrgGetRunnerRegistrationTokenParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewOrgGetRunnerRegistrationTokenParamsWithTimeout creates a new OrgGetRunnerRegistrationTokenParams object
+// with the ability to set a timeout on a request.
+func NewOrgGetRunnerRegistrationTokenParamsWithTimeout(timeout time.Duration) *OrgGetRunnerRegistrationTokenParams {
+	return &OrgGetRunnerRegistrationTokenParams{
+		timeout: timeout,
+	}
+}
+
+// NewOrgGetRunnerRegistrationTokenParamsWithContext creates a new OrgGetRunnerRegistrationTokenParams object
+// with the ability to set a context for a request.
+func NewOrgGetRunnerRegistrationTokenParamsWithContext(ctx context.Context) *OrgGetRunnerRegistrationTokenParams {
+	return &OrgGetRunnerRegistrationTokenParams{
+		Context: ctx,
+	}
+}
+
+// NewOrgGetRunnerRegistrationTokenParamsWithHTTPClient creates a new OrgGetRunnerRegistrationTokenParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewOrgGetRunnerRegistrationTokenParamsWithHTTPClient(client *http.Client) *OrgGetRunnerRegistrationTokenParams {
+	return &OrgGetRunnerRegistrationTokenParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+OrgGetRunnerRegistrationTokenParams contains all the parameters to send to the API endpoint
+
+	for the org get runner registration token operation.
+
+	Typically these are written to a http.Request.
+*/
+type OrgGetRunnerRegistrationTokenParams struct {
+
+	/* Org.
+
+	   name of the organization
+	*/
+	Org string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the org get runner registration token params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgGetRunnerRegistrationTokenParams) WithDefaults() *OrgGetRunnerRegistrationTokenParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the org get runner registration token params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgGetRunnerRegistrationTokenParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the org get runner registration token params
+func (o *OrgGetRunnerRegistrationTokenParams) WithTimeout(timeout time.Duration) *OrgGetRunnerRegistrationTokenParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the org get runner registration token params
+func (o *OrgGetRunnerRegistrationTokenParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the org get runner registration token params
+func (o *OrgGetRunnerRegistrationTokenParams) WithContext(ctx context.Context) *OrgGetRunnerRegistrationTokenParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the org get runner registration token params
+func (o *OrgGetRunnerRegistrationTokenParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the org get runner registration token params
+func (o *OrgGetRunnerRegistrationTokenParams) WithHTTPClient(client *http.Client) *OrgGetRunnerRegistrationTokenParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the org get runner registration token params
+func (o *OrgGetRunnerRegistrationTokenParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithOrg adds the org to the org get runner registration token params
+func (o *OrgGetRunnerRegistrationTokenParams) WithOrg(org string) *OrgGetRunnerRegistrationTokenParams {
+	o.SetOrg(org)
+	return o
+}
+
+// SetOrg adds the org to the org get runner registration token params
+func (o *OrgGetRunnerRegistrationTokenParams) SetOrg(org string) {
+	o.Org = org
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *OrgGetRunnerRegistrationTokenParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param org
+	if err := r.SetPathParam("org", o.Org); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_get_runner_registration_token_responses.go b/bots-common/gitea-generated/client/organization/org_get_runner_registration_token_responses.go
new file mode 100644
index 0000000..f56df83
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_get_runner_registration_token_responses.go
@@ -0,0 +1,96 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// OrgGetRunnerRegistrationTokenReader is a Reader for the OrgGetRunnerRegistrationToken structure.
+type OrgGetRunnerRegistrationTokenReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *OrgGetRunnerRegistrationTokenReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewOrgGetRunnerRegistrationTokenOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	default:
+		return nil, runtime.NewAPIError("[GET /orgs/{org}/actions/runners/registration-token] orgGetRunnerRegistrationToken", response, response.Code())
+	}
+}
+
+// NewOrgGetRunnerRegistrationTokenOK creates a OrgGetRunnerRegistrationTokenOK with default headers values
+func NewOrgGetRunnerRegistrationTokenOK() *OrgGetRunnerRegistrationTokenOK {
+	return &OrgGetRunnerRegistrationTokenOK{}
+}
+
+/*
+OrgGetRunnerRegistrationTokenOK describes a response with status code 200, with default header values.
+
+RegistrationToken is response related to registration token
+*/
+type OrgGetRunnerRegistrationTokenOK struct {
+	Token string
+}
+
+// IsSuccess returns true when this org get runner registration token o k response has a 2xx status code
+func (o *OrgGetRunnerRegistrationTokenOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this org get runner registration token o k response has a 3xx status code
+func (o *OrgGetRunnerRegistrationTokenOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org get runner registration token o k response has a 4xx status code
+func (o *OrgGetRunnerRegistrationTokenOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this org get runner registration token o k response has a 5xx status code
+func (o *OrgGetRunnerRegistrationTokenOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org get runner registration token o k response a status code equal to that given
+func (o *OrgGetRunnerRegistrationTokenOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the org get runner registration token o k response
+func (o *OrgGetRunnerRegistrationTokenOK) Code() int {
+	return 200
+}
+
+func (o *OrgGetRunnerRegistrationTokenOK) Error() string {
+	return fmt.Sprintf("[GET /orgs/{org}/actions/runners/registration-token][%d] orgGetRunnerRegistrationTokenOK", 200)
+}
+
+func (o *OrgGetRunnerRegistrationTokenOK) String() string {
+	return fmt.Sprintf("[GET /orgs/{org}/actions/runners/registration-token][%d] orgGetRunnerRegistrationTokenOK", 200)
+}
+
+func (o *OrgGetRunnerRegistrationTokenOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header token
+	hdrToken := response.GetHeader("token")
+
+	if hdrToken != "" {
+		o.Token = hdrToken
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_get_team_parameters.go b/bots-common/gitea-generated/client/organization/org_get_team_parameters.go
new file mode 100644
index 0000000..b3619d0
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_get_team_parameters.go
@@ -0,0 +1,154 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewOrgGetTeamParams creates a new OrgGetTeamParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewOrgGetTeamParams() *OrgGetTeamParams {
+	return &OrgGetTeamParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewOrgGetTeamParamsWithTimeout creates a new OrgGetTeamParams object
+// with the ability to set a timeout on a request.
+func NewOrgGetTeamParamsWithTimeout(timeout time.Duration) *OrgGetTeamParams {
+	return &OrgGetTeamParams{
+		timeout: timeout,
+	}
+}
+
+// NewOrgGetTeamParamsWithContext creates a new OrgGetTeamParams object
+// with the ability to set a context for a request.
+func NewOrgGetTeamParamsWithContext(ctx context.Context) *OrgGetTeamParams {
+	return &OrgGetTeamParams{
+		Context: ctx,
+	}
+}
+
+// NewOrgGetTeamParamsWithHTTPClient creates a new OrgGetTeamParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewOrgGetTeamParamsWithHTTPClient(client *http.Client) *OrgGetTeamParams {
+	return &OrgGetTeamParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+OrgGetTeamParams contains all the parameters to send to the API endpoint
+
+	for the org get team operation.
+
+	Typically these are written to a http.Request.
+*/
+type OrgGetTeamParams struct {
+
+	/* ID.
+
+	   id of the team to get
+
+	   Format: int64
+	*/
+	ID int64
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the org get team params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgGetTeamParams) WithDefaults() *OrgGetTeamParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the org get team params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgGetTeamParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the org get team params
+func (o *OrgGetTeamParams) WithTimeout(timeout time.Duration) *OrgGetTeamParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the org get team params
+func (o *OrgGetTeamParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the org get team params
+func (o *OrgGetTeamParams) WithContext(ctx context.Context) *OrgGetTeamParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the org get team params
+func (o *OrgGetTeamParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the org get team params
+func (o *OrgGetTeamParams) WithHTTPClient(client *http.Client) *OrgGetTeamParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the org get team params
+func (o *OrgGetTeamParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithID adds the id to the org get team params
+func (o *OrgGetTeamParams) WithID(id int64) *OrgGetTeamParams {
+	o.SetID(id)
+	return o
+}
+
+// SetID adds the id to the org get team params
+func (o *OrgGetTeamParams) SetID(id int64) {
+	o.ID = id
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *OrgGetTeamParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param id
+	if err := r.SetPathParam("id", swag.FormatInt64(o.ID)); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_get_team_responses.go b/bots-common/gitea-generated/client/organization/org_get_team_responses.go
new file mode 100644
index 0000000..06a485d
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_get_team_responses.go
@@ -0,0 +1,168 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// OrgGetTeamReader is a Reader for the OrgGetTeam structure.
+type OrgGetTeamReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *OrgGetTeamReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewOrgGetTeamOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewOrgGetTeamNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /teams/{id}] orgGetTeam", response, response.Code())
+	}
+}
+
+// NewOrgGetTeamOK creates a OrgGetTeamOK with default headers values
+func NewOrgGetTeamOK() *OrgGetTeamOK {
+	return &OrgGetTeamOK{}
+}
+
+/*
+OrgGetTeamOK describes a response with status code 200, with default header values.
+
+Team
+*/
+type OrgGetTeamOK struct {
+	Payload *models.Team
+}
+
+// IsSuccess returns true when this org get team o k response has a 2xx status code
+func (o *OrgGetTeamOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this org get team o k response has a 3xx status code
+func (o *OrgGetTeamOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org get team o k response has a 4xx status code
+func (o *OrgGetTeamOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this org get team o k response has a 5xx status code
+func (o *OrgGetTeamOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org get team o k response a status code equal to that given
+func (o *OrgGetTeamOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the org get team o k response
+func (o *OrgGetTeamOK) Code() int {
+	return 200
+}
+
+func (o *OrgGetTeamOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /teams/{id}][%d] orgGetTeamOK %s", 200, payload)
+}
+
+func (o *OrgGetTeamOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /teams/{id}][%d] orgGetTeamOK %s", 200, payload)
+}
+
+func (o *OrgGetTeamOK) GetPayload() *models.Team {
+	return o.Payload
+}
+
+func (o *OrgGetTeamOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.Team)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewOrgGetTeamNotFound creates a OrgGetTeamNotFound with default headers values
+func NewOrgGetTeamNotFound() *OrgGetTeamNotFound {
+	return &OrgGetTeamNotFound{}
+}
+
+/*
+OrgGetTeamNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type OrgGetTeamNotFound struct {
+}
+
+// IsSuccess returns true when this org get team not found response has a 2xx status code
+func (o *OrgGetTeamNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this org get team not found response has a 3xx status code
+func (o *OrgGetTeamNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org get team not found response has a 4xx status code
+func (o *OrgGetTeamNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this org get team not found response has a 5xx status code
+func (o *OrgGetTeamNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org get team not found response a status code equal to that given
+func (o *OrgGetTeamNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the org get team not found response
+func (o *OrgGetTeamNotFound) Code() int {
+	return 404
+}
+
+func (o *OrgGetTeamNotFound) Error() string {
+	return fmt.Sprintf("[GET /teams/{id}][%d] orgGetTeamNotFound", 404)
+}
+
+func (o *OrgGetTeamNotFound) String() string {
+	return fmt.Sprintf("[GET /teams/{id}][%d] orgGetTeamNotFound", 404)
+}
+
+func (o *OrgGetTeamNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_get_user_permissions_parameters.go b/bots-common/gitea-generated/client/organization/org_get_user_permissions_parameters.go
new file mode 100644
index 0000000..2acbe1f
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_get_user_permissions_parameters.go
@@ -0,0 +1,173 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewOrgGetUserPermissionsParams creates a new OrgGetUserPermissionsParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewOrgGetUserPermissionsParams() *OrgGetUserPermissionsParams {
+	return &OrgGetUserPermissionsParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewOrgGetUserPermissionsParamsWithTimeout creates a new OrgGetUserPermissionsParams object
+// with the ability to set a timeout on a request.
+func NewOrgGetUserPermissionsParamsWithTimeout(timeout time.Duration) *OrgGetUserPermissionsParams {
+	return &OrgGetUserPermissionsParams{
+		timeout: timeout,
+	}
+}
+
+// NewOrgGetUserPermissionsParamsWithContext creates a new OrgGetUserPermissionsParams object
+// with the ability to set a context for a request.
+func NewOrgGetUserPermissionsParamsWithContext(ctx context.Context) *OrgGetUserPermissionsParams {
+	return &OrgGetUserPermissionsParams{
+		Context: ctx,
+	}
+}
+
+// NewOrgGetUserPermissionsParamsWithHTTPClient creates a new OrgGetUserPermissionsParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewOrgGetUserPermissionsParamsWithHTTPClient(client *http.Client) *OrgGetUserPermissionsParams {
+	return &OrgGetUserPermissionsParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+OrgGetUserPermissionsParams contains all the parameters to send to the API endpoint
+
+	for the org get user permissions operation.
+
+	Typically these are written to a http.Request.
+*/
+type OrgGetUserPermissionsParams struct {
+
+	/* Org.
+
+	   name of the organization
+	*/
+	Org string
+
+	/* Username.
+
+	   username of user
+	*/
+	Username string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the org get user permissions params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgGetUserPermissionsParams) WithDefaults() *OrgGetUserPermissionsParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the org get user permissions params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgGetUserPermissionsParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the org get user permissions params
+func (o *OrgGetUserPermissionsParams) WithTimeout(timeout time.Duration) *OrgGetUserPermissionsParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the org get user permissions params
+func (o *OrgGetUserPermissionsParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the org get user permissions params
+func (o *OrgGetUserPermissionsParams) WithContext(ctx context.Context) *OrgGetUserPermissionsParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the org get user permissions params
+func (o *OrgGetUserPermissionsParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the org get user permissions params
+func (o *OrgGetUserPermissionsParams) WithHTTPClient(client *http.Client) *OrgGetUserPermissionsParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the org get user permissions params
+func (o *OrgGetUserPermissionsParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithOrg adds the org to the org get user permissions params
+func (o *OrgGetUserPermissionsParams) WithOrg(org string) *OrgGetUserPermissionsParams {
+	o.SetOrg(org)
+	return o
+}
+
+// SetOrg adds the org to the org get user permissions params
+func (o *OrgGetUserPermissionsParams) SetOrg(org string) {
+	o.Org = org
+}
+
+// WithUsername adds the username to the org get user permissions params
+func (o *OrgGetUserPermissionsParams) WithUsername(username string) *OrgGetUserPermissionsParams {
+	o.SetUsername(username)
+	return o
+}
+
+// SetUsername adds the username to the org get user permissions params
+func (o *OrgGetUserPermissionsParams) SetUsername(username string) {
+	o.Username = username
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *OrgGetUserPermissionsParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param org
+	if err := r.SetPathParam("org", o.Org); err != nil {
+		return err
+	}
+
+	// path param username
+	if err := r.SetPathParam("username", o.Username); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_get_user_permissions_responses.go b/bots-common/gitea-generated/client/organization/org_get_user_permissions_responses.go
new file mode 100644
index 0000000..7f57574
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_get_user_permissions_responses.go
@@ -0,0 +1,246 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// OrgGetUserPermissionsReader is a Reader for the OrgGetUserPermissions structure.
+type OrgGetUserPermissionsReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *OrgGetUserPermissionsReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewOrgGetUserPermissionsOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 403:
+		result := NewOrgGetUserPermissionsForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewOrgGetUserPermissionsNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /users/{username}/orgs/{org}/permissions] orgGetUserPermissions", response, response.Code())
+	}
+}
+
+// NewOrgGetUserPermissionsOK creates a OrgGetUserPermissionsOK with default headers values
+func NewOrgGetUserPermissionsOK() *OrgGetUserPermissionsOK {
+	return &OrgGetUserPermissionsOK{}
+}
+
+/*
+OrgGetUserPermissionsOK describes a response with status code 200, with default header values.
+
+OrganizationPermissions
+*/
+type OrgGetUserPermissionsOK struct {
+	Payload *models.OrganizationPermissions
+}
+
+// IsSuccess returns true when this org get user permissions o k response has a 2xx status code
+func (o *OrgGetUserPermissionsOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this org get user permissions o k response has a 3xx status code
+func (o *OrgGetUserPermissionsOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org get user permissions o k response has a 4xx status code
+func (o *OrgGetUserPermissionsOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this org get user permissions o k response has a 5xx status code
+func (o *OrgGetUserPermissionsOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org get user permissions o k response a status code equal to that given
+func (o *OrgGetUserPermissionsOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the org get user permissions o k response
+func (o *OrgGetUserPermissionsOK) Code() int {
+	return 200
+}
+
+func (o *OrgGetUserPermissionsOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /users/{username}/orgs/{org}/permissions][%d] orgGetUserPermissionsOK %s", 200, payload)
+}
+
+func (o *OrgGetUserPermissionsOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /users/{username}/orgs/{org}/permissions][%d] orgGetUserPermissionsOK %s", 200, payload)
+}
+
+func (o *OrgGetUserPermissionsOK) GetPayload() *models.OrganizationPermissions {
+	return o.Payload
+}
+
+func (o *OrgGetUserPermissionsOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.OrganizationPermissions)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewOrgGetUserPermissionsForbidden creates a OrgGetUserPermissionsForbidden with default headers values
+func NewOrgGetUserPermissionsForbidden() *OrgGetUserPermissionsForbidden {
+	return &OrgGetUserPermissionsForbidden{}
+}
+
+/*
+OrgGetUserPermissionsForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type OrgGetUserPermissionsForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this org get user permissions forbidden response has a 2xx status code
+func (o *OrgGetUserPermissionsForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this org get user permissions forbidden response has a 3xx status code
+func (o *OrgGetUserPermissionsForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org get user permissions forbidden response has a 4xx status code
+func (o *OrgGetUserPermissionsForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this org get user permissions forbidden response has a 5xx status code
+func (o *OrgGetUserPermissionsForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org get user permissions forbidden response a status code equal to that given
+func (o *OrgGetUserPermissionsForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the org get user permissions forbidden response
+func (o *OrgGetUserPermissionsForbidden) Code() int {
+	return 403
+}
+
+func (o *OrgGetUserPermissionsForbidden) Error() string {
+	return fmt.Sprintf("[GET /users/{username}/orgs/{org}/permissions][%d] orgGetUserPermissionsForbidden", 403)
+}
+
+func (o *OrgGetUserPermissionsForbidden) String() string {
+	return fmt.Sprintf("[GET /users/{username}/orgs/{org}/permissions][%d] orgGetUserPermissionsForbidden", 403)
+}
+
+func (o *OrgGetUserPermissionsForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewOrgGetUserPermissionsNotFound creates a OrgGetUserPermissionsNotFound with default headers values
+func NewOrgGetUserPermissionsNotFound() *OrgGetUserPermissionsNotFound {
+	return &OrgGetUserPermissionsNotFound{}
+}
+
+/*
+OrgGetUserPermissionsNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type OrgGetUserPermissionsNotFound struct {
+}
+
+// IsSuccess returns true when this org get user permissions not found response has a 2xx status code
+func (o *OrgGetUserPermissionsNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this org get user permissions not found response has a 3xx status code
+func (o *OrgGetUserPermissionsNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org get user permissions not found response has a 4xx status code
+func (o *OrgGetUserPermissionsNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this org get user permissions not found response has a 5xx status code
+func (o *OrgGetUserPermissionsNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org get user permissions not found response a status code equal to that given
+func (o *OrgGetUserPermissionsNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the org get user permissions not found response
+func (o *OrgGetUserPermissionsNotFound) Code() int {
+	return 404
+}
+
+func (o *OrgGetUserPermissionsNotFound) Error() string {
+	return fmt.Sprintf("[GET /users/{username}/orgs/{org}/permissions][%d] orgGetUserPermissionsNotFound", 404)
+}
+
+func (o *OrgGetUserPermissionsNotFound) String() string {
+	return fmt.Sprintf("[GET /users/{username}/orgs/{org}/permissions][%d] orgGetUserPermissionsNotFound", 404)
+}
+
+func (o *OrgGetUserPermissionsNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_is_member_parameters.go b/bots-common/gitea-generated/client/organization/org_is_member_parameters.go
new file mode 100644
index 0000000..ddb43f8
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_is_member_parameters.go
@@ -0,0 +1,173 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewOrgIsMemberParams creates a new OrgIsMemberParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewOrgIsMemberParams() *OrgIsMemberParams {
+	return &OrgIsMemberParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewOrgIsMemberParamsWithTimeout creates a new OrgIsMemberParams object
+// with the ability to set a timeout on a request.
+func NewOrgIsMemberParamsWithTimeout(timeout time.Duration) *OrgIsMemberParams {
+	return &OrgIsMemberParams{
+		timeout: timeout,
+	}
+}
+
+// NewOrgIsMemberParamsWithContext creates a new OrgIsMemberParams object
+// with the ability to set a context for a request.
+func NewOrgIsMemberParamsWithContext(ctx context.Context) *OrgIsMemberParams {
+	return &OrgIsMemberParams{
+		Context: ctx,
+	}
+}
+
+// NewOrgIsMemberParamsWithHTTPClient creates a new OrgIsMemberParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewOrgIsMemberParamsWithHTTPClient(client *http.Client) *OrgIsMemberParams {
+	return &OrgIsMemberParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+OrgIsMemberParams contains all the parameters to send to the API endpoint
+
+	for the org is member operation.
+
+	Typically these are written to a http.Request.
+*/
+type OrgIsMemberParams struct {
+
+	/* Org.
+
+	   name of the organization
+	*/
+	Org string
+
+	/* Username.
+
+	   username of the user
+	*/
+	Username string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the org is member params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgIsMemberParams) WithDefaults() *OrgIsMemberParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the org is member params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgIsMemberParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the org is member params
+func (o *OrgIsMemberParams) WithTimeout(timeout time.Duration) *OrgIsMemberParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the org is member params
+func (o *OrgIsMemberParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the org is member params
+func (o *OrgIsMemberParams) WithContext(ctx context.Context) *OrgIsMemberParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the org is member params
+func (o *OrgIsMemberParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the org is member params
+func (o *OrgIsMemberParams) WithHTTPClient(client *http.Client) *OrgIsMemberParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the org is member params
+func (o *OrgIsMemberParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithOrg adds the org to the org is member params
+func (o *OrgIsMemberParams) WithOrg(org string) *OrgIsMemberParams {
+	o.SetOrg(org)
+	return o
+}
+
+// SetOrg adds the org to the org is member params
+func (o *OrgIsMemberParams) SetOrg(org string) {
+	o.Org = org
+}
+
+// WithUsername adds the username to the org is member params
+func (o *OrgIsMemberParams) WithUsername(username string) *OrgIsMemberParams {
+	o.SetUsername(username)
+	return o
+}
+
+// SetUsername adds the username to the org is member params
+func (o *OrgIsMemberParams) SetUsername(username string) {
+	o.Username = username
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *OrgIsMemberParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param org
+	if err := r.SetPathParam("org", o.Org); err != nil {
+		return err
+	}
+
+	// path param username
+	if err := r.SetPathParam("username", o.Username); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_is_member_responses.go b/bots-common/gitea-generated/client/organization/org_is_member_responses.go
new file mode 100644
index 0000000..5760c91
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_is_member_responses.go
@@ -0,0 +1,212 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// OrgIsMemberReader is a Reader for the OrgIsMember structure.
+type OrgIsMemberReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *OrgIsMemberReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewOrgIsMemberNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 303:
+		result := NewOrgIsMemberSeeOther()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewOrgIsMemberNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /orgs/{org}/members/{username}] orgIsMember", response, response.Code())
+	}
+}
+
+// NewOrgIsMemberNoContent creates a OrgIsMemberNoContent with default headers values
+func NewOrgIsMemberNoContent() *OrgIsMemberNoContent {
+	return &OrgIsMemberNoContent{}
+}
+
+/*
+OrgIsMemberNoContent describes a response with status code 204, with default header values.
+
+user is a member
+*/
+type OrgIsMemberNoContent struct {
+}
+
+// IsSuccess returns true when this org is member no content response has a 2xx status code
+func (o *OrgIsMemberNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this org is member no content response has a 3xx status code
+func (o *OrgIsMemberNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org is member no content response has a 4xx status code
+func (o *OrgIsMemberNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this org is member no content response has a 5xx status code
+func (o *OrgIsMemberNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org is member no content response a status code equal to that given
+func (o *OrgIsMemberNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the org is member no content response
+func (o *OrgIsMemberNoContent) Code() int {
+	return 204
+}
+
+func (o *OrgIsMemberNoContent) Error() string {
+	return fmt.Sprintf("[GET /orgs/{org}/members/{username}][%d] orgIsMemberNoContent", 204)
+}
+
+func (o *OrgIsMemberNoContent) String() string {
+	return fmt.Sprintf("[GET /orgs/{org}/members/{username}][%d] orgIsMemberNoContent", 204)
+}
+
+func (o *OrgIsMemberNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewOrgIsMemberSeeOther creates a OrgIsMemberSeeOther with default headers values
+func NewOrgIsMemberSeeOther() *OrgIsMemberSeeOther {
+	return &OrgIsMemberSeeOther{}
+}
+
+/*
+OrgIsMemberSeeOther describes a response with status code 303, with default header values.
+
+redirection to /orgs/{org}/public_members/{username}
+*/
+type OrgIsMemberSeeOther struct {
+}
+
+// IsSuccess returns true when this org is member see other response has a 2xx status code
+func (o *OrgIsMemberSeeOther) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this org is member see other response has a 3xx status code
+func (o *OrgIsMemberSeeOther) IsRedirect() bool {
+	return true
+}
+
+// IsClientError returns true when this org is member see other response has a 4xx status code
+func (o *OrgIsMemberSeeOther) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this org is member see other response has a 5xx status code
+func (o *OrgIsMemberSeeOther) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org is member see other response a status code equal to that given
+func (o *OrgIsMemberSeeOther) IsCode(code int) bool {
+	return code == 303
+}
+
+// Code gets the status code for the org is member see other response
+func (o *OrgIsMemberSeeOther) Code() int {
+	return 303
+}
+
+func (o *OrgIsMemberSeeOther) Error() string {
+	return fmt.Sprintf("[GET /orgs/{org}/members/{username}][%d] orgIsMemberSeeOther", 303)
+}
+
+func (o *OrgIsMemberSeeOther) String() string {
+	return fmt.Sprintf("[GET /orgs/{org}/members/{username}][%d] orgIsMemberSeeOther", 303)
+}
+
+func (o *OrgIsMemberSeeOther) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewOrgIsMemberNotFound creates a OrgIsMemberNotFound with default headers values
+func NewOrgIsMemberNotFound() *OrgIsMemberNotFound {
+	return &OrgIsMemberNotFound{}
+}
+
+/*
+OrgIsMemberNotFound describes a response with status code 404, with default header values.
+
+user is not a member
+*/
+type OrgIsMemberNotFound struct {
+}
+
+// IsSuccess returns true when this org is member not found response has a 2xx status code
+func (o *OrgIsMemberNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this org is member not found response has a 3xx status code
+func (o *OrgIsMemberNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org is member not found response has a 4xx status code
+func (o *OrgIsMemberNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this org is member not found response has a 5xx status code
+func (o *OrgIsMemberNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org is member not found response a status code equal to that given
+func (o *OrgIsMemberNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the org is member not found response
+func (o *OrgIsMemberNotFound) Code() int {
+	return 404
+}
+
+func (o *OrgIsMemberNotFound) Error() string {
+	return fmt.Sprintf("[GET /orgs/{org}/members/{username}][%d] orgIsMemberNotFound", 404)
+}
+
+func (o *OrgIsMemberNotFound) String() string {
+	return fmt.Sprintf("[GET /orgs/{org}/members/{username}][%d] orgIsMemberNotFound", 404)
+}
+
+func (o *OrgIsMemberNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_is_public_member_parameters.go b/bots-common/gitea-generated/client/organization/org_is_public_member_parameters.go
new file mode 100644
index 0000000..5d953ba
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_is_public_member_parameters.go
@@ -0,0 +1,173 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewOrgIsPublicMemberParams creates a new OrgIsPublicMemberParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewOrgIsPublicMemberParams() *OrgIsPublicMemberParams {
+	return &OrgIsPublicMemberParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewOrgIsPublicMemberParamsWithTimeout creates a new OrgIsPublicMemberParams object
+// with the ability to set a timeout on a request.
+func NewOrgIsPublicMemberParamsWithTimeout(timeout time.Duration) *OrgIsPublicMemberParams {
+	return &OrgIsPublicMemberParams{
+		timeout: timeout,
+	}
+}
+
+// NewOrgIsPublicMemberParamsWithContext creates a new OrgIsPublicMemberParams object
+// with the ability to set a context for a request.
+func NewOrgIsPublicMemberParamsWithContext(ctx context.Context) *OrgIsPublicMemberParams {
+	return &OrgIsPublicMemberParams{
+		Context: ctx,
+	}
+}
+
+// NewOrgIsPublicMemberParamsWithHTTPClient creates a new OrgIsPublicMemberParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewOrgIsPublicMemberParamsWithHTTPClient(client *http.Client) *OrgIsPublicMemberParams {
+	return &OrgIsPublicMemberParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+OrgIsPublicMemberParams contains all the parameters to send to the API endpoint
+
+	for the org is public member operation.
+
+	Typically these are written to a http.Request.
+*/
+type OrgIsPublicMemberParams struct {
+
+	/* Org.
+
+	   name of the organization
+	*/
+	Org string
+
+	/* Username.
+
+	   username of the user
+	*/
+	Username string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the org is public member params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgIsPublicMemberParams) WithDefaults() *OrgIsPublicMemberParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the org is public member params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgIsPublicMemberParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the org is public member params
+func (o *OrgIsPublicMemberParams) WithTimeout(timeout time.Duration) *OrgIsPublicMemberParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the org is public member params
+func (o *OrgIsPublicMemberParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the org is public member params
+func (o *OrgIsPublicMemberParams) WithContext(ctx context.Context) *OrgIsPublicMemberParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the org is public member params
+func (o *OrgIsPublicMemberParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the org is public member params
+func (o *OrgIsPublicMemberParams) WithHTTPClient(client *http.Client) *OrgIsPublicMemberParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the org is public member params
+func (o *OrgIsPublicMemberParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithOrg adds the org to the org is public member params
+func (o *OrgIsPublicMemberParams) WithOrg(org string) *OrgIsPublicMemberParams {
+	o.SetOrg(org)
+	return o
+}
+
+// SetOrg adds the org to the org is public member params
+func (o *OrgIsPublicMemberParams) SetOrg(org string) {
+	o.Org = org
+}
+
+// WithUsername adds the username to the org is public member params
+func (o *OrgIsPublicMemberParams) WithUsername(username string) *OrgIsPublicMemberParams {
+	o.SetUsername(username)
+	return o
+}
+
+// SetUsername adds the username to the org is public member params
+func (o *OrgIsPublicMemberParams) SetUsername(username string) {
+	o.Username = username
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *OrgIsPublicMemberParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param org
+	if err := r.SetPathParam("org", o.Org); err != nil {
+		return err
+	}
+
+	// path param username
+	if err := r.SetPathParam("username", o.Username); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_is_public_member_responses.go b/bots-common/gitea-generated/client/organization/org_is_public_member_responses.go
new file mode 100644
index 0000000..d2adf33
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_is_public_member_responses.go
@@ -0,0 +1,150 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// OrgIsPublicMemberReader is a Reader for the OrgIsPublicMember structure.
+type OrgIsPublicMemberReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *OrgIsPublicMemberReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewOrgIsPublicMemberNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewOrgIsPublicMemberNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /orgs/{org}/public_members/{username}] orgIsPublicMember", response, response.Code())
+	}
+}
+
+// NewOrgIsPublicMemberNoContent creates a OrgIsPublicMemberNoContent with default headers values
+func NewOrgIsPublicMemberNoContent() *OrgIsPublicMemberNoContent {
+	return &OrgIsPublicMemberNoContent{}
+}
+
+/*
+OrgIsPublicMemberNoContent describes a response with status code 204, with default header values.
+
+user is a public member
+*/
+type OrgIsPublicMemberNoContent struct {
+}
+
+// IsSuccess returns true when this org is public member no content response has a 2xx status code
+func (o *OrgIsPublicMemberNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this org is public member no content response has a 3xx status code
+func (o *OrgIsPublicMemberNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org is public member no content response has a 4xx status code
+func (o *OrgIsPublicMemberNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this org is public member no content response has a 5xx status code
+func (o *OrgIsPublicMemberNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org is public member no content response a status code equal to that given
+func (o *OrgIsPublicMemberNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the org is public member no content response
+func (o *OrgIsPublicMemberNoContent) Code() int {
+	return 204
+}
+
+func (o *OrgIsPublicMemberNoContent) Error() string {
+	return fmt.Sprintf("[GET /orgs/{org}/public_members/{username}][%d] orgIsPublicMemberNoContent", 204)
+}
+
+func (o *OrgIsPublicMemberNoContent) String() string {
+	return fmt.Sprintf("[GET /orgs/{org}/public_members/{username}][%d] orgIsPublicMemberNoContent", 204)
+}
+
+func (o *OrgIsPublicMemberNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewOrgIsPublicMemberNotFound creates a OrgIsPublicMemberNotFound with default headers values
+func NewOrgIsPublicMemberNotFound() *OrgIsPublicMemberNotFound {
+	return &OrgIsPublicMemberNotFound{}
+}
+
+/*
+OrgIsPublicMemberNotFound describes a response with status code 404, with default header values.
+
+user is not a public member
+*/
+type OrgIsPublicMemberNotFound struct {
+}
+
+// IsSuccess returns true when this org is public member not found response has a 2xx status code
+func (o *OrgIsPublicMemberNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this org is public member not found response has a 3xx status code
+func (o *OrgIsPublicMemberNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org is public member not found response has a 4xx status code
+func (o *OrgIsPublicMemberNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this org is public member not found response has a 5xx status code
+func (o *OrgIsPublicMemberNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org is public member not found response a status code equal to that given
+func (o *OrgIsPublicMemberNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the org is public member not found response
+func (o *OrgIsPublicMemberNotFound) Code() int {
+	return 404
+}
+
+func (o *OrgIsPublicMemberNotFound) Error() string {
+	return fmt.Sprintf("[GET /orgs/{org}/public_members/{username}][%d] orgIsPublicMemberNotFound", 404)
+}
+
+func (o *OrgIsPublicMemberNotFound) String() string {
+	return fmt.Sprintf("[GET /orgs/{org}/public_members/{username}][%d] orgIsPublicMemberNotFound", 404)
+}
+
+func (o *OrgIsPublicMemberNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_list_actions_secrets_parameters.go b/bots-common/gitea-generated/client/organization/org_list_actions_secrets_parameters.go
new file mode 100644
index 0000000..841d319
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_list_actions_secrets_parameters.go
@@ -0,0 +1,220 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewOrgListActionsSecretsParams creates a new OrgListActionsSecretsParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewOrgListActionsSecretsParams() *OrgListActionsSecretsParams {
+	return &OrgListActionsSecretsParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewOrgListActionsSecretsParamsWithTimeout creates a new OrgListActionsSecretsParams object
+// with the ability to set a timeout on a request.
+func NewOrgListActionsSecretsParamsWithTimeout(timeout time.Duration) *OrgListActionsSecretsParams {
+	return &OrgListActionsSecretsParams{
+		timeout: timeout,
+	}
+}
+
+// NewOrgListActionsSecretsParamsWithContext creates a new OrgListActionsSecretsParams object
+// with the ability to set a context for a request.
+func NewOrgListActionsSecretsParamsWithContext(ctx context.Context) *OrgListActionsSecretsParams {
+	return &OrgListActionsSecretsParams{
+		Context: ctx,
+	}
+}
+
+// NewOrgListActionsSecretsParamsWithHTTPClient creates a new OrgListActionsSecretsParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewOrgListActionsSecretsParamsWithHTTPClient(client *http.Client) *OrgListActionsSecretsParams {
+	return &OrgListActionsSecretsParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+OrgListActionsSecretsParams contains all the parameters to send to the API endpoint
+
+	for the org list actions secrets operation.
+
+	Typically these are written to a http.Request.
+*/
+type OrgListActionsSecretsParams struct {
+
+	/* Limit.
+
+	   page size of results
+	*/
+	Limit *int64
+
+	/* Org.
+
+	   name of the organization
+	*/
+	Org string
+
+	/* Page.
+
+	   page number of results to return (1-based)
+	*/
+	Page *int64
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the org list actions secrets params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgListActionsSecretsParams) WithDefaults() *OrgListActionsSecretsParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the org list actions secrets params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgListActionsSecretsParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the org list actions secrets params
+func (o *OrgListActionsSecretsParams) WithTimeout(timeout time.Duration) *OrgListActionsSecretsParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the org list actions secrets params
+func (o *OrgListActionsSecretsParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the org list actions secrets params
+func (o *OrgListActionsSecretsParams) WithContext(ctx context.Context) *OrgListActionsSecretsParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the org list actions secrets params
+func (o *OrgListActionsSecretsParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the org list actions secrets params
+func (o *OrgListActionsSecretsParams) WithHTTPClient(client *http.Client) *OrgListActionsSecretsParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the org list actions secrets params
+func (o *OrgListActionsSecretsParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithLimit adds the limit to the org list actions secrets params
+func (o *OrgListActionsSecretsParams) WithLimit(limit *int64) *OrgListActionsSecretsParams {
+	o.SetLimit(limit)
+	return o
+}
+
+// SetLimit adds the limit to the org list actions secrets params
+func (o *OrgListActionsSecretsParams) SetLimit(limit *int64) {
+	o.Limit = limit
+}
+
+// WithOrg adds the org to the org list actions secrets params
+func (o *OrgListActionsSecretsParams) WithOrg(org string) *OrgListActionsSecretsParams {
+	o.SetOrg(org)
+	return o
+}
+
+// SetOrg adds the org to the org list actions secrets params
+func (o *OrgListActionsSecretsParams) SetOrg(org string) {
+	o.Org = org
+}
+
+// WithPage adds the page to the org list actions secrets params
+func (o *OrgListActionsSecretsParams) WithPage(page *int64) *OrgListActionsSecretsParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the org list actions secrets params
+func (o *OrgListActionsSecretsParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *OrgListActionsSecretsParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.Limit != nil {
+
+		// query param limit
+		var qrLimit int64
+
+		if o.Limit != nil {
+			qrLimit = *o.Limit
+		}
+		qLimit := swag.FormatInt64(qrLimit)
+		if qLimit != "" {
+
+			if err := r.SetQueryParam("limit", qLimit); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param org
+	if err := r.SetPathParam("org", o.Org); err != nil {
+		return err
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_list_actions_secrets_responses.go b/bots-common/gitea-generated/client/organization/org_list_actions_secrets_responses.go
new file mode 100644
index 0000000..d2aa29c
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_list_actions_secrets_responses.go
@@ -0,0 +1,166 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// OrgListActionsSecretsReader is a Reader for the OrgListActionsSecrets structure.
+type OrgListActionsSecretsReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *OrgListActionsSecretsReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewOrgListActionsSecretsOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewOrgListActionsSecretsNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /orgs/{org}/actions/secrets] orgListActionsSecrets", response, response.Code())
+	}
+}
+
+// NewOrgListActionsSecretsOK creates a OrgListActionsSecretsOK with default headers values
+func NewOrgListActionsSecretsOK() *OrgListActionsSecretsOK {
+	return &OrgListActionsSecretsOK{}
+}
+
+/*
+OrgListActionsSecretsOK describes a response with status code 200, with default header values.
+
+SecretList
+*/
+type OrgListActionsSecretsOK struct {
+	Payload []*models.Secret
+}
+
+// IsSuccess returns true when this org list actions secrets o k response has a 2xx status code
+func (o *OrgListActionsSecretsOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this org list actions secrets o k response has a 3xx status code
+func (o *OrgListActionsSecretsOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org list actions secrets o k response has a 4xx status code
+func (o *OrgListActionsSecretsOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this org list actions secrets o k response has a 5xx status code
+func (o *OrgListActionsSecretsOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org list actions secrets o k response a status code equal to that given
+func (o *OrgListActionsSecretsOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the org list actions secrets o k response
+func (o *OrgListActionsSecretsOK) Code() int {
+	return 200
+}
+
+func (o *OrgListActionsSecretsOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /orgs/{org}/actions/secrets][%d] orgListActionsSecretsOK %s", 200, payload)
+}
+
+func (o *OrgListActionsSecretsOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /orgs/{org}/actions/secrets][%d] orgListActionsSecretsOK %s", 200, payload)
+}
+
+func (o *OrgListActionsSecretsOK) GetPayload() []*models.Secret {
+	return o.Payload
+}
+
+func (o *OrgListActionsSecretsOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewOrgListActionsSecretsNotFound creates a OrgListActionsSecretsNotFound with default headers values
+func NewOrgListActionsSecretsNotFound() *OrgListActionsSecretsNotFound {
+	return &OrgListActionsSecretsNotFound{}
+}
+
+/*
+OrgListActionsSecretsNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type OrgListActionsSecretsNotFound struct {
+}
+
+// IsSuccess returns true when this org list actions secrets not found response has a 2xx status code
+func (o *OrgListActionsSecretsNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this org list actions secrets not found response has a 3xx status code
+func (o *OrgListActionsSecretsNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org list actions secrets not found response has a 4xx status code
+func (o *OrgListActionsSecretsNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this org list actions secrets not found response has a 5xx status code
+func (o *OrgListActionsSecretsNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org list actions secrets not found response a status code equal to that given
+func (o *OrgListActionsSecretsNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the org list actions secrets not found response
+func (o *OrgListActionsSecretsNotFound) Code() int {
+	return 404
+}
+
+func (o *OrgListActionsSecretsNotFound) Error() string {
+	return fmt.Sprintf("[GET /orgs/{org}/actions/secrets][%d] orgListActionsSecretsNotFound", 404)
+}
+
+func (o *OrgListActionsSecretsNotFound) String() string {
+	return fmt.Sprintf("[GET /orgs/{org}/actions/secrets][%d] orgListActionsSecretsNotFound", 404)
+}
+
+func (o *OrgListActionsSecretsNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_list_activity_feeds_parameters.go b/bots-common/gitea-generated/client/organization/org_list_activity_feeds_parameters.go
new file mode 100644
index 0000000..cc709b9
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_list_activity_feeds_parameters.go
@@ -0,0 +1,256 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewOrgListActivityFeedsParams creates a new OrgListActivityFeedsParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewOrgListActivityFeedsParams() *OrgListActivityFeedsParams {
+	return &OrgListActivityFeedsParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewOrgListActivityFeedsParamsWithTimeout creates a new OrgListActivityFeedsParams object
+// with the ability to set a timeout on a request.
+func NewOrgListActivityFeedsParamsWithTimeout(timeout time.Duration) *OrgListActivityFeedsParams {
+	return &OrgListActivityFeedsParams{
+		timeout: timeout,
+	}
+}
+
+// NewOrgListActivityFeedsParamsWithContext creates a new OrgListActivityFeedsParams object
+// with the ability to set a context for a request.
+func NewOrgListActivityFeedsParamsWithContext(ctx context.Context) *OrgListActivityFeedsParams {
+	return &OrgListActivityFeedsParams{
+		Context: ctx,
+	}
+}
+
+// NewOrgListActivityFeedsParamsWithHTTPClient creates a new OrgListActivityFeedsParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewOrgListActivityFeedsParamsWithHTTPClient(client *http.Client) *OrgListActivityFeedsParams {
+	return &OrgListActivityFeedsParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+OrgListActivityFeedsParams contains all the parameters to send to the API endpoint
+
+	for the org list activity feeds operation.
+
+	Typically these are written to a http.Request.
+*/
+type OrgListActivityFeedsParams struct {
+
+	/* Date.
+
+	   the date of the activities to be found
+
+	   Format: date
+	*/
+	Date *strfmt.Date
+
+	/* Limit.
+
+	   page size of results
+	*/
+	Limit *int64
+
+	/* Org.
+
+	   name of the org
+	*/
+	Org string
+
+	/* Page.
+
+	   page number of results to return (1-based)
+	*/
+	Page *int64
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the org list activity feeds params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgListActivityFeedsParams) WithDefaults() *OrgListActivityFeedsParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the org list activity feeds params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgListActivityFeedsParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the org list activity feeds params
+func (o *OrgListActivityFeedsParams) WithTimeout(timeout time.Duration) *OrgListActivityFeedsParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the org list activity feeds params
+func (o *OrgListActivityFeedsParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the org list activity feeds params
+func (o *OrgListActivityFeedsParams) WithContext(ctx context.Context) *OrgListActivityFeedsParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the org list activity feeds params
+func (o *OrgListActivityFeedsParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the org list activity feeds params
+func (o *OrgListActivityFeedsParams) WithHTTPClient(client *http.Client) *OrgListActivityFeedsParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the org list activity feeds params
+func (o *OrgListActivityFeedsParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithDate adds the date to the org list activity feeds params
+func (o *OrgListActivityFeedsParams) WithDate(date *strfmt.Date) *OrgListActivityFeedsParams {
+	o.SetDate(date)
+	return o
+}
+
+// SetDate adds the date to the org list activity feeds params
+func (o *OrgListActivityFeedsParams) SetDate(date *strfmt.Date) {
+	o.Date = date
+}
+
+// WithLimit adds the limit to the org list activity feeds params
+func (o *OrgListActivityFeedsParams) WithLimit(limit *int64) *OrgListActivityFeedsParams {
+	o.SetLimit(limit)
+	return o
+}
+
+// SetLimit adds the limit to the org list activity feeds params
+func (o *OrgListActivityFeedsParams) SetLimit(limit *int64) {
+	o.Limit = limit
+}
+
+// WithOrg adds the org to the org list activity feeds params
+func (o *OrgListActivityFeedsParams) WithOrg(org string) *OrgListActivityFeedsParams {
+	o.SetOrg(org)
+	return o
+}
+
+// SetOrg adds the org to the org list activity feeds params
+func (o *OrgListActivityFeedsParams) SetOrg(org string) {
+	o.Org = org
+}
+
+// WithPage adds the page to the org list activity feeds params
+func (o *OrgListActivityFeedsParams) WithPage(page *int64) *OrgListActivityFeedsParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the org list activity feeds params
+func (o *OrgListActivityFeedsParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *OrgListActivityFeedsParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.Date != nil {
+
+		// query param date
+		var qrDate strfmt.Date
+
+		if o.Date != nil {
+			qrDate = *o.Date
+		}
+		qDate := qrDate.String()
+		if qDate != "" {
+
+			if err := r.SetQueryParam("date", qDate); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Limit != nil {
+
+		// query param limit
+		var qrLimit int64
+
+		if o.Limit != nil {
+			qrLimit = *o.Limit
+		}
+		qLimit := swag.FormatInt64(qrLimit)
+		if qLimit != "" {
+
+			if err := r.SetQueryParam("limit", qLimit); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param org
+	if err := r.SetPathParam("org", o.Org); err != nil {
+		return err
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_list_activity_feeds_responses.go b/bots-common/gitea-generated/client/organization/org_list_activity_feeds_responses.go
new file mode 100644
index 0000000..0d60ace
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_list_activity_feeds_responses.go
@@ -0,0 +1,166 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// OrgListActivityFeedsReader is a Reader for the OrgListActivityFeeds structure.
+type OrgListActivityFeedsReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *OrgListActivityFeedsReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewOrgListActivityFeedsOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewOrgListActivityFeedsNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /orgs/{org}/activities/feeds] orgListActivityFeeds", response, response.Code())
+	}
+}
+
+// NewOrgListActivityFeedsOK creates a OrgListActivityFeedsOK with default headers values
+func NewOrgListActivityFeedsOK() *OrgListActivityFeedsOK {
+	return &OrgListActivityFeedsOK{}
+}
+
+/*
+OrgListActivityFeedsOK describes a response with status code 200, with default header values.
+
+ActivityFeedsList
+*/
+type OrgListActivityFeedsOK struct {
+	Payload []*models.Activity
+}
+
+// IsSuccess returns true when this org list activity feeds o k response has a 2xx status code
+func (o *OrgListActivityFeedsOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this org list activity feeds o k response has a 3xx status code
+func (o *OrgListActivityFeedsOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org list activity feeds o k response has a 4xx status code
+func (o *OrgListActivityFeedsOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this org list activity feeds o k response has a 5xx status code
+func (o *OrgListActivityFeedsOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org list activity feeds o k response a status code equal to that given
+func (o *OrgListActivityFeedsOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the org list activity feeds o k response
+func (o *OrgListActivityFeedsOK) Code() int {
+	return 200
+}
+
+func (o *OrgListActivityFeedsOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /orgs/{org}/activities/feeds][%d] orgListActivityFeedsOK %s", 200, payload)
+}
+
+func (o *OrgListActivityFeedsOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /orgs/{org}/activities/feeds][%d] orgListActivityFeedsOK %s", 200, payload)
+}
+
+func (o *OrgListActivityFeedsOK) GetPayload() []*models.Activity {
+	return o.Payload
+}
+
+func (o *OrgListActivityFeedsOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewOrgListActivityFeedsNotFound creates a OrgListActivityFeedsNotFound with default headers values
+func NewOrgListActivityFeedsNotFound() *OrgListActivityFeedsNotFound {
+	return &OrgListActivityFeedsNotFound{}
+}
+
+/*
+OrgListActivityFeedsNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type OrgListActivityFeedsNotFound struct {
+}
+
+// IsSuccess returns true when this org list activity feeds not found response has a 2xx status code
+func (o *OrgListActivityFeedsNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this org list activity feeds not found response has a 3xx status code
+func (o *OrgListActivityFeedsNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org list activity feeds not found response has a 4xx status code
+func (o *OrgListActivityFeedsNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this org list activity feeds not found response has a 5xx status code
+func (o *OrgListActivityFeedsNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org list activity feeds not found response a status code equal to that given
+func (o *OrgListActivityFeedsNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the org list activity feeds not found response
+func (o *OrgListActivityFeedsNotFound) Code() int {
+	return 404
+}
+
+func (o *OrgListActivityFeedsNotFound) Error() string {
+	return fmt.Sprintf("[GET /orgs/{org}/activities/feeds][%d] orgListActivityFeedsNotFound", 404)
+}
+
+func (o *OrgListActivityFeedsNotFound) String() string {
+	return fmt.Sprintf("[GET /orgs/{org}/activities/feeds][%d] orgListActivityFeedsNotFound", 404)
+}
+
+func (o *OrgListActivityFeedsNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_list_current_user_orgs_parameters.go b/bots-common/gitea-generated/client/organization/org_list_current_user_orgs_parameters.go
new file mode 100644
index 0000000..6bb5278
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_list_current_user_orgs_parameters.go
@@ -0,0 +1,198 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewOrgListCurrentUserOrgsParams creates a new OrgListCurrentUserOrgsParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewOrgListCurrentUserOrgsParams() *OrgListCurrentUserOrgsParams {
+	return &OrgListCurrentUserOrgsParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewOrgListCurrentUserOrgsParamsWithTimeout creates a new OrgListCurrentUserOrgsParams object
+// with the ability to set a timeout on a request.
+func NewOrgListCurrentUserOrgsParamsWithTimeout(timeout time.Duration) *OrgListCurrentUserOrgsParams {
+	return &OrgListCurrentUserOrgsParams{
+		timeout: timeout,
+	}
+}
+
+// NewOrgListCurrentUserOrgsParamsWithContext creates a new OrgListCurrentUserOrgsParams object
+// with the ability to set a context for a request.
+func NewOrgListCurrentUserOrgsParamsWithContext(ctx context.Context) *OrgListCurrentUserOrgsParams {
+	return &OrgListCurrentUserOrgsParams{
+		Context: ctx,
+	}
+}
+
+// NewOrgListCurrentUserOrgsParamsWithHTTPClient creates a new OrgListCurrentUserOrgsParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewOrgListCurrentUserOrgsParamsWithHTTPClient(client *http.Client) *OrgListCurrentUserOrgsParams {
+	return &OrgListCurrentUserOrgsParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+OrgListCurrentUserOrgsParams contains all the parameters to send to the API endpoint
+
+	for the org list current user orgs operation.
+
+	Typically these are written to a http.Request.
+*/
+type OrgListCurrentUserOrgsParams struct {
+
+	/* Limit.
+
+	   page size of results
+	*/
+	Limit *int64
+
+	/* Page.
+
+	   page number of results to return (1-based)
+	*/
+	Page *int64
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the org list current user orgs params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgListCurrentUserOrgsParams) WithDefaults() *OrgListCurrentUserOrgsParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the org list current user orgs params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgListCurrentUserOrgsParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the org list current user orgs params
+func (o *OrgListCurrentUserOrgsParams) WithTimeout(timeout time.Duration) *OrgListCurrentUserOrgsParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the org list current user orgs params
+func (o *OrgListCurrentUserOrgsParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the org list current user orgs params
+func (o *OrgListCurrentUserOrgsParams) WithContext(ctx context.Context) *OrgListCurrentUserOrgsParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the org list current user orgs params
+func (o *OrgListCurrentUserOrgsParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the org list current user orgs params
+func (o *OrgListCurrentUserOrgsParams) WithHTTPClient(client *http.Client) *OrgListCurrentUserOrgsParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the org list current user orgs params
+func (o *OrgListCurrentUserOrgsParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithLimit adds the limit to the org list current user orgs params
+func (o *OrgListCurrentUserOrgsParams) WithLimit(limit *int64) *OrgListCurrentUserOrgsParams {
+	o.SetLimit(limit)
+	return o
+}
+
+// SetLimit adds the limit to the org list current user orgs params
+func (o *OrgListCurrentUserOrgsParams) SetLimit(limit *int64) {
+	o.Limit = limit
+}
+
+// WithPage adds the page to the org list current user orgs params
+func (o *OrgListCurrentUserOrgsParams) WithPage(page *int64) *OrgListCurrentUserOrgsParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the org list current user orgs params
+func (o *OrgListCurrentUserOrgsParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *OrgListCurrentUserOrgsParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.Limit != nil {
+
+		// query param limit
+		var qrLimit int64
+
+		if o.Limit != nil {
+			qrLimit = *o.Limit
+		}
+		qLimit := swag.FormatInt64(qrLimit)
+		if qLimit != "" {
+
+			if err := r.SetQueryParam("limit", qLimit); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_list_current_user_orgs_responses.go b/bots-common/gitea-generated/client/organization/org_list_current_user_orgs_responses.go
new file mode 100644
index 0000000..d576503
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_list_current_user_orgs_responses.go
@@ -0,0 +1,166 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// OrgListCurrentUserOrgsReader is a Reader for the OrgListCurrentUserOrgs structure.
+type OrgListCurrentUserOrgsReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *OrgListCurrentUserOrgsReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewOrgListCurrentUserOrgsOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewOrgListCurrentUserOrgsNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /user/orgs] orgListCurrentUserOrgs", response, response.Code())
+	}
+}
+
+// NewOrgListCurrentUserOrgsOK creates a OrgListCurrentUserOrgsOK with default headers values
+func NewOrgListCurrentUserOrgsOK() *OrgListCurrentUserOrgsOK {
+	return &OrgListCurrentUserOrgsOK{}
+}
+
+/*
+OrgListCurrentUserOrgsOK describes a response with status code 200, with default header values.
+
+OrganizationList
+*/
+type OrgListCurrentUserOrgsOK struct {
+	Payload []*models.Organization
+}
+
+// IsSuccess returns true when this org list current user orgs o k response has a 2xx status code
+func (o *OrgListCurrentUserOrgsOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this org list current user orgs o k response has a 3xx status code
+func (o *OrgListCurrentUserOrgsOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org list current user orgs o k response has a 4xx status code
+func (o *OrgListCurrentUserOrgsOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this org list current user orgs o k response has a 5xx status code
+func (o *OrgListCurrentUserOrgsOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org list current user orgs o k response a status code equal to that given
+func (o *OrgListCurrentUserOrgsOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the org list current user orgs o k response
+func (o *OrgListCurrentUserOrgsOK) Code() int {
+	return 200
+}
+
+func (o *OrgListCurrentUserOrgsOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /user/orgs][%d] orgListCurrentUserOrgsOK %s", 200, payload)
+}
+
+func (o *OrgListCurrentUserOrgsOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /user/orgs][%d] orgListCurrentUserOrgsOK %s", 200, payload)
+}
+
+func (o *OrgListCurrentUserOrgsOK) GetPayload() []*models.Organization {
+	return o.Payload
+}
+
+func (o *OrgListCurrentUserOrgsOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewOrgListCurrentUserOrgsNotFound creates a OrgListCurrentUserOrgsNotFound with default headers values
+func NewOrgListCurrentUserOrgsNotFound() *OrgListCurrentUserOrgsNotFound {
+	return &OrgListCurrentUserOrgsNotFound{}
+}
+
+/*
+OrgListCurrentUserOrgsNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type OrgListCurrentUserOrgsNotFound struct {
+}
+
+// IsSuccess returns true when this org list current user orgs not found response has a 2xx status code
+func (o *OrgListCurrentUserOrgsNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this org list current user orgs not found response has a 3xx status code
+func (o *OrgListCurrentUserOrgsNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org list current user orgs not found response has a 4xx status code
+func (o *OrgListCurrentUserOrgsNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this org list current user orgs not found response has a 5xx status code
+func (o *OrgListCurrentUserOrgsNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org list current user orgs not found response a status code equal to that given
+func (o *OrgListCurrentUserOrgsNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the org list current user orgs not found response
+func (o *OrgListCurrentUserOrgsNotFound) Code() int {
+	return 404
+}
+
+func (o *OrgListCurrentUserOrgsNotFound) Error() string {
+	return fmt.Sprintf("[GET /user/orgs][%d] orgListCurrentUserOrgsNotFound", 404)
+}
+
+func (o *OrgListCurrentUserOrgsNotFound) String() string {
+	return fmt.Sprintf("[GET /user/orgs][%d] orgListCurrentUserOrgsNotFound", 404)
+}
+
+func (o *OrgListCurrentUserOrgsNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_list_hooks_parameters.go b/bots-common/gitea-generated/client/organization/org_list_hooks_parameters.go
new file mode 100644
index 0000000..423f840
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_list_hooks_parameters.go
@@ -0,0 +1,220 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewOrgListHooksParams creates a new OrgListHooksParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewOrgListHooksParams() *OrgListHooksParams {
+	return &OrgListHooksParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewOrgListHooksParamsWithTimeout creates a new OrgListHooksParams object
+// with the ability to set a timeout on a request.
+func NewOrgListHooksParamsWithTimeout(timeout time.Duration) *OrgListHooksParams {
+	return &OrgListHooksParams{
+		timeout: timeout,
+	}
+}
+
+// NewOrgListHooksParamsWithContext creates a new OrgListHooksParams object
+// with the ability to set a context for a request.
+func NewOrgListHooksParamsWithContext(ctx context.Context) *OrgListHooksParams {
+	return &OrgListHooksParams{
+		Context: ctx,
+	}
+}
+
+// NewOrgListHooksParamsWithHTTPClient creates a new OrgListHooksParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewOrgListHooksParamsWithHTTPClient(client *http.Client) *OrgListHooksParams {
+	return &OrgListHooksParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+OrgListHooksParams contains all the parameters to send to the API endpoint
+
+	for the org list hooks operation.
+
+	Typically these are written to a http.Request.
+*/
+type OrgListHooksParams struct {
+
+	/* Limit.
+
+	   page size of results
+	*/
+	Limit *int64
+
+	/* Org.
+
+	   name of the organization
+	*/
+	Org string
+
+	/* Page.
+
+	   page number of results to return (1-based)
+	*/
+	Page *int64
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the org list hooks params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgListHooksParams) WithDefaults() *OrgListHooksParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the org list hooks params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgListHooksParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the org list hooks params
+func (o *OrgListHooksParams) WithTimeout(timeout time.Duration) *OrgListHooksParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the org list hooks params
+func (o *OrgListHooksParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the org list hooks params
+func (o *OrgListHooksParams) WithContext(ctx context.Context) *OrgListHooksParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the org list hooks params
+func (o *OrgListHooksParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the org list hooks params
+func (o *OrgListHooksParams) WithHTTPClient(client *http.Client) *OrgListHooksParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the org list hooks params
+func (o *OrgListHooksParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithLimit adds the limit to the org list hooks params
+func (o *OrgListHooksParams) WithLimit(limit *int64) *OrgListHooksParams {
+	o.SetLimit(limit)
+	return o
+}
+
+// SetLimit adds the limit to the org list hooks params
+func (o *OrgListHooksParams) SetLimit(limit *int64) {
+	o.Limit = limit
+}
+
+// WithOrg adds the org to the org list hooks params
+func (o *OrgListHooksParams) WithOrg(org string) *OrgListHooksParams {
+	o.SetOrg(org)
+	return o
+}
+
+// SetOrg adds the org to the org list hooks params
+func (o *OrgListHooksParams) SetOrg(org string) {
+	o.Org = org
+}
+
+// WithPage adds the page to the org list hooks params
+func (o *OrgListHooksParams) WithPage(page *int64) *OrgListHooksParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the org list hooks params
+func (o *OrgListHooksParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *OrgListHooksParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.Limit != nil {
+
+		// query param limit
+		var qrLimit int64
+
+		if o.Limit != nil {
+			qrLimit = *o.Limit
+		}
+		qLimit := swag.FormatInt64(qrLimit)
+		if qLimit != "" {
+
+			if err := r.SetQueryParam("limit", qLimit); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param org
+	if err := r.SetPathParam("org", o.Org); err != nil {
+		return err
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_list_hooks_responses.go b/bots-common/gitea-generated/client/organization/org_list_hooks_responses.go
new file mode 100644
index 0000000..b072960
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_list_hooks_responses.go
@@ -0,0 +1,166 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// OrgListHooksReader is a Reader for the OrgListHooks structure.
+type OrgListHooksReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *OrgListHooksReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewOrgListHooksOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewOrgListHooksNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /orgs/{org}/hooks] orgListHooks", response, response.Code())
+	}
+}
+
+// NewOrgListHooksOK creates a OrgListHooksOK with default headers values
+func NewOrgListHooksOK() *OrgListHooksOK {
+	return &OrgListHooksOK{}
+}
+
+/*
+OrgListHooksOK describes a response with status code 200, with default header values.
+
+HookList
+*/
+type OrgListHooksOK struct {
+	Payload []*models.Hook
+}
+
+// IsSuccess returns true when this org list hooks o k response has a 2xx status code
+func (o *OrgListHooksOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this org list hooks o k response has a 3xx status code
+func (o *OrgListHooksOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org list hooks o k response has a 4xx status code
+func (o *OrgListHooksOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this org list hooks o k response has a 5xx status code
+func (o *OrgListHooksOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org list hooks o k response a status code equal to that given
+func (o *OrgListHooksOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the org list hooks o k response
+func (o *OrgListHooksOK) Code() int {
+	return 200
+}
+
+func (o *OrgListHooksOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /orgs/{org}/hooks][%d] orgListHooksOK %s", 200, payload)
+}
+
+func (o *OrgListHooksOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /orgs/{org}/hooks][%d] orgListHooksOK %s", 200, payload)
+}
+
+func (o *OrgListHooksOK) GetPayload() []*models.Hook {
+	return o.Payload
+}
+
+func (o *OrgListHooksOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewOrgListHooksNotFound creates a OrgListHooksNotFound with default headers values
+func NewOrgListHooksNotFound() *OrgListHooksNotFound {
+	return &OrgListHooksNotFound{}
+}
+
+/*
+OrgListHooksNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type OrgListHooksNotFound struct {
+}
+
+// IsSuccess returns true when this org list hooks not found response has a 2xx status code
+func (o *OrgListHooksNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this org list hooks not found response has a 3xx status code
+func (o *OrgListHooksNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org list hooks not found response has a 4xx status code
+func (o *OrgListHooksNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this org list hooks not found response has a 5xx status code
+func (o *OrgListHooksNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org list hooks not found response a status code equal to that given
+func (o *OrgListHooksNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the org list hooks not found response
+func (o *OrgListHooksNotFound) Code() int {
+	return 404
+}
+
+func (o *OrgListHooksNotFound) Error() string {
+	return fmt.Sprintf("[GET /orgs/{org}/hooks][%d] orgListHooksNotFound", 404)
+}
+
+func (o *OrgListHooksNotFound) String() string {
+	return fmt.Sprintf("[GET /orgs/{org}/hooks][%d] orgListHooksNotFound", 404)
+}
+
+func (o *OrgListHooksNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_list_labels_parameters.go b/bots-common/gitea-generated/client/organization/org_list_labels_parameters.go
new file mode 100644
index 0000000..4dee385
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_list_labels_parameters.go
@@ -0,0 +1,220 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewOrgListLabelsParams creates a new OrgListLabelsParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewOrgListLabelsParams() *OrgListLabelsParams {
+	return &OrgListLabelsParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewOrgListLabelsParamsWithTimeout creates a new OrgListLabelsParams object
+// with the ability to set a timeout on a request.
+func NewOrgListLabelsParamsWithTimeout(timeout time.Duration) *OrgListLabelsParams {
+	return &OrgListLabelsParams{
+		timeout: timeout,
+	}
+}
+
+// NewOrgListLabelsParamsWithContext creates a new OrgListLabelsParams object
+// with the ability to set a context for a request.
+func NewOrgListLabelsParamsWithContext(ctx context.Context) *OrgListLabelsParams {
+	return &OrgListLabelsParams{
+		Context: ctx,
+	}
+}
+
+// NewOrgListLabelsParamsWithHTTPClient creates a new OrgListLabelsParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewOrgListLabelsParamsWithHTTPClient(client *http.Client) *OrgListLabelsParams {
+	return &OrgListLabelsParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+OrgListLabelsParams contains all the parameters to send to the API endpoint
+
+	for the org list labels operation.
+
+	Typically these are written to a http.Request.
+*/
+type OrgListLabelsParams struct {
+
+	/* Limit.
+
+	   page size of results
+	*/
+	Limit *int64
+
+	/* Org.
+
+	   name of the organization
+	*/
+	Org string
+
+	/* Page.
+
+	   page number of results to return (1-based)
+	*/
+	Page *int64
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the org list labels params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgListLabelsParams) WithDefaults() *OrgListLabelsParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the org list labels params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgListLabelsParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the org list labels params
+func (o *OrgListLabelsParams) WithTimeout(timeout time.Duration) *OrgListLabelsParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the org list labels params
+func (o *OrgListLabelsParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the org list labels params
+func (o *OrgListLabelsParams) WithContext(ctx context.Context) *OrgListLabelsParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the org list labels params
+func (o *OrgListLabelsParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the org list labels params
+func (o *OrgListLabelsParams) WithHTTPClient(client *http.Client) *OrgListLabelsParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the org list labels params
+func (o *OrgListLabelsParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithLimit adds the limit to the org list labels params
+func (o *OrgListLabelsParams) WithLimit(limit *int64) *OrgListLabelsParams {
+	o.SetLimit(limit)
+	return o
+}
+
+// SetLimit adds the limit to the org list labels params
+func (o *OrgListLabelsParams) SetLimit(limit *int64) {
+	o.Limit = limit
+}
+
+// WithOrg adds the org to the org list labels params
+func (o *OrgListLabelsParams) WithOrg(org string) *OrgListLabelsParams {
+	o.SetOrg(org)
+	return o
+}
+
+// SetOrg adds the org to the org list labels params
+func (o *OrgListLabelsParams) SetOrg(org string) {
+	o.Org = org
+}
+
+// WithPage adds the page to the org list labels params
+func (o *OrgListLabelsParams) WithPage(page *int64) *OrgListLabelsParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the org list labels params
+func (o *OrgListLabelsParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *OrgListLabelsParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.Limit != nil {
+
+		// query param limit
+		var qrLimit int64
+
+		if o.Limit != nil {
+			qrLimit = *o.Limit
+		}
+		qLimit := swag.FormatInt64(qrLimit)
+		if qLimit != "" {
+
+			if err := r.SetQueryParam("limit", qLimit); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param org
+	if err := r.SetPathParam("org", o.Org); err != nil {
+		return err
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_list_labels_responses.go b/bots-common/gitea-generated/client/organization/org_list_labels_responses.go
new file mode 100644
index 0000000..d1b45ea
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_list_labels_responses.go
@@ -0,0 +1,166 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// OrgListLabelsReader is a Reader for the OrgListLabels structure.
+type OrgListLabelsReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *OrgListLabelsReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewOrgListLabelsOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewOrgListLabelsNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /orgs/{org}/labels] orgListLabels", response, response.Code())
+	}
+}
+
+// NewOrgListLabelsOK creates a OrgListLabelsOK with default headers values
+func NewOrgListLabelsOK() *OrgListLabelsOK {
+	return &OrgListLabelsOK{}
+}
+
+/*
+OrgListLabelsOK describes a response with status code 200, with default header values.
+
+LabelList
+*/
+type OrgListLabelsOK struct {
+	Payload []*models.Label
+}
+
+// IsSuccess returns true when this org list labels o k response has a 2xx status code
+func (o *OrgListLabelsOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this org list labels o k response has a 3xx status code
+func (o *OrgListLabelsOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org list labels o k response has a 4xx status code
+func (o *OrgListLabelsOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this org list labels o k response has a 5xx status code
+func (o *OrgListLabelsOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org list labels o k response a status code equal to that given
+func (o *OrgListLabelsOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the org list labels o k response
+func (o *OrgListLabelsOK) Code() int {
+	return 200
+}
+
+func (o *OrgListLabelsOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /orgs/{org}/labels][%d] orgListLabelsOK %s", 200, payload)
+}
+
+func (o *OrgListLabelsOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /orgs/{org}/labels][%d] orgListLabelsOK %s", 200, payload)
+}
+
+func (o *OrgListLabelsOK) GetPayload() []*models.Label {
+	return o.Payload
+}
+
+func (o *OrgListLabelsOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewOrgListLabelsNotFound creates a OrgListLabelsNotFound with default headers values
+func NewOrgListLabelsNotFound() *OrgListLabelsNotFound {
+	return &OrgListLabelsNotFound{}
+}
+
+/*
+OrgListLabelsNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type OrgListLabelsNotFound struct {
+}
+
+// IsSuccess returns true when this org list labels not found response has a 2xx status code
+func (o *OrgListLabelsNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this org list labels not found response has a 3xx status code
+func (o *OrgListLabelsNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org list labels not found response has a 4xx status code
+func (o *OrgListLabelsNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this org list labels not found response has a 5xx status code
+func (o *OrgListLabelsNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org list labels not found response a status code equal to that given
+func (o *OrgListLabelsNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the org list labels not found response
+func (o *OrgListLabelsNotFound) Code() int {
+	return 404
+}
+
+func (o *OrgListLabelsNotFound) Error() string {
+	return fmt.Sprintf("[GET /orgs/{org}/labels][%d] orgListLabelsNotFound", 404)
+}
+
+func (o *OrgListLabelsNotFound) String() string {
+	return fmt.Sprintf("[GET /orgs/{org}/labels][%d] orgListLabelsNotFound", 404)
+}
+
+func (o *OrgListLabelsNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_list_members_parameters.go b/bots-common/gitea-generated/client/organization/org_list_members_parameters.go
new file mode 100644
index 0000000..a0eb708
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_list_members_parameters.go
@@ -0,0 +1,220 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewOrgListMembersParams creates a new OrgListMembersParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewOrgListMembersParams() *OrgListMembersParams {
+	return &OrgListMembersParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewOrgListMembersParamsWithTimeout creates a new OrgListMembersParams object
+// with the ability to set a timeout on a request.
+func NewOrgListMembersParamsWithTimeout(timeout time.Duration) *OrgListMembersParams {
+	return &OrgListMembersParams{
+		timeout: timeout,
+	}
+}
+
+// NewOrgListMembersParamsWithContext creates a new OrgListMembersParams object
+// with the ability to set a context for a request.
+func NewOrgListMembersParamsWithContext(ctx context.Context) *OrgListMembersParams {
+	return &OrgListMembersParams{
+		Context: ctx,
+	}
+}
+
+// NewOrgListMembersParamsWithHTTPClient creates a new OrgListMembersParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewOrgListMembersParamsWithHTTPClient(client *http.Client) *OrgListMembersParams {
+	return &OrgListMembersParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+OrgListMembersParams contains all the parameters to send to the API endpoint
+
+	for the org list members operation.
+
+	Typically these are written to a http.Request.
+*/
+type OrgListMembersParams struct {
+
+	/* Limit.
+
+	   page size of results
+	*/
+	Limit *int64
+
+	/* Org.
+
+	   name of the organization
+	*/
+	Org string
+
+	/* Page.
+
+	   page number of results to return (1-based)
+	*/
+	Page *int64
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the org list members params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgListMembersParams) WithDefaults() *OrgListMembersParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the org list members params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgListMembersParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the org list members params
+func (o *OrgListMembersParams) WithTimeout(timeout time.Duration) *OrgListMembersParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the org list members params
+func (o *OrgListMembersParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the org list members params
+func (o *OrgListMembersParams) WithContext(ctx context.Context) *OrgListMembersParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the org list members params
+func (o *OrgListMembersParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the org list members params
+func (o *OrgListMembersParams) WithHTTPClient(client *http.Client) *OrgListMembersParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the org list members params
+func (o *OrgListMembersParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithLimit adds the limit to the org list members params
+func (o *OrgListMembersParams) WithLimit(limit *int64) *OrgListMembersParams {
+	o.SetLimit(limit)
+	return o
+}
+
+// SetLimit adds the limit to the org list members params
+func (o *OrgListMembersParams) SetLimit(limit *int64) {
+	o.Limit = limit
+}
+
+// WithOrg adds the org to the org list members params
+func (o *OrgListMembersParams) WithOrg(org string) *OrgListMembersParams {
+	o.SetOrg(org)
+	return o
+}
+
+// SetOrg adds the org to the org list members params
+func (o *OrgListMembersParams) SetOrg(org string) {
+	o.Org = org
+}
+
+// WithPage adds the page to the org list members params
+func (o *OrgListMembersParams) WithPage(page *int64) *OrgListMembersParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the org list members params
+func (o *OrgListMembersParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *OrgListMembersParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.Limit != nil {
+
+		// query param limit
+		var qrLimit int64
+
+		if o.Limit != nil {
+			qrLimit = *o.Limit
+		}
+		qLimit := swag.FormatInt64(qrLimit)
+		if qLimit != "" {
+
+			if err := r.SetQueryParam("limit", qLimit); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param org
+	if err := r.SetPathParam("org", o.Org); err != nil {
+		return err
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_list_members_responses.go b/bots-common/gitea-generated/client/organization/org_list_members_responses.go
new file mode 100644
index 0000000..bb6a3ca
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_list_members_responses.go
@@ -0,0 +1,166 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// OrgListMembersReader is a Reader for the OrgListMembers structure.
+type OrgListMembersReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *OrgListMembersReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewOrgListMembersOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewOrgListMembersNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /orgs/{org}/members] orgListMembers", response, response.Code())
+	}
+}
+
+// NewOrgListMembersOK creates a OrgListMembersOK with default headers values
+func NewOrgListMembersOK() *OrgListMembersOK {
+	return &OrgListMembersOK{}
+}
+
+/*
+OrgListMembersOK describes a response with status code 200, with default header values.
+
+UserList
+*/
+type OrgListMembersOK struct {
+	Payload []*models.User
+}
+
+// IsSuccess returns true when this org list members o k response has a 2xx status code
+func (o *OrgListMembersOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this org list members o k response has a 3xx status code
+func (o *OrgListMembersOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org list members o k response has a 4xx status code
+func (o *OrgListMembersOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this org list members o k response has a 5xx status code
+func (o *OrgListMembersOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org list members o k response a status code equal to that given
+func (o *OrgListMembersOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the org list members o k response
+func (o *OrgListMembersOK) Code() int {
+	return 200
+}
+
+func (o *OrgListMembersOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /orgs/{org}/members][%d] orgListMembersOK %s", 200, payload)
+}
+
+func (o *OrgListMembersOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /orgs/{org}/members][%d] orgListMembersOK %s", 200, payload)
+}
+
+func (o *OrgListMembersOK) GetPayload() []*models.User {
+	return o.Payload
+}
+
+func (o *OrgListMembersOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewOrgListMembersNotFound creates a OrgListMembersNotFound with default headers values
+func NewOrgListMembersNotFound() *OrgListMembersNotFound {
+	return &OrgListMembersNotFound{}
+}
+
+/*
+OrgListMembersNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type OrgListMembersNotFound struct {
+}
+
+// IsSuccess returns true when this org list members not found response has a 2xx status code
+func (o *OrgListMembersNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this org list members not found response has a 3xx status code
+func (o *OrgListMembersNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org list members not found response has a 4xx status code
+func (o *OrgListMembersNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this org list members not found response has a 5xx status code
+func (o *OrgListMembersNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org list members not found response a status code equal to that given
+func (o *OrgListMembersNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the org list members not found response
+func (o *OrgListMembersNotFound) Code() int {
+	return 404
+}
+
+func (o *OrgListMembersNotFound) Error() string {
+	return fmt.Sprintf("[GET /orgs/{org}/members][%d] orgListMembersNotFound", 404)
+}
+
+func (o *OrgListMembersNotFound) String() string {
+	return fmt.Sprintf("[GET /orgs/{org}/members][%d] orgListMembersNotFound", 404)
+}
+
+func (o *OrgListMembersNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_list_public_members_parameters.go b/bots-common/gitea-generated/client/organization/org_list_public_members_parameters.go
new file mode 100644
index 0000000..3296c73
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_list_public_members_parameters.go
@@ -0,0 +1,220 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewOrgListPublicMembersParams creates a new OrgListPublicMembersParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewOrgListPublicMembersParams() *OrgListPublicMembersParams {
+	return &OrgListPublicMembersParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewOrgListPublicMembersParamsWithTimeout creates a new OrgListPublicMembersParams object
+// with the ability to set a timeout on a request.
+func NewOrgListPublicMembersParamsWithTimeout(timeout time.Duration) *OrgListPublicMembersParams {
+	return &OrgListPublicMembersParams{
+		timeout: timeout,
+	}
+}
+
+// NewOrgListPublicMembersParamsWithContext creates a new OrgListPublicMembersParams object
+// with the ability to set a context for a request.
+func NewOrgListPublicMembersParamsWithContext(ctx context.Context) *OrgListPublicMembersParams {
+	return &OrgListPublicMembersParams{
+		Context: ctx,
+	}
+}
+
+// NewOrgListPublicMembersParamsWithHTTPClient creates a new OrgListPublicMembersParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewOrgListPublicMembersParamsWithHTTPClient(client *http.Client) *OrgListPublicMembersParams {
+	return &OrgListPublicMembersParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+OrgListPublicMembersParams contains all the parameters to send to the API endpoint
+
+	for the org list public members operation.
+
+	Typically these are written to a http.Request.
+*/
+type OrgListPublicMembersParams struct {
+
+	/* Limit.
+
+	   page size of results
+	*/
+	Limit *int64
+
+	/* Org.
+
+	   name of the organization
+	*/
+	Org string
+
+	/* Page.
+
+	   page number of results to return (1-based)
+	*/
+	Page *int64
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the org list public members params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgListPublicMembersParams) WithDefaults() *OrgListPublicMembersParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the org list public members params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgListPublicMembersParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the org list public members params
+func (o *OrgListPublicMembersParams) WithTimeout(timeout time.Duration) *OrgListPublicMembersParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the org list public members params
+func (o *OrgListPublicMembersParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the org list public members params
+func (o *OrgListPublicMembersParams) WithContext(ctx context.Context) *OrgListPublicMembersParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the org list public members params
+func (o *OrgListPublicMembersParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the org list public members params
+func (o *OrgListPublicMembersParams) WithHTTPClient(client *http.Client) *OrgListPublicMembersParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the org list public members params
+func (o *OrgListPublicMembersParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithLimit adds the limit to the org list public members params
+func (o *OrgListPublicMembersParams) WithLimit(limit *int64) *OrgListPublicMembersParams {
+	o.SetLimit(limit)
+	return o
+}
+
+// SetLimit adds the limit to the org list public members params
+func (o *OrgListPublicMembersParams) SetLimit(limit *int64) {
+	o.Limit = limit
+}
+
+// WithOrg adds the org to the org list public members params
+func (o *OrgListPublicMembersParams) WithOrg(org string) *OrgListPublicMembersParams {
+	o.SetOrg(org)
+	return o
+}
+
+// SetOrg adds the org to the org list public members params
+func (o *OrgListPublicMembersParams) SetOrg(org string) {
+	o.Org = org
+}
+
+// WithPage adds the page to the org list public members params
+func (o *OrgListPublicMembersParams) WithPage(page *int64) *OrgListPublicMembersParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the org list public members params
+func (o *OrgListPublicMembersParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *OrgListPublicMembersParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.Limit != nil {
+
+		// query param limit
+		var qrLimit int64
+
+		if o.Limit != nil {
+			qrLimit = *o.Limit
+		}
+		qLimit := swag.FormatInt64(qrLimit)
+		if qLimit != "" {
+
+			if err := r.SetQueryParam("limit", qLimit); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param org
+	if err := r.SetPathParam("org", o.Org); err != nil {
+		return err
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_list_public_members_responses.go b/bots-common/gitea-generated/client/organization/org_list_public_members_responses.go
new file mode 100644
index 0000000..339718e
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_list_public_members_responses.go
@@ -0,0 +1,166 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// OrgListPublicMembersReader is a Reader for the OrgListPublicMembers structure.
+type OrgListPublicMembersReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *OrgListPublicMembersReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewOrgListPublicMembersOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewOrgListPublicMembersNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /orgs/{org}/public_members] orgListPublicMembers", response, response.Code())
+	}
+}
+
+// NewOrgListPublicMembersOK creates a OrgListPublicMembersOK with default headers values
+func NewOrgListPublicMembersOK() *OrgListPublicMembersOK {
+	return &OrgListPublicMembersOK{}
+}
+
+/*
+OrgListPublicMembersOK describes a response with status code 200, with default header values.
+
+UserList
+*/
+type OrgListPublicMembersOK struct {
+	Payload []*models.User
+}
+
+// IsSuccess returns true when this org list public members o k response has a 2xx status code
+func (o *OrgListPublicMembersOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this org list public members o k response has a 3xx status code
+func (o *OrgListPublicMembersOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org list public members o k response has a 4xx status code
+func (o *OrgListPublicMembersOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this org list public members o k response has a 5xx status code
+func (o *OrgListPublicMembersOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org list public members o k response a status code equal to that given
+func (o *OrgListPublicMembersOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the org list public members o k response
+func (o *OrgListPublicMembersOK) Code() int {
+	return 200
+}
+
+func (o *OrgListPublicMembersOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /orgs/{org}/public_members][%d] orgListPublicMembersOK %s", 200, payload)
+}
+
+func (o *OrgListPublicMembersOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /orgs/{org}/public_members][%d] orgListPublicMembersOK %s", 200, payload)
+}
+
+func (o *OrgListPublicMembersOK) GetPayload() []*models.User {
+	return o.Payload
+}
+
+func (o *OrgListPublicMembersOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewOrgListPublicMembersNotFound creates a OrgListPublicMembersNotFound with default headers values
+func NewOrgListPublicMembersNotFound() *OrgListPublicMembersNotFound {
+	return &OrgListPublicMembersNotFound{}
+}
+
+/*
+OrgListPublicMembersNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type OrgListPublicMembersNotFound struct {
+}
+
+// IsSuccess returns true when this org list public members not found response has a 2xx status code
+func (o *OrgListPublicMembersNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this org list public members not found response has a 3xx status code
+func (o *OrgListPublicMembersNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org list public members not found response has a 4xx status code
+func (o *OrgListPublicMembersNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this org list public members not found response has a 5xx status code
+func (o *OrgListPublicMembersNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org list public members not found response a status code equal to that given
+func (o *OrgListPublicMembersNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the org list public members not found response
+func (o *OrgListPublicMembersNotFound) Code() int {
+	return 404
+}
+
+func (o *OrgListPublicMembersNotFound) Error() string {
+	return fmt.Sprintf("[GET /orgs/{org}/public_members][%d] orgListPublicMembersNotFound", 404)
+}
+
+func (o *OrgListPublicMembersNotFound) String() string {
+	return fmt.Sprintf("[GET /orgs/{org}/public_members][%d] orgListPublicMembersNotFound", 404)
+}
+
+func (o *OrgListPublicMembersNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_list_repos_parameters.go b/bots-common/gitea-generated/client/organization/org_list_repos_parameters.go
new file mode 100644
index 0000000..b09b71c
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_list_repos_parameters.go
@@ -0,0 +1,220 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewOrgListReposParams creates a new OrgListReposParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewOrgListReposParams() *OrgListReposParams {
+	return &OrgListReposParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewOrgListReposParamsWithTimeout creates a new OrgListReposParams object
+// with the ability to set a timeout on a request.
+func NewOrgListReposParamsWithTimeout(timeout time.Duration) *OrgListReposParams {
+	return &OrgListReposParams{
+		timeout: timeout,
+	}
+}
+
+// NewOrgListReposParamsWithContext creates a new OrgListReposParams object
+// with the ability to set a context for a request.
+func NewOrgListReposParamsWithContext(ctx context.Context) *OrgListReposParams {
+	return &OrgListReposParams{
+		Context: ctx,
+	}
+}
+
+// NewOrgListReposParamsWithHTTPClient creates a new OrgListReposParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewOrgListReposParamsWithHTTPClient(client *http.Client) *OrgListReposParams {
+	return &OrgListReposParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+OrgListReposParams contains all the parameters to send to the API endpoint
+
+	for the org list repos operation.
+
+	Typically these are written to a http.Request.
+*/
+type OrgListReposParams struct {
+
+	/* Limit.
+
+	   page size of results
+	*/
+	Limit *int64
+
+	/* Org.
+
+	   name of the organization
+	*/
+	Org string
+
+	/* Page.
+
+	   page number of results to return (1-based)
+	*/
+	Page *int64
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the org list repos params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgListReposParams) WithDefaults() *OrgListReposParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the org list repos params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgListReposParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the org list repos params
+func (o *OrgListReposParams) WithTimeout(timeout time.Duration) *OrgListReposParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the org list repos params
+func (o *OrgListReposParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the org list repos params
+func (o *OrgListReposParams) WithContext(ctx context.Context) *OrgListReposParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the org list repos params
+func (o *OrgListReposParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the org list repos params
+func (o *OrgListReposParams) WithHTTPClient(client *http.Client) *OrgListReposParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the org list repos params
+func (o *OrgListReposParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithLimit adds the limit to the org list repos params
+func (o *OrgListReposParams) WithLimit(limit *int64) *OrgListReposParams {
+	o.SetLimit(limit)
+	return o
+}
+
+// SetLimit adds the limit to the org list repos params
+func (o *OrgListReposParams) SetLimit(limit *int64) {
+	o.Limit = limit
+}
+
+// WithOrg adds the org to the org list repos params
+func (o *OrgListReposParams) WithOrg(org string) *OrgListReposParams {
+	o.SetOrg(org)
+	return o
+}
+
+// SetOrg adds the org to the org list repos params
+func (o *OrgListReposParams) SetOrg(org string) {
+	o.Org = org
+}
+
+// WithPage adds the page to the org list repos params
+func (o *OrgListReposParams) WithPage(page *int64) *OrgListReposParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the org list repos params
+func (o *OrgListReposParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *OrgListReposParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.Limit != nil {
+
+		// query param limit
+		var qrLimit int64
+
+		if o.Limit != nil {
+			qrLimit = *o.Limit
+		}
+		qLimit := swag.FormatInt64(qrLimit)
+		if qLimit != "" {
+
+			if err := r.SetQueryParam("limit", qLimit); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param org
+	if err := r.SetPathParam("org", o.Org); err != nil {
+		return err
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_list_repos_responses.go b/bots-common/gitea-generated/client/organization/org_list_repos_responses.go
new file mode 100644
index 0000000..3696651
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_list_repos_responses.go
@@ -0,0 +1,166 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// OrgListReposReader is a Reader for the OrgListRepos structure.
+type OrgListReposReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *OrgListReposReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewOrgListReposOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewOrgListReposNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /orgs/{org}/repos] orgListRepos", response, response.Code())
+	}
+}
+
+// NewOrgListReposOK creates a OrgListReposOK with default headers values
+func NewOrgListReposOK() *OrgListReposOK {
+	return &OrgListReposOK{}
+}
+
+/*
+OrgListReposOK describes a response with status code 200, with default header values.
+
+RepositoryList
+*/
+type OrgListReposOK struct {
+	Payload []*models.Repository
+}
+
+// IsSuccess returns true when this org list repos o k response has a 2xx status code
+func (o *OrgListReposOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this org list repos o k response has a 3xx status code
+func (o *OrgListReposOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org list repos o k response has a 4xx status code
+func (o *OrgListReposOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this org list repos o k response has a 5xx status code
+func (o *OrgListReposOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org list repos o k response a status code equal to that given
+func (o *OrgListReposOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the org list repos o k response
+func (o *OrgListReposOK) Code() int {
+	return 200
+}
+
+func (o *OrgListReposOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /orgs/{org}/repos][%d] orgListReposOK %s", 200, payload)
+}
+
+func (o *OrgListReposOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /orgs/{org}/repos][%d] orgListReposOK %s", 200, payload)
+}
+
+func (o *OrgListReposOK) GetPayload() []*models.Repository {
+	return o.Payload
+}
+
+func (o *OrgListReposOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewOrgListReposNotFound creates a OrgListReposNotFound with default headers values
+func NewOrgListReposNotFound() *OrgListReposNotFound {
+	return &OrgListReposNotFound{}
+}
+
+/*
+OrgListReposNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type OrgListReposNotFound struct {
+}
+
+// IsSuccess returns true when this org list repos not found response has a 2xx status code
+func (o *OrgListReposNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this org list repos not found response has a 3xx status code
+func (o *OrgListReposNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org list repos not found response has a 4xx status code
+func (o *OrgListReposNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this org list repos not found response has a 5xx status code
+func (o *OrgListReposNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org list repos not found response a status code equal to that given
+func (o *OrgListReposNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the org list repos not found response
+func (o *OrgListReposNotFound) Code() int {
+	return 404
+}
+
+func (o *OrgListReposNotFound) Error() string {
+	return fmt.Sprintf("[GET /orgs/{org}/repos][%d] orgListReposNotFound", 404)
+}
+
+func (o *OrgListReposNotFound) String() string {
+	return fmt.Sprintf("[GET /orgs/{org}/repos][%d] orgListReposNotFound", 404)
+}
+
+func (o *OrgListReposNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_list_team_activity_feeds_parameters.go b/bots-common/gitea-generated/client/organization/org_list_team_activity_feeds_parameters.go
new file mode 100644
index 0000000..1f65ee0
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_list_team_activity_feeds_parameters.go
@@ -0,0 +1,258 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewOrgListTeamActivityFeedsParams creates a new OrgListTeamActivityFeedsParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewOrgListTeamActivityFeedsParams() *OrgListTeamActivityFeedsParams {
+	return &OrgListTeamActivityFeedsParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewOrgListTeamActivityFeedsParamsWithTimeout creates a new OrgListTeamActivityFeedsParams object
+// with the ability to set a timeout on a request.
+func NewOrgListTeamActivityFeedsParamsWithTimeout(timeout time.Duration) *OrgListTeamActivityFeedsParams {
+	return &OrgListTeamActivityFeedsParams{
+		timeout: timeout,
+	}
+}
+
+// NewOrgListTeamActivityFeedsParamsWithContext creates a new OrgListTeamActivityFeedsParams object
+// with the ability to set a context for a request.
+func NewOrgListTeamActivityFeedsParamsWithContext(ctx context.Context) *OrgListTeamActivityFeedsParams {
+	return &OrgListTeamActivityFeedsParams{
+		Context: ctx,
+	}
+}
+
+// NewOrgListTeamActivityFeedsParamsWithHTTPClient creates a new OrgListTeamActivityFeedsParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewOrgListTeamActivityFeedsParamsWithHTTPClient(client *http.Client) *OrgListTeamActivityFeedsParams {
+	return &OrgListTeamActivityFeedsParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+OrgListTeamActivityFeedsParams contains all the parameters to send to the API endpoint
+
+	for the org list team activity feeds operation.
+
+	Typically these are written to a http.Request.
+*/
+type OrgListTeamActivityFeedsParams struct {
+
+	/* Date.
+
+	   the date of the activities to be found
+
+	   Format: date
+	*/
+	Date *strfmt.Date
+
+	/* ID.
+
+	   id of the team
+
+	   Format: int64
+	*/
+	ID int64
+
+	/* Limit.
+
+	   page size of results
+	*/
+	Limit *int64
+
+	/* Page.
+
+	   page number of results to return (1-based)
+	*/
+	Page *int64
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the org list team activity feeds params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgListTeamActivityFeedsParams) WithDefaults() *OrgListTeamActivityFeedsParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the org list team activity feeds params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgListTeamActivityFeedsParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the org list team activity feeds params
+func (o *OrgListTeamActivityFeedsParams) WithTimeout(timeout time.Duration) *OrgListTeamActivityFeedsParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the org list team activity feeds params
+func (o *OrgListTeamActivityFeedsParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the org list team activity feeds params
+func (o *OrgListTeamActivityFeedsParams) WithContext(ctx context.Context) *OrgListTeamActivityFeedsParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the org list team activity feeds params
+func (o *OrgListTeamActivityFeedsParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the org list team activity feeds params
+func (o *OrgListTeamActivityFeedsParams) WithHTTPClient(client *http.Client) *OrgListTeamActivityFeedsParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the org list team activity feeds params
+func (o *OrgListTeamActivityFeedsParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithDate adds the date to the org list team activity feeds params
+func (o *OrgListTeamActivityFeedsParams) WithDate(date *strfmt.Date) *OrgListTeamActivityFeedsParams {
+	o.SetDate(date)
+	return o
+}
+
+// SetDate adds the date to the org list team activity feeds params
+func (o *OrgListTeamActivityFeedsParams) SetDate(date *strfmt.Date) {
+	o.Date = date
+}
+
+// WithID adds the id to the org list team activity feeds params
+func (o *OrgListTeamActivityFeedsParams) WithID(id int64) *OrgListTeamActivityFeedsParams {
+	o.SetID(id)
+	return o
+}
+
+// SetID adds the id to the org list team activity feeds params
+func (o *OrgListTeamActivityFeedsParams) SetID(id int64) {
+	o.ID = id
+}
+
+// WithLimit adds the limit to the org list team activity feeds params
+func (o *OrgListTeamActivityFeedsParams) WithLimit(limit *int64) *OrgListTeamActivityFeedsParams {
+	o.SetLimit(limit)
+	return o
+}
+
+// SetLimit adds the limit to the org list team activity feeds params
+func (o *OrgListTeamActivityFeedsParams) SetLimit(limit *int64) {
+	o.Limit = limit
+}
+
+// WithPage adds the page to the org list team activity feeds params
+func (o *OrgListTeamActivityFeedsParams) WithPage(page *int64) *OrgListTeamActivityFeedsParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the org list team activity feeds params
+func (o *OrgListTeamActivityFeedsParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *OrgListTeamActivityFeedsParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.Date != nil {
+
+		// query param date
+		var qrDate strfmt.Date
+
+		if o.Date != nil {
+			qrDate = *o.Date
+		}
+		qDate := qrDate.String()
+		if qDate != "" {
+
+			if err := r.SetQueryParam("date", qDate); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param id
+	if err := r.SetPathParam("id", swag.FormatInt64(o.ID)); err != nil {
+		return err
+	}
+
+	if o.Limit != nil {
+
+		// query param limit
+		var qrLimit int64
+
+		if o.Limit != nil {
+			qrLimit = *o.Limit
+		}
+		qLimit := swag.FormatInt64(qrLimit)
+		if qLimit != "" {
+
+			if err := r.SetQueryParam("limit", qLimit); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_list_team_activity_feeds_responses.go b/bots-common/gitea-generated/client/organization/org_list_team_activity_feeds_responses.go
new file mode 100644
index 0000000..a97fbce
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_list_team_activity_feeds_responses.go
@@ -0,0 +1,166 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// OrgListTeamActivityFeedsReader is a Reader for the OrgListTeamActivityFeeds structure.
+type OrgListTeamActivityFeedsReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *OrgListTeamActivityFeedsReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewOrgListTeamActivityFeedsOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewOrgListTeamActivityFeedsNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /teams/{id}/activities/feeds] orgListTeamActivityFeeds", response, response.Code())
+	}
+}
+
+// NewOrgListTeamActivityFeedsOK creates a OrgListTeamActivityFeedsOK with default headers values
+func NewOrgListTeamActivityFeedsOK() *OrgListTeamActivityFeedsOK {
+	return &OrgListTeamActivityFeedsOK{}
+}
+
+/*
+OrgListTeamActivityFeedsOK describes a response with status code 200, with default header values.
+
+ActivityFeedsList
+*/
+type OrgListTeamActivityFeedsOK struct {
+	Payload []*models.Activity
+}
+
+// IsSuccess returns true when this org list team activity feeds o k response has a 2xx status code
+func (o *OrgListTeamActivityFeedsOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this org list team activity feeds o k response has a 3xx status code
+func (o *OrgListTeamActivityFeedsOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org list team activity feeds o k response has a 4xx status code
+func (o *OrgListTeamActivityFeedsOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this org list team activity feeds o k response has a 5xx status code
+func (o *OrgListTeamActivityFeedsOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org list team activity feeds o k response a status code equal to that given
+func (o *OrgListTeamActivityFeedsOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the org list team activity feeds o k response
+func (o *OrgListTeamActivityFeedsOK) Code() int {
+	return 200
+}
+
+func (o *OrgListTeamActivityFeedsOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /teams/{id}/activities/feeds][%d] orgListTeamActivityFeedsOK %s", 200, payload)
+}
+
+func (o *OrgListTeamActivityFeedsOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /teams/{id}/activities/feeds][%d] orgListTeamActivityFeedsOK %s", 200, payload)
+}
+
+func (o *OrgListTeamActivityFeedsOK) GetPayload() []*models.Activity {
+	return o.Payload
+}
+
+func (o *OrgListTeamActivityFeedsOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewOrgListTeamActivityFeedsNotFound creates a OrgListTeamActivityFeedsNotFound with default headers values
+func NewOrgListTeamActivityFeedsNotFound() *OrgListTeamActivityFeedsNotFound {
+	return &OrgListTeamActivityFeedsNotFound{}
+}
+
+/*
+OrgListTeamActivityFeedsNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type OrgListTeamActivityFeedsNotFound struct {
+}
+
+// IsSuccess returns true when this org list team activity feeds not found response has a 2xx status code
+func (o *OrgListTeamActivityFeedsNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this org list team activity feeds not found response has a 3xx status code
+func (o *OrgListTeamActivityFeedsNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org list team activity feeds not found response has a 4xx status code
+func (o *OrgListTeamActivityFeedsNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this org list team activity feeds not found response has a 5xx status code
+func (o *OrgListTeamActivityFeedsNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org list team activity feeds not found response a status code equal to that given
+func (o *OrgListTeamActivityFeedsNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the org list team activity feeds not found response
+func (o *OrgListTeamActivityFeedsNotFound) Code() int {
+	return 404
+}
+
+func (o *OrgListTeamActivityFeedsNotFound) Error() string {
+	return fmt.Sprintf("[GET /teams/{id}/activities/feeds][%d] orgListTeamActivityFeedsNotFound", 404)
+}
+
+func (o *OrgListTeamActivityFeedsNotFound) String() string {
+	return fmt.Sprintf("[GET /teams/{id}/activities/feeds][%d] orgListTeamActivityFeedsNotFound", 404)
+}
+
+func (o *OrgListTeamActivityFeedsNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_list_team_member_parameters.go b/bots-common/gitea-generated/client/organization/org_list_team_member_parameters.go
new file mode 100644
index 0000000..fbb6840
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_list_team_member_parameters.go
@@ -0,0 +1,176 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewOrgListTeamMemberParams creates a new OrgListTeamMemberParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewOrgListTeamMemberParams() *OrgListTeamMemberParams {
+	return &OrgListTeamMemberParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewOrgListTeamMemberParamsWithTimeout creates a new OrgListTeamMemberParams object
+// with the ability to set a timeout on a request.
+func NewOrgListTeamMemberParamsWithTimeout(timeout time.Duration) *OrgListTeamMemberParams {
+	return &OrgListTeamMemberParams{
+		timeout: timeout,
+	}
+}
+
+// NewOrgListTeamMemberParamsWithContext creates a new OrgListTeamMemberParams object
+// with the ability to set a context for a request.
+func NewOrgListTeamMemberParamsWithContext(ctx context.Context) *OrgListTeamMemberParams {
+	return &OrgListTeamMemberParams{
+		Context: ctx,
+	}
+}
+
+// NewOrgListTeamMemberParamsWithHTTPClient creates a new OrgListTeamMemberParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewOrgListTeamMemberParamsWithHTTPClient(client *http.Client) *OrgListTeamMemberParams {
+	return &OrgListTeamMemberParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+OrgListTeamMemberParams contains all the parameters to send to the API endpoint
+
+	for the org list team member operation.
+
+	Typically these are written to a http.Request.
+*/
+type OrgListTeamMemberParams struct {
+
+	/* ID.
+
+	   id of the team
+
+	   Format: int64
+	*/
+	ID int64
+
+	/* Username.
+
+	   username of the member to list
+	*/
+	Username string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the org list team member params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgListTeamMemberParams) WithDefaults() *OrgListTeamMemberParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the org list team member params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgListTeamMemberParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the org list team member params
+func (o *OrgListTeamMemberParams) WithTimeout(timeout time.Duration) *OrgListTeamMemberParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the org list team member params
+func (o *OrgListTeamMemberParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the org list team member params
+func (o *OrgListTeamMemberParams) WithContext(ctx context.Context) *OrgListTeamMemberParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the org list team member params
+func (o *OrgListTeamMemberParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the org list team member params
+func (o *OrgListTeamMemberParams) WithHTTPClient(client *http.Client) *OrgListTeamMemberParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the org list team member params
+func (o *OrgListTeamMemberParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithID adds the id to the org list team member params
+func (o *OrgListTeamMemberParams) WithID(id int64) *OrgListTeamMemberParams {
+	o.SetID(id)
+	return o
+}
+
+// SetID adds the id to the org list team member params
+func (o *OrgListTeamMemberParams) SetID(id int64) {
+	o.ID = id
+}
+
+// WithUsername adds the username to the org list team member params
+func (o *OrgListTeamMemberParams) WithUsername(username string) *OrgListTeamMemberParams {
+	o.SetUsername(username)
+	return o
+}
+
+// SetUsername adds the username to the org list team member params
+func (o *OrgListTeamMemberParams) SetUsername(username string) {
+	o.Username = username
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *OrgListTeamMemberParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param id
+	if err := r.SetPathParam("id", swag.FormatInt64(o.ID)); err != nil {
+		return err
+	}
+
+	// path param username
+	if err := r.SetPathParam("username", o.Username); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_list_team_member_responses.go b/bots-common/gitea-generated/client/organization/org_list_team_member_responses.go
new file mode 100644
index 0000000..a2d8064
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_list_team_member_responses.go
@@ -0,0 +1,168 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// OrgListTeamMemberReader is a Reader for the OrgListTeamMember structure.
+type OrgListTeamMemberReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *OrgListTeamMemberReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewOrgListTeamMemberOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewOrgListTeamMemberNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /teams/{id}/members/{username}] orgListTeamMember", response, response.Code())
+	}
+}
+
+// NewOrgListTeamMemberOK creates a OrgListTeamMemberOK with default headers values
+func NewOrgListTeamMemberOK() *OrgListTeamMemberOK {
+	return &OrgListTeamMemberOK{}
+}
+
+/*
+OrgListTeamMemberOK describes a response with status code 200, with default header values.
+
+User
+*/
+type OrgListTeamMemberOK struct {
+	Payload *models.User
+}
+
+// IsSuccess returns true when this org list team member o k response has a 2xx status code
+func (o *OrgListTeamMemberOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this org list team member o k response has a 3xx status code
+func (o *OrgListTeamMemberOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org list team member o k response has a 4xx status code
+func (o *OrgListTeamMemberOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this org list team member o k response has a 5xx status code
+func (o *OrgListTeamMemberOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org list team member o k response a status code equal to that given
+func (o *OrgListTeamMemberOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the org list team member o k response
+func (o *OrgListTeamMemberOK) Code() int {
+	return 200
+}
+
+func (o *OrgListTeamMemberOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /teams/{id}/members/{username}][%d] orgListTeamMemberOK %s", 200, payload)
+}
+
+func (o *OrgListTeamMemberOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /teams/{id}/members/{username}][%d] orgListTeamMemberOK %s", 200, payload)
+}
+
+func (o *OrgListTeamMemberOK) GetPayload() *models.User {
+	return o.Payload
+}
+
+func (o *OrgListTeamMemberOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.User)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewOrgListTeamMemberNotFound creates a OrgListTeamMemberNotFound with default headers values
+func NewOrgListTeamMemberNotFound() *OrgListTeamMemberNotFound {
+	return &OrgListTeamMemberNotFound{}
+}
+
+/*
+OrgListTeamMemberNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type OrgListTeamMemberNotFound struct {
+}
+
+// IsSuccess returns true when this org list team member not found response has a 2xx status code
+func (o *OrgListTeamMemberNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this org list team member not found response has a 3xx status code
+func (o *OrgListTeamMemberNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org list team member not found response has a 4xx status code
+func (o *OrgListTeamMemberNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this org list team member not found response has a 5xx status code
+func (o *OrgListTeamMemberNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org list team member not found response a status code equal to that given
+func (o *OrgListTeamMemberNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the org list team member not found response
+func (o *OrgListTeamMemberNotFound) Code() int {
+	return 404
+}
+
+func (o *OrgListTeamMemberNotFound) Error() string {
+	return fmt.Sprintf("[GET /teams/{id}/members/{username}][%d] orgListTeamMemberNotFound", 404)
+}
+
+func (o *OrgListTeamMemberNotFound) String() string {
+	return fmt.Sprintf("[GET /teams/{id}/members/{username}][%d] orgListTeamMemberNotFound", 404)
+}
+
+func (o *OrgListTeamMemberNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_list_team_members_parameters.go b/bots-common/gitea-generated/client/organization/org_list_team_members_parameters.go
new file mode 100644
index 0000000..49ddd4d
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_list_team_members_parameters.go
@@ -0,0 +1,222 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewOrgListTeamMembersParams creates a new OrgListTeamMembersParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewOrgListTeamMembersParams() *OrgListTeamMembersParams {
+	return &OrgListTeamMembersParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewOrgListTeamMembersParamsWithTimeout creates a new OrgListTeamMembersParams object
+// with the ability to set a timeout on a request.
+func NewOrgListTeamMembersParamsWithTimeout(timeout time.Duration) *OrgListTeamMembersParams {
+	return &OrgListTeamMembersParams{
+		timeout: timeout,
+	}
+}
+
+// NewOrgListTeamMembersParamsWithContext creates a new OrgListTeamMembersParams object
+// with the ability to set a context for a request.
+func NewOrgListTeamMembersParamsWithContext(ctx context.Context) *OrgListTeamMembersParams {
+	return &OrgListTeamMembersParams{
+		Context: ctx,
+	}
+}
+
+// NewOrgListTeamMembersParamsWithHTTPClient creates a new OrgListTeamMembersParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewOrgListTeamMembersParamsWithHTTPClient(client *http.Client) *OrgListTeamMembersParams {
+	return &OrgListTeamMembersParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+OrgListTeamMembersParams contains all the parameters to send to the API endpoint
+
+	for the org list team members operation.
+
+	Typically these are written to a http.Request.
+*/
+type OrgListTeamMembersParams struct {
+
+	/* ID.
+
+	   id of the team
+
+	   Format: int64
+	*/
+	ID int64
+
+	/* Limit.
+
+	   page size of results
+	*/
+	Limit *int64
+
+	/* Page.
+
+	   page number of results to return (1-based)
+	*/
+	Page *int64
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the org list team members params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgListTeamMembersParams) WithDefaults() *OrgListTeamMembersParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the org list team members params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgListTeamMembersParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the org list team members params
+func (o *OrgListTeamMembersParams) WithTimeout(timeout time.Duration) *OrgListTeamMembersParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the org list team members params
+func (o *OrgListTeamMembersParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the org list team members params
+func (o *OrgListTeamMembersParams) WithContext(ctx context.Context) *OrgListTeamMembersParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the org list team members params
+func (o *OrgListTeamMembersParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the org list team members params
+func (o *OrgListTeamMembersParams) WithHTTPClient(client *http.Client) *OrgListTeamMembersParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the org list team members params
+func (o *OrgListTeamMembersParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithID adds the id to the org list team members params
+func (o *OrgListTeamMembersParams) WithID(id int64) *OrgListTeamMembersParams {
+	o.SetID(id)
+	return o
+}
+
+// SetID adds the id to the org list team members params
+func (o *OrgListTeamMembersParams) SetID(id int64) {
+	o.ID = id
+}
+
+// WithLimit adds the limit to the org list team members params
+func (o *OrgListTeamMembersParams) WithLimit(limit *int64) *OrgListTeamMembersParams {
+	o.SetLimit(limit)
+	return o
+}
+
+// SetLimit adds the limit to the org list team members params
+func (o *OrgListTeamMembersParams) SetLimit(limit *int64) {
+	o.Limit = limit
+}
+
+// WithPage adds the page to the org list team members params
+func (o *OrgListTeamMembersParams) WithPage(page *int64) *OrgListTeamMembersParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the org list team members params
+func (o *OrgListTeamMembersParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *OrgListTeamMembersParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param id
+	if err := r.SetPathParam("id", swag.FormatInt64(o.ID)); err != nil {
+		return err
+	}
+
+	if o.Limit != nil {
+
+		// query param limit
+		var qrLimit int64
+
+		if o.Limit != nil {
+			qrLimit = *o.Limit
+		}
+		qLimit := swag.FormatInt64(qrLimit)
+		if qLimit != "" {
+
+			if err := r.SetQueryParam("limit", qLimit); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_list_team_members_responses.go b/bots-common/gitea-generated/client/organization/org_list_team_members_responses.go
new file mode 100644
index 0000000..bfa5e31
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_list_team_members_responses.go
@@ -0,0 +1,166 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// OrgListTeamMembersReader is a Reader for the OrgListTeamMembers structure.
+type OrgListTeamMembersReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *OrgListTeamMembersReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewOrgListTeamMembersOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewOrgListTeamMembersNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /teams/{id}/members] orgListTeamMembers", response, response.Code())
+	}
+}
+
+// NewOrgListTeamMembersOK creates a OrgListTeamMembersOK with default headers values
+func NewOrgListTeamMembersOK() *OrgListTeamMembersOK {
+	return &OrgListTeamMembersOK{}
+}
+
+/*
+OrgListTeamMembersOK describes a response with status code 200, with default header values.
+
+UserList
+*/
+type OrgListTeamMembersOK struct {
+	Payload []*models.User
+}
+
+// IsSuccess returns true when this org list team members o k response has a 2xx status code
+func (o *OrgListTeamMembersOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this org list team members o k response has a 3xx status code
+func (o *OrgListTeamMembersOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org list team members o k response has a 4xx status code
+func (o *OrgListTeamMembersOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this org list team members o k response has a 5xx status code
+func (o *OrgListTeamMembersOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org list team members o k response a status code equal to that given
+func (o *OrgListTeamMembersOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the org list team members o k response
+func (o *OrgListTeamMembersOK) Code() int {
+	return 200
+}
+
+func (o *OrgListTeamMembersOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /teams/{id}/members][%d] orgListTeamMembersOK %s", 200, payload)
+}
+
+func (o *OrgListTeamMembersOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /teams/{id}/members][%d] orgListTeamMembersOK %s", 200, payload)
+}
+
+func (o *OrgListTeamMembersOK) GetPayload() []*models.User {
+	return o.Payload
+}
+
+func (o *OrgListTeamMembersOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewOrgListTeamMembersNotFound creates a OrgListTeamMembersNotFound with default headers values
+func NewOrgListTeamMembersNotFound() *OrgListTeamMembersNotFound {
+	return &OrgListTeamMembersNotFound{}
+}
+
+/*
+OrgListTeamMembersNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type OrgListTeamMembersNotFound struct {
+}
+
+// IsSuccess returns true when this org list team members not found response has a 2xx status code
+func (o *OrgListTeamMembersNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this org list team members not found response has a 3xx status code
+func (o *OrgListTeamMembersNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org list team members not found response has a 4xx status code
+func (o *OrgListTeamMembersNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this org list team members not found response has a 5xx status code
+func (o *OrgListTeamMembersNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org list team members not found response a status code equal to that given
+func (o *OrgListTeamMembersNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the org list team members not found response
+func (o *OrgListTeamMembersNotFound) Code() int {
+	return 404
+}
+
+func (o *OrgListTeamMembersNotFound) Error() string {
+	return fmt.Sprintf("[GET /teams/{id}/members][%d] orgListTeamMembersNotFound", 404)
+}
+
+func (o *OrgListTeamMembersNotFound) String() string {
+	return fmt.Sprintf("[GET /teams/{id}/members][%d] orgListTeamMembersNotFound", 404)
+}
+
+func (o *OrgListTeamMembersNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_list_team_repo_parameters.go b/bots-common/gitea-generated/client/organization/org_list_team_repo_parameters.go
new file mode 100644
index 0000000..064cc99
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_list_team_repo_parameters.go
@@ -0,0 +1,198 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewOrgListTeamRepoParams creates a new OrgListTeamRepoParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewOrgListTeamRepoParams() *OrgListTeamRepoParams {
+	return &OrgListTeamRepoParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewOrgListTeamRepoParamsWithTimeout creates a new OrgListTeamRepoParams object
+// with the ability to set a timeout on a request.
+func NewOrgListTeamRepoParamsWithTimeout(timeout time.Duration) *OrgListTeamRepoParams {
+	return &OrgListTeamRepoParams{
+		timeout: timeout,
+	}
+}
+
+// NewOrgListTeamRepoParamsWithContext creates a new OrgListTeamRepoParams object
+// with the ability to set a context for a request.
+func NewOrgListTeamRepoParamsWithContext(ctx context.Context) *OrgListTeamRepoParams {
+	return &OrgListTeamRepoParams{
+		Context: ctx,
+	}
+}
+
+// NewOrgListTeamRepoParamsWithHTTPClient creates a new OrgListTeamRepoParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewOrgListTeamRepoParamsWithHTTPClient(client *http.Client) *OrgListTeamRepoParams {
+	return &OrgListTeamRepoParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+OrgListTeamRepoParams contains all the parameters to send to the API endpoint
+
+	for the org list team repo operation.
+
+	Typically these are written to a http.Request.
+*/
+type OrgListTeamRepoParams struct {
+
+	/* ID.
+
+	   id of the team
+
+	   Format: int64
+	*/
+	ID int64
+
+	/* Org.
+
+	   organization that owns the repo to list
+	*/
+	Org string
+
+	/* Repo.
+
+	   name of the repo to list
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the org list team repo params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgListTeamRepoParams) WithDefaults() *OrgListTeamRepoParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the org list team repo params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgListTeamRepoParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the org list team repo params
+func (o *OrgListTeamRepoParams) WithTimeout(timeout time.Duration) *OrgListTeamRepoParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the org list team repo params
+func (o *OrgListTeamRepoParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the org list team repo params
+func (o *OrgListTeamRepoParams) WithContext(ctx context.Context) *OrgListTeamRepoParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the org list team repo params
+func (o *OrgListTeamRepoParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the org list team repo params
+func (o *OrgListTeamRepoParams) WithHTTPClient(client *http.Client) *OrgListTeamRepoParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the org list team repo params
+func (o *OrgListTeamRepoParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithID adds the id to the org list team repo params
+func (o *OrgListTeamRepoParams) WithID(id int64) *OrgListTeamRepoParams {
+	o.SetID(id)
+	return o
+}
+
+// SetID adds the id to the org list team repo params
+func (o *OrgListTeamRepoParams) SetID(id int64) {
+	o.ID = id
+}
+
+// WithOrg adds the org to the org list team repo params
+func (o *OrgListTeamRepoParams) WithOrg(org string) *OrgListTeamRepoParams {
+	o.SetOrg(org)
+	return o
+}
+
+// SetOrg adds the org to the org list team repo params
+func (o *OrgListTeamRepoParams) SetOrg(org string) {
+	o.Org = org
+}
+
+// WithRepo adds the repo to the org list team repo params
+func (o *OrgListTeamRepoParams) WithRepo(repo string) *OrgListTeamRepoParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the org list team repo params
+func (o *OrgListTeamRepoParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *OrgListTeamRepoParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param id
+	if err := r.SetPathParam("id", swag.FormatInt64(o.ID)); err != nil {
+		return err
+	}
+
+	// path param org
+	if err := r.SetPathParam("org", o.Org); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_list_team_repo_responses.go b/bots-common/gitea-generated/client/organization/org_list_team_repo_responses.go
new file mode 100644
index 0000000..4480397
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_list_team_repo_responses.go
@@ -0,0 +1,168 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// OrgListTeamRepoReader is a Reader for the OrgListTeamRepo structure.
+type OrgListTeamRepoReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *OrgListTeamRepoReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewOrgListTeamRepoOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewOrgListTeamRepoNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /teams/{id}/repos/{org}/{repo}] orgListTeamRepo", response, response.Code())
+	}
+}
+
+// NewOrgListTeamRepoOK creates a OrgListTeamRepoOK with default headers values
+func NewOrgListTeamRepoOK() *OrgListTeamRepoOK {
+	return &OrgListTeamRepoOK{}
+}
+
+/*
+OrgListTeamRepoOK describes a response with status code 200, with default header values.
+
+Repository
+*/
+type OrgListTeamRepoOK struct {
+	Payload *models.Repository
+}
+
+// IsSuccess returns true when this org list team repo o k response has a 2xx status code
+func (o *OrgListTeamRepoOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this org list team repo o k response has a 3xx status code
+func (o *OrgListTeamRepoOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org list team repo o k response has a 4xx status code
+func (o *OrgListTeamRepoOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this org list team repo o k response has a 5xx status code
+func (o *OrgListTeamRepoOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org list team repo o k response a status code equal to that given
+func (o *OrgListTeamRepoOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the org list team repo o k response
+func (o *OrgListTeamRepoOK) Code() int {
+	return 200
+}
+
+func (o *OrgListTeamRepoOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /teams/{id}/repos/{org}/{repo}][%d] orgListTeamRepoOK %s", 200, payload)
+}
+
+func (o *OrgListTeamRepoOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /teams/{id}/repos/{org}/{repo}][%d] orgListTeamRepoOK %s", 200, payload)
+}
+
+func (o *OrgListTeamRepoOK) GetPayload() *models.Repository {
+	return o.Payload
+}
+
+func (o *OrgListTeamRepoOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.Repository)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewOrgListTeamRepoNotFound creates a OrgListTeamRepoNotFound with default headers values
+func NewOrgListTeamRepoNotFound() *OrgListTeamRepoNotFound {
+	return &OrgListTeamRepoNotFound{}
+}
+
+/*
+OrgListTeamRepoNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type OrgListTeamRepoNotFound struct {
+}
+
+// IsSuccess returns true when this org list team repo not found response has a 2xx status code
+func (o *OrgListTeamRepoNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this org list team repo not found response has a 3xx status code
+func (o *OrgListTeamRepoNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org list team repo not found response has a 4xx status code
+func (o *OrgListTeamRepoNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this org list team repo not found response has a 5xx status code
+func (o *OrgListTeamRepoNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org list team repo not found response a status code equal to that given
+func (o *OrgListTeamRepoNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the org list team repo not found response
+func (o *OrgListTeamRepoNotFound) Code() int {
+	return 404
+}
+
+func (o *OrgListTeamRepoNotFound) Error() string {
+	return fmt.Sprintf("[GET /teams/{id}/repos/{org}/{repo}][%d] orgListTeamRepoNotFound", 404)
+}
+
+func (o *OrgListTeamRepoNotFound) String() string {
+	return fmt.Sprintf("[GET /teams/{id}/repos/{org}/{repo}][%d] orgListTeamRepoNotFound", 404)
+}
+
+func (o *OrgListTeamRepoNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_list_team_repos_parameters.go b/bots-common/gitea-generated/client/organization/org_list_team_repos_parameters.go
new file mode 100644
index 0000000..3cf548f
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_list_team_repos_parameters.go
@@ -0,0 +1,222 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewOrgListTeamReposParams creates a new OrgListTeamReposParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewOrgListTeamReposParams() *OrgListTeamReposParams {
+	return &OrgListTeamReposParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewOrgListTeamReposParamsWithTimeout creates a new OrgListTeamReposParams object
+// with the ability to set a timeout on a request.
+func NewOrgListTeamReposParamsWithTimeout(timeout time.Duration) *OrgListTeamReposParams {
+	return &OrgListTeamReposParams{
+		timeout: timeout,
+	}
+}
+
+// NewOrgListTeamReposParamsWithContext creates a new OrgListTeamReposParams object
+// with the ability to set a context for a request.
+func NewOrgListTeamReposParamsWithContext(ctx context.Context) *OrgListTeamReposParams {
+	return &OrgListTeamReposParams{
+		Context: ctx,
+	}
+}
+
+// NewOrgListTeamReposParamsWithHTTPClient creates a new OrgListTeamReposParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewOrgListTeamReposParamsWithHTTPClient(client *http.Client) *OrgListTeamReposParams {
+	return &OrgListTeamReposParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+OrgListTeamReposParams contains all the parameters to send to the API endpoint
+
+	for the org list team repos operation.
+
+	Typically these are written to a http.Request.
+*/
+type OrgListTeamReposParams struct {
+
+	/* ID.
+
+	   id of the team
+
+	   Format: int64
+	*/
+	ID int64
+
+	/* Limit.
+
+	   page size of results
+	*/
+	Limit *int64
+
+	/* Page.
+
+	   page number of results to return (1-based)
+	*/
+	Page *int64
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the org list team repos params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgListTeamReposParams) WithDefaults() *OrgListTeamReposParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the org list team repos params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgListTeamReposParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the org list team repos params
+func (o *OrgListTeamReposParams) WithTimeout(timeout time.Duration) *OrgListTeamReposParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the org list team repos params
+func (o *OrgListTeamReposParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the org list team repos params
+func (o *OrgListTeamReposParams) WithContext(ctx context.Context) *OrgListTeamReposParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the org list team repos params
+func (o *OrgListTeamReposParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the org list team repos params
+func (o *OrgListTeamReposParams) WithHTTPClient(client *http.Client) *OrgListTeamReposParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the org list team repos params
+func (o *OrgListTeamReposParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithID adds the id to the org list team repos params
+func (o *OrgListTeamReposParams) WithID(id int64) *OrgListTeamReposParams {
+	o.SetID(id)
+	return o
+}
+
+// SetID adds the id to the org list team repos params
+func (o *OrgListTeamReposParams) SetID(id int64) {
+	o.ID = id
+}
+
+// WithLimit adds the limit to the org list team repos params
+func (o *OrgListTeamReposParams) WithLimit(limit *int64) *OrgListTeamReposParams {
+	o.SetLimit(limit)
+	return o
+}
+
+// SetLimit adds the limit to the org list team repos params
+func (o *OrgListTeamReposParams) SetLimit(limit *int64) {
+	o.Limit = limit
+}
+
+// WithPage adds the page to the org list team repos params
+func (o *OrgListTeamReposParams) WithPage(page *int64) *OrgListTeamReposParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the org list team repos params
+func (o *OrgListTeamReposParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *OrgListTeamReposParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param id
+	if err := r.SetPathParam("id", swag.FormatInt64(o.ID)); err != nil {
+		return err
+	}
+
+	if o.Limit != nil {
+
+		// query param limit
+		var qrLimit int64
+
+		if o.Limit != nil {
+			qrLimit = *o.Limit
+		}
+		qLimit := swag.FormatInt64(qrLimit)
+		if qLimit != "" {
+
+			if err := r.SetQueryParam("limit", qLimit); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_list_team_repos_responses.go b/bots-common/gitea-generated/client/organization/org_list_team_repos_responses.go
new file mode 100644
index 0000000..8e14ddb
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_list_team_repos_responses.go
@@ -0,0 +1,166 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// OrgListTeamReposReader is a Reader for the OrgListTeamRepos structure.
+type OrgListTeamReposReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *OrgListTeamReposReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewOrgListTeamReposOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewOrgListTeamReposNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /teams/{id}/repos] orgListTeamRepos", response, response.Code())
+	}
+}
+
+// NewOrgListTeamReposOK creates a OrgListTeamReposOK with default headers values
+func NewOrgListTeamReposOK() *OrgListTeamReposOK {
+	return &OrgListTeamReposOK{}
+}
+
+/*
+OrgListTeamReposOK describes a response with status code 200, with default header values.
+
+RepositoryList
+*/
+type OrgListTeamReposOK struct {
+	Payload []*models.Repository
+}
+
+// IsSuccess returns true when this org list team repos o k response has a 2xx status code
+func (o *OrgListTeamReposOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this org list team repos o k response has a 3xx status code
+func (o *OrgListTeamReposOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org list team repos o k response has a 4xx status code
+func (o *OrgListTeamReposOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this org list team repos o k response has a 5xx status code
+func (o *OrgListTeamReposOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org list team repos o k response a status code equal to that given
+func (o *OrgListTeamReposOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the org list team repos o k response
+func (o *OrgListTeamReposOK) Code() int {
+	return 200
+}
+
+func (o *OrgListTeamReposOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /teams/{id}/repos][%d] orgListTeamReposOK %s", 200, payload)
+}
+
+func (o *OrgListTeamReposOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /teams/{id}/repos][%d] orgListTeamReposOK %s", 200, payload)
+}
+
+func (o *OrgListTeamReposOK) GetPayload() []*models.Repository {
+	return o.Payload
+}
+
+func (o *OrgListTeamReposOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewOrgListTeamReposNotFound creates a OrgListTeamReposNotFound with default headers values
+func NewOrgListTeamReposNotFound() *OrgListTeamReposNotFound {
+	return &OrgListTeamReposNotFound{}
+}
+
+/*
+OrgListTeamReposNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type OrgListTeamReposNotFound struct {
+}
+
+// IsSuccess returns true when this org list team repos not found response has a 2xx status code
+func (o *OrgListTeamReposNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this org list team repos not found response has a 3xx status code
+func (o *OrgListTeamReposNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org list team repos not found response has a 4xx status code
+func (o *OrgListTeamReposNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this org list team repos not found response has a 5xx status code
+func (o *OrgListTeamReposNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org list team repos not found response a status code equal to that given
+func (o *OrgListTeamReposNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the org list team repos not found response
+func (o *OrgListTeamReposNotFound) Code() int {
+	return 404
+}
+
+func (o *OrgListTeamReposNotFound) Error() string {
+	return fmt.Sprintf("[GET /teams/{id}/repos][%d] orgListTeamReposNotFound", 404)
+}
+
+func (o *OrgListTeamReposNotFound) String() string {
+	return fmt.Sprintf("[GET /teams/{id}/repos][%d] orgListTeamReposNotFound", 404)
+}
+
+func (o *OrgListTeamReposNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_list_teams_parameters.go b/bots-common/gitea-generated/client/organization/org_list_teams_parameters.go
new file mode 100644
index 0000000..18c1fc0
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_list_teams_parameters.go
@@ -0,0 +1,220 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewOrgListTeamsParams creates a new OrgListTeamsParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewOrgListTeamsParams() *OrgListTeamsParams {
+	return &OrgListTeamsParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewOrgListTeamsParamsWithTimeout creates a new OrgListTeamsParams object
+// with the ability to set a timeout on a request.
+func NewOrgListTeamsParamsWithTimeout(timeout time.Duration) *OrgListTeamsParams {
+	return &OrgListTeamsParams{
+		timeout: timeout,
+	}
+}
+
+// NewOrgListTeamsParamsWithContext creates a new OrgListTeamsParams object
+// with the ability to set a context for a request.
+func NewOrgListTeamsParamsWithContext(ctx context.Context) *OrgListTeamsParams {
+	return &OrgListTeamsParams{
+		Context: ctx,
+	}
+}
+
+// NewOrgListTeamsParamsWithHTTPClient creates a new OrgListTeamsParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewOrgListTeamsParamsWithHTTPClient(client *http.Client) *OrgListTeamsParams {
+	return &OrgListTeamsParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+OrgListTeamsParams contains all the parameters to send to the API endpoint
+
+	for the org list teams operation.
+
+	Typically these are written to a http.Request.
+*/
+type OrgListTeamsParams struct {
+
+	/* Limit.
+
+	   page size of results
+	*/
+	Limit *int64
+
+	/* Org.
+
+	   name of the organization
+	*/
+	Org string
+
+	/* Page.
+
+	   page number of results to return (1-based)
+	*/
+	Page *int64
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the org list teams params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgListTeamsParams) WithDefaults() *OrgListTeamsParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the org list teams params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgListTeamsParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the org list teams params
+func (o *OrgListTeamsParams) WithTimeout(timeout time.Duration) *OrgListTeamsParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the org list teams params
+func (o *OrgListTeamsParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the org list teams params
+func (o *OrgListTeamsParams) WithContext(ctx context.Context) *OrgListTeamsParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the org list teams params
+func (o *OrgListTeamsParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the org list teams params
+func (o *OrgListTeamsParams) WithHTTPClient(client *http.Client) *OrgListTeamsParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the org list teams params
+func (o *OrgListTeamsParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithLimit adds the limit to the org list teams params
+func (o *OrgListTeamsParams) WithLimit(limit *int64) *OrgListTeamsParams {
+	o.SetLimit(limit)
+	return o
+}
+
+// SetLimit adds the limit to the org list teams params
+func (o *OrgListTeamsParams) SetLimit(limit *int64) {
+	o.Limit = limit
+}
+
+// WithOrg adds the org to the org list teams params
+func (o *OrgListTeamsParams) WithOrg(org string) *OrgListTeamsParams {
+	o.SetOrg(org)
+	return o
+}
+
+// SetOrg adds the org to the org list teams params
+func (o *OrgListTeamsParams) SetOrg(org string) {
+	o.Org = org
+}
+
+// WithPage adds the page to the org list teams params
+func (o *OrgListTeamsParams) WithPage(page *int64) *OrgListTeamsParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the org list teams params
+func (o *OrgListTeamsParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *OrgListTeamsParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.Limit != nil {
+
+		// query param limit
+		var qrLimit int64
+
+		if o.Limit != nil {
+			qrLimit = *o.Limit
+		}
+		qLimit := swag.FormatInt64(qrLimit)
+		if qLimit != "" {
+
+			if err := r.SetQueryParam("limit", qLimit); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param org
+	if err := r.SetPathParam("org", o.Org); err != nil {
+		return err
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_list_teams_responses.go b/bots-common/gitea-generated/client/organization/org_list_teams_responses.go
new file mode 100644
index 0000000..6a50714
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_list_teams_responses.go
@@ -0,0 +1,166 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// OrgListTeamsReader is a Reader for the OrgListTeams structure.
+type OrgListTeamsReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *OrgListTeamsReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewOrgListTeamsOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewOrgListTeamsNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /orgs/{org}/teams] orgListTeams", response, response.Code())
+	}
+}
+
+// NewOrgListTeamsOK creates a OrgListTeamsOK with default headers values
+func NewOrgListTeamsOK() *OrgListTeamsOK {
+	return &OrgListTeamsOK{}
+}
+
+/*
+OrgListTeamsOK describes a response with status code 200, with default header values.
+
+TeamList
+*/
+type OrgListTeamsOK struct {
+	Payload []*models.Team
+}
+
+// IsSuccess returns true when this org list teams o k response has a 2xx status code
+func (o *OrgListTeamsOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this org list teams o k response has a 3xx status code
+func (o *OrgListTeamsOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org list teams o k response has a 4xx status code
+func (o *OrgListTeamsOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this org list teams o k response has a 5xx status code
+func (o *OrgListTeamsOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org list teams o k response a status code equal to that given
+func (o *OrgListTeamsOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the org list teams o k response
+func (o *OrgListTeamsOK) Code() int {
+	return 200
+}
+
+func (o *OrgListTeamsOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /orgs/{org}/teams][%d] orgListTeamsOK %s", 200, payload)
+}
+
+func (o *OrgListTeamsOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /orgs/{org}/teams][%d] orgListTeamsOK %s", 200, payload)
+}
+
+func (o *OrgListTeamsOK) GetPayload() []*models.Team {
+	return o.Payload
+}
+
+func (o *OrgListTeamsOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewOrgListTeamsNotFound creates a OrgListTeamsNotFound with default headers values
+func NewOrgListTeamsNotFound() *OrgListTeamsNotFound {
+	return &OrgListTeamsNotFound{}
+}
+
+/*
+OrgListTeamsNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type OrgListTeamsNotFound struct {
+}
+
+// IsSuccess returns true when this org list teams not found response has a 2xx status code
+func (o *OrgListTeamsNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this org list teams not found response has a 3xx status code
+func (o *OrgListTeamsNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org list teams not found response has a 4xx status code
+func (o *OrgListTeamsNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this org list teams not found response has a 5xx status code
+func (o *OrgListTeamsNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org list teams not found response a status code equal to that given
+func (o *OrgListTeamsNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the org list teams not found response
+func (o *OrgListTeamsNotFound) Code() int {
+	return 404
+}
+
+func (o *OrgListTeamsNotFound) Error() string {
+	return fmt.Sprintf("[GET /orgs/{org}/teams][%d] orgListTeamsNotFound", 404)
+}
+
+func (o *OrgListTeamsNotFound) String() string {
+	return fmt.Sprintf("[GET /orgs/{org}/teams][%d] orgListTeamsNotFound", 404)
+}
+
+func (o *OrgListTeamsNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_list_user_orgs_parameters.go b/bots-common/gitea-generated/client/organization/org_list_user_orgs_parameters.go
new file mode 100644
index 0000000..6274598
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_list_user_orgs_parameters.go
@@ -0,0 +1,220 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewOrgListUserOrgsParams creates a new OrgListUserOrgsParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewOrgListUserOrgsParams() *OrgListUserOrgsParams {
+	return &OrgListUserOrgsParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewOrgListUserOrgsParamsWithTimeout creates a new OrgListUserOrgsParams object
+// with the ability to set a timeout on a request.
+func NewOrgListUserOrgsParamsWithTimeout(timeout time.Duration) *OrgListUserOrgsParams {
+	return &OrgListUserOrgsParams{
+		timeout: timeout,
+	}
+}
+
+// NewOrgListUserOrgsParamsWithContext creates a new OrgListUserOrgsParams object
+// with the ability to set a context for a request.
+func NewOrgListUserOrgsParamsWithContext(ctx context.Context) *OrgListUserOrgsParams {
+	return &OrgListUserOrgsParams{
+		Context: ctx,
+	}
+}
+
+// NewOrgListUserOrgsParamsWithHTTPClient creates a new OrgListUserOrgsParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewOrgListUserOrgsParamsWithHTTPClient(client *http.Client) *OrgListUserOrgsParams {
+	return &OrgListUserOrgsParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+OrgListUserOrgsParams contains all the parameters to send to the API endpoint
+
+	for the org list user orgs operation.
+
+	Typically these are written to a http.Request.
+*/
+type OrgListUserOrgsParams struct {
+
+	/* Limit.
+
+	   page size of results
+	*/
+	Limit *int64
+
+	/* Page.
+
+	   page number of results to return (1-based)
+	*/
+	Page *int64
+
+	/* Username.
+
+	   username of user
+	*/
+	Username string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the org list user orgs params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgListUserOrgsParams) WithDefaults() *OrgListUserOrgsParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the org list user orgs params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgListUserOrgsParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the org list user orgs params
+func (o *OrgListUserOrgsParams) WithTimeout(timeout time.Duration) *OrgListUserOrgsParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the org list user orgs params
+func (o *OrgListUserOrgsParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the org list user orgs params
+func (o *OrgListUserOrgsParams) WithContext(ctx context.Context) *OrgListUserOrgsParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the org list user orgs params
+func (o *OrgListUserOrgsParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the org list user orgs params
+func (o *OrgListUserOrgsParams) WithHTTPClient(client *http.Client) *OrgListUserOrgsParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the org list user orgs params
+func (o *OrgListUserOrgsParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithLimit adds the limit to the org list user orgs params
+func (o *OrgListUserOrgsParams) WithLimit(limit *int64) *OrgListUserOrgsParams {
+	o.SetLimit(limit)
+	return o
+}
+
+// SetLimit adds the limit to the org list user orgs params
+func (o *OrgListUserOrgsParams) SetLimit(limit *int64) {
+	o.Limit = limit
+}
+
+// WithPage adds the page to the org list user orgs params
+func (o *OrgListUserOrgsParams) WithPage(page *int64) *OrgListUserOrgsParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the org list user orgs params
+func (o *OrgListUserOrgsParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WithUsername adds the username to the org list user orgs params
+func (o *OrgListUserOrgsParams) WithUsername(username string) *OrgListUserOrgsParams {
+	o.SetUsername(username)
+	return o
+}
+
+// SetUsername adds the username to the org list user orgs params
+func (o *OrgListUserOrgsParams) SetUsername(username string) {
+	o.Username = username
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *OrgListUserOrgsParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.Limit != nil {
+
+		// query param limit
+		var qrLimit int64
+
+		if o.Limit != nil {
+			qrLimit = *o.Limit
+		}
+		qLimit := swag.FormatInt64(qrLimit)
+		if qLimit != "" {
+
+			if err := r.SetQueryParam("limit", qLimit); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param username
+	if err := r.SetPathParam("username", o.Username); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_list_user_orgs_responses.go b/bots-common/gitea-generated/client/organization/org_list_user_orgs_responses.go
new file mode 100644
index 0000000..bf38a22
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_list_user_orgs_responses.go
@@ -0,0 +1,166 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// OrgListUserOrgsReader is a Reader for the OrgListUserOrgs structure.
+type OrgListUserOrgsReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *OrgListUserOrgsReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewOrgListUserOrgsOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewOrgListUserOrgsNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /users/{username}/orgs] orgListUserOrgs", response, response.Code())
+	}
+}
+
+// NewOrgListUserOrgsOK creates a OrgListUserOrgsOK with default headers values
+func NewOrgListUserOrgsOK() *OrgListUserOrgsOK {
+	return &OrgListUserOrgsOK{}
+}
+
+/*
+OrgListUserOrgsOK describes a response with status code 200, with default header values.
+
+OrganizationList
+*/
+type OrgListUserOrgsOK struct {
+	Payload []*models.Organization
+}
+
+// IsSuccess returns true when this org list user orgs o k response has a 2xx status code
+func (o *OrgListUserOrgsOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this org list user orgs o k response has a 3xx status code
+func (o *OrgListUserOrgsOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org list user orgs o k response has a 4xx status code
+func (o *OrgListUserOrgsOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this org list user orgs o k response has a 5xx status code
+func (o *OrgListUserOrgsOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org list user orgs o k response a status code equal to that given
+func (o *OrgListUserOrgsOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the org list user orgs o k response
+func (o *OrgListUserOrgsOK) Code() int {
+	return 200
+}
+
+func (o *OrgListUserOrgsOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /users/{username}/orgs][%d] orgListUserOrgsOK %s", 200, payload)
+}
+
+func (o *OrgListUserOrgsOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /users/{username}/orgs][%d] orgListUserOrgsOK %s", 200, payload)
+}
+
+func (o *OrgListUserOrgsOK) GetPayload() []*models.Organization {
+	return o.Payload
+}
+
+func (o *OrgListUserOrgsOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewOrgListUserOrgsNotFound creates a OrgListUserOrgsNotFound with default headers values
+func NewOrgListUserOrgsNotFound() *OrgListUserOrgsNotFound {
+	return &OrgListUserOrgsNotFound{}
+}
+
+/*
+OrgListUserOrgsNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type OrgListUserOrgsNotFound struct {
+}
+
+// IsSuccess returns true when this org list user orgs not found response has a 2xx status code
+func (o *OrgListUserOrgsNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this org list user orgs not found response has a 3xx status code
+func (o *OrgListUserOrgsNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org list user orgs not found response has a 4xx status code
+func (o *OrgListUserOrgsNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this org list user orgs not found response has a 5xx status code
+func (o *OrgListUserOrgsNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org list user orgs not found response a status code equal to that given
+func (o *OrgListUserOrgsNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the org list user orgs not found response
+func (o *OrgListUserOrgsNotFound) Code() int {
+	return 404
+}
+
+func (o *OrgListUserOrgsNotFound) Error() string {
+	return fmt.Sprintf("[GET /users/{username}/orgs][%d] orgListUserOrgsNotFound", 404)
+}
+
+func (o *OrgListUserOrgsNotFound) String() string {
+	return fmt.Sprintf("[GET /users/{username}/orgs][%d] orgListUserOrgsNotFound", 404)
+}
+
+func (o *OrgListUserOrgsNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_publicize_member_parameters.go b/bots-common/gitea-generated/client/organization/org_publicize_member_parameters.go
new file mode 100644
index 0000000..c55b737
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_publicize_member_parameters.go
@@ -0,0 +1,173 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewOrgPublicizeMemberParams creates a new OrgPublicizeMemberParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewOrgPublicizeMemberParams() *OrgPublicizeMemberParams {
+	return &OrgPublicizeMemberParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewOrgPublicizeMemberParamsWithTimeout creates a new OrgPublicizeMemberParams object
+// with the ability to set a timeout on a request.
+func NewOrgPublicizeMemberParamsWithTimeout(timeout time.Duration) *OrgPublicizeMemberParams {
+	return &OrgPublicizeMemberParams{
+		timeout: timeout,
+	}
+}
+
+// NewOrgPublicizeMemberParamsWithContext creates a new OrgPublicizeMemberParams object
+// with the ability to set a context for a request.
+func NewOrgPublicizeMemberParamsWithContext(ctx context.Context) *OrgPublicizeMemberParams {
+	return &OrgPublicizeMemberParams{
+		Context: ctx,
+	}
+}
+
+// NewOrgPublicizeMemberParamsWithHTTPClient creates a new OrgPublicizeMemberParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewOrgPublicizeMemberParamsWithHTTPClient(client *http.Client) *OrgPublicizeMemberParams {
+	return &OrgPublicizeMemberParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+OrgPublicizeMemberParams contains all the parameters to send to the API endpoint
+
+	for the org publicize member operation.
+
+	Typically these are written to a http.Request.
+*/
+type OrgPublicizeMemberParams struct {
+
+	/* Org.
+
+	   name of the organization
+	*/
+	Org string
+
+	/* Username.
+
+	   username of the user
+	*/
+	Username string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the org publicize member params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgPublicizeMemberParams) WithDefaults() *OrgPublicizeMemberParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the org publicize member params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgPublicizeMemberParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the org publicize member params
+func (o *OrgPublicizeMemberParams) WithTimeout(timeout time.Duration) *OrgPublicizeMemberParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the org publicize member params
+func (o *OrgPublicizeMemberParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the org publicize member params
+func (o *OrgPublicizeMemberParams) WithContext(ctx context.Context) *OrgPublicizeMemberParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the org publicize member params
+func (o *OrgPublicizeMemberParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the org publicize member params
+func (o *OrgPublicizeMemberParams) WithHTTPClient(client *http.Client) *OrgPublicizeMemberParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the org publicize member params
+func (o *OrgPublicizeMemberParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithOrg adds the org to the org publicize member params
+func (o *OrgPublicizeMemberParams) WithOrg(org string) *OrgPublicizeMemberParams {
+	o.SetOrg(org)
+	return o
+}
+
+// SetOrg adds the org to the org publicize member params
+func (o *OrgPublicizeMemberParams) SetOrg(org string) {
+	o.Org = org
+}
+
+// WithUsername adds the username to the org publicize member params
+func (o *OrgPublicizeMemberParams) WithUsername(username string) *OrgPublicizeMemberParams {
+	o.SetUsername(username)
+	return o
+}
+
+// SetUsername adds the username to the org publicize member params
+func (o *OrgPublicizeMemberParams) SetUsername(username string) {
+	o.Username = username
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *OrgPublicizeMemberParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param org
+	if err := r.SetPathParam("org", o.Org); err != nil {
+		return err
+	}
+
+	// path param username
+	if err := r.SetPathParam("username", o.Username); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_publicize_member_responses.go b/bots-common/gitea-generated/client/organization/org_publicize_member_responses.go
new file mode 100644
index 0000000..96bb3b0
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_publicize_member_responses.go
@@ -0,0 +1,228 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// OrgPublicizeMemberReader is a Reader for the OrgPublicizeMember structure.
+type OrgPublicizeMemberReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *OrgPublicizeMemberReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewOrgPublicizeMemberNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 403:
+		result := NewOrgPublicizeMemberForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewOrgPublicizeMemberNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[PUT /orgs/{org}/public_members/{username}] orgPublicizeMember", response, response.Code())
+	}
+}
+
+// NewOrgPublicizeMemberNoContent creates a OrgPublicizeMemberNoContent with default headers values
+func NewOrgPublicizeMemberNoContent() *OrgPublicizeMemberNoContent {
+	return &OrgPublicizeMemberNoContent{}
+}
+
+/*
+OrgPublicizeMemberNoContent describes a response with status code 204, with default header values.
+
+membership publicized
+*/
+type OrgPublicizeMemberNoContent struct {
+}
+
+// IsSuccess returns true when this org publicize member no content response has a 2xx status code
+func (o *OrgPublicizeMemberNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this org publicize member no content response has a 3xx status code
+func (o *OrgPublicizeMemberNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org publicize member no content response has a 4xx status code
+func (o *OrgPublicizeMemberNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this org publicize member no content response has a 5xx status code
+func (o *OrgPublicizeMemberNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org publicize member no content response a status code equal to that given
+func (o *OrgPublicizeMemberNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the org publicize member no content response
+func (o *OrgPublicizeMemberNoContent) Code() int {
+	return 204
+}
+
+func (o *OrgPublicizeMemberNoContent) Error() string {
+	return fmt.Sprintf("[PUT /orgs/{org}/public_members/{username}][%d] orgPublicizeMemberNoContent", 204)
+}
+
+func (o *OrgPublicizeMemberNoContent) String() string {
+	return fmt.Sprintf("[PUT /orgs/{org}/public_members/{username}][%d] orgPublicizeMemberNoContent", 204)
+}
+
+func (o *OrgPublicizeMemberNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewOrgPublicizeMemberForbidden creates a OrgPublicizeMemberForbidden with default headers values
+func NewOrgPublicizeMemberForbidden() *OrgPublicizeMemberForbidden {
+	return &OrgPublicizeMemberForbidden{}
+}
+
+/*
+OrgPublicizeMemberForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type OrgPublicizeMemberForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this org publicize member forbidden response has a 2xx status code
+func (o *OrgPublicizeMemberForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this org publicize member forbidden response has a 3xx status code
+func (o *OrgPublicizeMemberForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org publicize member forbidden response has a 4xx status code
+func (o *OrgPublicizeMemberForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this org publicize member forbidden response has a 5xx status code
+func (o *OrgPublicizeMemberForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org publicize member forbidden response a status code equal to that given
+func (o *OrgPublicizeMemberForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the org publicize member forbidden response
+func (o *OrgPublicizeMemberForbidden) Code() int {
+	return 403
+}
+
+func (o *OrgPublicizeMemberForbidden) Error() string {
+	return fmt.Sprintf("[PUT /orgs/{org}/public_members/{username}][%d] orgPublicizeMemberForbidden", 403)
+}
+
+func (o *OrgPublicizeMemberForbidden) String() string {
+	return fmt.Sprintf("[PUT /orgs/{org}/public_members/{username}][%d] orgPublicizeMemberForbidden", 403)
+}
+
+func (o *OrgPublicizeMemberForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewOrgPublicizeMemberNotFound creates a OrgPublicizeMemberNotFound with default headers values
+func NewOrgPublicizeMemberNotFound() *OrgPublicizeMemberNotFound {
+	return &OrgPublicizeMemberNotFound{}
+}
+
+/*
+OrgPublicizeMemberNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type OrgPublicizeMemberNotFound struct {
+}
+
+// IsSuccess returns true when this org publicize member not found response has a 2xx status code
+func (o *OrgPublicizeMemberNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this org publicize member not found response has a 3xx status code
+func (o *OrgPublicizeMemberNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org publicize member not found response has a 4xx status code
+func (o *OrgPublicizeMemberNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this org publicize member not found response has a 5xx status code
+func (o *OrgPublicizeMemberNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org publicize member not found response a status code equal to that given
+func (o *OrgPublicizeMemberNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the org publicize member not found response
+func (o *OrgPublicizeMemberNotFound) Code() int {
+	return 404
+}
+
+func (o *OrgPublicizeMemberNotFound) Error() string {
+	return fmt.Sprintf("[PUT /orgs/{org}/public_members/{username}][%d] orgPublicizeMemberNotFound", 404)
+}
+
+func (o *OrgPublicizeMemberNotFound) String() string {
+	return fmt.Sprintf("[PUT /orgs/{org}/public_members/{username}][%d] orgPublicizeMemberNotFound", 404)
+}
+
+func (o *OrgPublicizeMemberNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_remove_team_member_parameters.go b/bots-common/gitea-generated/client/organization/org_remove_team_member_parameters.go
new file mode 100644
index 0000000..cedabbb
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_remove_team_member_parameters.go
@@ -0,0 +1,176 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewOrgRemoveTeamMemberParams creates a new OrgRemoveTeamMemberParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewOrgRemoveTeamMemberParams() *OrgRemoveTeamMemberParams {
+	return &OrgRemoveTeamMemberParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewOrgRemoveTeamMemberParamsWithTimeout creates a new OrgRemoveTeamMemberParams object
+// with the ability to set a timeout on a request.
+func NewOrgRemoveTeamMemberParamsWithTimeout(timeout time.Duration) *OrgRemoveTeamMemberParams {
+	return &OrgRemoveTeamMemberParams{
+		timeout: timeout,
+	}
+}
+
+// NewOrgRemoveTeamMemberParamsWithContext creates a new OrgRemoveTeamMemberParams object
+// with the ability to set a context for a request.
+func NewOrgRemoveTeamMemberParamsWithContext(ctx context.Context) *OrgRemoveTeamMemberParams {
+	return &OrgRemoveTeamMemberParams{
+		Context: ctx,
+	}
+}
+
+// NewOrgRemoveTeamMemberParamsWithHTTPClient creates a new OrgRemoveTeamMemberParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewOrgRemoveTeamMemberParamsWithHTTPClient(client *http.Client) *OrgRemoveTeamMemberParams {
+	return &OrgRemoveTeamMemberParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+OrgRemoveTeamMemberParams contains all the parameters to send to the API endpoint
+
+	for the org remove team member operation.
+
+	Typically these are written to a http.Request.
+*/
+type OrgRemoveTeamMemberParams struct {
+
+	/* ID.
+
+	   id of the team
+
+	   Format: int64
+	*/
+	ID int64
+
+	/* Username.
+
+	   username of the user to remove
+	*/
+	Username string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the org remove team member params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgRemoveTeamMemberParams) WithDefaults() *OrgRemoveTeamMemberParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the org remove team member params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgRemoveTeamMemberParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the org remove team member params
+func (o *OrgRemoveTeamMemberParams) WithTimeout(timeout time.Duration) *OrgRemoveTeamMemberParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the org remove team member params
+func (o *OrgRemoveTeamMemberParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the org remove team member params
+func (o *OrgRemoveTeamMemberParams) WithContext(ctx context.Context) *OrgRemoveTeamMemberParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the org remove team member params
+func (o *OrgRemoveTeamMemberParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the org remove team member params
+func (o *OrgRemoveTeamMemberParams) WithHTTPClient(client *http.Client) *OrgRemoveTeamMemberParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the org remove team member params
+func (o *OrgRemoveTeamMemberParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithID adds the id to the org remove team member params
+func (o *OrgRemoveTeamMemberParams) WithID(id int64) *OrgRemoveTeamMemberParams {
+	o.SetID(id)
+	return o
+}
+
+// SetID adds the id to the org remove team member params
+func (o *OrgRemoveTeamMemberParams) SetID(id int64) {
+	o.ID = id
+}
+
+// WithUsername adds the username to the org remove team member params
+func (o *OrgRemoveTeamMemberParams) WithUsername(username string) *OrgRemoveTeamMemberParams {
+	o.SetUsername(username)
+	return o
+}
+
+// SetUsername adds the username to the org remove team member params
+func (o *OrgRemoveTeamMemberParams) SetUsername(username string) {
+	o.Username = username
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *OrgRemoveTeamMemberParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param id
+	if err := r.SetPathParam("id", swag.FormatInt64(o.ID)); err != nil {
+		return err
+	}
+
+	// path param username
+	if err := r.SetPathParam("username", o.Username); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_remove_team_member_responses.go b/bots-common/gitea-generated/client/organization/org_remove_team_member_responses.go
new file mode 100644
index 0000000..4b81976
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_remove_team_member_responses.go
@@ -0,0 +1,150 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// OrgRemoveTeamMemberReader is a Reader for the OrgRemoveTeamMember structure.
+type OrgRemoveTeamMemberReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *OrgRemoveTeamMemberReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewOrgRemoveTeamMemberNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewOrgRemoveTeamMemberNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[DELETE /teams/{id}/members/{username}] orgRemoveTeamMember", response, response.Code())
+	}
+}
+
+// NewOrgRemoveTeamMemberNoContent creates a OrgRemoveTeamMemberNoContent with default headers values
+func NewOrgRemoveTeamMemberNoContent() *OrgRemoveTeamMemberNoContent {
+	return &OrgRemoveTeamMemberNoContent{}
+}
+
+/*
+OrgRemoveTeamMemberNoContent describes a response with status code 204, with default header values.
+
+APIEmpty is an empty response
+*/
+type OrgRemoveTeamMemberNoContent struct {
+}
+
+// IsSuccess returns true when this org remove team member no content response has a 2xx status code
+func (o *OrgRemoveTeamMemberNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this org remove team member no content response has a 3xx status code
+func (o *OrgRemoveTeamMemberNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org remove team member no content response has a 4xx status code
+func (o *OrgRemoveTeamMemberNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this org remove team member no content response has a 5xx status code
+func (o *OrgRemoveTeamMemberNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org remove team member no content response a status code equal to that given
+func (o *OrgRemoveTeamMemberNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the org remove team member no content response
+func (o *OrgRemoveTeamMemberNoContent) Code() int {
+	return 204
+}
+
+func (o *OrgRemoveTeamMemberNoContent) Error() string {
+	return fmt.Sprintf("[DELETE /teams/{id}/members/{username}][%d] orgRemoveTeamMemberNoContent", 204)
+}
+
+func (o *OrgRemoveTeamMemberNoContent) String() string {
+	return fmt.Sprintf("[DELETE /teams/{id}/members/{username}][%d] orgRemoveTeamMemberNoContent", 204)
+}
+
+func (o *OrgRemoveTeamMemberNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewOrgRemoveTeamMemberNotFound creates a OrgRemoveTeamMemberNotFound with default headers values
+func NewOrgRemoveTeamMemberNotFound() *OrgRemoveTeamMemberNotFound {
+	return &OrgRemoveTeamMemberNotFound{}
+}
+
+/*
+OrgRemoveTeamMemberNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type OrgRemoveTeamMemberNotFound struct {
+}
+
+// IsSuccess returns true when this org remove team member not found response has a 2xx status code
+func (o *OrgRemoveTeamMemberNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this org remove team member not found response has a 3xx status code
+func (o *OrgRemoveTeamMemberNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org remove team member not found response has a 4xx status code
+func (o *OrgRemoveTeamMemberNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this org remove team member not found response has a 5xx status code
+func (o *OrgRemoveTeamMemberNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org remove team member not found response a status code equal to that given
+func (o *OrgRemoveTeamMemberNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the org remove team member not found response
+func (o *OrgRemoveTeamMemberNotFound) Code() int {
+	return 404
+}
+
+func (o *OrgRemoveTeamMemberNotFound) Error() string {
+	return fmt.Sprintf("[DELETE /teams/{id}/members/{username}][%d] orgRemoveTeamMemberNotFound", 404)
+}
+
+func (o *OrgRemoveTeamMemberNotFound) String() string {
+	return fmt.Sprintf("[DELETE /teams/{id}/members/{username}][%d] orgRemoveTeamMemberNotFound", 404)
+}
+
+func (o *OrgRemoveTeamMemberNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_remove_team_repository_parameters.go b/bots-common/gitea-generated/client/organization/org_remove_team_repository_parameters.go
new file mode 100644
index 0000000..ed7a1b6
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_remove_team_repository_parameters.go
@@ -0,0 +1,198 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewOrgRemoveTeamRepositoryParams creates a new OrgRemoveTeamRepositoryParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewOrgRemoveTeamRepositoryParams() *OrgRemoveTeamRepositoryParams {
+	return &OrgRemoveTeamRepositoryParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewOrgRemoveTeamRepositoryParamsWithTimeout creates a new OrgRemoveTeamRepositoryParams object
+// with the ability to set a timeout on a request.
+func NewOrgRemoveTeamRepositoryParamsWithTimeout(timeout time.Duration) *OrgRemoveTeamRepositoryParams {
+	return &OrgRemoveTeamRepositoryParams{
+		timeout: timeout,
+	}
+}
+
+// NewOrgRemoveTeamRepositoryParamsWithContext creates a new OrgRemoveTeamRepositoryParams object
+// with the ability to set a context for a request.
+func NewOrgRemoveTeamRepositoryParamsWithContext(ctx context.Context) *OrgRemoveTeamRepositoryParams {
+	return &OrgRemoveTeamRepositoryParams{
+		Context: ctx,
+	}
+}
+
+// NewOrgRemoveTeamRepositoryParamsWithHTTPClient creates a new OrgRemoveTeamRepositoryParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewOrgRemoveTeamRepositoryParamsWithHTTPClient(client *http.Client) *OrgRemoveTeamRepositoryParams {
+	return &OrgRemoveTeamRepositoryParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+OrgRemoveTeamRepositoryParams contains all the parameters to send to the API endpoint
+
+	for the org remove team repository operation.
+
+	Typically these are written to a http.Request.
+*/
+type OrgRemoveTeamRepositoryParams struct {
+
+	/* ID.
+
+	   id of the team
+
+	   Format: int64
+	*/
+	ID int64
+
+	/* Org.
+
+	   organization that owns the repo to remove
+	*/
+	Org string
+
+	/* Repo.
+
+	   name of the repo to remove
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the org remove team repository params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgRemoveTeamRepositoryParams) WithDefaults() *OrgRemoveTeamRepositoryParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the org remove team repository params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgRemoveTeamRepositoryParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the org remove team repository params
+func (o *OrgRemoveTeamRepositoryParams) WithTimeout(timeout time.Duration) *OrgRemoveTeamRepositoryParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the org remove team repository params
+func (o *OrgRemoveTeamRepositoryParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the org remove team repository params
+func (o *OrgRemoveTeamRepositoryParams) WithContext(ctx context.Context) *OrgRemoveTeamRepositoryParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the org remove team repository params
+func (o *OrgRemoveTeamRepositoryParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the org remove team repository params
+func (o *OrgRemoveTeamRepositoryParams) WithHTTPClient(client *http.Client) *OrgRemoveTeamRepositoryParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the org remove team repository params
+func (o *OrgRemoveTeamRepositoryParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithID adds the id to the org remove team repository params
+func (o *OrgRemoveTeamRepositoryParams) WithID(id int64) *OrgRemoveTeamRepositoryParams {
+	o.SetID(id)
+	return o
+}
+
+// SetID adds the id to the org remove team repository params
+func (o *OrgRemoveTeamRepositoryParams) SetID(id int64) {
+	o.ID = id
+}
+
+// WithOrg adds the org to the org remove team repository params
+func (o *OrgRemoveTeamRepositoryParams) WithOrg(org string) *OrgRemoveTeamRepositoryParams {
+	o.SetOrg(org)
+	return o
+}
+
+// SetOrg adds the org to the org remove team repository params
+func (o *OrgRemoveTeamRepositoryParams) SetOrg(org string) {
+	o.Org = org
+}
+
+// WithRepo adds the repo to the org remove team repository params
+func (o *OrgRemoveTeamRepositoryParams) WithRepo(repo string) *OrgRemoveTeamRepositoryParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the org remove team repository params
+func (o *OrgRemoveTeamRepositoryParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *OrgRemoveTeamRepositoryParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param id
+	if err := r.SetPathParam("id", swag.FormatInt64(o.ID)); err != nil {
+		return err
+	}
+
+	// path param org
+	if err := r.SetPathParam("org", o.Org); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_remove_team_repository_responses.go b/bots-common/gitea-generated/client/organization/org_remove_team_repository_responses.go
new file mode 100644
index 0000000..1e9fb6f
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_remove_team_repository_responses.go
@@ -0,0 +1,228 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// OrgRemoveTeamRepositoryReader is a Reader for the OrgRemoveTeamRepository structure.
+type OrgRemoveTeamRepositoryReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *OrgRemoveTeamRepositoryReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewOrgRemoveTeamRepositoryNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 403:
+		result := NewOrgRemoveTeamRepositoryForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewOrgRemoveTeamRepositoryNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[DELETE /teams/{id}/repos/{org}/{repo}] orgRemoveTeamRepository", response, response.Code())
+	}
+}
+
+// NewOrgRemoveTeamRepositoryNoContent creates a OrgRemoveTeamRepositoryNoContent with default headers values
+func NewOrgRemoveTeamRepositoryNoContent() *OrgRemoveTeamRepositoryNoContent {
+	return &OrgRemoveTeamRepositoryNoContent{}
+}
+
+/*
+OrgRemoveTeamRepositoryNoContent describes a response with status code 204, with default header values.
+
+APIEmpty is an empty response
+*/
+type OrgRemoveTeamRepositoryNoContent struct {
+}
+
+// IsSuccess returns true when this org remove team repository no content response has a 2xx status code
+func (o *OrgRemoveTeamRepositoryNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this org remove team repository no content response has a 3xx status code
+func (o *OrgRemoveTeamRepositoryNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org remove team repository no content response has a 4xx status code
+func (o *OrgRemoveTeamRepositoryNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this org remove team repository no content response has a 5xx status code
+func (o *OrgRemoveTeamRepositoryNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org remove team repository no content response a status code equal to that given
+func (o *OrgRemoveTeamRepositoryNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the org remove team repository no content response
+func (o *OrgRemoveTeamRepositoryNoContent) Code() int {
+	return 204
+}
+
+func (o *OrgRemoveTeamRepositoryNoContent) Error() string {
+	return fmt.Sprintf("[DELETE /teams/{id}/repos/{org}/{repo}][%d] orgRemoveTeamRepositoryNoContent", 204)
+}
+
+func (o *OrgRemoveTeamRepositoryNoContent) String() string {
+	return fmt.Sprintf("[DELETE /teams/{id}/repos/{org}/{repo}][%d] orgRemoveTeamRepositoryNoContent", 204)
+}
+
+func (o *OrgRemoveTeamRepositoryNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewOrgRemoveTeamRepositoryForbidden creates a OrgRemoveTeamRepositoryForbidden with default headers values
+func NewOrgRemoveTeamRepositoryForbidden() *OrgRemoveTeamRepositoryForbidden {
+	return &OrgRemoveTeamRepositoryForbidden{}
+}
+
+/*
+OrgRemoveTeamRepositoryForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type OrgRemoveTeamRepositoryForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this org remove team repository forbidden response has a 2xx status code
+func (o *OrgRemoveTeamRepositoryForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this org remove team repository forbidden response has a 3xx status code
+func (o *OrgRemoveTeamRepositoryForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org remove team repository forbidden response has a 4xx status code
+func (o *OrgRemoveTeamRepositoryForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this org remove team repository forbidden response has a 5xx status code
+func (o *OrgRemoveTeamRepositoryForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org remove team repository forbidden response a status code equal to that given
+func (o *OrgRemoveTeamRepositoryForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the org remove team repository forbidden response
+func (o *OrgRemoveTeamRepositoryForbidden) Code() int {
+	return 403
+}
+
+func (o *OrgRemoveTeamRepositoryForbidden) Error() string {
+	return fmt.Sprintf("[DELETE /teams/{id}/repos/{org}/{repo}][%d] orgRemoveTeamRepositoryForbidden", 403)
+}
+
+func (o *OrgRemoveTeamRepositoryForbidden) String() string {
+	return fmt.Sprintf("[DELETE /teams/{id}/repos/{org}/{repo}][%d] orgRemoveTeamRepositoryForbidden", 403)
+}
+
+func (o *OrgRemoveTeamRepositoryForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewOrgRemoveTeamRepositoryNotFound creates a OrgRemoveTeamRepositoryNotFound with default headers values
+func NewOrgRemoveTeamRepositoryNotFound() *OrgRemoveTeamRepositoryNotFound {
+	return &OrgRemoveTeamRepositoryNotFound{}
+}
+
+/*
+OrgRemoveTeamRepositoryNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type OrgRemoveTeamRepositoryNotFound struct {
+}
+
+// IsSuccess returns true when this org remove team repository not found response has a 2xx status code
+func (o *OrgRemoveTeamRepositoryNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this org remove team repository not found response has a 3xx status code
+func (o *OrgRemoveTeamRepositoryNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org remove team repository not found response has a 4xx status code
+func (o *OrgRemoveTeamRepositoryNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this org remove team repository not found response has a 5xx status code
+func (o *OrgRemoveTeamRepositoryNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org remove team repository not found response a status code equal to that given
+func (o *OrgRemoveTeamRepositoryNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the org remove team repository not found response
+func (o *OrgRemoveTeamRepositoryNotFound) Code() int {
+	return 404
+}
+
+func (o *OrgRemoveTeamRepositoryNotFound) Error() string {
+	return fmt.Sprintf("[DELETE /teams/{id}/repos/{org}/{repo}][%d] orgRemoveTeamRepositoryNotFound", 404)
+}
+
+func (o *OrgRemoveTeamRepositoryNotFound) String() string {
+	return fmt.Sprintf("[DELETE /teams/{id}/repos/{org}/{repo}][%d] orgRemoveTeamRepositoryNotFound", 404)
+}
+
+func (o *OrgRemoveTeamRepositoryNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_update_avatar_parameters.go b/bots-common/gitea-generated/client/organization/org_update_avatar_parameters.go
new file mode 100644
index 0000000..cdfb94c
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_update_avatar_parameters.go
@@ -0,0 +1,172 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewOrgUpdateAvatarParams creates a new OrgUpdateAvatarParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewOrgUpdateAvatarParams() *OrgUpdateAvatarParams {
+	return &OrgUpdateAvatarParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewOrgUpdateAvatarParamsWithTimeout creates a new OrgUpdateAvatarParams object
+// with the ability to set a timeout on a request.
+func NewOrgUpdateAvatarParamsWithTimeout(timeout time.Duration) *OrgUpdateAvatarParams {
+	return &OrgUpdateAvatarParams{
+		timeout: timeout,
+	}
+}
+
+// NewOrgUpdateAvatarParamsWithContext creates a new OrgUpdateAvatarParams object
+// with the ability to set a context for a request.
+func NewOrgUpdateAvatarParamsWithContext(ctx context.Context) *OrgUpdateAvatarParams {
+	return &OrgUpdateAvatarParams{
+		Context: ctx,
+	}
+}
+
+// NewOrgUpdateAvatarParamsWithHTTPClient creates a new OrgUpdateAvatarParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewOrgUpdateAvatarParamsWithHTTPClient(client *http.Client) *OrgUpdateAvatarParams {
+	return &OrgUpdateAvatarParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+OrgUpdateAvatarParams contains all the parameters to send to the API endpoint
+
+	for the org update avatar operation.
+
+	Typically these are written to a http.Request.
+*/
+type OrgUpdateAvatarParams struct {
+
+	// Body.
+	Body *models.UpdateUserAvatarOption
+
+	/* Org.
+
+	   name of the organization
+	*/
+	Org string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the org update avatar params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgUpdateAvatarParams) WithDefaults() *OrgUpdateAvatarParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the org update avatar params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrgUpdateAvatarParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the org update avatar params
+func (o *OrgUpdateAvatarParams) WithTimeout(timeout time.Duration) *OrgUpdateAvatarParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the org update avatar params
+func (o *OrgUpdateAvatarParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the org update avatar params
+func (o *OrgUpdateAvatarParams) WithContext(ctx context.Context) *OrgUpdateAvatarParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the org update avatar params
+func (o *OrgUpdateAvatarParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the org update avatar params
+func (o *OrgUpdateAvatarParams) WithHTTPClient(client *http.Client) *OrgUpdateAvatarParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the org update avatar params
+func (o *OrgUpdateAvatarParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the org update avatar params
+func (o *OrgUpdateAvatarParams) WithBody(body *models.UpdateUserAvatarOption) *OrgUpdateAvatarParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the org update avatar params
+func (o *OrgUpdateAvatarParams) SetBody(body *models.UpdateUserAvatarOption) {
+	o.Body = body
+}
+
+// WithOrg adds the org to the org update avatar params
+func (o *OrgUpdateAvatarParams) WithOrg(org string) *OrgUpdateAvatarParams {
+	o.SetOrg(org)
+	return o
+}
+
+// SetOrg adds the org to the org update avatar params
+func (o *OrgUpdateAvatarParams) SetOrg(org string) {
+	o.Org = org
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *OrgUpdateAvatarParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	// path param org
+	if err := r.SetPathParam("org", o.Org); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/org_update_avatar_responses.go b/bots-common/gitea-generated/client/organization/org_update_avatar_responses.go
new file mode 100644
index 0000000..7fedd70
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/org_update_avatar_responses.go
@@ -0,0 +1,150 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// OrgUpdateAvatarReader is a Reader for the OrgUpdateAvatar structure.
+type OrgUpdateAvatarReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *OrgUpdateAvatarReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewOrgUpdateAvatarNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewOrgUpdateAvatarNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[POST /orgs/{org}/avatar] orgUpdateAvatar", response, response.Code())
+	}
+}
+
+// NewOrgUpdateAvatarNoContent creates a OrgUpdateAvatarNoContent with default headers values
+func NewOrgUpdateAvatarNoContent() *OrgUpdateAvatarNoContent {
+	return &OrgUpdateAvatarNoContent{}
+}
+
+/*
+OrgUpdateAvatarNoContent describes a response with status code 204, with default header values.
+
+APIEmpty is an empty response
+*/
+type OrgUpdateAvatarNoContent struct {
+}
+
+// IsSuccess returns true when this org update avatar no content response has a 2xx status code
+func (o *OrgUpdateAvatarNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this org update avatar no content response has a 3xx status code
+func (o *OrgUpdateAvatarNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org update avatar no content response has a 4xx status code
+func (o *OrgUpdateAvatarNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this org update avatar no content response has a 5xx status code
+func (o *OrgUpdateAvatarNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org update avatar no content response a status code equal to that given
+func (o *OrgUpdateAvatarNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the org update avatar no content response
+func (o *OrgUpdateAvatarNoContent) Code() int {
+	return 204
+}
+
+func (o *OrgUpdateAvatarNoContent) Error() string {
+	return fmt.Sprintf("[POST /orgs/{org}/avatar][%d] orgUpdateAvatarNoContent", 204)
+}
+
+func (o *OrgUpdateAvatarNoContent) String() string {
+	return fmt.Sprintf("[POST /orgs/{org}/avatar][%d] orgUpdateAvatarNoContent", 204)
+}
+
+func (o *OrgUpdateAvatarNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewOrgUpdateAvatarNotFound creates a OrgUpdateAvatarNotFound with default headers values
+func NewOrgUpdateAvatarNotFound() *OrgUpdateAvatarNotFound {
+	return &OrgUpdateAvatarNotFound{}
+}
+
+/*
+OrgUpdateAvatarNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type OrgUpdateAvatarNotFound struct {
+}
+
+// IsSuccess returns true when this org update avatar not found response has a 2xx status code
+func (o *OrgUpdateAvatarNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this org update avatar not found response has a 3xx status code
+func (o *OrgUpdateAvatarNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this org update avatar not found response has a 4xx status code
+func (o *OrgUpdateAvatarNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this org update avatar not found response has a 5xx status code
+func (o *OrgUpdateAvatarNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this org update avatar not found response a status code equal to that given
+func (o *OrgUpdateAvatarNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the org update avatar not found response
+func (o *OrgUpdateAvatarNotFound) Code() int {
+	return 404
+}
+
+func (o *OrgUpdateAvatarNotFound) Error() string {
+	return fmt.Sprintf("[POST /orgs/{org}/avatar][%d] orgUpdateAvatarNotFound", 404)
+}
+
+func (o *OrgUpdateAvatarNotFound) String() string {
+	return fmt.Sprintf("[POST /orgs/{org}/avatar][%d] orgUpdateAvatarNotFound", 404)
+}
+
+func (o *OrgUpdateAvatarNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/organization_block_user_parameters.go b/bots-common/gitea-generated/client/organization/organization_block_user_parameters.go
new file mode 100644
index 0000000..6acc803
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/organization_block_user_parameters.go
@@ -0,0 +1,207 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewOrganizationBlockUserParams creates a new OrganizationBlockUserParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewOrganizationBlockUserParams() *OrganizationBlockUserParams {
+	return &OrganizationBlockUserParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewOrganizationBlockUserParamsWithTimeout creates a new OrganizationBlockUserParams object
+// with the ability to set a timeout on a request.
+func NewOrganizationBlockUserParamsWithTimeout(timeout time.Duration) *OrganizationBlockUserParams {
+	return &OrganizationBlockUserParams{
+		timeout: timeout,
+	}
+}
+
+// NewOrganizationBlockUserParamsWithContext creates a new OrganizationBlockUserParams object
+// with the ability to set a context for a request.
+func NewOrganizationBlockUserParamsWithContext(ctx context.Context) *OrganizationBlockUserParams {
+	return &OrganizationBlockUserParams{
+		Context: ctx,
+	}
+}
+
+// NewOrganizationBlockUserParamsWithHTTPClient creates a new OrganizationBlockUserParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewOrganizationBlockUserParamsWithHTTPClient(client *http.Client) *OrganizationBlockUserParams {
+	return &OrganizationBlockUserParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+OrganizationBlockUserParams contains all the parameters to send to the API endpoint
+
+	for the organization block user operation.
+
+	Typically these are written to a http.Request.
+*/
+type OrganizationBlockUserParams struct {
+
+	/* Note.
+
+	   optional note for the block
+	*/
+	Note *string
+
+	/* Org.
+
+	   name of the organization
+	*/
+	Org string
+
+	/* Username.
+
+	   user to block
+	*/
+	Username string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the organization block user params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrganizationBlockUserParams) WithDefaults() *OrganizationBlockUserParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the organization block user params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrganizationBlockUserParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the organization block user params
+func (o *OrganizationBlockUserParams) WithTimeout(timeout time.Duration) *OrganizationBlockUserParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the organization block user params
+func (o *OrganizationBlockUserParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the organization block user params
+func (o *OrganizationBlockUserParams) WithContext(ctx context.Context) *OrganizationBlockUserParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the organization block user params
+func (o *OrganizationBlockUserParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the organization block user params
+func (o *OrganizationBlockUserParams) WithHTTPClient(client *http.Client) *OrganizationBlockUserParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the organization block user params
+func (o *OrganizationBlockUserParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithNote adds the note to the organization block user params
+func (o *OrganizationBlockUserParams) WithNote(note *string) *OrganizationBlockUserParams {
+	o.SetNote(note)
+	return o
+}
+
+// SetNote adds the note to the organization block user params
+func (o *OrganizationBlockUserParams) SetNote(note *string) {
+	o.Note = note
+}
+
+// WithOrg adds the org to the organization block user params
+func (o *OrganizationBlockUserParams) WithOrg(org string) *OrganizationBlockUserParams {
+	o.SetOrg(org)
+	return o
+}
+
+// SetOrg adds the org to the organization block user params
+func (o *OrganizationBlockUserParams) SetOrg(org string) {
+	o.Org = org
+}
+
+// WithUsername adds the username to the organization block user params
+func (o *OrganizationBlockUserParams) WithUsername(username string) *OrganizationBlockUserParams {
+	o.SetUsername(username)
+	return o
+}
+
+// SetUsername adds the username to the organization block user params
+func (o *OrganizationBlockUserParams) SetUsername(username string) {
+	o.Username = username
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *OrganizationBlockUserParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.Note != nil {
+
+		// query param note
+		var qrNote string
+
+		if o.Note != nil {
+			qrNote = *o.Note
+		}
+		qNote := qrNote
+		if qNote != "" {
+
+			if err := r.SetQueryParam("note", qNote); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param org
+	if err := r.SetPathParam("org", o.Org); err != nil {
+		return err
+	}
+
+	// path param username
+	if err := r.SetPathParam("username", o.Username); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/organization_block_user_responses.go b/bots-common/gitea-generated/client/organization/organization_block_user_responses.go
new file mode 100644
index 0000000..38e68b5
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/organization_block_user_responses.go
@@ -0,0 +1,228 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// OrganizationBlockUserReader is a Reader for the OrganizationBlockUser structure.
+type OrganizationBlockUserReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *OrganizationBlockUserReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewOrganizationBlockUserNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewOrganizationBlockUserNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 422:
+		result := NewOrganizationBlockUserUnprocessableEntity()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[PUT /orgs/{org}/blocks/{username}] organizationBlockUser", response, response.Code())
+	}
+}
+
+// NewOrganizationBlockUserNoContent creates a OrganizationBlockUserNoContent with default headers values
+func NewOrganizationBlockUserNoContent() *OrganizationBlockUserNoContent {
+	return &OrganizationBlockUserNoContent{}
+}
+
+/*
+OrganizationBlockUserNoContent describes a response with status code 204, with default header values.
+
+APIEmpty is an empty response
+*/
+type OrganizationBlockUserNoContent struct {
+}
+
+// IsSuccess returns true when this organization block user no content response has a 2xx status code
+func (o *OrganizationBlockUserNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this organization block user no content response has a 3xx status code
+func (o *OrganizationBlockUserNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this organization block user no content response has a 4xx status code
+func (o *OrganizationBlockUserNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this organization block user no content response has a 5xx status code
+func (o *OrganizationBlockUserNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this organization block user no content response a status code equal to that given
+func (o *OrganizationBlockUserNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the organization block user no content response
+func (o *OrganizationBlockUserNoContent) Code() int {
+	return 204
+}
+
+func (o *OrganizationBlockUserNoContent) Error() string {
+	return fmt.Sprintf("[PUT /orgs/{org}/blocks/{username}][%d] organizationBlockUserNoContent", 204)
+}
+
+func (o *OrganizationBlockUserNoContent) String() string {
+	return fmt.Sprintf("[PUT /orgs/{org}/blocks/{username}][%d] organizationBlockUserNoContent", 204)
+}
+
+func (o *OrganizationBlockUserNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewOrganizationBlockUserNotFound creates a OrganizationBlockUserNotFound with default headers values
+func NewOrganizationBlockUserNotFound() *OrganizationBlockUserNotFound {
+	return &OrganizationBlockUserNotFound{}
+}
+
+/*
+OrganizationBlockUserNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type OrganizationBlockUserNotFound struct {
+}
+
+// IsSuccess returns true when this organization block user not found response has a 2xx status code
+func (o *OrganizationBlockUserNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this organization block user not found response has a 3xx status code
+func (o *OrganizationBlockUserNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this organization block user not found response has a 4xx status code
+func (o *OrganizationBlockUserNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this organization block user not found response has a 5xx status code
+func (o *OrganizationBlockUserNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this organization block user not found response a status code equal to that given
+func (o *OrganizationBlockUserNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the organization block user not found response
+func (o *OrganizationBlockUserNotFound) Code() int {
+	return 404
+}
+
+func (o *OrganizationBlockUserNotFound) Error() string {
+	return fmt.Sprintf("[PUT /orgs/{org}/blocks/{username}][%d] organizationBlockUserNotFound", 404)
+}
+
+func (o *OrganizationBlockUserNotFound) String() string {
+	return fmt.Sprintf("[PUT /orgs/{org}/blocks/{username}][%d] organizationBlockUserNotFound", 404)
+}
+
+func (o *OrganizationBlockUserNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewOrganizationBlockUserUnprocessableEntity creates a OrganizationBlockUserUnprocessableEntity with default headers values
+func NewOrganizationBlockUserUnprocessableEntity() *OrganizationBlockUserUnprocessableEntity {
+	return &OrganizationBlockUserUnprocessableEntity{}
+}
+
+/*
+OrganizationBlockUserUnprocessableEntity describes a response with status code 422, with default header values.
+
+APIValidationError is error format response related to input validation
+*/
+type OrganizationBlockUserUnprocessableEntity struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this organization block user unprocessable entity response has a 2xx status code
+func (o *OrganizationBlockUserUnprocessableEntity) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this organization block user unprocessable entity response has a 3xx status code
+func (o *OrganizationBlockUserUnprocessableEntity) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this organization block user unprocessable entity response has a 4xx status code
+func (o *OrganizationBlockUserUnprocessableEntity) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this organization block user unprocessable entity response has a 5xx status code
+func (o *OrganizationBlockUserUnprocessableEntity) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this organization block user unprocessable entity response a status code equal to that given
+func (o *OrganizationBlockUserUnprocessableEntity) IsCode(code int) bool {
+	return code == 422
+}
+
+// Code gets the status code for the organization block user unprocessable entity response
+func (o *OrganizationBlockUserUnprocessableEntity) Code() int {
+	return 422
+}
+
+func (o *OrganizationBlockUserUnprocessableEntity) Error() string {
+	return fmt.Sprintf("[PUT /orgs/{org}/blocks/{username}][%d] organizationBlockUserUnprocessableEntity", 422)
+}
+
+func (o *OrganizationBlockUserUnprocessableEntity) String() string {
+	return fmt.Sprintf("[PUT /orgs/{org}/blocks/{username}][%d] organizationBlockUserUnprocessableEntity", 422)
+}
+
+func (o *OrganizationBlockUserUnprocessableEntity) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/organization_check_user_block_parameters.go b/bots-common/gitea-generated/client/organization/organization_check_user_block_parameters.go
new file mode 100644
index 0000000..92dd34d
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/organization_check_user_block_parameters.go
@@ -0,0 +1,173 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewOrganizationCheckUserBlockParams creates a new OrganizationCheckUserBlockParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewOrganizationCheckUserBlockParams() *OrganizationCheckUserBlockParams {
+	return &OrganizationCheckUserBlockParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewOrganizationCheckUserBlockParamsWithTimeout creates a new OrganizationCheckUserBlockParams object
+// with the ability to set a timeout on a request.
+func NewOrganizationCheckUserBlockParamsWithTimeout(timeout time.Duration) *OrganizationCheckUserBlockParams {
+	return &OrganizationCheckUserBlockParams{
+		timeout: timeout,
+	}
+}
+
+// NewOrganizationCheckUserBlockParamsWithContext creates a new OrganizationCheckUserBlockParams object
+// with the ability to set a context for a request.
+func NewOrganizationCheckUserBlockParamsWithContext(ctx context.Context) *OrganizationCheckUserBlockParams {
+	return &OrganizationCheckUserBlockParams{
+		Context: ctx,
+	}
+}
+
+// NewOrganizationCheckUserBlockParamsWithHTTPClient creates a new OrganizationCheckUserBlockParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewOrganizationCheckUserBlockParamsWithHTTPClient(client *http.Client) *OrganizationCheckUserBlockParams {
+	return &OrganizationCheckUserBlockParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+OrganizationCheckUserBlockParams contains all the parameters to send to the API endpoint
+
+	for the organization check user block operation.
+
+	Typically these are written to a http.Request.
+*/
+type OrganizationCheckUserBlockParams struct {
+
+	/* Org.
+
+	   name of the organization
+	*/
+	Org string
+
+	/* Username.
+
+	   user to check
+	*/
+	Username string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the organization check user block params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrganizationCheckUserBlockParams) WithDefaults() *OrganizationCheckUserBlockParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the organization check user block params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrganizationCheckUserBlockParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the organization check user block params
+func (o *OrganizationCheckUserBlockParams) WithTimeout(timeout time.Duration) *OrganizationCheckUserBlockParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the organization check user block params
+func (o *OrganizationCheckUserBlockParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the organization check user block params
+func (o *OrganizationCheckUserBlockParams) WithContext(ctx context.Context) *OrganizationCheckUserBlockParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the organization check user block params
+func (o *OrganizationCheckUserBlockParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the organization check user block params
+func (o *OrganizationCheckUserBlockParams) WithHTTPClient(client *http.Client) *OrganizationCheckUserBlockParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the organization check user block params
+func (o *OrganizationCheckUserBlockParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithOrg adds the org to the organization check user block params
+func (o *OrganizationCheckUserBlockParams) WithOrg(org string) *OrganizationCheckUserBlockParams {
+	o.SetOrg(org)
+	return o
+}
+
+// SetOrg adds the org to the organization check user block params
+func (o *OrganizationCheckUserBlockParams) SetOrg(org string) {
+	o.Org = org
+}
+
+// WithUsername adds the username to the organization check user block params
+func (o *OrganizationCheckUserBlockParams) WithUsername(username string) *OrganizationCheckUserBlockParams {
+	o.SetUsername(username)
+	return o
+}
+
+// SetUsername adds the username to the organization check user block params
+func (o *OrganizationCheckUserBlockParams) SetUsername(username string) {
+	o.Username = username
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *OrganizationCheckUserBlockParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param org
+	if err := r.SetPathParam("org", o.Org); err != nil {
+		return err
+	}
+
+	// path param username
+	if err := r.SetPathParam("username", o.Username); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/organization_check_user_block_responses.go b/bots-common/gitea-generated/client/organization/organization_check_user_block_responses.go
new file mode 100644
index 0000000..0e28007
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/organization_check_user_block_responses.go
@@ -0,0 +1,150 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// OrganizationCheckUserBlockReader is a Reader for the OrganizationCheckUserBlock structure.
+type OrganizationCheckUserBlockReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *OrganizationCheckUserBlockReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewOrganizationCheckUserBlockNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewOrganizationCheckUserBlockNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /orgs/{org}/blocks/{username}] organizationCheckUserBlock", response, response.Code())
+	}
+}
+
+// NewOrganizationCheckUserBlockNoContent creates a OrganizationCheckUserBlockNoContent with default headers values
+func NewOrganizationCheckUserBlockNoContent() *OrganizationCheckUserBlockNoContent {
+	return &OrganizationCheckUserBlockNoContent{}
+}
+
+/*
+OrganizationCheckUserBlockNoContent describes a response with status code 204, with default header values.
+
+APIEmpty is an empty response
+*/
+type OrganizationCheckUserBlockNoContent struct {
+}
+
+// IsSuccess returns true when this organization check user block no content response has a 2xx status code
+func (o *OrganizationCheckUserBlockNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this organization check user block no content response has a 3xx status code
+func (o *OrganizationCheckUserBlockNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this organization check user block no content response has a 4xx status code
+func (o *OrganizationCheckUserBlockNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this organization check user block no content response has a 5xx status code
+func (o *OrganizationCheckUserBlockNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this organization check user block no content response a status code equal to that given
+func (o *OrganizationCheckUserBlockNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the organization check user block no content response
+func (o *OrganizationCheckUserBlockNoContent) Code() int {
+	return 204
+}
+
+func (o *OrganizationCheckUserBlockNoContent) Error() string {
+	return fmt.Sprintf("[GET /orgs/{org}/blocks/{username}][%d] organizationCheckUserBlockNoContent", 204)
+}
+
+func (o *OrganizationCheckUserBlockNoContent) String() string {
+	return fmt.Sprintf("[GET /orgs/{org}/blocks/{username}][%d] organizationCheckUserBlockNoContent", 204)
+}
+
+func (o *OrganizationCheckUserBlockNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewOrganizationCheckUserBlockNotFound creates a OrganizationCheckUserBlockNotFound with default headers values
+func NewOrganizationCheckUserBlockNotFound() *OrganizationCheckUserBlockNotFound {
+	return &OrganizationCheckUserBlockNotFound{}
+}
+
+/*
+OrganizationCheckUserBlockNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type OrganizationCheckUserBlockNotFound struct {
+}
+
+// IsSuccess returns true when this organization check user block not found response has a 2xx status code
+func (o *OrganizationCheckUserBlockNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this organization check user block not found response has a 3xx status code
+func (o *OrganizationCheckUserBlockNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this organization check user block not found response has a 4xx status code
+func (o *OrganizationCheckUserBlockNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this organization check user block not found response has a 5xx status code
+func (o *OrganizationCheckUserBlockNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this organization check user block not found response a status code equal to that given
+func (o *OrganizationCheckUserBlockNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the organization check user block not found response
+func (o *OrganizationCheckUserBlockNotFound) Code() int {
+	return 404
+}
+
+func (o *OrganizationCheckUserBlockNotFound) Error() string {
+	return fmt.Sprintf("[GET /orgs/{org}/blocks/{username}][%d] organizationCheckUserBlockNotFound", 404)
+}
+
+func (o *OrganizationCheckUserBlockNotFound) String() string {
+	return fmt.Sprintf("[GET /orgs/{org}/blocks/{username}][%d] organizationCheckUserBlockNotFound", 404)
+}
+
+func (o *OrganizationCheckUserBlockNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/organization_client.go b/bots-common/gitea-generated/client/organization/organization_client.go
new file mode 100644
index 0000000..504d7fd
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/organization_client.go
@@ -0,0 +1,2536 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	httptransport "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// New creates a new organization API client.
+func New(transport runtime.ClientTransport, formats strfmt.Registry) ClientService {
+	return &Client{transport: transport, formats: formats}
+}
+
+// New creates a new organization API client with basic auth credentials.
+// It takes the following parameters:
+// - host: http host (github.com).
+// - basePath: any base path for the API client ("/v1", "/v3").
+// - scheme: http scheme ("http", "https").
+// - user: user for basic authentication header.
+// - password: password for basic authentication header.
+func NewClientWithBasicAuth(host, basePath, scheme, user, password string) ClientService {
+	transport := httptransport.New(host, basePath, []string{scheme})
+	transport.DefaultAuthentication = httptransport.BasicAuth(user, password)
+	return &Client{transport: transport, formats: strfmt.Default}
+}
+
+// New creates a new organization API client with a bearer token for authentication.
+// It takes the following parameters:
+// - host: http host (github.com).
+// - basePath: any base path for the API client ("/v1", "/v3").
+// - scheme: http scheme ("http", "https").
+// - bearerToken: bearer token for Bearer authentication header.
+func NewClientWithBearerToken(host, basePath, scheme, bearerToken string) ClientService {
+	transport := httptransport.New(host, basePath, []string{scheme})
+	transport.DefaultAuthentication = httptransport.BearerToken(bearerToken)
+	return &Client{transport: transport, formats: strfmt.Default}
+}
+
+/*
+Client for organization API
+*/
+type Client struct {
+	transport runtime.ClientTransport
+	formats   strfmt.Registry
+}
+
+// ClientOption may be used to customize the behavior of Client methods.
+type ClientOption func(*runtime.ClientOperation)
+
+// This client is generated with a few options you might find useful for your swagger spec.
+//
+// Feel free to add you own set of options.
+
+// WithContentType allows the client to force the Content-Type header
+// to negotiate a specific Consumer from the server.
+//
+// You may use this option to set arbitrary extensions to your MIME media type.
+func WithContentType(mime string) ClientOption {
+	return func(r *runtime.ClientOperation) {
+		r.ConsumesMediaTypes = []string{mime}
+	}
+}
+
+// WithContentTypeApplicationJSON sets the Content-Type header to "application/json".
+func WithContentTypeApplicationJSON(r *runtime.ClientOperation) {
+	r.ConsumesMediaTypes = []string{"application/json"}
+}
+
+// WithContentTypeTextPlain sets the Content-Type header to "text/plain".
+func WithContentTypeTextPlain(r *runtime.ClientOperation) {
+	r.ConsumesMediaTypes = []string{"text/plain"}
+}
+
+// WithAccept allows the client to force the Accept header
+// to negotiate a specific Producer from the server.
+//
+// You may use this option to set arbitrary extensions to your MIME media type.
+func WithAccept(mime string) ClientOption {
+	return func(r *runtime.ClientOperation) {
+		r.ProducesMediaTypes = []string{mime}
+	}
+}
+
+// WithAcceptApplicationJSON sets the Accept header to "application/json".
+func WithAcceptApplicationJSON(r *runtime.ClientOperation) {
+	r.ProducesMediaTypes = []string{"application/json"}
+}
+
+// WithAcceptTextHTML sets the Accept header to "text/html".
+func WithAcceptTextHTML(r *runtime.ClientOperation) {
+	r.ProducesMediaTypes = []string{"text/html"}
+}
+
+// ClientService is the interface for Client methods
+type ClientService interface {
+	CreateOrgRepo(params *CreateOrgRepoParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*CreateOrgRepoCreated, error)
+
+	CreateOrgRepoDeprecated(params *CreateOrgRepoDeprecatedParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*CreateOrgRepoDeprecatedCreated, error)
+
+	CreateOrgVariable(params *CreateOrgVariableParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*CreateOrgVariableCreated, *CreateOrgVariableNoContent, error)
+
+	DeleteOrgSecret(params *DeleteOrgSecretParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*DeleteOrgSecretNoContent, error)
+
+	DeleteOrgVariable(params *DeleteOrgVariableParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*DeleteOrgVariableOK, *DeleteOrgVariableCreated, *DeleteOrgVariableNoContent, error)
+
+	GetOrgVariable(params *GetOrgVariableParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*GetOrgVariableOK, error)
+
+	GetOrgVariablesList(params *GetOrgVariablesListParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*GetOrgVariablesListOK, error)
+
+	OrgAddTeamMember(params *OrgAddTeamMemberParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgAddTeamMemberNoContent, error)
+
+	OrgAddTeamRepository(params *OrgAddTeamRepositoryParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgAddTeamRepositoryNoContent, error)
+
+	OrgConcealMember(params *OrgConcealMemberParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgConcealMemberNoContent, error)
+
+	OrgCreate(params *OrgCreateParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgCreateCreated, error)
+
+	OrgCreateHook(params *OrgCreateHookParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgCreateHookCreated, error)
+
+	OrgCreateLabel(params *OrgCreateLabelParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgCreateLabelCreated, error)
+
+	OrgCreateTeam(params *OrgCreateTeamParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgCreateTeamCreated, error)
+
+	OrgDelete(params *OrgDeleteParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgDeleteNoContent, error)
+
+	OrgDeleteAvatar(params *OrgDeleteAvatarParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgDeleteAvatarNoContent, error)
+
+	OrgDeleteHook(params *OrgDeleteHookParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgDeleteHookNoContent, error)
+
+	OrgDeleteLabel(params *OrgDeleteLabelParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgDeleteLabelNoContent, error)
+
+	OrgDeleteMember(params *OrgDeleteMemberParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgDeleteMemberNoContent, error)
+
+	OrgDeleteTeam(params *OrgDeleteTeamParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgDeleteTeamNoContent, error)
+
+	OrgEdit(params *OrgEditParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgEditOK, error)
+
+	OrgEditHook(params *OrgEditHookParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgEditHookOK, error)
+
+	OrgEditLabel(params *OrgEditLabelParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgEditLabelOK, error)
+
+	OrgEditTeam(params *OrgEditTeamParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgEditTeamOK, error)
+
+	OrgGet(params *OrgGetParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgGetOK, error)
+
+	OrgGetAll(params *OrgGetAllParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgGetAllOK, error)
+
+	OrgGetHook(params *OrgGetHookParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgGetHookOK, error)
+
+	OrgGetLabel(params *OrgGetLabelParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgGetLabelOK, error)
+
+	OrgGetRunnerRegistrationToken(params *OrgGetRunnerRegistrationTokenParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgGetRunnerRegistrationTokenOK, error)
+
+	OrgGetTeam(params *OrgGetTeamParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgGetTeamOK, error)
+
+	OrgGetUserPermissions(params *OrgGetUserPermissionsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgGetUserPermissionsOK, error)
+
+	OrgIsMember(params *OrgIsMemberParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgIsMemberNoContent, error)
+
+	OrgIsPublicMember(params *OrgIsPublicMemberParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgIsPublicMemberNoContent, error)
+
+	OrgListActionsSecrets(params *OrgListActionsSecretsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgListActionsSecretsOK, error)
+
+	OrgListActivityFeeds(params *OrgListActivityFeedsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgListActivityFeedsOK, error)
+
+	OrgListCurrentUserOrgs(params *OrgListCurrentUserOrgsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgListCurrentUserOrgsOK, error)
+
+	OrgListHooks(params *OrgListHooksParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgListHooksOK, error)
+
+	OrgListLabels(params *OrgListLabelsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgListLabelsOK, error)
+
+	OrgListMembers(params *OrgListMembersParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgListMembersOK, error)
+
+	OrgListPublicMembers(params *OrgListPublicMembersParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgListPublicMembersOK, error)
+
+	OrgListRepos(params *OrgListReposParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgListReposOK, error)
+
+	OrgListTeamActivityFeeds(params *OrgListTeamActivityFeedsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgListTeamActivityFeedsOK, error)
+
+	OrgListTeamMember(params *OrgListTeamMemberParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgListTeamMemberOK, error)
+
+	OrgListTeamMembers(params *OrgListTeamMembersParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgListTeamMembersOK, error)
+
+	OrgListTeamRepo(params *OrgListTeamRepoParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgListTeamRepoOK, error)
+
+	OrgListTeamRepos(params *OrgListTeamReposParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgListTeamReposOK, error)
+
+	OrgListTeams(params *OrgListTeamsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgListTeamsOK, error)
+
+	OrgListUserOrgs(params *OrgListUserOrgsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgListUserOrgsOK, error)
+
+	OrgPublicizeMember(params *OrgPublicizeMemberParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgPublicizeMemberNoContent, error)
+
+	OrgRemoveTeamMember(params *OrgRemoveTeamMemberParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgRemoveTeamMemberNoContent, error)
+
+	OrgRemoveTeamRepository(params *OrgRemoveTeamRepositoryParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgRemoveTeamRepositoryNoContent, error)
+
+	OrgUpdateAvatar(params *OrgUpdateAvatarParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgUpdateAvatarNoContent, error)
+
+	OrganizationBlockUser(params *OrganizationBlockUserParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrganizationBlockUserNoContent, error)
+
+	OrganizationCheckUserBlock(params *OrganizationCheckUserBlockParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrganizationCheckUserBlockNoContent, error)
+
+	OrganizationListBlocks(params *OrganizationListBlocksParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrganizationListBlocksOK, error)
+
+	OrganizationUnblockUser(params *OrganizationUnblockUserParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrganizationUnblockUserNoContent, error)
+
+	TeamSearch(params *TeamSearchParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*TeamSearchOK, error)
+
+	UpdateOrgSecret(params *UpdateOrgSecretParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UpdateOrgSecretCreated, *UpdateOrgSecretNoContent, error)
+
+	UpdateOrgVariable(params *UpdateOrgVariableParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UpdateOrgVariableCreated, *UpdateOrgVariableNoContent, error)
+
+	SetTransport(transport runtime.ClientTransport)
+}
+
+/*
+CreateOrgRepo creates a repository in an organization
+*/
+func (a *Client) CreateOrgRepo(params *CreateOrgRepoParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*CreateOrgRepoCreated, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewCreateOrgRepoParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "createOrgRepo",
+		Method:             "POST",
+		PathPattern:        "/orgs/{org}/repos",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &CreateOrgRepoReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*CreateOrgRepoCreated)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for createOrgRepo: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+CreateOrgRepoDeprecated creates a repository in an organization
+*/
+func (a *Client) CreateOrgRepoDeprecated(params *CreateOrgRepoDeprecatedParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*CreateOrgRepoDeprecatedCreated, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewCreateOrgRepoDeprecatedParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "createOrgRepoDeprecated",
+		Method:             "POST",
+		PathPattern:        "/org/{org}/repos",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &CreateOrgRepoDeprecatedReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*CreateOrgRepoDeprecatedCreated)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for createOrgRepoDeprecated: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+CreateOrgVariable creates an org level variable
+*/
+func (a *Client) CreateOrgVariable(params *CreateOrgVariableParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*CreateOrgVariableCreated, *CreateOrgVariableNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewCreateOrgVariableParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "createOrgVariable",
+		Method:             "POST",
+		PathPattern:        "/orgs/{org}/actions/variables/{variablename}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &CreateOrgVariableReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, nil, err
+	}
+	switch value := result.(type) {
+	case *CreateOrgVariableCreated:
+		return value, nil, nil
+	case *CreateOrgVariableNoContent:
+		return nil, value, nil
+	}
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for organization: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+DeleteOrgSecret deletes a secret in an organization
+*/
+func (a *Client) DeleteOrgSecret(params *DeleteOrgSecretParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*DeleteOrgSecretNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewDeleteOrgSecretParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "deleteOrgSecret",
+		Method:             "DELETE",
+		PathPattern:        "/orgs/{org}/actions/secrets/{secretname}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &DeleteOrgSecretReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*DeleteOrgSecretNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for deleteOrgSecret: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+DeleteOrgVariable deletes an org level variable
+*/
+func (a *Client) DeleteOrgVariable(params *DeleteOrgVariableParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*DeleteOrgVariableOK, *DeleteOrgVariableCreated, *DeleteOrgVariableNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewDeleteOrgVariableParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "deleteOrgVariable",
+		Method:             "DELETE",
+		PathPattern:        "/orgs/{org}/actions/variables/{variablename}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &DeleteOrgVariableReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, nil, nil, err
+	}
+	switch value := result.(type) {
+	case *DeleteOrgVariableOK:
+		return value, nil, nil, nil
+	case *DeleteOrgVariableCreated:
+		return nil, value, nil, nil
+	case *DeleteOrgVariableNoContent:
+		return nil, nil, value, nil
+	}
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for organization: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+GetOrgVariable gets an org level variable
+*/
+func (a *Client) GetOrgVariable(params *GetOrgVariableParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*GetOrgVariableOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewGetOrgVariableParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "getOrgVariable",
+		Method:             "GET",
+		PathPattern:        "/orgs/{org}/actions/variables/{variablename}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &GetOrgVariableReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*GetOrgVariableOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for getOrgVariable: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+GetOrgVariablesList gets an org level variables list
+*/
+func (a *Client) GetOrgVariablesList(params *GetOrgVariablesListParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*GetOrgVariablesListOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewGetOrgVariablesListParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "getOrgVariablesList",
+		Method:             "GET",
+		PathPattern:        "/orgs/{org}/actions/variables",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &GetOrgVariablesListReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*GetOrgVariablesListOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for getOrgVariablesList: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+OrgAddTeamMember adds a team member
+*/
+func (a *Client) OrgAddTeamMember(params *OrgAddTeamMemberParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgAddTeamMemberNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewOrgAddTeamMemberParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "orgAddTeamMember",
+		Method:             "PUT",
+		PathPattern:        "/teams/{id}/members/{username}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &OrgAddTeamMemberReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*OrgAddTeamMemberNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for orgAddTeamMember: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+OrgAddTeamRepository adds a repository to a team
+*/
+func (a *Client) OrgAddTeamRepository(params *OrgAddTeamRepositoryParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgAddTeamRepositoryNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewOrgAddTeamRepositoryParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "orgAddTeamRepository",
+		Method:             "PUT",
+		PathPattern:        "/teams/{id}/repos/{org}/{repo}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &OrgAddTeamRepositoryReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*OrgAddTeamRepositoryNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for orgAddTeamRepository: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+OrgConcealMember conceals a user s membership
+*/
+func (a *Client) OrgConcealMember(params *OrgConcealMemberParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgConcealMemberNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewOrgConcealMemberParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "orgConcealMember",
+		Method:             "DELETE",
+		PathPattern:        "/orgs/{org}/public_members/{username}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &OrgConcealMemberReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*OrgConcealMemberNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for orgConcealMember: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+OrgCreate creates an organization
+*/
+func (a *Client) OrgCreate(params *OrgCreateParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgCreateCreated, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewOrgCreateParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "orgCreate",
+		Method:             "POST",
+		PathPattern:        "/orgs",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &OrgCreateReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*OrgCreateCreated)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for orgCreate: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+OrgCreateHook creates a hook
+*/
+func (a *Client) OrgCreateHook(params *OrgCreateHookParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgCreateHookCreated, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewOrgCreateHookParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "orgCreateHook",
+		Method:             "POST",
+		PathPattern:        "/orgs/{org}/hooks",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &OrgCreateHookReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*OrgCreateHookCreated)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for orgCreateHook: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+OrgCreateLabel creates a label for an organization
+*/
+func (a *Client) OrgCreateLabel(params *OrgCreateLabelParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgCreateLabelCreated, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewOrgCreateLabelParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "orgCreateLabel",
+		Method:             "POST",
+		PathPattern:        "/orgs/{org}/labels",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &OrgCreateLabelReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*OrgCreateLabelCreated)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for orgCreateLabel: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+OrgCreateTeam creates a team
+*/
+func (a *Client) OrgCreateTeam(params *OrgCreateTeamParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgCreateTeamCreated, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewOrgCreateTeamParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "orgCreateTeam",
+		Method:             "POST",
+		PathPattern:        "/orgs/{org}/teams",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &OrgCreateTeamReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*OrgCreateTeamCreated)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for orgCreateTeam: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+OrgDelete deletes an organization
+*/
+func (a *Client) OrgDelete(params *OrgDeleteParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgDeleteNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewOrgDeleteParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "orgDelete",
+		Method:             "DELETE",
+		PathPattern:        "/orgs/{org}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &OrgDeleteReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*OrgDeleteNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for orgDelete: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+OrgDeleteAvatar deletes avatar
+*/
+func (a *Client) OrgDeleteAvatar(params *OrgDeleteAvatarParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgDeleteAvatarNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewOrgDeleteAvatarParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "orgDeleteAvatar",
+		Method:             "DELETE",
+		PathPattern:        "/orgs/{org}/avatar",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &OrgDeleteAvatarReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*OrgDeleteAvatarNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for orgDeleteAvatar: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+OrgDeleteHook deletes a hook
+*/
+func (a *Client) OrgDeleteHook(params *OrgDeleteHookParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgDeleteHookNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewOrgDeleteHookParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "orgDeleteHook",
+		Method:             "DELETE",
+		PathPattern:        "/orgs/{org}/hooks/{id}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &OrgDeleteHookReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*OrgDeleteHookNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for orgDeleteHook: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+OrgDeleteLabel deletes a label
+*/
+func (a *Client) OrgDeleteLabel(params *OrgDeleteLabelParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgDeleteLabelNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewOrgDeleteLabelParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "orgDeleteLabel",
+		Method:             "DELETE",
+		PathPattern:        "/orgs/{org}/labels/{id}",
+		ProducesMediaTypes: []string{"application/json", "text/html"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &OrgDeleteLabelReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*OrgDeleteLabelNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for orgDeleteLabel: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+OrgDeleteMember removes a member from an organization
+*/
+func (a *Client) OrgDeleteMember(params *OrgDeleteMemberParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgDeleteMemberNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewOrgDeleteMemberParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "orgDeleteMember",
+		Method:             "DELETE",
+		PathPattern:        "/orgs/{org}/members/{username}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &OrgDeleteMemberReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*OrgDeleteMemberNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for orgDeleteMember: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+OrgDeleteTeam deletes a team
+*/
+func (a *Client) OrgDeleteTeam(params *OrgDeleteTeamParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgDeleteTeamNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewOrgDeleteTeamParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "orgDeleteTeam",
+		Method:             "DELETE",
+		PathPattern:        "/teams/{id}",
+		ProducesMediaTypes: []string{"application/json", "text/html"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &OrgDeleteTeamReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*OrgDeleteTeamNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for orgDeleteTeam: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+OrgEdit edits an organization
+*/
+func (a *Client) OrgEdit(params *OrgEditParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgEditOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewOrgEditParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "orgEdit",
+		Method:             "PATCH",
+		PathPattern:        "/orgs/{org}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &OrgEditReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*OrgEditOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for orgEdit: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+OrgEditHook updates a hook
+*/
+func (a *Client) OrgEditHook(params *OrgEditHookParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgEditHookOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewOrgEditHookParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "orgEditHook",
+		Method:             "PATCH",
+		PathPattern:        "/orgs/{org}/hooks/{id}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &OrgEditHookReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*OrgEditHookOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for orgEditHook: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+OrgEditLabel updates a label
+*/
+func (a *Client) OrgEditLabel(params *OrgEditLabelParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgEditLabelOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewOrgEditLabelParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "orgEditLabel",
+		Method:             "PATCH",
+		PathPattern:        "/orgs/{org}/labels/{id}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &OrgEditLabelReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*OrgEditLabelOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for orgEditLabel: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+OrgEditTeam edits a team
+*/
+func (a *Client) OrgEditTeam(params *OrgEditTeamParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgEditTeamOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewOrgEditTeamParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "orgEditTeam",
+		Method:             "PATCH",
+		PathPattern:        "/teams/{id}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &OrgEditTeamReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*OrgEditTeamOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for orgEditTeam: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+OrgGet gets an organization
+*/
+func (a *Client) OrgGet(params *OrgGetParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgGetOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewOrgGetParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "orgGet",
+		Method:             "GET",
+		PathPattern:        "/orgs/{org}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &OrgGetReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*OrgGetOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for orgGet: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+OrgGetAll gets list of organizations
+*/
+func (a *Client) OrgGetAll(params *OrgGetAllParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgGetAllOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewOrgGetAllParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "orgGetAll",
+		Method:             "GET",
+		PathPattern:        "/orgs",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &OrgGetAllReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*OrgGetAllOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for orgGetAll: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+OrgGetHook gets a hook
+*/
+func (a *Client) OrgGetHook(params *OrgGetHookParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgGetHookOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewOrgGetHookParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "orgGetHook",
+		Method:             "GET",
+		PathPattern:        "/orgs/{org}/hooks/{id}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &OrgGetHookReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*OrgGetHookOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for orgGetHook: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+OrgGetLabel gets a single label
+*/
+func (a *Client) OrgGetLabel(params *OrgGetLabelParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgGetLabelOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewOrgGetLabelParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "orgGetLabel",
+		Method:             "GET",
+		PathPattern:        "/orgs/{org}/labels/{id}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &OrgGetLabelReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*OrgGetLabelOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for orgGetLabel: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+OrgGetRunnerRegistrationToken gets an organization s actions runner registration token
+*/
+func (a *Client) OrgGetRunnerRegistrationToken(params *OrgGetRunnerRegistrationTokenParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgGetRunnerRegistrationTokenOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewOrgGetRunnerRegistrationTokenParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "orgGetRunnerRegistrationToken",
+		Method:             "GET",
+		PathPattern:        "/orgs/{org}/actions/runners/registration-token",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &OrgGetRunnerRegistrationTokenReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*OrgGetRunnerRegistrationTokenOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for orgGetRunnerRegistrationToken: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+OrgGetTeam gets a team
+*/
+func (a *Client) OrgGetTeam(params *OrgGetTeamParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgGetTeamOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewOrgGetTeamParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "orgGetTeam",
+		Method:             "GET",
+		PathPattern:        "/teams/{id}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &OrgGetTeamReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*OrgGetTeamOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for orgGetTeam: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+OrgGetUserPermissions gets user permissions in organization
+*/
+func (a *Client) OrgGetUserPermissions(params *OrgGetUserPermissionsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgGetUserPermissionsOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewOrgGetUserPermissionsParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "orgGetUserPermissions",
+		Method:             "GET",
+		PathPattern:        "/users/{username}/orgs/{org}/permissions",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &OrgGetUserPermissionsReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*OrgGetUserPermissionsOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for orgGetUserPermissions: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+OrgIsMember checks if a user is a member of an organization
+*/
+func (a *Client) OrgIsMember(params *OrgIsMemberParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgIsMemberNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewOrgIsMemberParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "orgIsMember",
+		Method:             "GET",
+		PathPattern:        "/orgs/{org}/members/{username}",
+		ProducesMediaTypes: []string{"application/json", "text/html"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &OrgIsMemberReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*OrgIsMemberNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for orgIsMember: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+OrgIsPublicMember checks if a user is a public member of an organization
+*/
+func (a *Client) OrgIsPublicMember(params *OrgIsPublicMemberParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgIsPublicMemberNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewOrgIsPublicMemberParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "orgIsPublicMember",
+		Method:             "GET",
+		PathPattern:        "/orgs/{org}/public_members/{username}",
+		ProducesMediaTypes: []string{"application/json", "text/html"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &OrgIsPublicMemberReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*OrgIsPublicMemberNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for orgIsPublicMember: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+OrgListActionsSecrets lists an organization s actions secrets
+*/
+func (a *Client) OrgListActionsSecrets(params *OrgListActionsSecretsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgListActionsSecretsOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewOrgListActionsSecretsParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "orgListActionsSecrets",
+		Method:             "GET",
+		PathPattern:        "/orgs/{org}/actions/secrets",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &OrgListActionsSecretsReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*OrgListActionsSecretsOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for orgListActionsSecrets: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+OrgListActivityFeeds lists an organization s activity feeds
+*/
+func (a *Client) OrgListActivityFeeds(params *OrgListActivityFeedsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgListActivityFeedsOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewOrgListActivityFeedsParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "orgListActivityFeeds",
+		Method:             "GET",
+		PathPattern:        "/orgs/{org}/activities/feeds",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &OrgListActivityFeedsReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*OrgListActivityFeedsOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for orgListActivityFeeds: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+OrgListCurrentUserOrgs lists the current user s organizations
+*/
+func (a *Client) OrgListCurrentUserOrgs(params *OrgListCurrentUserOrgsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgListCurrentUserOrgsOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewOrgListCurrentUserOrgsParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "orgListCurrentUserOrgs",
+		Method:             "GET",
+		PathPattern:        "/user/orgs",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &OrgListCurrentUserOrgsReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*OrgListCurrentUserOrgsOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for orgListCurrentUserOrgs: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+OrgListHooks lists an organization s webhooks
+*/
+func (a *Client) OrgListHooks(params *OrgListHooksParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgListHooksOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewOrgListHooksParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "orgListHooks",
+		Method:             "GET",
+		PathPattern:        "/orgs/{org}/hooks",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &OrgListHooksReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*OrgListHooksOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for orgListHooks: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+OrgListLabels lists an organization s labels
+*/
+func (a *Client) OrgListLabels(params *OrgListLabelsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgListLabelsOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewOrgListLabelsParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "orgListLabels",
+		Method:             "GET",
+		PathPattern:        "/orgs/{org}/labels",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &OrgListLabelsReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*OrgListLabelsOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for orgListLabels: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+OrgListMembers lists an organization s members
+*/
+func (a *Client) OrgListMembers(params *OrgListMembersParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgListMembersOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewOrgListMembersParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "orgListMembers",
+		Method:             "GET",
+		PathPattern:        "/orgs/{org}/members",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &OrgListMembersReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*OrgListMembersOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for orgListMembers: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+OrgListPublicMembers lists an organization s public members
+*/
+func (a *Client) OrgListPublicMembers(params *OrgListPublicMembersParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgListPublicMembersOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewOrgListPublicMembersParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "orgListPublicMembers",
+		Method:             "GET",
+		PathPattern:        "/orgs/{org}/public_members",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &OrgListPublicMembersReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*OrgListPublicMembersOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for orgListPublicMembers: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+OrgListRepos lists an organization s repos
+*/
+func (a *Client) OrgListRepos(params *OrgListReposParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgListReposOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewOrgListReposParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "orgListRepos",
+		Method:             "GET",
+		PathPattern:        "/orgs/{org}/repos",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &OrgListReposReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*OrgListReposOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for orgListRepos: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+OrgListTeamActivityFeeds lists a team s activity feeds
+*/
+func (a *Client) OrgListTeamActivityFeeds(params *OrgListTeamActivityFeedsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgListTeamActivityFeedsOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewOrgListTeamActivityFeedsParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "orgListTeamActivityFeeds",
+		Method:             "GET",
+		PathPattern:        "/teams/{id}/activities/feeds",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &OrgListTeamActivityFeedsReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*OrgListTeamActivityFeedsOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for orgListTeamActivityFeeds: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+OrgListTeamMember lists a particular member of team
+*/
+func (a *Client) OrgListTeamMember(params *OrgListTeamMemberParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgListTeamMemberOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewOrgListTeamMemberParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "orgListTeamMember",
+		Method:             "GET",
+		PathPattern:        "/teams/{id}/members/{username}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &OrgListTeamMemberReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*OrgListTeamMemberOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for orgListTeamMember: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+OrgListTeamMembers lists a team s members
+*/
+func (a *Client) OrgListTeamMembers(params *OrgListTeamMembersParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgListTeamMembersOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewOrgListTeamMembersParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "orgListTeamMembers",
+		Method:             "GET",
+		PathPattern:        "/teams/{id}/members",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &OrgListTeamMembersReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*OrgListTeamMembersOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for orgListTeamMembers: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+OrgListTeamRepo lists a particular repo of team
+*/
+func (a *Client) OrgListTeamRepo(params *OrgListTeamRepoParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgListTeamRepoOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewOrgListTeamRepoParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "orgListTeamRepo",
+		Method:             "GET",
+		PathPattern:        "/teams/{id}/repos/{org}/{repo}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &OrgListTeamRepoReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*OrgListTeamRepoOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for orgListTeamRepo: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+OrgListTeamRepos lists a team s repos
+*/
+func (a *Client) OrgListTeamRepos(params *OrgListTeamReposParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgListTeamReposOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewOrgListTeamReposParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "orgListTeamRepos",
+		Method:             "GET",
+		PathPattern:        "/teams/{id}/repos",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &OrgListTeamReposReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*OrgListTeamReposOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for orgListTeamRepos: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+OrgListTeams lists an organization s teams
+*/
+func (a *Client) OrgListTeams(params *OrgListTeamsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgListTeamsOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewOrgListTeamsParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "orgListTeams",
+		Method:             "GET",
+		PathPattern:        "/orgs/{org}/teams",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &OrgListTeamsReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*OrgListTeamsOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for orgListTeams: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+OrgListUserOrgs lists a user s organizations
+*/
+func (a *Client) OrgListUserOrgs(params *OrgListUserOrgsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgListUserOrgsOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewOrgListUserOrgsParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "orgListUserOrgs",
+		Method:             "GET",
+		PathPattern:        "/users/{username}/orgs",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &OrgListUserOrgsReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*OrgListUserOrgsOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for orgListUserOrgs: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+OrgPublicizeMember publicizes a user s membership
+*/
+func (a *Client) OrgPublicizeMember(params *OrgPublicizeMemberParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgPublicizeMemberNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewOrgPublicizeMemberParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "orgPublicizeMember",
+		Method:             "PUT",
+		PathPattern:        "/orgs/{org}/public_members/{username}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &OrgPublicizeMemberReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*OrgPublicizeMemberNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for orgPublicizeMember: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+OrgRemoveTeamMember removes a team member
+*/
+func (a *Client) OrgRemoveTeamMember(params *OrgRemoveTeamMemberParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgRemoveTeamMemberNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewOrgRemoveTeamMemberParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "orgRemoveTeamMember",
+		Method:             "DELETE",
+		PathPattern:        "/teams/{id}/members/{username}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &OrgRemoveTeamMemberReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*OrgRemoveTeamMemberNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for orgRemoveTeamMember: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+OrgRemoveTeamRepository removes a repository from a team
+
+This does not delete the repository, it only removes the repository from the team.
+*/
+func (a *Client) OrgRemoveTeamRepository(params *OrgRemoveTeamRepositoryParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgRemoveTeamRepositoryNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewOrgRemoveTeamRepositoryParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "orgRemoveTeamRepository",
+		Method:             "DELETE",
+		PathPattern:        "/teams/{id}/repos/{org}/{repo}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &OrgRemoveTeamRepositoryReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*OrgRemoveTeamRepositoryNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for orgRemoveTeamRepository: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+OrgUpdateAvatar updates avatar
+*/
+func (a *Client) OrgUpdateAvatar(params *OrgUpdateAvatarParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrgUpdateAvatarNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewOrgUpdateAvatarParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "orgUpdateAvatar",
+		Method:             "POST",
+		PathPattern:        "/orgs/{org}/avatar",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &OrgUpdateAvatarReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*OrgUpdateAvatarNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for orgUpdateAvatar: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+OrganizationBlockUser blocks a user
+*/
+func (a *Client) OrganizationBlockUser(params *OrganizationBlockUserParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrganizationBlockUserNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewOrganizationBlockUserParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "organizationBlockUser",
+		Method:             "PUT",
+		PathPattern:        "/orgs/{org}/blocks/{username}",
+		ProducesMediaTypes: []string{"application/json", "text/html"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &OrganizationBlockUserReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*OrganizationBlockUserNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for organizationBlockUser: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+OrganizationCheckUserBlock checks if a user is blocked by the organization
+*/
+func (a *Client) OrganizationCheckUserBlock(params *OrganizationCheckUserBlockParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrganizationCheckUserBlockNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewOrganizationCheckUserBlockParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "organizationCheckUserBlock",
+		Method:             "GET",
+		PathPattern:        "/orgs/{org}/blocks/{username}",
+		ProducesMediaTypes: []string{"application/json", "text/html"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &OrganizationCheckUserBlockReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*OrganizationCheckUserBlockNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for organizationCheckUserBlock: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+OrganizationListBlocks lists users blocked by the organization
+*/
+func (a *Client) OrganizationListBlocks(params *OrganizationListBlocksParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrganizationListBlocksOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewOrganizationListBlocksParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "organizationListBlocks",
+		Method:             "GET",
+		PathPattern:        "/orgs/{org}/blocks",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &OrganizationListBlocksReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*OrganizationListBlocksOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for organizationListBlocks: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+OrganizationUnblockUser unblocks a user
+*/
+func (a *Client) OrganizationUnblockUser(params *OrganizationUnblockUserParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*OrganizationUnblockUserNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewOrganizationUnblockUserParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "organizationUnblockUser",
+		Method:             "DELETE",
+		PathPattern:        "/orgs/{org}/blocks/{username}",
+		ProducesMediaTypes: []string{"application/json", "text/html"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &OrganizationUnblockUserReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*OrganizationUnblockUserNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for organizationUnblockUser: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+TeamSearch searches for teams within an organization
+*/
+func (a *Client) TeamSearch(params *TeamSearchParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*TeamSearchOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewTeamSearchParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "teamSearch",
+		Method:             "GET",
+		PathPattern:        "/orgs/{org}/teams/search",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &TeamSearchReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*TeamSearchOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for teamSearch: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+UpdateOrgSecret creates or update a secret value in an organization
+*/
+func (a *Client) UpdateOrgSecret(params *UpdateOrgSecretParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UpdateOrgSecretCreated, *UpdateOrgSecretNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewUpdateOrgSecretParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "updateOrgSecret",
+		Method:             "PUT",
+		PathPattern:        "/orgs/{org}/actions/secrets/{secretname}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &UpdateOrgSecretReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, nil, err
+	}
+	switch value := result.(type) {
+	case *UpdateOrgSecretCreated:
+		return value, nil, nil
+	case *UpdateOrgSecretNoContent:
+		return nil, value, nil
+	}
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for organization: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+UpdateOrgVariable updates an org level variable
+*/
+func (a *Client) UpdateOrgVariable(params *UpdateOrgVariableParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UpdateOrgVariableCreated, *UpdateOrgVariableNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewUpdateOrgVariableParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "updateOrgVariable",
+		Method:             "PUT",
+		PathPattern:        "/orgs/{org}/actions/variables/{variablename}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &UpdateOrgVariableReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, nil, err
+	}
+	switch value := result.(type) {
+	case *UpdateOrgVariableCreated:
+		return value, nil, nil
+	case *UpdateOrgVariableNoContent:
+		return nil, value, nil
+	}
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for organization: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+// SetTransport changes the transport on the client
+func (a *Client) SetTransport(transport runtime.ClientTransport) {
+	a.transport = transport
+}
diff --git a/bots-common/gitea-generated/client/organization/organization_list_blocks_parameters.go b/bots-common/gitea-generated/client/organization/organization_list_blocks_parameters.go
new file mode 100644
index 0000000..ebaefe9
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/organization_list_blocks_parameters.go
@@ -0,0 +1,220 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewOrganizationListBlocksParams creates a new OrganizationListBlocksParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewOrganizationListBlocksParams() *OrganizationListBlocksParams {
+	return &OrganizationListBlocksParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewOrganizationListBlocksParamsWithTimeout creates a new OrganizationListBlocksParams object
+// with the ability to set a timeout on a request.
+func NewOrganizationListBlocksParamsWithTimeout(timeout time.Duration) *OrganizationListBlocksParams {
+	return &OrganizationListBlocksParams{
+		timeout: timeout,
+	}
+}
+
+// NewOrganizationListBlocksParamsWithContext creates a new OrganizationListBlocksParams object
+// with the ability to set a context for a request.
+func NewOrganizationListBlocksParamsWithContext(ctx context.Context) *OrganizationListBlocksParams {
+	return &OrganizationListBlocksParams{
+		Context: ctx,
+	}
+}
+
+// NewOrganizationListBlocksParamsWithHTTPClient creates a new OrganizationListBlocksParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewOrganizationListBlocksParamsWithHTTPClient(client *http.Client) *OrganizationListBlocksParams {
+	return &OrganizationListBlocksParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+OrganizationListBlocksParams contains all the parameters to send to the API endpoint
+
+	for the organization list blocks operation.
+
+	Typically these are written to a http.Request.
+*/
+type OrganizationListBlocksParams struct {
+
+	/* Limit.
+
+	   page size of results
+	*/
+	Limit *int64
+
+	/* Org.
+
+	   name of the organization
+	*/
+	Org string
+
+	/* Page.
+
+	   page number of results to return (1-based)
+	*/
+	Page *int64
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the organization list blocks params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrganizationListBlocksParams) WithDefaults() *OrganizationListBlocksParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the organization list blocks params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrganizationListBlocksParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the organization list blocks params
+func (o *OrganizationListBlocksParams) WithTimeout(timeout time.Duration) *OrganizationListBlocksParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the organization list blocks params
+func (o *OrganizationListBlocksParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the organization list blocks params
+func (o *OrganizationListBlocksParams) WithContext(ctx context.Context) *OrganizationListBlocksParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the organization list blocks params
+func (o *OrganizationListBlocksParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the organization list blocks params
+func (o *OrganizationListBlocksParams) WithHTTPClient(client *http.Client) *OrganizationListBlocksParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the organization list blocks params
+func (o *OrganizationListBlocksParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithLimit adds the limit to the organization list blocks params
+func (o *OrganizationListBlocksParams) WithLimit(limit *int64) *OrganizationListBlocksParams {
+	o.SetLimit(limit)
+	return o
+}
+
+// SetLimit adds the limit to the organization list blocks params
+func (o *OrganizationListBlocksParams) SetLimit(limit *int64) {
+	o.Limit = limit
+}
+
+// WithOrg adds the org to the organization list blocks params
+func (o *OrganizationListBlocksParams) WithOrg(org string) *OrganizationListBlocksParams {
+	o.SetOrg(org)
+	return o
+}
+
+// SetOrg adds the org to the organization list blocks params
+func (o *OrganizationListBlocksParams) SetOrg(org string) {
+	o.Org = org
+}
+
+// WithPage adds the page to the organization list blocks params
+func (o *OrganizationListBlocksParams) WithPage(page *int64) *OrganizationListBlocksParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the organization list blocks params
+func (o *OrganizationListBlocksParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *OrganizationListBlocksParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.Limit != nil {
+
+		// query param limit
+		var qrLimit int64
+
+		if o.Limit != nil {
+			qrLimit = *o.Limit
+		}
+		qLimit := swag.FormatInt64(qrLimit)
+		if qLimit != "" {
+
+			if err := r.SetQueryParam("limit", qLimit); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param org
+	if err := r.SetPathParam("org", o.Org); err != nil {
+		return err
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/organization_list_blocks_responses.go b/bots-common/gitea-generated/client/organization/organization_list_blocks_responses.go
new file mode 100644
index 0000000..7e696f6
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/organization_list_blocks_responses.go
@@ -0,0 +1,104 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// OrganizationListBlocksReader is a Reader for the OrganizationListBlocks structure.
+type OrganizationListBlocksReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *OrganizationListBlocksReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewOrganizationListBlocksOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	default:
+		return nil, runtime.NewAPIError("[GET /orgs/{org}/blocks] organizationListBlocks", response, response.Code())
+	}
+}
+
+// NewOrganizationListBlocksOK creates a OrganizationListBlocksOK with default headers values
+func NewOrganizationListBlocksOK() *OrganizationListBlocksOK {
+	return &OrganizationListBlocksOK{}
+}
+
+/*
+OrganizationListBlocksOK describes a response with status code 200, with default header values.
+
+UserList
+*/
+type OrganizationListBlocksOK struct {
+	Payload []*models.User
+}
+
+// IsSuccess returns true when this organization list blocks o k response has a 2xx status code
+func (o *OrganizationListBlocksOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this organization list blocks o k response has a 3xx status code
+func (o *OrganizationListBlocksOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this organization list blocks o k response has a 4xx status code
+func (o *OrganizationListBlocksOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this organization list blocks o k response has a 5xx status code
+func (o *OrganizationListBlocksOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this organization list blocks o k response a status code equal to that given
+func (o *OrganizationListBlocksOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the organization list blocks o k response
+func (o *OrganizationListBlocksOK) Code() int {
+	return 200
+}
+
+func (o *OrganizationListBlocksOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /orgs/{org}/blocks][%d] organizationListBlocksOK %s", 200, payload)
+}
+
+func (o *OrganizationListBlocksOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /orgs/{org}/blocks][%d] organizationListBlocksOK %s", 200, payload)
+}
+
+func (o *OrganizationListBlocksOK) GetPayload() []*models.User {
+	return o.Payload
+}
+
+func (o *OrganizationListBlocksOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/organization_unblock_user_parameters.go b/bots-common/gitea-generated/client/organization/organization_unblock_user_parameters.go
new file mode 100644
index 0000000..05357f6
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/organization_unblock_user_parameters.go
@@ -0,0 +1,173 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewOrganizationUnblockUserParams creates a new OrganizationUnblockUserParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewOrganizationUnblockUserParams() *OrganizationUnblockUserParams {
+	return &OrganizationUnblockUserParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewOrganizationUnblockUserParamsWithTimeout creates a new OrganizationUnblockUserParams object
+// with the ability to set a timeout on a request.
+func NewOrganizationUnblockUserParamsWithTimeout(timeout time.Duration) *OrganizationUnblockUserParams {
+	return &OrganizationUnblockUserParams{
+		timeout: timeout,
+	}
+}
+
+// NewOrganizationUnblockUserParamsWithContext creates a new OrganizationUnblockUserParams object
+// with the ability to set a context for a request.
+func NewOrganizationUnblockUserParamsWithContext(ctx context.Context) *OrganizationUnblockUserParams {
+	return &OrganizationUnblockUserParams{
+		Context: ctx,
+	}
+}
+
+// NewOrganizationUnblockUserParamsWithHTTPClient creates a new OrganizationUnblockUserParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewOrganizationUnblockUserParamsWithHTTPClient(client *http.Client) *OrganizationUnblockUserParams {
+	return &OrganizationUnblockUserParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+OrganizationUnblockUserParams contains all the parameters to send to the API endpoint
+
+	for the organization unblock user operation.
+
+	Typically these are written to a http.Request.
+*/
+type OrganizationUnblockUserParams struct {
+
+	/* Org.
+
+	   name of the organization
+	*/
+	Org string
+
+	/* Username.
+
+	   user to unblock
+	*/
+	Username string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the organization unblock user params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrganizationUnblockUserParams) WithDefaults() *OrganizationUnblockUserParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the organization unblock user params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *OrganizationUnblockUserParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the organization unblock user params
+func (o *OrganizationUnblockUserParams) WithTimeout(timeout time.Duration) *OrganizationUnblockUserParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the organization unblock user params
+func (o *OrganizationUnblockUserParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the organization unblock user params
+func (o *OrganizationUnblockUserParams) WithContext(ctx context.Context) *OrganizationUnblockUserParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the organization unblock user params
+func (o *OrganizationUnblockUserParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the organization unblock user params
+func (o *OrganizationUnblockUserParams) WithHTTPClient(client *http.Client) *OrganizationUnblockUserParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the organization unblock user params
+func (o *OrganizationUnblockUserParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithOrg adds the org to the organization unblock user params
+func (o *OrganizationUnblockUserParams) WithOrg(org string) *OrganizationUnblockUserParams {
+	o.SetOrg(org)
+	return o
+}
+
+// SetOrg adds the org to the organization unblock user params
+func (o *OrganizationUnblockUserParams) SetOrg(org string) {
+	o.Org = org
+}
+
+// WithUsername adds the username to the organization unblock user params
+func (o *OrganizationUnblockUserParams) WithUsername(username string) *OrganizationUnblockUserParams {
+	o.SetUsername(username)
+	return o
+}
+
+// SetUsername adds the username to the organization unblock user params
+func (o *OrganizationUnblockUserParams) SetUsername(username string) {
+	o.Username = username
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *OrganizationUnblockUserParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param org
+	if err := r.SetPathParam("org", o.Org); err != nil {
+		return err
+	}
+
+	// path param username
+	if err := r.SetPathParam("username", o.Username); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/organization_unblock_user_responses.go b/bots-common/gitea-generated/client/organization/organization_unblock_user_responses.go
new file mode 100644
index 0000000..d00384b
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/organization_unblock_user_responses.go
@@ -0,0 +1,228 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// OrganizationUnblockUserReader is a Reader for the OrganizationUnblockUser structure.
+type OrganizationUnblockUserReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *OrganizationUnblockUserReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewOrganizationUnblockUserNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewOrganizationUnblockUserNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 422:
+		result := NewOrganizationUnblockUserUnprocessableEntity()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[DELETE /orgs/{org}/blocks/{username}] organizationUnblockUser", response, response.Code())
+	}
+}
+
+// NewOrganizationUnblockUserNoContent creates a OrganizationUnblockUserNoContent with default headers values
+func NewOrganizationUnblockUserNoContent() *OrganizationUnblockUserNoContent {
+	return &OrganizationUnblockUserNoContent{}
+}
+
+/*
+OrganizationUnblockUserNoContent describes a response with status code 204, with default header values.
+
+APIEmpty is an empty response
+*/
+type OrganizationUnblockUserNoContent struct {
+}
+
+// IsSuccess returns true when this organization unblock user no content response has a 2xx status code
+func (o *OrganizationUnblockUserNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this organization unblock user no content response has a 3xx status code
+func (o *OrganizationUnblockUserNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this organization unblock user no content response has a 4xx status code
+func (o *OrganizationUnblockUserNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this organization unblock user no content response has a 5xx status code
+func (o *OrganizationUnblockUserNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this organization unblock user no content response a status code equal to that given
+func (o *OrganizationUnblockUserNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the organization unblock user no content response
+func (o *OrganizationUnblockUserNoContent) Code() int {
+	return 204
+}
+
+func (o *OrganizationUnblockUserNoContent) Error() string {
+	return fmt.Sprintf("[DELETE /orgs/{org}/blocks/{username}][%d] organizationUnblockUserNoContent", 204)
+}
+
+func (o *OrganizationUnblockUserNoContent) String() string {
+	return fmt.Sprintf("[DELETE /orgs/{org}/blocks/{username}][%d] organizationUnblockUserNoContent", 204)
+}
+
+func (o *OrganizationUnblockUserNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewOrganizationUnblockUserNotFound creates a OrganizationUnblockUserNotFound with default headers values
+func NewOrganizationUnblockUserNotFound() *OrganizationUnblockUserNotFound {
+	return &OrganizationUnblockUserNotFound{}
+}
+
+/*
+OrganizationUnblockUserNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type OrganizationUnblockUserNotFound struct {
+}
+
+// IsSuccess returns true when this organization unblock user not found response has a 2xx status code
+func (o *OrganizationUnblockUserNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this organization unblock user not found response has a 3xx status code
+func (o *OrganizationUnblockUserNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this organization unblock user not found response has a 4xx status code
+func (o *OrganizationUnblockUserNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this organization unblock user not found response has a 5xx status code
+func (o *OrganizationUnblockUserNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this organization unblock user not found response a status code equal to that given
+func (o *OrganizationUnblockUserNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the organization unblock user not found response
+func (o *OrganizationUnblockUserNotFound) Code() int {
+	return 404
+}
+
+func (o *OrganizationUnblockUserNotFound) Error() string {
+	return fmt.Sprintf("[DELETE /orgs/{org}/blocks/{username}][%d] organizationUnblockUserNotFound", 404)
+}
+
+func (o *OrganizationUnblockUserNotFound) String() string {
+	return fmt.Sprintf("[DELETE /orgs/{org}/blocks/{username}][%d] organizationUnblockUserNotFound", 404)
+}
+
+func (o *OrganizationUnblockUserNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewOrganizationUnblockUserUnprocessableEntity creates a OrganizationUnblockUserUnprocessableEntity with default headers values
+func NewOrganizationUnblockUserUnprocessableEntity() *OrganizationUnblockUserUnprocessableEntity {
+	return &OrganizationUnblockUserUnprocessableEntity{}
+}
+
+/*
+OrganizationUnblockUserUnprocessableEntity describes a response with status code 422, with default header values.
+
+APIValidationError is error format response related to input validation
+*/
+type OrganizationUnblockUserUnprocessableEntity struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this organization unblock user unprocessable entity response has a 2xx status code
+func (o *OrganizationUnblockUserUnprocessableEntity) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this organization unblock user unprocessable entity response has a 3xx status code
+func (o *OrganizationUnblockUserUnprocessableEntity) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this organization unblock user unprocessable entity response has a 4xx status code
+func (o *OrganizationUnblockUserUnprocessableEntity) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this organization unblock user unprocessable entity response has a 5xx status code
+func (o *OrganizationUnblockUserUnprocessableEntity) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this organization unblock user unprocessable entity response a status code equal to that given
+func (o *OrganizationUnblockUserUnprocessableEntity) IsCode(code int) bool {
+	return code == 422
+}
+
+// Code gets the status code for the organization unblock user unprocessable entity response
+func (o *OrganizationUnblockUserUnprocessableEntity) Code() int {
+	return 422
+}
+
+func (o *OrganizationUnblockUserUnprocessableEntity) Error() string {
+	return fmt.Sprintf("[DELETE /orgs/{org}/blocks/{username}][%d] organizationUnblockUserUnprocessableEntity", 422)
+}
+
+func (o *OrganizationUnblockUserUnprocessableEntity) String() string {
+	return fmt.Sprintf("[DELETE /orgs/{org}/blocks/{username}][%d] organizationUnblockUserUnprocessableEntity", 422)
+}
+
+func (o *OrganizationUnblockUserUnprocessableEntity) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/team_search_parameters.go b/bots-common/gitea-generated/client/organization/team_search_parameters.go
new file mode 100644
index 0000000..c045780
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/team_search_parameters.go
@@ -0,0 +1,288 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewTeamSearchParams creates a new TeamSearchParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewTeamSearchParams() *TeamSearchParams {
+	return &TeamSearchParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewTeamSearchParamsWithTimeout creates a new TeamSearchParams object
+// with the ability to set a timeout on a request.
+func NewTeamSearchParamsWithTimeout(timeout time.Duration) *TeamSearchParams {
+	return &TeamSearchParams{
+		timeout: timeout,
+	}
+}
+
+// NewTeamSearchParamsWithContext creates a new TeamSearchParams object
+// with the ability to set a context for a request.
+func NewTeamSearchParamsWithContext(ctx context.Context) *TeamSearchParams {
+	return &TeamSearchParams{
+		Context: ctx,
+	}
+}
+
+// NewTeamSearchParamsWithHTTPClient creates a new TeamSearchParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewTeamSearchParamsWithHTTPClient(client *http.Client) *TeamSearchParams {
+	return &TeamSearchParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+TeamSearchParams contains all the parameters to send to the API endpoint
+
+	for the team search operation.
+
+	Typically these are written to a http.Request.
+*/
+type TeamSearchParams struct {
+
+	/* IncludeDesc.
+
+	   include search within team description (defaults to true)
+	*/
+	IncludeDesc *bool
+
+	/* Limit.
+
+	   page size of results
+	*/
+	Limit *int64
+
+	/* Org.
+
+	   name of the organization
+	*/
+	Org string
+
+	/* Page.
+
+	   page number of results to return (1-based)
+	*/
+	Page *int64
+
+	/* Q.
+
+	   keywords to search
+	*/
+	Q *string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the team search params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *TeamSearchParams) WithDefaults() *TeamSearchParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the team search params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *TeamSearchParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the team search params
+func (o *TeamSearchParams) WithTimeout(timeout time.Duration) *TeamSearchParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the team search params
+func (o *TeamSearchParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the team search params
+func (o *TeamSearchParams) WithContext(ctx context.Context) *TeamSearchParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the team search params
+func (o *TeamSearchParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the team search params
+func (o *TeamSearchParams) WithHTTPClient(client *http.Client) *TeamSearchParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the team search params
+func (o *TeamSearchParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithIncludeDesc adds the includeDesc to the team search params
+func (o *TeamSearchParams) WithIncludeDesc(includeDesc *bool) *TeamSearchParams {
+	o.SetIncludeDesc(includeDesc)
+	return o
+}
+
+// SetIncludeDesc adds the includeDesc to the team search params
+func (o *TeamSearchParams) SetIncludeDesc(includeDesc *bool) {
+	o.IncludeDesc = includeDesc
+}
+
+// WithLimit adds the limit to the team search params
+func (o *TeamSearchParams) WithLimit(limit *int64) *TeamSearchParams {
+	o.SetLimit(limit)
+	return o
+}
+
+// SetLimit adds the limit to the team search params
+func (o *TeamSearchParams) SetLimit(limit *int64) {
+	o.Limit = limit
+}
+
+// WithOrg adds the org to the team search params
+func (o *TeamSearchParams) WithOrg(org string) *TeamSearchParams {
+	o.SetOrg(org)
+	return o
+}
+
+// SetOrg adds the org to the team search params
+func (o *TeamSearchParams) SetOrg(org string) {
+	o.Org = org
+}
+
+// WithPage adds the page to the team search params
+func (o *TeamSearchParams) WithPage(page *int64) *TeamSearchParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the team search params
+func (o *TeamSearchParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WithQ adds the q to the team search params
+func (o *TeamSearchParams) WithQ(q *string) *TeamSearchParams {
+	o.SetQ(q)
+	return o
+}
+
+// SetQ adds the q to the team search params
+func (o *TeamSearchParams) SetQ(q *string) {
+	o.Q = q
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *TeamSearchParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.IncludeDesc != nil {
+
+		// query param include_desc
+		var qrIncludeDesc bool
+
+		if o.IncludeDesc != nil {
+			qrIncludeDesc = *o.IncludeDesc
+		}
+		qIncludeDesc := swag.FormatBool(qrIncludeDesc)
+		if qIncludeDesc != "" {
+
+			if err := r.SetQueryParam("include_desc", qIncludeDesc); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Limit != nil {
+
+		// query param limit
+		var qrLimit int64
+
+		if o.Limit != nil {
+			qrLimit = *o.Limit
+		}
+		qLimit := swag.FormatInt64(qrLimit)
+		if qLimit != "" {
+
+			if err := r.SetQueryParam("limit", qLimit); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param org
+	if err := r.SetPathParam("org", o.Org); err != nil {
+		return err
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Q != nil {
+
+		// query param q
+		var qrQ string
+
+		if o.Q != nil {
+			qrQ = *o.Q
+		}
+		qQ := qrQ
+		if qQ != "" {
+
+			if err := r.SetQueryParam("q", qQ); err != nil {
+				return err
+			}
+		}
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/team_search_responses.go b/bots-common/gitea-generated/client/organization/team_search_responses.go
new file mode 100644
index 0000000..a84d82a
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/team_search_responses.go
@@ -0,0 +1,282 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"encoding/json"
+	"fmt"
+	"io"
+	"strconv"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// TeamSearchReader is a Reader for the TeamSearch structure.
+type TeamSearchReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *TeamSearchReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewTeamSearchOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewTeamSearchNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /orgs/{org}/teams/search] teamSearch", response, response.Code())
+	}
+}
+
+// NewTeamSearchOK creates a TeamSearchOK with default headers values
+func NewTeamSearchOK() *TeamSearchOK {
+	return &TeamSearchOK{}
+}
+
+/*
+TeamSearchOK describes a response with status code 200, with default header values.
+
+SearchResults of a successful search
+*/
+type TeamSearchOK struct {
+	Payload *TeamSearchOKBody
+}
+
+// IsSuccess returns true when this team search o k response has a 2xx status code
+func (o *TeamSearchOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this team search o k response has a 3xx status code
+func (o *TeamSearchOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this team search o k response has a 4xx status code
+func (o *TeamSearchOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this team search o k response has a 5xx status code
+func (o *TeamSearchOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this team search o k response a status code equal to that given
+func (o *TeamSearchOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the team search o k response
+func (o *TeamSearchOK) Code() int {
+	return 200
+}
+
+func (o *TeamSearchOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /orgs/{org}/teams/search][%d] teamSearchOK %s", 200, payload)
+}
+
+func (o *TeamSearchOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /orgs/{org}/teams/search][%d] teamSearchOK %s", 200, payload)
+}
+
+func (o *TeamSearchOK) GetPayload() *TeamSearchOKBody {
+	return o.Payload
+}
+
+func (o *TeamSearchOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(TeamSearchOKBody)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewTeamSearchNotFound creates a TeamSearchNotFound with default headers values
+func NewTeamSearchNotFound() *TeamSearchNotFound {
+	return &TeamSearchNotFound{}
+}
+
+/*
+TeamSearchNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type TeamSearchNotFound struct {
+}
+
+// IsSuccess returns true when this team search not found response has a 2xx status code
+func (o *TeamSearchNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this team search not found response has a 3xx status code
+func (o *TeamSearchNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this team search not found response has a 4xx status code
+func (o *TeamSearchNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this team search not found response has a 5xx status code
+func (o *TeamSearchNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this team search not found response a status code equal to that given
+func (o *TeamSearchNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the team search not found response
+func (o *TeamSearchNotFound) Code() int {
+	return 404
+}
+
+func (o *TeamSearchNotFound) Error() string {
+	return fmt.Sprintf("[GET /orgs/{org}/teams/search][%d] teamSearchNotFound", 404)
+}
+
+func (o *TeamSearchNotFound) String() string {
+	return fmt.Sprintf("[GET /orgs/{org}/teams/search][%d] teamSearchNotFound", 404)
+}
+
+func (o *TeamSearchNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+/*
+TeamSearchOKBody team search o k body
+swagger:model TeamSearchOKBody
+*/
+type TeamSearchOKBody struct {
+
+	// data
+	Data []*models.Team `json:"data"`
+
+	// ok
+	Ok bool `json:"ok,omitempty"`
+}
+
+// Validate validates this team search o k body
+func (o *TeamSearchOKBody) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := o.validateData(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (o *TeamSearchOKBody) validateData(formats strfmt.Registry) error {
+	if swag.IsZero(o.Data) { // not required
+		return nil
+	}
+
+	for i := 0; i < len(o.Data); i++ {
+		if swag.IsZero(o.Data[i]) { // not required
+			continue
+		}
+
+		if o.Data[i] != nil {
+			if err := o.Data[i].Validate(formats); err != nil {
+				if ve, ok := err.(*errors.Validation); ok {
+					return ve.ValidateName("teamSearchOK" + "." + "data" + "." + strconv.Itoa(i))
+				} else if ce, ok := err.(*errors.CompositeError); ok {
+					return ce.ValidateName("teamSearchOK" + "." + "data" + "." + strconv.Itoa(i))
+				}
+				return err
+			}
+		}
+
+	}
+
+	return nil
+}
+
+// ContextValidate validate this team search o k body based on the context it is used
+func (o *TeamSearchOKBody) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	var res []error
+
+	if err := o.contextValidateData(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (o *TeamSearchOKBody) contextValidateData(ctx context.Context, formats strfmt.Registry) error {
+
+	for i := 0; i < len(o.Data); i++ {
+
+		if o.Data[i] != nil {
+
+			if swag.IsZero(o.Data[i]) { // not required
+				return nil
+			}
+
+			if err := o.Data[i].ContextValidate(ctx, formats); err != nil {
+				if ve, ok := err.(*errors.Validation); ok {
+					return ve.ValidateName("teamSearchOK" + "." + "data" + "." + strconv.Itoa(i))
+				} else if ce, ok := err.(*errors.CompositeError); ok {
+					return ce.ValidateName("teamSearchOK" + "." + "data" + "." + strconv.Itoa(i))
+				}
+				return err
+			}
+		}
+
+	}
+
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (o *TeamSearchOKBody) MarshalBinary() ([]byte, error) {
+	if o == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(o)
+}
+
+// UnmarshalBinary interface implementation
+func (o *TeamSearchOKBody) UnmarshalBinary(b []byte) error {
+	var res TeamSearchOKBody
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*o = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/update_org_secret_parameters.go b/bots-common/gitea-generated/client/organization/update_org_secret_parameters.go
new file mode 100644
index 0000000..8f4ac4b
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/update_org_secret_parameters.go
@@ -0,0 +1,194 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewUpdateOrgSecretParams creates a new UpdateOrgSecretParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewUpdateOrgSecretParams() *UpdateOrgSecretParams {
+	return &UpdateOrgSecretParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewUpdateOrgSecretParamsWithTimeout creates a new UpdateOrgSecretParams object
+// with the ability to set a timeout on a request.
+func NewUpdateOrgSecretParamsWithTimeout(timeout time.Duration) *UpdateOrgSecretParams {
+	return &UpdateOrgSecretParams{
+		timeout: timeout,
+	}
+}
+
+// NewUpdateOrgSecretParamsWithContext creates a new UpdateOrgSecretParams object
+// with the ability to set a context for a request.
+func NewUpdateOrgSecretParamsWithContext(ctx context.Context) *UpdateOrgSecretParams {
+	return &UpdateOrgSecretParams{
+		Context: ctx,
+	}
+}
+
+// NewUpdateOrgSecretParamsWithHTTPClient creates a new UpdateOrgSecretParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewUpdateOrgSecretParamsWithHTTPClient(client *http.Client) *UpdateOrgSecretParams {
+	return &UpdateOrgSecretParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+UpdateOrgSecretParams contains all the parameters to send to the API endpoint
+
+	for the update org secret operation.
+
+	Typically these are written to a http.Request.
+*/
+type UpdateOrgSecretParams struct {
+
+	// Body.
+	Body *models.CreateOrUpdateSecretOption
+
+	/* Org.
+
+	   name of organization
+	*/
+	Org string
+
+	/* Secretname.
+
+	   name of the secret
+	*/
+	Secretname string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the update org secret params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UpdateOrgSecretParams) WithDefaults() *UpdateOrgSecretParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the update org secret params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UpdateOrgSecretParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the update org secret params
+func (o *UpdateOrgSecretParams) WithTimeout(timeout time.Duration) *UpdateOrgSecretParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the update org secret params
+func (o *UpdateOrgSecretParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the update org secret params
+func (o *UpdateOrgSecretParams) WithContext(ctx context.Context) *UpdateOrgSecretParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the update org secret params
+func (o *UpdateOrgSecretParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the update org secret params
+func (o *UpdateOrgSecretParams) WithHTTPClient(client *http.Client) *UpdateOrgSecretParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the update org secret params
+func (o *UpdateOrgSecretParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the update org secret params
+func (o *UpdateOrgSecretParams) WithBody(body *models.CreateOrUpdateSecretOption) *UpdateOrgSecretParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the update org secret params
+func (o *UpdateOrgSecretParams) SetBody(body *models.CreateOrUpdateSecretOption) {
+	o.Body = body
+}
+
+// WithOrg adds the org to the update org secret params
+func (o *UpdateOrgSecretParams) WithOrg(org string) *UpdateOrgSecretParams {
+	o.SetOrg(org)
+	return o
+}
+
+// SetOrg adds the org to the update org secret params
+func (o *UpdateOrgSecretParams) SetOrg(org string) {
+	o.Org = org
+}
+
+// WithSecretname adds the secretname to the update org secret params
+func (o *UpdateOrgSecretParams) WithSecretname(secretname string) *UpdateOrgSecretParams {
+	o.SetSecretname(secretname)
+	return o
+}
+
+// SetSecretname adds the secretname to the update org secret params
+func (o *UpdateOrgSecretParams) SetSecretname(secretname string) {
+	o.Secretname = secretname
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *UpdateOrgSecretParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	// path param org
+	if err := r.SetPathParam("org", o.Org); err != nil {
+		return err
+	}
+
+	// path param secretname
+	if err := r.SetPathParam("secretname", o.Secretname); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/update_org_secret_responses.go b/bots-common/gitea-generated/client/organization/update_org_secret_responses.go
new file mode 100644
index 0000000..73e804c
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/update_org_secret_responses.go
@@ -0,0 +1,290 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// UpdateOrgSecretReader is a Reader for the UpdateOrgSecret structure.
+type UpdateOrgSecretReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *UpdateOrgSecretReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 201:
+		result := NewUpdateOrgSecretCreated()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 204:
+		result := NewUpdateOrgSecretNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 400:
+		result := NewUpdateOrgSecretBadRequest()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewUpdateOrgSecretNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[PUT /orgs/{org}/actions/secrets/{secretname}] updateOrgSecret", response, response.Code())
+	}
+}
+
+// NewUpdateOrgSecretCreated creates a UpdateOrgSecretCreated with default headers values
+func NewUpdateOrgSecretCreated() *UpdateOrgSecretCreated {
+	return &UpdateOrgSecretCreated{}
+}
+
+/*
+UpdateOrgSecretCreated describes a response with status code 201, with default header values.
+
+response when creating a secret
+*/
+type UpdateOrgSecretCreated struct {
+}
+
+// IsSuccess returns true when this update org secret created response has a 2xx status code
+func (o *UpdateOrgSecretCreated) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this update org secret created response has a 3xx status code
+func (o *UpdateOrgSecretCreated) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this update org secret created response has a 4xx status code
+func (o *UpdateOrgSecretCreated) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this update org secret created response has a 5xx status code
+func (o *UpdateOrgSecretCreated) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this update org secret created response a status code equal to that given
+func (o *UpdateOrgSecretCreated) IsCode(code int) bool {
+	return code == 201
+}
+
+// Code gets the status code for the update org secret created response
+func (o *UpdateOrgSecretCreated) Code() int {
+	return 201
+}
+
+func (o *UpdateOrgSecretCreated) Error() string {
+	return fmt.Sprintf("[PUT /orgs/{org}/actions/secrets/{secretname}][%d] updateOrgSecretCreated", 201)
+}
+
+func (o *UpdateOrgSecretCreated) String() string {
+	return fmt.Sprintf("[PUT /orgs/{org}/actions/secrets/{secretname}][%d] updateOrgSecretCreated", 201)
+}
+
+func (o *UpdateOrgSecretCreated) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewUpdateOrgSecretNoContent creates a UpdateOrgSecretNoContent with default headers values
+func NewUpdateOrgSecretNoContent() *UpdateOrgSecretNoContent {
+	return &UpdateOrgSecretNoContent{}
+}
+
+/*
+UpdateOrgSecretNoContent describes a response with status code 204, with default header values.
+
+response when updating a secret
+*/
+type UpdateOrgSecretNoContent struct {
+}
+
+// IsSuccess returns true when this update org secret no content response has a 2xx status code
+func (o *UpdateOrgSecretNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this update org secret no content response has a 3xx status code
+func (o *UpdateOrgSecretNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this update org secret no content response has a 4xx status code
+func (o *UpdateOrgSecretNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this update org secret no content response has a 5xx status code
+func (o *UpdateOrgSecretNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this update org secret no content response a status code equal to that given
+func (o *UpdateOrgSecretNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the update org secret no content response
+func (o *UpdateOrgSecretNoContent) Code() int {
+	return 204
+}
+
+func (o *UpdateOrgSecretNoContent) Error() string {
+	return fmt.Sprintf("[PUT /orgs/{org}/actions/secrets/{secretname}][%d] updateOrgSecretNoContent", 204)
+}
+
+func (o *UpdateOrgSecretNoContent) String() string {
+	return fmt.Sprintf("[PUT /orgs/{org}/actions/secrets/{secretname}][%d] updateOrgSecretNoContent", 204)
+}
+
+func (o *UpdateOrgSecretNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewUpdateOrgSecretBadRequest creates a UpdateOrgSecretBadRequest with default headers values
+func NewUpdateOrgSecretBadRequest() *UpdateOrgSecretBadRequest {
+	return &UpdateOrgSecretBadRequest{}
+}
+
+/*
+UpdateOrgSecretBadRequest describes a response with status code 400, with default header values.
+
+APIError is error format response
+*/
+type UpdateOrgSecretBadRequest struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this update org secret bad request response has a 2xx status code
+func (o *UpdateOrgSecretBadRequest) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this update org secret bad request response has a 3xx status code
+func (o *UpdateOrgSecretBadRequest) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this update org secret bad request response has a 4xx status code
+func (o *UpdateOrgSecretBadRequest) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this update org secret bad request response has a 5xx status code
+func (o *UpdateOrgSecretBadRequest) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this update org secret bad request response a status code equal to that given
+func (o *UpdateOrgSecretBadRequest) IsCode(code int) bool {
+	return code == 400
+}
+
+// Code gets the status code for the update org secret bad request response
+func (o *UpdateOrgSecretBadRequest) Code() int {
+	return 400
+}
+
+func (o *UpdateOrgSecretBadRequest) Error() string {
+	return fmt.Sprintf("[PUT /orgs/{org}/actions/secrets/{secretname}][%d] updateOrgSecretBadRequest", 400)
+}
+
+func (o *UpdateOrgSecretBadRequest) String() string {
+	return fmt.Sprintf("[PUT /orgs/{org}/actions/secrets/{secretname}][%d] updateOrgSecretBadRequest", 400)
+}
+
+func (o *UpdateOrgSecretBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewUpdateOrgSecretNotFound creates a UpdateOrgSecretNotFound with default headers values
+func NewUpdateOrgSecretNotFound() *UpdateOrgSecretNotFound {
+	return &UpdateOrgSecretNotFound{}
+}
+
+/*
+UpdateOrgSecretNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type UpdateOrgSecretNotFound struct {
+}
+
+// IsSuccess returns true when this update org secret not found response has a 2xx status code
+func (o *UpdateOrgSecretNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this update org secret not found response has a 3xx status code
+func (o *UpdateOrgSecretNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this update org secret not found response has a 4xx status code
+func (o *UpdateOrgSecretNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this update org secret not found response has a 5xx status code
+func (o *UpdateOrgSecretNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this update org secret not found response a status code equal to that given
+func (o *UpdateOrgSecretNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the update org secret not found response
+func (o *UpdateOrgSecretNotFound) Code() int {
+	return 404
+}
+
+func (o *UpdateOrgSecretNotFound) Error() string {
+	return fmt.Sprintf("[PUT /orgs/{org}/actions/secrets/{secretname}][%d] updateOrgSecretNotFound", 404)
+}
+
+func (o *UpdateOrgSecretNotFound) String() string {
+	return fmt.Sprintf("[PUT /orgs/{org}/actions/secrets/{secretname}][%d] updateOrgSecretNotFound", 404)
+}
+
+func (o *UpdateOrgSecretNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/update_org_variable_parameters.go b/bots-common/gitea-generated/client/organization/update_org_variable_parameters.go
new file mode 100644
index 0000000..825d686
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/update_org_variable_parameters.go
@@ -0,0 +1,194 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewUpdateOrgVariableParams creates a new UpdateOrgVariableParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewUpdateOrgVariableParams() *UpdateOrgVariableParams {
+	return &UpdateOrgVariableParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewUpdateOrgVariableParamsWithTimeout creates a new UpdateOrgVariableParams object
+// with the ability to set a timeout on a request.
+func NewUpdateOrgVariableParamsWithTimeout(timeout time.Duration) *UpdateOrgVariableParams {
+	return &UpdateOrgVariableParams{
+		timeout: timeout,
+	}
+}
+
+// NewUpdateOrgVariableParamsWithContext creates a new UpdateOrgVariableParams object
+// with the ability to set a context for a request.
+func NewUpdateOrgVariableParamsWithContext(ctx context.Context) *UpdateOrgVariableParams {
+	return &UpdateOrgVariableParams{
+		Context: ctx,
+	}
+}
+
+// NewUpdateOrgVariableParamsWithHTTPClient creates a new UpdateOrgVariableParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewUpdateOrgVariableParamsWithHTTPClient(client *http.Client) *UpdateOrgVariableParams {
+	return &UpdateOrgVariableParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+UpdateOrgVariableParams contains all the parameters to send to the API endpoint
+
+	for the update org variable operation.
+
+	Typically these are written to a http.Request.
+*/
+type UpdateOrgVariableParams struct {
+
+	// Body.
+	Body *models.UpdateVariableOption
+
+	/* Org.
+
+	   name of the organization
+	*/
+	Org string
+
+	/* Variablename.
+
+	   name of the variable
+	*/
+	Variablename string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the update org variable params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UpdateOrgVariableParams) WithDefaults() *UpdateOrgVariableParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the update org variable params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UpdateOrgVariableParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the update org variable params
+func (o *UpdateOrgVariableParams) WithTimeout(timeout time.Duration) *UpdateOrgVariableParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the update org variable params
+func (o *UpdateOrgVariableParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the update org variable params
+func (o *UpdateOrgVariableParams) WithContext(ctx context.Context) *UpdateOrgVariableParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the update org variable params
+func (o *UpdateOrgVariableParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the update org variable params
+func (o *UpdateOrgVariableParams) WithHTTPClient(client *http.Client) *UpdateOrgVariableParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the update org variable params
+func (o *UpdateOrgVariableParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the update org variable params
+func (o *UpdateOrgVariableParams) WithBody(body *models.UpdateVariableOption) *UpdateOrgVariableParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the update org variable params
+func (o *UpdateOrgVariableParams) SetBody(body *models.UpdateVariableOption) {
+	o.Body = body
+}
+
+// WithOrg adds the org to the update org variable params
+func (o *UpdateOrgVariableParams) WithOrg(org string) *UpdateOrgVariableParams {
+	o.SetOrg(org)
+	return o
+}
+
+// SetOrg adds the org to the update org variable params
+func (o *UpdateOrgVariableParams) SetOrg(org string) {
+	o.Org = org
+}
+
+// WithVariablename adds the variablename to the update org variable params
+func (o *UpdateOrgVariableParams) WithVariablename(variablename string) *UpdateOrgVariableParams {
+	o.SetVariablename(variablename)
+	return o
+}
+
+// SetVariablename adds the variablename to the update org variable params
+func (o *UpdateOrgVariableParams) SetVariablename(variablename string) {
+	o.Variablename = variablename
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *UpdateOrgVariableParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	// path param org
+	if err := r.SetPathParam("org", o.Org); err != nil {
+		return err
+	}
+
+	// path param variablename
+	if err := r.SetPathParam("variablename", o.Variablename); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/organization/update_org_variable_responses.go b/bots-common/gitea-generated/client/organization/update_org_variable_responses.go
new file mode 100644
index 0000000..b442622
--- /dev/null
+++ b/bots-common/gitea-generated/client/organization/update_org_variable_responses.go
@@ -0,0 +1,290 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package organization
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// UpdateOrgVariableReader is a Reader for the UpdateOrgVariable structure.
+type UpdateOrgVariableReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *UpdateOrgVariableReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 201:
+		result := NewUpdateOrgVariableCreated()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 204:
+		result := NewUpdateOrgVariableNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 400:
+		result := NewUpdateOrgVariableBadRequest()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewUpdateOrgVariableNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[PUT /orgs/{org}/actions/variables/{variablename}] updateOrgVariable", response, response.Code())
+	}
+}
+
+// NewUpdateOrgVariableCreated creates a UpdateOrgVariableCreated with default headers values
+func NewUpdateOrgVariableCreated() *UpdateOrgVariableCreated {
+	return &UpdateOrgVariableCreated{}
+}
+
+/*
+UpdateOrgVariableCreated describes a response with status code 201, with default header values.
+
+response when updating an org-level variable
+*/
+type UpdateOrgVariableCreated struct {
+}
+
+// IsSuccess returns true when this update org variable created response has a 2xx status code
+func (o *UpdateOrgVariableCreated) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this update org variable created response has a 3xx status code
+func (o *UpdateOrgVariableCreated) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this update org variable created response has a 4xx status code
+func (o *UpdateOrgVariableCreated) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this update org variable created response has a 5xx status code
+func (o *UpdateOrgVariableCreated) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this update org variable created response a status code equal to that given
+func (o *UpdateOrgVariableCreated) IsCode(code int) bool {
+	return code == 201
+}
+
+// Code gets the status code for the update org variable created response
+func (o *UpdateOrgVariableCreated) Code() int {
+	return 201
+}
+
+func (o *UpdateOrgVariableCreated) Error() string {
+	return fmt.Sprintf("[PUT /orgs/{org}/actions/variables/{variablename}][%d] updateOrgVariableCreated", 201)
+}
+
+func (o *UpdateOrgVariableCreated) String() string {
+	return fmt.Sprintf("[PUT /orgs/{org}/actions/variables/{variablename}][%d] updateOrgVariableCreated", 201)
+}
+
+func (o *UpdateOrgVariableCreated) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewUpdateOrgVariableNoContent creates a UpdateOrgVariableNoContent with default headers values
+func NewUpdateOrgVariableNoContent() *UpdateOrgVariableNoContent {
+	return &UpdateOrgVariableNoContent{}
+}
+
+/*
+UpdateOrgVariableNoContent describes a response with status code 204, with default header values.
+
+response when updating an org-level variable
+*/
+type UpdateOrgVariableNoContent struct {
+}
+
+// IsSuccess returns true when this update org variable no content response has a 2xx status code
+func (o *UpdateOrgVariableNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this update org variable no content response has a 3xx status code
+func (o *UpdateOrgVariableNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this update org variable no content response has a 4xx status code
+func (o *UpdateOrgVariableNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this update org variable no content response has a 5xx status code
+func (o *UpdateOrgVariableNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this update org variable no content response a status code equal to that given
+func (o *UpdateOrgVariableNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the update org variable no content response
+func (o *UpdateOrgVariableNoContent) Code() int {
+	return 204
+}
+
+func (o *UpdateOrgVariableNoContent) Error() string {
+	return fmt.Sprintf("[PUT /orgs/{org}/actions/variables/{variablename}][%d] updateOrgVariableNoContent", 204)
+}
+
+func (o *UpdateOrgVariableNoContent) String() string {
+	return fmt.Sprintf("[PUT /orgs/{org}/actions/variables/{variablename}][%d] updateOrgVariableNoContent", 204)
+}
+
+func (o *UpdateOrgVariableNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewUpdateOrgVariableBadRequest creates a UpdateOrgVariableBadRequest with default headers values
+func NewUpdateOrgVariableBadRequest() *UpdateOrgVariableBadRequest {
+	return &UpdateOrgVariableBadRequest{}
+}
+
+/*
+UpdateOrgVariableBadRequest describes a response with status code 400, with default header values.
+
+APIError is error format response
+*/
+type UpdateOrgVariableBadRequest struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this update org variable bad request response has a 2xx status code
+func (o *UpdateOrgVariableBadRequest) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this update org variable bad request response has a 3xx status code
+func (o *UpdateOrgVariableBadRequest) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this update org variable bad request response has a 4xx status code
+func (o *UpdateOrgVariableBadRequest) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this update org variable bad request response has a 5xx status code
+func (o *UpdateOrgVariableBadRequest) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this update org variable bad request response a status code equal to that given
+func (o *UpdateOrgVariableBadRequest) IsCode(code int) bool {
+	return code == 400
+}
+
+// Code gets the status code for the update org variable bad request response
+func (o *UpdateOrgVariableBadRequest) Code() int {
+	return 400
+}
+
+func (o *UpdateOrgVariableBadRequest) Error() string {
+	return fmt.Sprintf("[PUT /orgs/{org}/actions/variables/{variablename}][%d] updateOrgVariableBadRequest", 400)
+}
+
+func (o *UpdateOrgVariableBadRequest) String() string {
+	return fmt.Sprintf("[PUT /orgs/{org}/actions/variables/{variablename}][%d] updateOrgVariableBadRequest", 400)
+}
+
+func (o *UpdateOrgVariableBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewUpdateOrgVariableNotFound creates a UpdateOrgVariableNotFound with default headers values
+func NewUpdateOrgVariableNotFound() *UpdateOrgVariableNotFound {
+	return &UpdateOrgVariableNotFound{}
+}
+
+/*
+UpdateOrgVariableNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type UpdateOrgVariableNotFound struct {
+}
+
+// IsSuccess returns true when this update org variable not found response has a 2xx status code
+func (o *UpdateOrgVariableNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this update org variable not found response has a 3xx status code
+func (o *UpdateOrgVariableNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this update org variable not found response has a 4xx status code
+func (o *UpdateOrgVariableNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this update org variable not found response has a 5xx status code
+func (o *UpdateOrgVariableNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this update org variable not found response a status code equal to that given
+func (o *UpdateOrgVariableNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the update org variable not found response
+func (o *UpdateOrgVariableNotFound) Code() int {
+	return 404
+}
+
+func (o *UpdateOrgVariableNotFound) Error() string {
+	return fmt.Sprintf("[PUT /orgs/{org}/actions/variables/{variablename}][%d] updateOrgVariableNotFound", 404)
+}
+
+func (o *UpdateOrgVariableNotFound) String() string {
+	return fmt.Sprintf("[PUT /orgs/{org}/actions/variables/{variablename}][%d] updateOrgVariableNotFound", 404)
+}
+
+func (o *UpdateOrgVariableNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/package_operations/delete_package_parameters.go b/bots-common/gitea-generated/client/package_operations/delete_package_parameters.go
new file mode 100644
index 0000000..dc8a67e
--- /dev/null
+++ b/bots-common/gitea-generated/client/package_operations/delete_package_parameters.go
@@ -0,0 +1,217 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package package_operations
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewDeletePackageParams creates a new DeletePackageParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewDeletePackageParams() *DeletePackageParams {
+	return &DeletePackageParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewDeletePackageParamsWithTimeout creates a new DeletePackageParams object
+// with the ability to set a timeout on a request.
+func NewDeletePackageParamsWithTimeout(timeout time.Duration) *DeletePackageParams {
+	return &DeletePackageParams{
+		timeout: timeout,
+	}
+}
+
+// NewDeletePackageParamsWithContext creates a new DeletePackageParams object
+// with the ability to set a context for a request.
+func NewDeletePackageParamsWithContext(ctx context.Context) *DeletePackageParams {
+	return &DeletePackageParams{
+		Context: ctx,
+	}
+}
+
+// NewDeletePackageParamsWithHTTPClient creates a new DeletePackageParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewDeletePackageParamsWithHTTPClient(client *http.Client) *DeletePackageParams {
+	return &DeletePackageParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+DeletePackageParams contains all the parameters to send to the API endpoint
+
+	for the delete package operation.
+
+	Typically these are written to a http.Request.
+*/
+type DeletePackageParams struct {
+
+	/* Name.
+
+	   name of the package
+	*/
+	Name string
+
+	/* Owner.
+
+	   owner of the package
+	*/
+	Owner string
+
+	/* Type.
+
+	   type of the package
+	*/
+	Type string
+
+	/* Version.
+
+	   version of the package
+	*/
+	Version string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the delete package params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *DeletePackageParams) WithDefaults() *DeletePackageParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the delete package params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *DeletePackageParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the delete package params
+func (o *DeletePackageParams) WithTimeout(timeout time.Duration) *DeletePackageParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the delete package params
+func (o *DeletePackageParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the delete package params
+func (o *DeletePackageParams) WithContext(ctx context.Context) *DeletePackageParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the delete package params
+func (o *DeletePackageParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the delete package params
+func (o *DeletePackageParams) WithHTTPClient(client *http.Client) *DeletePackageParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the delete package params
+func (o *DeletePackageParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithName adds the name to the delete package params
+func (o *DeletePackageParams) WithName(name string) *DeletePackageParams {
+	o.SetName(name)
+	return o
+}
+
+// SetName adds the name to the delete package params
+func (o *DeletePackageParams) SetName(name string) {
+	o.Name = name
+}
+
+// WithOwner adds the owner to the delete package params
+func (o *DeletePackageParams) WithOwner(owner string) *DeletePackageParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the delete package params
+func (o *DeletePackageParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithType adds the typeVar to the delete package params
+func (o *DeletePackageParams) WithType(typeVar string) *DeletePackageParams {
+	o.SetType(typeVar)
+	return o
+}
+
+// SetType adds the type to the delete package params
+func (o *DeletePackageParams) SetType(typeVar string) {
+	o.Type = typeVar
+}
+
+// WithVersion adds the version to the delete package params
+func (o *DeletePackageParams) WithVersion(version string) *DeletePackageParams {
+	o.SetVersion(version)
+	return o
+}
+
+// SetVersion adds the version to the delete package params
+func (o *DeletePackageParams) SetVersion(version string) {
+	o.Version = version
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *DeletePackageParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param name
+	if err := r.SetPathParam("name", o.Name); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param type
+	if err := r.SetPathParam("type", o.Type); err != nil {
+		return err
+	}
+
+	// path param version
+	if err := r.SetPathParam("version", o.Version); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/package_operations/delete_package_responses.go b/bots-common/gitea-generated/client/package_operations/delete_package_responses.go
new file mode 100644
index 0000000..4a3b58d
--- /dev/null
+++ b/bots-common/gitea-generated/client/package_operations/delete_package_responses.go
@@ -0,0 +1,150 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package package_operations
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// DeletePackageReader is a Reader for the DeletePackage structure.
+type DeletePackageReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *DeletePackageReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewDeletePackageNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewDeletePackageNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[DELETE /packages/{owner}/{type}/{name}/{version}] deletePackage", response, response.Code())
+	}
+}
+
+// NewDeletePackageNoContent creates a DeletePackageNoContent with default headers values
+func NewDeletePackageNoContent() *DeletePackageNoContent {
+	return &DeletePackageNoContent{}
+}
+
+/*
+DeletePackageNoContent describes a response with status code 204, with default header values.
+
+APIEmpty is an empty response
+*/
+type DeletePackageNoContent struct {
+}
+
+// IsSuccess returns true when this delete package no content response has a 2xx status code
+func (o *DeletePackageNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this delete package no content response has a 3xx status code
+func (o *DeletePackageNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this delete package no content response has a 4xx status code
+func (o *DeletePackageNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this delete package no content response has a 5xx status code
+func (o *DeletePackageNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this delete package no content response a status code equal to that given
+func (o *DeletePackageNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the delete package no content response
+func (o *DeletePackageNoContent) Code() int {
+	return 204
+}
+
+func (o *DeletePackageNoContent) Error() string {
+	return fmt.Sprintf("[DELETE /packages/{owner}/{type}/{name}/{version}][%d] deletePackageNoContent", 204)
+}
+
+func (o *DeletePackageNoContent) String() string {
+	return fmt.Sprintf("[DELETE /packages/{owner}/{type}/{name}/{version}][%d] deletePackageNoContent", 204)
+}
+
+func (o *DeletePackageNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewDeletePackageNotFound creates a DeletePackageNotFound with default headers values
+func NewDeletePackageNotFound() *DeletePackageNotFound {
+	return &DeletePackageNotFound{}
+}
+
+/*
+DeletePackageNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type DeletePackageNotFound struct {
+}
+
+// IsSuccess returns true when this delete package not found response has a 2xx status code
+func (o *DeletePackageNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this delete package not found response has a 3xx status code
+func (o *DeletePackageNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this delete package not found response has a 4xx status code
+func (o *DeletePackageNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this delete package not found response has a 5xx status code
+func (o *DeletePackageNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this delete package not found response a status code equal to that given
+func (o *DeletePackageNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the delete package not found response
+func (o *DeletePackageNotFound) Code() int {
+	return 404
+}
+
+func (o *DeletePackageNotFound) Error() string {
+	return fmt.Sprintf("[DELETE /packages/{owner}/{type}/{name}/{version}][%d] deletePackageNotFound", 404)
+}
+
+func (o *DeletePackageNotFound) String() string {
+	return fmt.Sprintf("[DELETE /packages/{owner}/{type}/{name}/{version}][%d] deletePackageNotFound", 404)
+}
+
+func (o *DeletePackageNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/package_operations/get_package_parameters.go b/bots-common/gitea-generated/client/package_operations/get_package_parameters.go
new file mode 100644
index 0000000..4755066
--- /dev/null
+++ b/bots-common/gitea-generated/client/package_operations/get_package_parameters.go
@@ -0,0 +1,217 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package package_operations
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewGetPackageParams creates a new GetPackageParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewGetPackageParams() *GetPackageParams {
+	return &GetPackageParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewGetPackageParamsWithTimeout creates a new GetPackageParams object
+// with the ability to set a timeout on a request.
+func NewGetPackageParamsWithTimeout(timeout time.Duration) *GetPackageParams {
+	return &GetPackageParams{
+		timeout: timeout,
+	}
+}
+
+// NewGetPackageParamsWithContext creates a new GetPackageParams object
+// with the ability to set a context for a request.
+func NewGetPackageParamsWithContext(ctx context.Context) *GetPackageParams {
+	return &GetPackageParams{
+		Context: ctx,
+	}
+}
+
+// NewGetPackageParamsWithHTTPClient creates a new GetPackageParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewGetPackageParamsWithHTTPClient(client *http.Client) *GetPackageParams {
+	return &GetPackageParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+GetPackageParams contains all the parameters to send to the API endpoint
+
+	for the get package operation.
+
+	Typically these are written to a http.Request.
+*/
+type GetPackageParams struct {
+
+	/* Name.
+
+	   name of the package
+	*/
+	Name string
+
+	/* Owner.
+
+	   owner of the package
+	*/
+	Owner string
+
+	/* Type.
+
+	   type of the package
+	*/
+	Type string
+
+	/* Version.
+
+	   version of the package
+	*/
+	Version string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the get package params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *GetPackageParams) WithDefaults() *GetPackageParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the get package params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *GetPackageParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the get package params
+func (o *GetPackageParams) WithTimeout(timeout time.Duration) *GetPackageParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the get package params
+func (o *GetPackageParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the get package params
+func (o *GetPackageParams) WithContext(ctx context.Context) *GetPackageParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the get package params
+func (o *GetPackageParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the get package params
+func (o *GetPackageParams) WithHTTPClient(client *http.Client) *GetPackageParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the get package params
+func (o *GetPackageParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithName adds the name to the get package params
+func (o *GetPackageParams) WithName(name string) *GetPackageParams {
+	o.SetName(name)
+	return o
+}
+
+// SetName adds the name to the get package params
+func (o *GetPackageParams) SetName(name string) {
+	o.Name = name
+}
+
+// WithOwner adds the owner to the get package params
+func (o *GetPackageParams) WithOwner(owner string) *GetPackageParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the get package params
+func (o *GetPackageParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithType adds the typeVar to the get package params
+func (o *GetPackageParams) WithType(typeVar string) *GetPackageParams {
+	o.SetType(typeVar)
+	return o
+}
+
+// SetType adds the type to the get package params
+func (o *GetPackageParams) SetType(typeVar string) {
+	o.Type = typeVar
+}
+
+// WithVersion adds the version to the get package params
+func (o *GetPackageParams) WithVersion(version string) *GetPackageParams {
+	o.SetVersion(version)
+	return o
+}
+
+// SetVersion adds the version to the get package params
+func (o *GetPackageParams) SetVersion(version string) {
+	o.Version = version
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *GetPackageParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param name
+	if err := r.SetPathParam("name", o.Name); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param type
+	if err := r.SetPathParam("type", o.Type); err != nil {
+		return err
+	}
+
+	// path param version
+	if err := r.SetPathParam("version", o.Version); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/package_operations/get_package_responses.go b/bots-common/gitea-generated/client/package_operations/get_package_responses.go
new file mode 100644
index 0000000..92bbf0b
--- /dev/null
+++ b/bots-common/gitea-generated/client/package_operations/get_package_responses.go
@@ -0,0 +1,168 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package package_operations
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// GetPackageReader is a Reader for the GetPackage structure.
+type GetPackageReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *GetPackageReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewGetPackageOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewGetPackageNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /packages/{owner}/{type}/{name}/{version}] getPackage", response, response.Code())
+	}
+}
+
+// NewGetPackageOK creates a GetPackageOK with default headers values
+func NewGetPackageOK() *GetPackageOK {
+	return &GetPackageOK{}
+}
+
+/*
+GetPackageOK describes a response with status code 200, with default header values.
+
+Package
+*/
+type GetPackageOK struct {
+	Payload *models.Package
+}
+
+// IsSuccess returns true when this get package o k response has a 2xx status code
+func (o *GetPackageOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this get package o k response has a 3xx status code
+func (o *GetPackageOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this get package o k response has a 4xx status code
+func (o *GetPackageOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this get package o k response has a 5xx status code
+func (o *GetPackageOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this get package o k response a status code equal to that given
+func (o *GetPackageOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the get package o k response
+func (o *GetPackageOK) Code() int {
+	return 200
+}
+
+func (o *GetPackageOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /packages/{owner}/{type}/{name}/{version}][%d] getPackageOK %s", 200, payload)
+}
+
+func (o *GetPackageOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /packages/{owner}/{type}/{name}/{version}][%d] getPackageOK %s", 200, payload)
+}
+
+func (o *GetPackageOK) GetPayload() *models.Package {
+	return o.Payload
+}
+
+func (o *GetPackageOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.Package)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewGetPackageNotFound creates a GetPackageNotFound with default headers values
+func NewGetPackageNotFound() *GetPackageNotFound {
+	return &GetPackageNotFound{}
+}
+
+/*
+GetPackageNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type GetPackageNotFound struct {
+}
+
+// IsSuccess returns true when this get package not found response has a 2xx status code
+func (o *GetPackageNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this get package not found response has a 3xx status code
+func (o *GetPackageNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this get package not found response has a 4xx status code
+func (o *GetPackageNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this get package not found response has a 5xx status code
+func (o *GetPackageNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this get package not found response a status code equal to that given
+func (o *GetPackageNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the get package not found response
+func (o *GetPackageNotFound) Code() int {
+	return 404
+}
+
+func (o *GetPackageNotFound) Error() string {
+	return fmt.Sprintf("[GET /packages/{owner}/{type}/{name}/{version}][%d] getPackageNotFound", 404)
+}
+
+func (o *GetPackageNotFound) String() string {
+	return fmt.Sprintf("[GET /packages/{owner}/{type}/{name}/{version}][%d] getPackageNotFound", 404)
+}
+
+func (o *GetPackageNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/package_operations/list_package_files_parameters.go b/bots-common/gitea-generated/client/package_operations/list_package_files_parameters.go
new file mode 100644
index 0000000..31249c7
--- /dev/null
+++ b/bots-common/gitea-generated/client/package_operations/list_package_files_parameters.go
@@ -0,0 +1,217 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package package_operations
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewListPackageFilesParams creates a new ListPackageFilesParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewListPackageFilesParams() *ListPackageFilesParams {
+	return &ListPackageFilesParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewListPackageFilesParamsWithTimeout creates a new ListPackageFilesParams object
+// with the ability to set a timeout on a request.
+func NewListPackageFilesParamsWithTimeout(timeout time.Duration) *ListPackageFilesParams {
+	return &ListPackageFilesParams{
+		timeout: timeout,
+	}
+}
+
+// NewListPackageFilesParamsWithContext creates a new ListPackageFilesParams object
+// with the ability to set a context for a request.
+func NewListPackageFilesParamsWithContext(ctx context.Context) *ListPackageFilesParams {
+	return &ListPackageFilesParams{
+		Context: ctx,
+	}
+}
+
+// NewListPackageFilesParamsWithHTTPClient creates a new ListPackageFilesParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewListPackageFilesParamsWithHTTPClient(client *http.Client) *ListPackageFilesParams {
+	return &ListPackageFilesParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+ListPackageFilesParams contains all the parameters to send to the API endpoint
+
+	for the list package files operation.
+
+	Typically these are written to a http.Request.
+*/
+type ListPackageFilesParams struct {
+
+	/* Name.
+
+	   name of the package
+	*/
+	Name string
+
+	/* Owner.
+
+	   owner of the package
+	*/
+	Owner string
+
+	/* Type.
+
+	   type of the package
+	*/
+	Type string
+
+	/* Version.
+
+	   version of the package
+	*/
+	Version string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the list package files params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *ListPackageFilesParams) WithDefaults() *ListPackageFilesParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the list package files params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *ListPackageFilesParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the list package files params
+func (o *ListPackageFilesParams) WithTimeout(timeout time.Duration) *ListPackageFilesParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the list package files params
+func (o *ListPackageFilesParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the list package files params
+func (o *ListPackageFilesParams) WithContext(ctx context.Context) *ListPackageFilesParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the list package files params
+func (o *ListPackageFilesParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the list package files params
+func (o *ListPackageFilesParams) WithHTTPClient(client *http.Client) *ListPackageFilesParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the list package files params
+func (o *ListPackageFilesParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithName adds the name to the list package files params
+func (o *ListPackageFilesParams) WithName(name string) *ListPackageFilesParams {
+	o.SetName(name)
+	return o
+}
+
+// SetName adds the name to the list package files params
+func (o *ListPackageFilesParams) SetName(name string) {
+	o.Name = name
+}
+
+// WithOwner adds the owner to the list package files params
+func (o *ListPackageFilesParams) WithOwner(owner string) *ListPackageFilesParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the list package files params
+func (o *ListPackageFilesParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithType adds the typeVar to the list package files params
+func (o *ListPackageFilesParams) WithType(typeVar string) *ListPackageFilesParams {
+	o.SetType(typeVar)
+	return o
+}
+
+// SetType adds the type to the list package files params
+func (o *ListPackageFilesParams) SetType(typeVar string) {
+	o.Type = typeVar
+}
+
+// WithVersion adds the version to the list package files params
+func (o *ListPackageFilesParams) WithVersion(version string) *ListPackageFilesParams {
+	o.SetVersion(version)
+	return o
+}
+
+// SetVersion adds the version to the list package files params
+func (o *ListPackageFilesParams) SetVersion(version string) {
+	o.Version = version
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *ListPackageFilesParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param name
+	if err := r.SetPathParam("name", o.Name); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param type
+	if err := r.SetPathParam("type", o.Type); err != nil {
+		return err
+	}
+
+	// path param version
+	if err := r.SetPathParam("version", o.Version); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/package_operations/list_package_files_responses.go b/bots-common/gitea-generated/client/package_operations/list_package_files_responses.go
new file mode 100644
index 0000000..c4c9ae9
--- /dev/null
+++ b/bots-common/gitea-generated/client/package_operations/list_package_files_responses.go
@@ -0,0 +1,166 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package package_operations
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// ListPackageFilesReader is a Reader for the ListPackageFiles structure.
+type ListPackageFilesReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *ListPackageFilesReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewListPackageFilesOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewListPackageFilesNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /packages/{owner}/{type}/{name}/{version}/files] listPackageFiles", response, response.Code())
+	}
+}
+
+// NewListPackageFilesOK creates a ListPackageFilesOK with default headers values
+func NewListPackageFilesOK() *ListPackageFilesOK {
+	return &ListPackageFilesOK{}
+}
+
+/*
+ListPackageFilesOK describes a response with status code 200, with default header values.
+
+PackageFileList
+*/
+type ListPackageFilesOK struct {
+	Payload []*models.PackageFile
+}
+
+// IsSuccess returns true when this list package files o k response has a 2xx status code
+func (o *ListPackageFilesOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this list package files o k response has a 3xx status code
+func (o *ListPackageFilesOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this list package files o k response has a 4xx status code
+func (o *ListPackageFilesOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this list package files o k response has a 5xx status code
+func (o *ListPackageFilesOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this list package files o k response a status code equal to that given
+func (o *ListPackageFilesOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the list package files o k response
+func (o *ListPackageFilesOK) Code() int {
+	return 200
+}
+
+func (o *ListPackageFilesOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /packages/{owner}/{type}/{name}/{version}/files][%d] listPackageFilesOK %s", 200, payload)
+}
+
+func (o *ListPackageFilesOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /packages/{owner}/{type}/{name}/{version}/files][%d] listPackageFilesOK %s", 200, payload)
+}
+
+func (o *ListPackageFilesOK) GetPayload() []*models.PackageFile {
+	return o.Payload
+}
+
+func (o *ListPackageFilesOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewListPackageFilesNotFound creates a ListPackageFilesNotFound with default headers values
+func NewListPackageFilesNotFound() *ListPackageFilesNotFound {
+	return &ListPackageFilesNotFound{}
+}
+
+/*
+ListPackageFilesNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type ListPackageFilesNotFound struct {
+}
+
+// IsSuccess returns true when this list package files not found response has a 2xx status code
+func (o *ListPackageFilesNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this list package files not found response has a 3xx status code
+func (o *ListPackageFilesNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this list package files not found response has a 4xx status code
+func (o *ListPackageFilesNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this list package files not found response has a 5xx status code
+func (o *ListPackageFilesNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this list package files not found response a status code equal to that given
+func (o *ListPackageFilesNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the list package files not found response
+func (o *ListPackageFilesNotFound) Code() int {
+	return 404
+}
+
+func (o *ListPackageFilesNotFound) Error() string {
+	return fmt.Sprintf("[GET /packages/{owner}/{type}/{name}/{version}/files][%d] listPackageFilesNotFound", 404)
+}
+
+func (o *ListPackageFilesNotFound) String() string {
+	return fmt.Sprintf("[GET /packages/{owner}/{type}/{name}/{version}/files][%d] listPackageFilesNotFound", 404)
+}
+
+func (o *ListPackageFilesNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/package_operations/list_packages_parameters.go b/bots-common/gitea-generated/client/package_operations/list_packages_parameters.go
new file mode 100644
index 0000000..e4eef5f
--- /dev/null
+++ b/bots-common/gitea-generated/client/package_operations/list_packages_parameters.go
@@ -0,0 +1,288 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package package_operations
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewListPackagesParams creates a new ListPackagesParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewListPackagesParams() *ListPackagesParams {
+	return &ListPackagesParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewListPackagesParamsWithTimeout creates a new ListPackagesParams object
+// with the ability to set a timeout on a request.
+func NewListPackagesParamsWithTimeout(timeout time.Duration) *ListPackagesParams {
+	return &ListPackagesParams{
+		timeout: timeout,
+	}
+}
+
+// NewListPackagesParamsWithContext creates a new ListPackagesParams object
+// with the ability to set a context for a request.
+func NewListPackagesParamsWithContext(ctx context.Context) *ListPackagesParams {
+	return &ListPackagesParams{
+		Context: ctx,
+	}
+}
+
+// NewListPackagesParamsWithHTTPClient creates a new ListPackagesParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewListPackagesParamsWithHTTPClient(client *http.Client) *ListPackagesParams {
+	return &ListPackagesParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+ListPackagesParams contains all the parameters to send to the API endpoint
+
+	for the list packages operation.
+
+	Typically these are written to a http.Request.
+*/
+type ListPackagesParams struct {
+
+	/* Limit.
+
+	   page size of results
+	*/
+	Limit *int64
+
+	/* Owner.
+
+	   owner of the packages
+	*/
+	Owner string
+
+	/* Page.
+
+	   page number of results to return (1-based)
+	*/
+	Page *int64
+
+	/* Q.
+
+	   name filter
+	*/
+	Q *string
+
+	/* Type.
+
+	   package type filter
+	*/
+	Type *string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the list packages params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *ListPackagesParams) WithDefaults() *ListPackagesParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the list packages params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *ListPackagesParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the list packages params
+func (o *ListPackagesParams) WithTimeout(timeout time.Duration) *ListPackagesParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the list packages params
+func (o *ListPackagesParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the list packages params
+func (o *ListPackagesParams) WithContext(ctx context.Context) *ListPackagesParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the list packages params
+func (o *ListPackagesParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the list packages params
+func (o *ListPackagesParams) WithHTTPClient(client *http.Client) *ListPackagesParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the list packages params
+func (o *ListPackagesParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithLimit adds the limit to the list packages params
+func (o *ListPackagesParams) WithLimit(limit *int64) *ListPackagesParams {
+	o.SetLimit(limit)
+	return o
+}
+
+// SetLimit adds the limit to the list packages params
+func (o *ListPackagesParams) SetLimit(limit *int64) {
+	o.Limit = limit
+}
+
+// WithOwner adds the owner to the list packages params
+func (o *ListPackagesParams) WithOwner(owner string) *ListPackagesParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the list packages params
+func (o *ListPackagesParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithPage adds the page to the list packages params
+func (o *ListPackagesParams) WithPage(page *int64) *ListPackagesParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the list packages params
+func (o *ListPackagesParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WithQ adds the q to the list packages params
+func (o *ListPackagesParams) WithQ(q *string) *ListPackagesParams {
+	o.SetQ(q)
+	return o
+}
+
+// SetQ adds the q to the list packages params
+func (o *ListPackagesParams) SetQ(q *string) {
+	o.Q = q
+}
+
+// WithType adds the typeVar to the list packages params
+func (o *ListPackagesParams) WithType(typeVar *string) *ListPackagesParams {
+	o.SetType(typeVar)
+	return o
+}
+
+// SetType adds the type to the list packages params
+func (o *ListPackagesParams) SetType(typeVar *string) {
+	o.Type = typeVar
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *ListPackagesParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.Limit != nil {
+
+		// query param limit
+		var qrLimit int64
+
+		if o.Limit != nil {
+			qrLimit = *o.Limit
+		}
+		qLimit := swag.FormatInt64(qrLimit)
+		if qLimit != "" {
+
+			if err := r.SetQueryParam("limit", qLimit); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Q != nil {
+
+		// query param q
+		var qrQ string
+
+		if o.Q != nil {
+			qrQ = *o.Q
+		}
+		qQ := qrQ
+		if qQ != "" {
+
+			if err := r.SetQueryParam("q", qQ); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Type != nil {
+
+		// query param type
+		var qrType string
+
+		if o.Type != nil {
+			qrType = *o.Type
+		}
+		qType := qrType
+		if qType != "" {
+
+			if err := r.SetQueryParam("type", qType); err != nil {
+				return err
+			}
+		}
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/package_operations/list_packages_responses.go b/bots-common/gitea-generated/client/package_operations/list_packages_responses.go
new file mode 100644
index 0000000..c7f6b05
--- /dev/null
+++ b/bots-common/gitea-generated/client/package_operations/list_packages_responses.go
@@ -0,0 +1,166 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package package_operations
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// ListPackagesReader is a Reader for the ListPackages structure.
+type ListPackagesReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *ListPackagesReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewListPackagesOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewListPackagesNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /packages/{owner}] listPackages", response, response.Code())
+	}
+}
+
+// NewListPackagesOK creates a ListPackagesOK with default headers values
+func NewListPackagesOK() *ListPackagesOK {
+	return &ListPackagesOK{}
+}
+
+/*
+ListPackagesOK describes a response with status code 200, with default header values.
+
+PackageList
+*/
+type ListPackagesOK struct {
+	Payload []*models.Package
+}
+
+// IsSuccess returns true when this list packages o k response has a 2xx status code
+func (o *ListPackagesOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this list packages o k response has a 3xx status code
+func (o *ListPackagesOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this list packages o k response has a 4xx status code
+func (o *ListPackagesOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this list packages o k response has a 5xx status code
+func (o *ListPackagesOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this list packages o k response a status code equal to that given
+func (o *ListPackagesOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the list packages o k response
+func (o *ListPackagesOK) Code() int {
+	return 200
+}
+
+func (o *ListPackagesOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /packages/{owner}][%d] listPackagesOK %s", 200, payload)
+}
+
+func (o *ListPackagesOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /packages/{owner}][%d] listPackagesOK %s", 200, payload)
+}
+
+func (o *ListPackagesOK) GetPayload() []*models.Package {
+	return o.Payload
+}
+
+func (o *ListPackagesOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewListPackagesNotFound creates a ListPackagesNotFound with default headers values
+func NewListPackagesNotFound() *ListPackagesNotFound {
+	return &ListPackagesNotFound{}
+}
+
+/*
+ListPackagesNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type ListPackagesNotFound struct {
+}
+
+// IsSuccess returns true when this list packages not found response has a 2xx status code
+func (o *ListPackagesNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this list packages not found response has a 3xx status code
+func (o *ListPackagesNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this list packages not found response has a 4xx status code
+func (o *ListPackagesNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this list packages not found response has a 5xx status code
+func (o *ListPackagesNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this list packages not found response a status code equal to that given
+func (o *ListPackagesNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the list packages not found response
+func (o *ListPackagesNotFound) Code() int {
+	return 404
+}
+
+func (o *ListPackagesNotFound) Error() string {
+	return fmt.Sprintf("[GET /packages/{owner}][%d] listPackagesNotFound", 404)
+}
+
+func (o *ListPackagesNotFound) String() string {
+	return fmt.Sprintf("[GET /packages/{owner}][%d] listPackagesNotFound", 404)
+}
+
+func (o *ListPackagesNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/package_operations/package_operations_client.go b/bots-common/gitea-generated/client/package_operations/package_operations_client.go
new file mode 100644
index 0000000..5209e78
--- /dev/null
+++ b/bots-common/gitea-generated/client/package_operations/package_operations_client.go
@@ -0,0 +1,273 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package package_operations
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	httptransport "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// New creates a new package operations API client.
+func New(transport runtime.ClientTransport, formats strfmt.Registry) ClientService {
+	return &Client{transport: transport, formats: formats}
+}
+
+// New creates a new package operations API client with basic auth credentials.
+// It takes the following parameters:
+// - host: http host (github.com).
+// - basePath: any base path for the API client ("/v1", "/v3").
+// - scheme: http scheme ("http", "https").
+// - user: user for basic authentication header.
+// - password: password for basic authentication header.
+func NewClientWithBasicAuth(host, basePath, scheme, user, password string) ClientService {
+	transport := httptransport.New(host, basePath, []string{scheme})
+	transport.DefaultAuthentication = httptransport.BasicAuth(user, password)
+	return &Client{transport: transport, formats: strfmt.Default}
+}
+
+// New creates a new package operations API client with a bearer token for authentication.
+// It takes the following parameters:
+// - host: http host (github.com).
+// - basePath: any base path for the API client ("/v1", "/v3").
+// - scheme: http scheme ("http", "https").
+// - bearerToken: bearer token for Bearer authentication header.
+func NewClientWithBearerToken(host, basePath, scheme, bearerToken string) ClientService {
+	transport := httptransport.New(host, basePath, []string{scheme})
+	transport.DefaultAuthentication = httptransport.BearerToken(bearerToken)
+	return &Client{transport: transport, formats: strfmt.Default}
+}
+
+/*
+Client for package operations API
+*/
+type Client struct {
+	transport runtime.ClientTransport
+	formats   strfmt.Registry
+}
+
+// ClientOption may be used to customize the behavior of Client methods.
+type ClientOption func(*runtime.ClientOperation)
+
+// This client is generated with a few options you might find useful for your swagger spec.
+//
+// Feel free to add you own set of options.
+
+// WithContentType allows the client to force the Content-Type header
+// to negotiate a specific Consumer from the server.
+//
+// You may use this option to set arbitrary extensions to your MIME media type.
+func WithContentType(mime string) ClientOption {
+	return func(r *runtime.ClientOperation) {
+		r.ConsumesMediaTypes = []string{mime}
+	}
+}
+
+// WithContentTypeApplicationJSON sets the Content-Type header to "application/json".
+func WithContentTypeApplicationJSON(r *runtime.ClientOperation) {
+	r.ConsumesMediaTypes = []string{"application/json"}
+}
+
+// WithContentTypeTextPlain sets the Content-Type header to "text/plain".
+func WithContentTypeTextPlain(r *runtime.ClientOperation) {
+	r.ConsumesMediaTypes = []string{"text/plain"}
+}
+
+// WithAccept allows the client to force the Accept header
+// to negotiate a specific Producer from the server.
+//
+// You may use this option to set arbitrary extensions to your MIME media type.
+func WithAccept(mime string) ClientOption {
+	return func(r *runtime.ClientOperation) {
+		r.ProducesMediaTypes = []string{mime}
+	}
+}
+
+// WithAcceptApplicationJSON sets the Accept header to "application/json".
+func WithAcceptApplicationJSON(r *runtime.ClientOperation) {
+	r.ProducesMediaTypes = []string{"application/json"}
+}
+
+// WithAcceptTextHTML sets the Accept header to "text/html".
+func WithAcceptTextHTML(r *runtime.ClientOperation) {
+	r.ProducesMediaTypes = []string{"text/html"}
+}
+
+// ClientService is the interface for Client methods
+type ClientService interface {
+	DeletePackage(params *DeletePackageParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*DeletePackageNoContent, error)
+
+	GetPackage(params *GetPackageParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*GetPackageOK, error)
+
+	ListPackageFiles(params *ListPackageFilesParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*ListPackageFilesOK, error)
+
+	ListPackages(params *ListPackagesParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*ListPackagesOK, error)
+
+	SetTransport(transport runtime.ClientTransport)
+}
+
+/*
+DeletePackage deletes a package
+*/
+func (a *Client) DeletePackage(params *DeletePackageParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*DeletePackageNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewDeletePackageParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "deletePackage",
+		Method:             "DELETE",
+		PathPattern:        "/packages/{owner}/{type}/{name}/{version}",
+		ProducesMediaTypes: []string{"application/json", "text/html"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &DeletePackageReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*DeletePackageNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for deletePackage: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+GetPackage gets a package
+*/
+func (a *Client) GetPackage(params *GetPackageParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*GetPackageOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewGetPackageParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "getPackage",
+		Method:             "GET",
+		PathPattern:        "/packages/{owner}/{type}/{name}/{version}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &GetPackageReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*GetPackageOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for getPackage: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+ListPackageFiles gets all files of a package
+*/
+func (a *Client) ListPackageFiles(params *ListPackageFilesParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*ListPackageFilesOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewListPackageFilesParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "listPackageFiles",
+		Method:             "GET",
+		PathPattern:        "/packages/{owner}/{type}/{name}/{version}/files",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &ListPackageFilesReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*ListPackageFilesOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for listPackageFiles: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+ListPackages gets all packages of an owner
+*/
+func (a *Client) ListPackages(params *ListPackagesParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*ListPackagesOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewListPackagesParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "listPackages",
+		Method:             "GET",
+		PathPattern:        "/packages/{owner}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &ListPackagesReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*ListPackagesOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for listPackages: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+// SetTransport changes the transport on the client
+func (a *Client) SetTransport(transport runtime.ClientTransport) {
+	a.transport = transport
+}
diff --git a/bots-common/gitea-generated/client/repository/accept_repo_transfer_parameters.go b/bots-common/gitea-generated/client/repository/accept_repo_transfer_parameters.go
new file mode 100644
index 0000000..e30e419
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/accept_repo_transfer_parameters.go
@@ -0,0 +1,173 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewAcceptRepoTransferParams creates a new AcceptRepoTransferParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewAcceptRepoTransferParams() *AcceptRepoTransferParams {
+	return &AcceptRepoTransferParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewAcceptRepoTransferParamsWithTimeout creates a new AcceptRepoTransferParams object
+// with the ability to set a timeout on a request.
+func NewAcceptRepoTransferParamsWithTimeout(timeout time.Duration) *AcceptRepoTransferParams {
+	return &AcceptRepoTransferParams{
+		timeout: timeout,
+	}
+}
+
+// NewAcceptRepoTransferParamsWithContext creates a new AcceptRepoTransferParams object
+// with the ability to set a context for a request.
+func NewAcceptRepoTransferParamsWithContext(ctx context.Context) *AcceptRepoTransferParams {
+	return &AcceptRepoTransferParams{
+		Context: ctx,
+	}
+}
+
+// NewAcceptRepoTransferParamsWithHTTPClient creates a new AcceptRepoTransferParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewAcceptRepoTransferParamsWithHTTPClient(client *http.Client) *AcceptRepoTransferParams {
+	return &AcceptRepoTransferParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+AcceptRepoTransferParams contains all the parameters to send to the API endpoint
+
+	for the accept repo transfer operation.
+
+	Typically these are written to a http.Request.
+*/
+type AcceptRepoTransferParams struct {
+
+	/* Owner.
+
+	   owner of the repo to transfer
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo to transfer
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the accept repo transfer params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *AcceptRepoTransferParams) WithDefaults() *AcceptRepoTransferParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the accept repo transfer params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *AcceptRepoTransferParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the accept repo transfer params
+func (o *AcceptRepoTransferParams) WithTimeout(timeout time.Duration) *AcceptRepoTransferParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the accept repo transfer params
+func (o *AcceptRepoTransferParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the accept repo transfer params
+func (o *AcceptRepoTransferParams) WithContext(ctx context.Context) *AcceptRepoTransferParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the accept repo transfer params
+func (o *AcceptRepoTransferParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the accept repo transfer params
+func (o *AcceptRepoTransferParams) WithHTTPClient(client *http.Client) *AcceptRepoTransferParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the accept repo transfer params
+func (o *AcceptRepoTransferParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithOwner adds the owner to the accept repo transfer params
+func (o *AcceptRepoTransferParams) WithOwner(owner string) *AcceptRepoTransferParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the accept repo transfer params
+func (o *AcceptRepoTransferParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the accept repo transfer params
+func (o *AcceptRepoTransferParams) WithRepo(repo string) *AcceptRepoTransferParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the accept repo transfer params
+func (o *AcceptRepoTransferParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *AcceptRepoTransferParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/accept_repo_transfer_responses.go b/bots-common/gitea-generated/client/repository/accept_repo_transfer_responses.go
new file mode 100644
index 0000000..b4a3382
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/accept_repo_transfer_responses.go
@@ -0,0 +1,246 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// AcceptRepoTransferReader is a Reader for the AcceptRepoTransfer structure.
+type AcceptRepoTransferReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *AcceptRepoTransferReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 202:
+		result := NewAcceptRepoTransferAccepted()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 403:
+		result := NewAcceptRepoTransferForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewAcceptRepoTransferNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[POST /repos/{owner}/{repo}/transfer/accept] acceptRepoTransfer", response, response.Code())
+	}
+}
+
+// NewAcceptRepoTransferAccepted creates a AcceptRepoTransferAccepted with default headers values
+func NewAcceptRepoTransferAccepted() *AcceptRepoTransferAccepted {
+	return &AcceptRepoTransferAccepted{}
+}
+
+/*
+AcceptRepoTransferAccepted describes a response with status code 202, with default header values.
+
+Repository
+*/
+type AcceptRepoTransferAccepted struct {
+	Payload *models.Repository
+}
+
+// IsSuccess returns true when this accept repo transfer accepted response has a 2xx status code
+func (o *AcceptRepoTransferAccepted) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this accept repo transfer accepted response has a 3xx status code
+func (o *AcceptRepoTransferAccepted) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this accept repo transfer accepted response has a 4xx status code
+func (o *AcceptRepoTransferAccepted) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this accept repo transfer accepted response has a 5xx status code
+func (o *AcceptRepoTransferAccepted) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this accept repo transfer accepted response a status code equal to that given
+func (o *AcceptRepoTransferAccepted) IsCode(code int) bool {
+	return code == 202
+}
+
+// Code gets the status code for the accept repo transfer accepted response
+func (o *AcceptRepoTransferAccepted) Code() int {
+	return 202
+}
+
+func (o *AcceptRepoTransferAccepted) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/transfer/accept][%d] acceptRepoTransferAccepted %s", 202, payload)
+}
+
+func (o *AcceptRepoTransferAccepted) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/transfer/accept][%d] acceptRepoTransferAccepted %s", 202, payload)
+}
+
+func (o *AcceptRepoTransferAccepted) GetPayload() *models.Repository {
+	return o.Payload
+}
+
+func (o *AcceptRepoTransferAccepted) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.Repository)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewAcceptRepoTransferForbidden creates a AcceptRepoTransferForbidden with default headers values
+func NewAcceptRepoTransferForbidden() *AcceptRepoTransferForbidden {
+	return &AcceptRepoTransferForbidden{}
+}
+
+/*
+AcceptRepoTransferForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type AcceptRepoTransferForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this accept repo transfer forbidden response has a 2xx status code
+func (o *AcceptRepoTransferForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this accept repo transfer forbidden response has a 3xx status code
+func (o *AcceptRepoTransferForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this accept repo transfer forbidden response has a 4xx status code
+func (o *AcceptRepoTransferForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this accept repo transfer forbidden response has a 5xx status code
+func (o *AcceptRepoTransferForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this accept repo transfer forbidden response a status code equal to that given
+func (o *AcceptRepoTransferForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the accept repo transfer forbidden response
+func (o *AcceptRepoTransferForbidden) Code() int {
+	return 403
+}
+
+func (o *AcceptRepoTransferForbidden) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/transfer/accept][%d] acceptRepoTransferForbidden", 403)
+}
+
+func (o *AcceptRepoTransferForbidden) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/transfer/accept][%d] acceptRepoTransferForbidden", 403)
+}
+
+func (o *AcceptRepoTransferForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewAcceptRepoTransferNotFound creates a AcceptRepoTransferNotFound with default headers values
+func NewAcceptRepoTransferNotFound() *AcceptRepoTransferNotFound {
+	return &AcceptRepoTransferNotFound{}
+}
+
+/*
+AcceptRepoTransferNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type AcceptRepoTransferNotFound struct {
+}
+
+// IsSuccess returns true when this accept repo transfer not found response has a 2xx status code
+func (o *AcceptRepoTransferNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this accept repo transfer not found response has a 3xx status code
+func (o *AcceptRepoTransferNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this accept repo transfer not found response has a 4xx status code
+func (o *AcceptRepoTransferNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this accept repo transfer not found response has a 5xx status code
+func (o *AcceptRepoTransferNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this accept repo transfer not found response a status code equal to that given
+func (o *AcceptRepoTransferNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the accept repo transfer not found response
+func (o *AcceptRepoTransferNotFound) Code() int {
+	return 404
+}
+
+func (o *AcceptRepoTransferNotFound) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/transfer/accept][%d] acceptRepoTransferNotFound", 404)
+}
+
+func (o *AcceptRepoTransferNotFound) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/transfer/accept][%d] acceptRepoTransferNotFound", 404)
+}
+
+func (o *AcceptRepoTransferNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/create_current_user_repo_parameters.go b/bots-common/gitea-generated/client/repository/create_current_user_repo_parameters.go
new file mode 100644
index 0000000..cdb176c
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/create_current_user_repo_parameters.go
@@ -0,0 +1,150 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewCreateCurrentUserRepoParams creates a new CreateCurrentUserRepoParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewCreateCurrentUserRepoParams() *CreateCurrentUserRepoParams {
+	return &CreateCurrentUserRepoParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewCreateCurrentUserRepoParamsWithTimeout creates a new CreateCurrentUserRepoParams object
+// with the ability to set a timeout on a request.
+func NewCreateCurrentUserRepoParamsWithTimeout(timeout time.Duration) *CreateCurrentUserRepoParams {
+	return &CreateCurrentUserRepoParams{
+		timeout: timeout,
+	}
+}
+
+// NewCreateCurrentUserRepoParamsWithContext creates a new CreateCurrentUserRepoParams object
+// with the ability to set a context for a request.
+func NewCreateCurrentUserRepoParamsWithContext(ctx context.Context) *CreateCurrentUserRepoParams {
+	return &CreateCurrentUserRepoParams{
+		Context: ctx,
+	}
+}
+
+// NewCreateCurrentUserRepoParamsWithHTTPClient creates a new CreateCurrentUserRepoParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewCreateCurrentUserRepoParamsWithHTTPClient(client *http.Client) *CreateCurrentUserRepoParams {
+	return &CreateCurrentUserRepoParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+CreateCurrentUserRepoParams contains all the parameters to send to the API endpoint
+
+	for the create current user repo operation.
+
+	Typically these are written to a http.Request.
+*/
+type CreateCurrentUserRepoParams struct {
+
+	// Body.
+	Body *models.CreateRepoOption
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the create current user repo params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *CreateCurrentUserRepoParams) WithDefaults() *CreateCurrentUserRepoParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the create current user repo params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *CreateCurrentUserRepoParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the create current user repo params
+func (o *CreateCurrentUserRepoParams) WithTimeout(timeout time.Duration) *CreateCurrentUserRepoParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the create current user repo params
+func (o *CreateCurrentUserRepoParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the create current user repo params
+func (o *CreateCurrentUserRepoParams) WithContext(ctx context.Context) *CreateCurrentUserRepoParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the create current user repo params
+func (o *CreateCurrentUserRepoParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the create current user repo params
+func (o *CreateCurrentUserRepoParams) WithHTTPClient(client *http.Client) *CreateCurrentUserRepoParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the create current user repo params
+func (o *CreateCurrentUserRepoParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the create current user repo params
+func (o *CreateCurrentUserRepoParams) WithBody(body *models.CreateRepoOption) *CreateCurrentUserRepoParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the create current user repo params
+func (o *CreateCurrentUserRepoParams) SetBody(body *models.CreateRepoOption) {
+	o.Body = body
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *CreateCurrentUserRepoParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/create_current_user_repo_responses.go b/bots-common/gitea-generated/client/repository/create_current_user_repo_responses.go
new file mode 100644
index 0000000..19f0b9a
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/create_current_user_repo_responses.go
@@ -0,0 +1,324 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// CreateCurrentUserRepoReader is a Reader for the CreateCurrentUserRepo structure.
+type CreateCurrentUserRepoReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *CreateCurrentUserRepoReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 201:
+		result := NewCreateCurrentUserRepoCreated()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 400:
+		result := NewCreateCurrentUserRepoBadRequest()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 409:
+		result := NewCreateCurrentUserRepoConflict()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 422:
+		result := NewCreateCurrentUserRepoUnprocessableEntity()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[POST /user/repos] createCurrentUserRepo", response, response.Code())
+	}
+}
+
+// NewCreateCurrentUserRepoCreated creates a CreateCurrentUserRepoCreated with default headers values
+func NewCreateCurrentUserRepoCreated() *CreateCurrentUserRepoCreated {
+	return &CreateCurrentUserRepoCreated{}
+}
+
+/*
+CreateCurrentUserRepoCreated describes a response with status code 201, with default header values.
+
+Repository
+*/
+type CreateCurrentUserRepoCreated struct {
+	Payload *models.Repository
+}
+
+// IsSuccess returns true when this create current user repo created response has a 2xx status code
+func (o *CreateCurrentUserRepoCreated) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this create current user repo created response has a 3xx status code
+func (o *CreateCurrentUserRepoCreated) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this create current user repo created response has a 4xx status code
+func (o *CreateCurrentUserRepoCreated) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this create current user repo created response has a 5xx status code
+func (o *CreateCurrentUserRepoCreated) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this create current user repo created response a status code equal to that given
+func (o *CreateCurrentUserRepoCreated) IsCode(code int) bool {
+	return code == 201
+}
+
+// Code gets the status code for the create current user repo created response
+func (o *CreateCurrentUserRepoCreated) Code() int {
+	return 201
+}
+
+func (o *CreateCurrentUserRepoCreated) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /user/repos][%d] createCurrentUserRepoCreated %s", 201, payload)
+}
+
+func (o *CreateCurrentUserRepoCreated) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /user/repos][%d] createCurrentUserRepoCreated %s", 201, payload)
+}
+
+func (o *CreateCurrentUserRepoCreated) GetPayload() *models.Repository {
+	return o.Payload
+}
+
+func (o *CreateCurrentUserRepoCreated) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.Repository)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewCreateCurrentUserRepoBadRequest creates a CreateCurrentUserRepoBadRequest with default headers values
+func NewCreateCurrentUserRepoBadRequest() *CreateCurrentUserRepoBadRequest {
+	return &CreateCurrentUserRepoBadRequest{}
+}
+
+/*
+CreateCurrentUserRepoBadRequest describes a response with status code 400, with default header values.
+
+APIError is error format response
+*/
+type CreateCurrentUserRepoBadRequest struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this create current user repo bad request response has a 2xx status code
+func (o *CreateCurrentUserRepoBadRequest) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this create current user repo bad request response has a 3xx status code
+func (o *CreateCurrentUserRepoBadRequest) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this create current user repo bad request response has a 4xx status code
+func (o *CreateCurrentUserRepoBadRequest) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this create current user repo bad request response has a 5xx status code
+func (o *CreateCurrentUserRepoBadRequest) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this create current user repo bad request response a status code equal to that given
+func (o *CreateCurrentUserRepoBadRequest) IsCode(code int) bool {
+	return code == 400
+}
+
+// Code gets the status code for the create current user repo bad request response
+func (o *CreateCurrentUserRepoBadRequest) Code() int {
+	return 400
+}
+
+func (o *CreateCurrentUserRepoBadRequest) Error() string {
+	return fmt.Sprintf("[POST /user/repos][%d] createCurrentUserRepoBadRequest", 400)
+}
+
+func (o *CreateCurrentUserRepoBadRequest) String() string {
+	return fmt.Sprintf("[POST /user/repos][%d] createCurrentUserRepoBadRequest", 400)
+}
+
+func (o *CreateCurrentUserRepoBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewCreateCurrentUserRepoConflict creates a CreateCurrentUserRepoConflict with default headers values
+func NewCreateCurrentUserRepoConflict() *CreateCurrentUserRepoConflict {
+	return &CreateCurrentUserRepoConflict{}
+}
+
+/*
+CreateCurrentUserRepoConflict describes a response with status code 409, with default header values.
+
+The repository with the same name already exists.
+*/
+type CreateCurrentUserRepoConflict struct {
+}
+
+// IsSuccess returns true when this create current user repo conflict response has a 2xx status code
+func (o *CreateCurrentUserRepoConflict) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this create current user repo conflict response has a 3xx status code
+func (o *CreateCurrentUserRepoConflict) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this create current user repo conflict response has a 4xx status code
+func (o *CreateCurrentUserRepoConflict) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this create current user repo conflict response has a 5xx status code
+func (o *CreateCurrentUserRepoConflict) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this create current user repo conflict response a status code equal to that given
+func (o *CreateCurrentUserRepoConflict) IsCode(code int) bool {
+	return code == 409
+}
+
+// Code gets the status code for the create current user repo conflict response
+func (o *CreateCurrentUserRepoConflict) Code() int {
+	return 409
+}
+
+func (o *CreateCurrentUserRepoConflict) Error() string {
+	return fmt.Sprintf("[POST /user/repos][%d] createCurrentUserRepoConflict", 409)
+}
+
+func (o *CreateCurrentUserRepoConflict) String() string {
+	return fmt.Sprintf("[POST /user/repos][%d] createCurrentUserRepoConflict", 409)
+}
+
+func (o *CreateCurrentUserRepoConflict) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewCreateCurrentUserRepoUnprocessableEntity creates a CreateCurrentUserRepoUnprocessableEntity with default headers values
+func NewCreateCurrentUserRepoUnprocessableEntity() *CreateCurrentUserRepoUnprocessableEntity {
+	return &CreateCurrentUserRepoUnprocessableEntity{}
+}
+
+/*
+CreateCurrentUserRepoUnprocessableEntity describes a response with status code 422, with default header values.
+
+APIValidationError is error format response related to input validation
+*/
+type CreateCurrentUserRepoUnprocessableEntity struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this create current user repo unprocessable entity response has a 2xx status code
+func (o *CreateCurrentUserRepoUnprocessableEntity) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this create current user repo unprocessable entity response has a 3xx status code
+func (o *CreateCurrentUserRepoUnprocessableEntity) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this create current user repo unprocessable entity response has a 4xx status code
+func (o *CreateCurrentUserRepoUnprocessableEntity) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this create current user repo unprocessable entity response has a 5xx status code
+func (o *CreateCurrentUserRepoUnprocessableEntity) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this create current user repo unprocessable entity response a status code equal to that given
+func (o *CreateCurrentUserRepoUnprocessableEntity) IsCode(code int) bool {
+	return code == 422
+}
+
+// Code gets the status code for the create current user repo unprocessable entity response
+func (o *CreateCurrentUserRepoUnprocessableEntity) Code() int {
+	return 422
+}
+
+func (o *CreateCurrentUserRepoUnprocessableEntity) Error() string {
+	return fmt.Sprintf("[POST /user/repos][%d] createCurrentUserRepoUnprocessableEntity", 422)
+}
+
+func (o *CreateCurrentUserRepoUnprocessableEntity) String() string {
+	return fmt.Sprintf("[POST /user/repos][%d] createCurrentUserRepoUnprocessableEntity", 422)
+}
+
+func (o *CreateCurrentUserRepoUnprocessableEntity) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/create_fork_parameters.go b/bots-common/gitea-generated/client/repository/create_fork_parameters.go
new file mode 100644
index 0000000..7bf9e10
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/create_fork_parameters.go
@@ -0,0 +1,194 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewCreateForkParams creates a new CreateForkParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewCreateForkParams() *CreateForkParams {
+	return &CreateForkParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewCreateForkParamsWithTimeout creates a new CreateForkParams object
+// with the ability to set a timeout on a request.
+func NewCreateForkParamsWithTimeout(timeout time.Duration) *CreateForkParams {
+	return &CreateForkParams{
+		timeout: timeout,
+	}
+}
+
+// NewCreateForkParamsWithContext creates a new CreateForkParams object
+// with the ability to set a context for a request.
+func NewCreateForkParamsWithContext(ctx context.Context) *CreateForkParams {
+	return &CreateForkParams{
+		Context: ctx,
+	}
+}
+
+// NewCreateForkParamsWithHTTPClient creates a new CreateForkParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewCreateForkParamsWithHTTPClient(client *http.Client) *CreateForkParams {
+	return &CreateForkParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+CreateForkParams contains all the parameters to send to the API endpoint
+
+	for the create fork operation.
+
+	Typically these are written to a http.Request.
+*/
+type CreateForkParams struct {
+
+	// Body.
+	Body *models.CreateForkOption
+
+	/* Owner.
+
+	   owner of the repo to fork
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo to fork
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the create fork params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *CreateForkParams) WithDefaults() *CreateForkParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the create fork params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *CreateForkParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the create fork params
+func (o *CreateForkParams) WithTimeout(timeout time.Duration) *CreateForkParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the create fork params
+func (o *CreateForkParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the create fork params
+func (o *CreateForkParams) WithContext(ctx context.Context) *CreateForkParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the create fork params
+func (o *CreateForkParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the create fork params
+func (o *CreateForkParams) WithHTTPClient(client *http.Client) *CreateForkParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the create fork params
+func (o *CreateForkParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the create fork params
+func (o *CreateForkParams) WithBody(body *models.CreateForkOption) *CreateForkParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the create fork params
+func (o *CreateForkParams) SetBody(body *models.CreateForkOption) {
+	o.Body = body
+}
+
+// WithOwner adds the owner to the create fork params
+func (o *CreateForkParams) WithOwner(owner string) *CreateForkParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the create fork params
+func (o *CreateForkParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the create fork params
+func (o *CreateForkParams) WithRepo(repo string) *CreateForkParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the create fork params
+func (o *CreateForkParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *CreateForkParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/create_fork_responses.go b/bots-common/gitea-generated/client/repository/create_fork_responses.go
new file mode 100644
index 0000000..df98798
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/create_fork_responses.go
@@ -0,0 +1,386 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// CreateForkReader is a Reader for the CreateFork structure.
+type CreateForkReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *CreateForkReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 202:
+		result := NewCreateForkAccepted()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 403:
+		result := NewCreateForkForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewCreateForkNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 409:
+		result := NewCreateForkConflict()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 422:
+		result := NewCreateForkUnprocessableEntity()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[POST /repos/{owner}/{repo}/forks] createFork", response, response.Code())
+	}
+}
+
+// NewCreateForkAccepted creates a CreateForkAccepted with default headers values
+func NewCreateForkAccepted() *CreateForkAccepted {
+	return &CreateForkAccepted{}
+}
+
+/*
+CreateForkAccepted describes a response with status code 202, with default header values.
+
+Repository
+*/
+type CreateForkAccepted struct {
+	Payload *models.Repository
+}
+
+// IsSuccess returns true when this create fork accepted response has a 2xx status code
+func (o *CreateForkAccepted) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this create fork accepted response has a 3xx status code
+func (o *CreateForkAccepted) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this create fork accepted response has a 4xx status code
+func (o *CreateForkAccepted) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this create fork accepted response has a 5xx status code
+func (o *CreateForkAccepted) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this create fork accepted response a status code equal to that given
+func (o *CreateForkAccepted) IsCode(code int) bool {
+	return code == 202
+}
+
+// Code gets the status code for the create fork accepted response
+func (o *CreateForkAccepted) Code() int {
+	return 202
+}
+
+func (o *CreateForkAccepted) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/forks][%d] createForkAccepted %s", 202, payload)
+}
+
+func (o *CreateForkAccepted) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/forks][%d] createForkAccepted %s", 202, payload)
+}
+
+func (o *CreateForkAccepted) GetPayload() *models.Repository {
+	return o.Payload
+}
+
+func (o *CreateForkAccepted) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.Repository)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewCreateForkForbidden creates a CreateForkForbidden with default headers values
+func NewCreateForkForbidden() *CreateForkForbidden {
+	return &CreateForkForbidden{}
+}
+
+/*
+CreateForkForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type CreateForkForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this create fork forbidden response has a 2xx status code
+func (o *CreateForkForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this create fork forbidden response has a 3xx status code
+func (o *CreateForkForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this create fork forbidden response has a 4xx status code
+func (o *CreateForkForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this create fork forbidden response has a 5xx status code
+func (o *CreateForkForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this create fork forbidden response a status code equal to that given
+func (o *CreateForkForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the create fork forbidden response
+func (o *CreateForkForbidden) Code() int {
+	return 403
+}
+
+func (o *CreateForkForbidden) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/forks][%d] createForkForbidden", 403)
+}
+
+func (o *CreateForkForbidden) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/forks][%d] createForkForbidden", 403)
+}
+
+func (o *CreateForkForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewCreateForkNotFound creates a CreateForkNotFound with default headers values
+func NewCreateForkNotFound() *CreateForkNotFound {
+	return &CreateForkNotFound{}
+}
+
+/*
+CreateForkNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type CreateForkNotFound struct {
+}
+
+// IsSuccess returns true when this create fork not found response has a 2xx status code
+func (o *CreateForkNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this create fork not found response has a 3xx status code
+func (o *CreateForkNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this create fork not found response has a 4xx status code
+func (o *CreateForkNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this create fork not found response has a 5xx status code
+func (o *CreateForkNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this create fork not found response a status code equal to that given
+func (o *CreateForkNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the create fork not found response
+func (o *CreateForkNotFound) Code() int {
+	return 404
+}
+
+func (o *CreateForkNotFound) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/forks][%d] createForkNotFound", 404)
+}
+
+func (o *CreateForkNotFound) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/forks][%d] createForkNotFound", 404)
+}
+
+func (o *CreateForkNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewCreateForkConflict creates a CreateForkConflict with default headers values
+func NewCreateForkConflict() *CreateForkConflict {
+	return &CreateForkConflict{}
+}
+
+/*
+CreateForkConflict describes a response with status code 409, with default header values.
+
+The repository with the same name already exists.
+*/
+type CreateForkConflict struct {
+}
+
+// IsSuccess returns true when this create fork conflict response has a 2xx status code
+func (o *CreateForkConflict) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this create fork conflict response has a 3xx status code
+func (o *CreateForkConflict) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this create fork conflict response has a 4xx status code
+func (o *CreateForkConflict) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this create fork conflict response has a 5xx status code
+func (o *CreateForkConflict) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this create fork conflict response a status code equal to that given
+func (o *CreateForkConflict) IsCode(code int) bool {
+	return code == 409
+}
+
+// Code gets the status code for the create fork conflict response
+func (o *CreateForkConflict) Code() int {
+	return 409
+}
+
+func (o *CreateForkConflict) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/forks][%d] createForkConflict", 409)
+}
+
+func (o *CreateForkConflict) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/forks][%d] createForkConflict", 409)
+}
+
+func (o *CreateForkConflict) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewCreateForkUnprocessableEntity creates a CreateForkUnprocessableEntity with default headers values
+func NewCreateForkUnprocessableEntity() *CreateForkUnprocessableEntity {
+	return &CreateForkUnprocessableEntity{}
+}
+
+/*
+CreateForkUnprocessableEntity describes a response with status code 422, with default header values.
+
+APIValidationError is error format response related to input validation
+*/
+type CreateForkUnprocessableEntity struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this create fork unprocessable entity response has a 2xx status code
+func (o *CreateForkUnprocessableEntity) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this create fork unprocessable entity response has a 3xx status code
+func (o *CreateForkUnprocessableEntity) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this create fork unprocessable entity response has a 4xx status code
+func (o *CreateForkUnprocessableEntity) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this create fork unprocessable entity response has a 5xx status code
+func (o *CreateForkUnprocessableEntity) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this create fork unprocessable entity response a status code equal to that given
+func (o *CreateForkUnprocessableEntity) IsCode(code int) bool {
+	return code == 422
+}
+
+// Code gets the status code for the create fork unprocessable entity response
+func (o *CreateForkUnprocessableEntity) Code() int {
+	return 422
+}
+
+func (o *CreateForkUnprocessableEntity) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/forks][%d] createForkUnprocessableEntity", 422)
+}
+
+func (o *CreateForkUnprocessableEntity) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/forks][%d] createForkUnprocessableEntity", 422)
+}
+
+func (o *CreateForkUnprocessableEntity) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/create_repo_variable_parameters.go b/bots-common/gitea-generated/client/repository/create_repo_variable_parameters.go
new file mode 100644
index 0000000..5c97621
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/create_repo_variable_parameters.go
@@ -0,0 +1,216 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewCreateRepoVariableParams creates a new CreateRepoVariableParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewCreateRepoVariableParams() *CreateRepoVariableParams {
+	return &CreateRepoVariableParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewCreateRepoVariableParamsWithTimeout creates a new CreateRepoVariableParams object
+// with the ability to set a timeout on a request.
+func NewCreateRepoVariableParamsWithTimeout(timeout time.Duration) *CreateRepoVariableParams {
+	return &CreateRepoVariableParams{
+		timeout: timeout,
+	}
+}
+
+// NewCreateRepoVariableParamsWithContext creates a new CreateRepoVariableParams object
+// with the ability to set a context for a request.
+func NewCreateRepoVariableParamsWithContext(ctx context.Context) *CreateRepoVariableParams {
+	return &CreateRepoVariableParams{
+		Context: ctx,
+	}
+}
+
+// NewCreateRepoVariableParamsWithHTTPClient creates a new CreateRepoVariableParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewCreateRepoVariableParamsWithHTTPClient(client *http.Client) *CreateRepoVariableParams {
+	return &CreateRepoVariableParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+CreateRepoVariableParams contains all the parameters to send to the API endpoint
+
+	for the create repo variable operation.
+
+	Typically these are written to a http.Request.
+*/
+type CreateRepoVariableParams struct {
+
+	// Body.
+	Body *models.CreateVariableOption
+
+	/* Owner.
+
+	   name of the owner
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repository
+	*/
+	Repo string
+
+	/* Variablename.
+
+	   name of the variable
+	*/
+	Variablename string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the create repo variable params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *CreateRepoVariableParams) WithDefaults() *CreateRepoVariableParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the create repo variable params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *CreateRepoVariableParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the create repo variable params
+func (o *CreateRepoVariableParams) WithTimeout(timeout time.Duration) *CreateRepoVariableParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the create repo variable params
+func (o *CreateRepoVariableParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the create repo variable params
+func (o *CreateRepoVariableParams) WithContext(ctx context.Context) *CreateRepoVariableParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the create repo variable params
+func (o *CreateRepoVariableParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the create repo variable params
+func (o *CreateRepoVariableParams) WithHTTPClient(client *http.Client) *CreateRepoVariableParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the create repo variable params
+func (o *CreateRepoVariableParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the create repo variable params
+func (o *CreateRepoVariableParams) WithBody(body *models.CreateVariableOption) *CreateRepoVariableParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the create repo variable params
+func (o *CreateRepoVariableParams) SetBody(body *models.CreateVariableOption) {
+	o.Body = body
+}
+
+// WithOwner adds the owner to the create repo variable params
+func (o *CreateRepoVariableParams) WithOwner(owner string) *CreateRepoVariableParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the create repo variable params
+func (o *CreateRepoVariableParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the create repo variable params
+func (o *CreateRepoVariableParams) WithRepo(repo string) *CreateRepoVariableParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the create repo variable params
+func (o *CreateRepoVariableParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WithVariablename adds the variablename to the create repo variable params
+func (o *CreateRepoVariableParams) WithVariablename(variablename string) *CreateRepoVariableParams {
+	o.SetVariablename(variablename)
+	return o
+}
+
+// SetVariablename adds the variablename to the create repo variable params
+func (o *CreateRepoVariableParams) SetVariablename(variablename string) {
+	o.Variablename = variablename
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *CreateRepoVariableParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	// path param variablename
+	if err := r.SetPathParam("variablename", o.Variablename); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/create_repo_variable_responses.go b/bots-common/gitea-generated/client/repository/create_repo_variable_responses.go
new file mode 100644
index 0000000..fa0b99c
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/create_repo_variable_responses.go
@@ -0,0 +1,290 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// CreateRepoVariableReader is a Reader for the CreateRepoVariable structure.
+type CreateRepoVariableReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *CreateRepoVariableReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 201:
+		result := NewCreateRepoVariableCreated()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 204:
+		result := NewCreateRepoVariableNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 400:
+		result := NewCreateRepoVariableBadRequest()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewCreateRepoVariableNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[POST /repos/{owner}/{repo}/actions/variables/{variablename}] createRepoVariable", response, response.Code())
+	}
+}
+
+// NewCreateRepoVariableCreated creates a CreateRepoVariableCreated with default headers values
+func NewCreateRepoVariableCreated() *CreateRepoVariableCreated {
+	return &CreateRepoVariableCreated{}
+}
+
+/*
+CreateRepoVariableCreated describes a response with status code 201, with default header values.
+
+response when creating a repo-level variable
+*/
+type CreateRepoVariableCreated struct {
+}
+
+// IsSuccess returns true when this create repo variable created response has a 2xx status code
+func (o *CreateRepoVariableCreated) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this create repo variable created response has a 3xx status code
+func (o *CreateRepoVariableCreated) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this create repo variable created response has a 4xx status code
+func (o *CreateRepoVariableCreated) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this create repo variable created response has a 5xx status code
+func (o *CreateRepoVariableCreated) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this create repo variable created response a status code equal to that given
+func (o *CreateRepoVariableCreated) IsCode(code int) bool {
+	return code == 201
+}
+
+// Code gets the status code for the create repo variable created response
+func (o *CreateRepoVariableCreated) Code() int {
+	return 201
+}
+
+func (o *CreateRepoVariableCreated) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/actions/variables/{variablename}][%d] createRepoVariableCreated", 201)
+}
+
+func (o *CreateRepoVariableCreated) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/actions/variables/{variablename}][%d] createRepoVariableCreated", 201)
+}
+
+func (o *CreateRepoVariableCreated) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewCreateRepoVariableNoContent creates a CreateRepoVariableNoContent with default headers values
+func NewCreateRepoVariableNoContent() *CreateRepoVariableNoContent {
+	return &CreateRepoVariableNoContent{}
+}
+
+/*
+CreateRepoVariableNoContent describes a response with status code 204, with default header values.
+
+response when creating a repo-level variable
+*/
+type CreateRepoVariableNoContent struct {
+}
+
+// IsSuccess returns true when this create repo variable no content response has a 2xx status code
+func (o *CreateRepoVariableNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this create repo variable no content response has a 3xx status code
+func (o *CreateRepoVariableNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this create repo variable no content response has a 4xx status code
+func (o *CreateRepoVariableNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this create repo variable no content response has a 5xx status code
+func (o *CreateRepoVariableNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this create repo variable no content response a status code equal to that given
+func (o *CreateRepoVariableNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the create repo variable no content response
+func (o *CreateRepoVariableNoContent) Code() int {
+	return 204
+}
+
+func (o *CreateRepoVariableNoContent) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/actions/variables/{variablename}][%d] createRepoVariableNoContent", 204)
+}
+
+func (o *CreateRepoVariableNoContent) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/actions/variables/{variablename}][%d] createRepoVariableNoContent", 204)
+}
+
+func (o *CreateRepoVariableNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewCreateRepoVariableBadRequest creates a CreateRepoVariableBadRequest with default headers values
+func NewCreateRepoVariableBadRequest() *CreateRepoVariableBadRequest {
+	return &CreateRepoVariableBadRequest{}
+}
+
+/*
+CreateRepoVariableBadRequest describes a response with status code 400, with default header values.
+
+APIError is error format response
+*/
+type CreateRepoVariableBadRequest struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this create repo variable bad request response has a 2xx status code
+func (o *CreateRepoVariableBadRequest) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this create repo variable bad request response has a 3xx status code
+func (o *CreateRepoVariableBadRequest) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this create repo variable bad request response has a 4xx status code
+func (o *CreateRepoVariableBadRequest) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this create repo variable bad request response has a 5xx status code
+func (o *CreateRepoVariableBadRequest) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this create repo variable bad request response a status code equal to that given
+func (o *CreateRepoVariableBadRequest) IsCode(code int) bool {
+	return code == 400
+}
+
+// Code gets the status code for the create repo variable bad request response
+func (o *CreateRepoVariableBadRequest) Code() int {
+	return 400
+}
+
+func (o *CreateRepoVariableBadRequest) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/actions/variables/{variablename}][%d] createRepoVariableBadRequest", 400)
+}
+
+func (o *CreateRepoVariableBadRequest) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/actions/variables/{variablename}][%d] createRepoVariableBadRequest", 400)
+}
+
+func (o *CreateRepoVariableBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewCreateRepoVariableNotFound creates a CreateRepoVariableNotFound with default headers values
+func NewCreateRepoVariableNotFound() *CreateRepoVariableNotFound {
+	return &CreateRepoVariableNotFound{}
+}
+
+/*
+CreateRepoVariableNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type CreateRepoVariableNotFound struct {
+}
+
+// IsSuccess returns true when this create repo variable not found response has a 2xx status code
+func (o *CreateRepoVariableNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this create repo variable not found response has a 3xx status code
+func (o *CreateRepoVariableNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this create repo variable not found response has a 4xx status code
+func (o *CreateRepoVariableNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this create repo variable not found response has a 5xx status code
+func (o *CreateRepoVariableNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this create repo variable not found response a status code equal to that given
+func (o *CreateRepoVariableNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the create repo variable not found response
+func (o *CreateRepoVariableNotFound) Code() int {
+	return 404
+}
+
+func (o *CreateRepoVariableNotFound) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/actions/variables/{variablename}][%d] createRepoVariableNotFound", 404)
+}
+
+func (o *CreateRepoVariableNotFound) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/actions/variables/{variablename}][%d] createRepoVariableNotFound", 404)
+}
+
+func (o *CreateRepoVariableNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/delete_repo_secret_parameters.go b/bots-common/gitea-generated/client/repository/delete_repo_secret_parameters.go
new file mode 100644
index 0000000..13e6b6a
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/delete_repo_secret_parameters.go
@@ -0,0 +1,195 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewDeleteRepoSecretParams creates a new DeleteRepoSecretParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewDeleteRepoSecretParams() *DeleteRepoSecretParams {
+	return &DeleteRepoSecretParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewDeleteRepoSecretParamsWithTimeout creates a new DeleteRepoSecretParams object
+// with the ability to set a timeout on a request.
+func NewDeleteRepoSecretParamsWithTimeout(timeout time.Duration) *DeleteRepoSecretParams {
+	return &DeleteRepoSecretParams{
+		timeout: timeout,
+	}
+}
+
+// NewDeleteRepoSecretParamsWithContext creates a new DeleteRepoSecretParams object
+// with the ability to set a context for a request.
+func NewDeleteRepoSecretParamsWithContext(ctx context.Context) *DeleteRepoSecretParams {
+	return &DeleteRepoSecretParams{
+		Context: ctx,
+	}
+}
+
+// NewDeleteRepoSecretParamsWithHTTPClient creates a new DeleteRepoSecretParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewDeleteRepoSecretParamsWithHTTPClient(client *http.Client) *DeleteRepoSecretParams {
+	return &DeleteRepoSecretParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+DeleteRepoSecretParams contains all the parameters to send to the API endpoint
+
+	for the delete repo secret operation.
+
+	Typically these are written to a http.Request.
+*/
+type DeleteRepoSecretParams struct {
+
+	/* Owner.
+
+	   owner of the repository
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repository
+	*/
+	Repo string
+
+	/* Secretname.
+
+	   name of the secret
+	*/
+	Secretname string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the delete repo secret params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *DeleteRepoSecretParams) WithDefaults() *DeleteRepoSecretParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the delete repo secret params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *DeleteRepoSecretParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the delete repo secret params
+func (o *DeleteRepoSecretParams) WithTimeout(timeout time.Duration) *DeleteRepoSecretParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the delete repo secret params
+func (o *DeleteRepoSecretParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the delete repo secret params
+func (o *DeleteRepoSecretParams) WithContext(ctx context.Context) *DeleteRepoSecretParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the delete repo secret params
+func (o *DeleteRepoSecretParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the delete repo secret params
+func (o *DeleteRepoSecretParams) WithHTTPClient(client *http.Client) *DeleteRepoSecretParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the delete repo secret params
+func (o *DeleteRepoSecretParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithOwner adds the owner to the delete repo secret params
+func (o *DeleteRepoSecretParams) WithOwner(owner string) *DeleteRepoSecretParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the delete repo secret params
+func (o *DeleteRepoSecretParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the delete repo secret params
+func (o *DeleteRepoSecretParams) WithRepo(repo string) *DeleteRepoSecretParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the delete repo secret params
+func (o *DeleteRepoSecretParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WithSecretname adds the secretname to the delete repo secret params
+func (o *DeleteRepoSecretParams) WithSecretname(secretname string) *DeleteRepoSecretParams {
+	o.SetSecretname(secretname)
+	return o
+}
+
+// SetSecretname adds the secretname to the delete repo secret params
+func (o *DeleteRepoSecretParams) SetSecretname(secretname string) {
+	o.Secretname = secretname
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *DeleteRepoSecretParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	// path param secretname
+	if err := r.SetPathParam("secretname", o.Secretname); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/delete_repo_secret_responses.go b/bots-common/gitea-generated/client/repository/delete_repo_secret_responses.go
new file mode 100644
index 0000000..8aec807
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/delete_repo_secret_responses.go
@@ -0,0 +1,228 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// DeleteRepoSecretReader is a Reader for the DeleteRepoSecret structure.
+type DeleteRepoSecretReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *DeleteRepoSecretReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewDeleteRepoSecretNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 400:
+		result := NewDeleteRepoSecretBadRequest()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewDeleteRepoSecretNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[DELETE /repos/{owner}/{repo}/actions/secrets/{secretname}] deleteRepoSecret", response, response.Code())
+	}
+}
+
+// NewDeleteRepoSecretNoContent creates a DeleteRepoSecretNoContent with default headers values
+func NewDeleteRepoSecretNoContent() *DeleteRepoSecretNoContent {
+	return &DeleteRepoSecretNoContent{}
+}
+
+/*
+DeleteRepoSecretNoContent describes a response with status code 204, with default header values.
+
+delete one secret of the organization
+*/
+type DeleteRepoSecretNoContent struct {
+}
+
+// IsSuccess returns true when this delete repo secret no content response has a 2xx status code
+func (o *DeleteRepoSecretNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this delete repo secret no content response has a 3xx status code
+func (o *DeleteRepoSecretNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this delete repo secret no content response has a 4xx status code
+func (o *DeleteRepoSecretNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this delete repo secret no content response has a 5xx status code
+func (o *DeleteRepoSecretNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this delete repo secret no content response a status code equal to that given
+func (o *DeleteRepoSecretNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the delete repo secret no content response
+func (o *DeleteRepoSecretNoContent) Code() int {
+	return 204
+}
+
+func (o *DeleteRepoSecretNoContent) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/actions/secrets/{secretname}][%d] deleteRepoSecretNoContent", 204)
+}
+
+func (o *DeleteRepoSecretNoContent) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/actions/secrets/{secretname}][%d] deleteRepoSecretNoContent", 204)
+}
+
+func (o *DeleteRepoSecretNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewDeleteRepoSecretBadRequest creates a DeleteRepoSecretBadRequest with default headers values
+func NewDeleteRepoSecretBadRequest() *DeleteRepoSecretBadRequest {
+	return &DeleteRepoSecretBadRequest{}
+}
+
+/*
+DeleteRepoSecretBadRequest describes a response with status code 400, with default header values.
+
+APIError is error format response
+*/
+type DeleteRepoSecretBadRequest struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this delete repo secret bad request response has a 2xx status code
+func (o *DeleteRepoSecretBadRequest) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this delete repo secret bad request response has a 3xx status code
+func (o *DeleteRepoSecretBadRequest) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this delete repo secret bad request response has a 4xx status code
+func (o *DeleteRepoSecretBadRequest) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this delete repo secret bad request response has a 5xx status code
+func (o *DeleteRepoSecretBadRequest) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this delete repo secret bad request response a status code equal to that given
+func (o *DeleteRepoSecretBadRequest) IsCode(code int) bool {
+	return code == 400
+}
+
+// Code gets the status code for the delete repo secret bad request response
+func (o *DeleteRepoSecretBadRequest) Code() int {
+	return 400
+}
+
+func (o *DeleteRepoSecretBadRequest) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/actions/secrets/{secretname}][%d] deleteRepoSecretBadRequest", 400)
+}
+
+func (o *DeleteRepoSecretBadRequest) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/actions/secrets/{secretname}][%d] deleteRepoSecretBadRequest", 400)
+}
+
+func (o *DeleteRepoSecretBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewDeleteRepoSecretNotFound creates a DeleteRepoSecretNotFound with default headers values
+func NewDeleteRepoSecretNotFound() *DeleteRepoSecretNotFound {
+	return &DeleteRepoSecretNotFound{}
+}
+
+/*
+DeleteRepoSecretNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type DeleteRepoSecretNotFound struct {
+}
+
+// IsSuccess returns true when this delete repo secret not found response has a 2xx status code
+func (o *DeleteRepoSecretNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this delete repo secret not found response has a 3xx status code
+func (o *DeleteRepoSecretNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this delete repo secret not found response has a 4xx status code
+func (o *DeleteRepoSecretNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this delete repo secret not found response has a 5xx status code
+func (o *DeleteRepoSecretNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this delete repo secret not found response a status code equal to that given
+func (o *DeleteRepoSecretNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the delete repo secret not found response
+func (o *DeleteRepoSecretNotFound) Code() int {
+	return 404
+}
+
+func (o *DeleteRepoSecretNotFound) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/actions/secrets/{secretname}][%d] deleteRepoSecretNotFound", 404)
+}
+
+func (o *DeleteRepoSecretNotFound) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/actions/secrets/{secretname}][%d] deleteRepoSecretNotFound", 404)
+}
+
+func (o *DeleteRepoSecretNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/delete_repo_variable_parameters.go b/bots-common/gitea-generated/client/repository/delete_repo_variable_parameters.go
new file mode 100644
index 0000000..bcc8427
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/delete_repo_variable_parameters.go
@@ -0,0 +1,195 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewDeleteRepoVariableParams creates a new DeleteRepoVariableParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewDeleteRepoVariableParams() *DeleteRepoVariableParams {
+	return &DeleteRepoVariableParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewDeleteRepoVariableParamsWithTimeout creates a new DeleteRepoVariableParams object
+// with the ability to set a timeout on a request.
+func NewDeleteRepoVariableParamsWithTimeout(timeout time.Duration) *DeleteRepoVariableParams {
+	return &DeleteRepoVariableParams{
+		timeout: timeout,
+	}
+}
+
+// NewDeleteRepoVariableParamsWithContext creates a new DeleteRepoVariableParams object
+// with the ability to set a context for a request.
+func NewDeleteRepoVariableParamsWithContext(ctx context.Context) *DeleteRepoVariableParams {
+	return &DeleteRepoVariableParams{
+		Context: ctx,
+	}
+}
+
+// NewDeleteRepoVariableParamsWithHTTPClient creates a new DeleteRepoVariableParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewDeleteRepoVariableParamsWithHTTPClient(client *http.Client) *DeleteRepoVariableParams {
+	return &DeleteRepoVariableParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+DeleteRepoVariableParams contains all the parameters to send to the API endpoint
+
+	for the delete repo variable operation.
+
+	Typically these are written to a http.Request.
+*/
+type DeleteRepoVariableParams struct {
+
+	/* Owner.
+
+	   name of the owner
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repository
+	*/
+	Repo string
+
+	/* Variablename.
+
+	   name of the variable
+	*/
+	Variablename string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the delete repo variable params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *DeleteRepoVariableParams) WithDefaults() *DeleteRepoVariableParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the delete repo variable params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *DeleteRepoVariableParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the delete repo variable params
+func (o *DeleteRepoVariableParams) WithTimeout(timeout time.Duration) *DeleteRepoVariableParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the delete repo variable params
+func (o *DeleteRepoVariableParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the delete repo variable params
+func (o *DeleteRepoVariableParams) WithContext(ctx context.Context) *DeleteRepoVariableParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the delete repo variable params
+func (o *DeleteRepoVariableParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the delete repo variable params
+func (o *DeleteRepoVariableParams) WithHTTPClient(client *http.Client) *DeleteRepoVariableParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the delete repo variable params
+func (o *DeleteRepoVariableParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithOwner adds the owner to the delete repo variable params
+func (o *DeleteRepoVariableParams) WithOwner(owner string) *DeleteRepoVariableParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the delete repo variable params
+func (o *DeleteRepoVariableParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the delete repo variable params
+func (o *DeleteRepoVariableParams) WithRepo(repo string) *DeleteRepoVariableParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the delete repo variable params
+func (o *DeleteRepoVariableParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WithVariablename adds the variablename to the delete repo variable params
+func (o *DeleteRepoVariableParams) WithVariablename(variablename string) *DeleteRepoVariableParams {
+	o.SetVariablename(variablename)
+	return o
+}
+
+// SetVariablename adds the variablename to the delete repo variable params
+func (o *DeleteRepoVariableParams) SetVariablename(variablename string) {
+	o.Variablename = variablename
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *DeleteRepoVariableParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	// path param variablename
+	if err := r.SetPathParam("variablename", o.Variablename); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/delete_repo_variable_responses.go b/bots-common/gitea-generated/client/repository/delete_repo_variable_responses.go
new file mode 100644
index 0000000..22a923b
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/delete_repo_variable_responses.go
@@ -0,0 +1,370 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// DeleteRepoVariableReader is a Reader for the DeleteRepoVariable structure.
+type DeleteRepoVariableReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *DeleteRepoVariableReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewDeleteRepoVariableOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 201:
+		result := NewDeleteRepoVariableCreated()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 204:
+		result := NewDeleteRepoVariableNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 400:
+		result := NewDeleteRepoVariableBadRequest()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewDeleteRepoVariableNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[DELETE /repos/{owner}/{repo}/actions/variables/{variablename}] deleteRepoVariable", response, response.Code())
+	}
+}
+
+// NewDeleteRepoVariableOK creates a DeleteRepoVariableOK with default headers values
+func NewDeleteRepoVariableOK() *DeleteRepoVariableOK {
+	return &DeleteRepoVariableOK{}
+}
+
+/*
+DeleteRepoVariableOK describes a response with status code 200, with default header values.
+
+ActionVariable
+*/
+type DeleteRepoVariableOK struct {
+	Payload *models.ActionVariable
+}
+
+// IsSuccess returns true when this delete repo variable o k response has a 2xx status code
+func (o *DeleteRepoVariableOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this delete repo variable o k response has a 3xx status code
+func (o *DeleteRepoVariableOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this delete repo variable o k response has a 4xx status code
+func (o *DeleteRepoVariableOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this delete repo variable o k response has a 5xx status code
+func (o *DeleteRepoVariableOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this delete repo variable o k response a status code equal to that given
+func (o *DeleteRepoVariableOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the delete repo variable o k response
+func (o *DeleteRepoVariableOK) Code() int {
+	return 200
+}
+
+func (o *DeleteRepoVariableOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/actions/variables/{variablename}][%d] deleteRepoVariableOK %s", 200, payload)
+}
+
+func (o *DeleteRepoVariableOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/actions/variables/{variablename}][%d] deleteRepoVariableOK %s", 200, payload)
+}
+
+func (o *DeleteRepoVariableOK) GetPayload() *models.ActionVariable {
+	return o.Payload
+}
+
+func (o *DeleteRepoVariableOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.ActionVariable)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewDeleteRepoVariableCreated creates a DeleteRepoVariableCreated with default headers values
+func NewDeleteRepoVariableCreated() *DeleteRepoVariableCreated {
+	return &DeleteRepoVariableCreated{}
+}
+
+/*
+DeleteRepoVariableCreated describes a response with status code 201, with default header values.
+
+response when deleting a variable
+*/
+type DeleteRepoVariableCreated struct {
+}
+
+// IsSuccess returns true when this delete repo variable created response has a 2xx status code
+func (o *DeleteRepoVariableCreated) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this delete repo variable created response has a 3xx status code
+func (o *DeleteRepoVariableCreated) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this delete repo variable created response has a 4xx status code
+func (o *DeleteRepoVariableCreated) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this delete repo variable created response has a 5xx status code
+func (o *DeleteRepoVariableCreated) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this delete repo variable created response a status code equal to that given
+func (o *DeleteRepoVariableCreated) IsCode(code int) bool {
+	return code == 201
+}
+
+// Code gets the status code for the delete repo variable created response
+func (o *DeleteRepoVariableCreated) Code() int {
+	return 201
+}
+
+func (o *DeleteRepoVariableCreated) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/actions/variables/{variablename}][%d] deleteRepoVariableCreated", 201)
+}
+
+func (o *DeleteRepoVariableCreated) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/actions/variables/{variablename}][%d] deleteRepoVariableCreated", 201)
+}
+
+func (o *DeleteRepoVariableCreated) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewDeleteRepoVariableNoContent creates a DeleteRepoVariableNoContent with default headers values
+func NewDeleteRepoVariableNoContent() *DeleteRepoVariableNoContent {
+	return &DeleteRepoVariableNoContent{}
+}
+
+/*
+DeleteRepoVariableNoContent describes a response with status code 204, with default header values.
+
+response when deleting a variable
+*/
+type DeleteRepoVariableNoContent struct {
+}
+
+// IsSuccess returns true when this delete repo variable no content response has a 2xx status code
+func (o *DeleteRepoVariableNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this delete repo variable no content response has a 3xx status code
+func (o *DeleteRepoVariableNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this delete repo variable no content response has a 4xx status code
+func (o *DeleteRepoVariableNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this delete repo variable no content response has a 5xx status code
+func (o *DeleteRepoVariableNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this delete repo variable no content response a status code equal to that given
+func (o *DeleteRepoVariableNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the delete repo variable no content response
+func (o *DeleteRepoVariableNoContent) Code() int {
+	return 204
+}
+
+func (o *DeleteRepoVariableNoContent) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/actions/variables/{variablename}][%d] deleteRepoVariableNoContent", 204)
+}
+
+func (o *DeleteRepoVariableNoContent) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/actions/variables/{variablename}][%d] deleteRepoVariableNoContent", 204)
+}
+
+func (o *DeleteRepoVariableNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewDeleteRepoVariableBadRequest creates a DeleteRepoVariableBadRequest with default headers values
+func NewDeleteRepoVariableBadRequest() *DeleteRepoVariableBadRequest {
+	return &DeleteRepoVariableBadRequest{}
+}
+
+/*
+DeleteRepoVariableBadRequest describes a response with status code 400, with default header values.
+
+APIError is error format response
+*/
+type DeleteRepoVariableBadRequest struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this delete repo variable bad request response has a 2xx status code
+func (o *DeleteRepoVariableBadRequest) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this delete repo variable bad request response has a 3xx status code
+func (o *DeleteRepoVariableBadRequest) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this delete repo variable bad request response has a 4xx status code
+func (o *DeleteRepoVariableBadRequest) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this delete repo variable bad request response has a 5xx status code
+func (o *DeleteRepoVariableBadRequest) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this delete repo variable bad request response a status code equal to that given
+func (o *DeleteRepoVariableBadRequest) IsCode(code int) bool {
+	return code == 400
+}
+
+// Code gets the status code for the delete repo variable bad request response
+func (o *DeleteRepoVariableBadRequest) Code() int {
+	return 400
+}
+
+func (o *DeleteRepoVariableBadRequest) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/actions/variables/{variablename}][%d] deleteRepoVariableBadRequest", 400)
+}
+
+func (o *DeleteRepoVariableBadRequest) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/actions/variables/{variablename}][%d] deleteRepoVariableBadRequest", 400)
+}
+
+func (o *DeleteRepoVariableBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewDeleteRepoVariableNotFound creates a DeleteRepoVariableNotFound with default headers values
+func NewDeleteRepoVariableNotFound() *DeleteRepoVariableNotFound {
+	return &DeleteRepoVariableNotFound{}
+}
+
+/*
+DeleteRepoVariableNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type DeleteRepoVariableNotFound struct {
+}
+
+// IsSuccess returns true when this delete repo variable not found response has a 2xx status code
+func (o *DeleteRepoVariableNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this delete repo variable not found response has a 3xx status code
+func (o *DeleteRepoVariableNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this delete repo variable not found response has a 4xx status code
+func (o *DeleteRepoVariableNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this delete repo variable not found response has a 5xx status code
+func (o *DeleteRepoVariableNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this delete repo variable not found response a status code equal to that given
+func (o *DeleteRepoVariableNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the delete repo variable not found response
+func (o *DeleteRepoVariableNotFound) Code() int {
+	return 404
+}
+
+func (o *DeleteRepoVariableNotFound) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/actions/variables/{variablename}][%d] deleteRepoVariableNotFound", 404)
+}
+
+func (o *DeleteRepoVariableNotFound) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/actions/variables/{variablename}][%d] deleteRepoVariableNotFound", 404)
+}
+
+func (o *DeleteRepoVariableNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/generate_repo_parameters.go b/bots-common/gitea-generated/client/repository/generate_repo_parameters.go
new file mode 100644
index 0000000..a9a8fcc
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/generate_repo_parameters.go
@@ -0,0 +1,194 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewGenerateRepoParams creates a new GenerateRepoParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewGenerateRepoParams() *GenerateRepoParams {
+	return &GenerateRepoParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewGenerateRepoParamsWithTimeout creates a new GenerateRepoParams object
+// with the ability to set a timeout on a request.
+func NewGenerateRepoParamsWithTimeout(timeout time.Duration) *GenerateRepoParams {
+	return &GenerateRepoParams{
+		timeout: timeout,
+	}
+}
+
+// NewGenerateRepoParamsWithContext creates a new GenerateRepoParams object
+// with the ability to set a context for a request.
+func NewGenerateRepoParamsWithContext(ctx context.Context) *GenerateRepoParams {
+	return &GenerateRepoParams{
+		Context: ctx,
+	}
+}
+
+// NewGenerateRepoParamsWithHTTPClient creates a new GenerateRepoParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewGenerateRepoParamsWithHTTPClient(client *http.Client) *GenerateRepoParams {
+	return &GenerateRepoParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+GenerateRepoParams contains all the parameters to send to the API endpoint
+
+	for the generate repo operation.
+
+	Typically these are written to a http.Request.
+*/
+type GenerateRepoParams struct {
+
+	// Body.
+	Body *models.GenerateRepoOption
+
+	/* TemplateOwner.
+
+	   name of the template repository owner
+	*/
+	TemplateOwner string
+
+	/* TemplateRepo.
+
+	   name of the template repository
+	*/
+	TemplateRepo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the generate repo params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *GenerateRepoParams) WithDefaults() *GenerateRepoParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the generate repo params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *GenerateRepoParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the generate repo params
+func (o *GenerateRepoParams) WithTimeout(timeout time.Duration) *GenerateRepoParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the generate repo params
+func (o *GenerateRepoParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the generate repo params
+func (o *GenerateRepoParams) WithContext(ctx context.Context) *GenerateRepoParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the generate repo params
+func (o *GenerateRepoParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the generate repo params
+func (o *GenerateRepoParams) WithHTTPClient(client *http.Client) *GenerateRepoParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the generate repo params
+func (o *GenerateRepoParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the generate repo params
+func (o *GenerateRepoParams) WithBody(body *models.GenerateRepoOption) *GenerateRepoParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the generate repo params
+func (o *GenerateRepoParams) SetBody(body *models.GenerateRepoOption) {
+	o.Body = body
+}
+
+// WithTemplateOwner adds the templateOwner to the generate repo params
+func (o *GenerateRepoParams) WithTemplateOwner(templateOwner string) *GenerateRepoParams {
+	o.SetTemplateOwner(templateOwner)
+	return o
+}
+
+// SetTemplateOwner adds the templateOwner to the generate repo params
+func (o *GenerateRepoParams) SetTemplateOwner(templateOwner string) {
+	o.TemplateOwner = templateOwner
+}
+
+// WithTemplateRepo adds the templateRepo to the generate repo params
+func (o *GenerateRepoParams) WithTemplateRepo(templateRepo string) *GenerateRepoParams {
+	o.SetTemplateRepo(templateRepo)
+	return o
+}
+
+// SetTemplateRepo adds the templateRepo to the generate repo params
+func (o *GenerateRepoParams) SetTemplateRepo(templateRepo string) {
+	o.TemplateRepo = templateRepo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *GenerateRepoParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	// path param template_owner
+	if err := r.SetPathParam("template_owner", o.TemplateOwner); err != nil {
+		return err
+	}
+
+	// path param template_repo
+	if err := r.SetPathParam("template_repo", o.TemplateRepo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/generate_repo_responses.go b/bots-common/gitea-generated/client/repository/generate_repo_responses.go
new file mode 100644
index 0000000..813a661
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/generate_repo_responses.go
@@ -0,0 +1,386 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// GenerateRepoReader is a Reader for the GenerateRepo structure.
+type GenerateRepoReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *GenerateRepoReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 201:
+		result := NewGenerateRepoCreated()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 403:
+		result := NewGenerateRepoForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewGenerateRepoNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 409:
+		result := NewGenerateRepoConflict()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 422:
+		result := NewGenerateRepoUnprocessableEntity()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[POST /repos/{template_owner}/{template_repo}/generate] generateRepo", response, response.Code())
+	}
+}
+
+// NewGenerateRepoCreated creates a GenerateRepoCreated with default headers values
+func NewGenerateRepoCreated() *GenerateRepoCreated {
+	return &GenerateRepoCreated{}
+}
+
+/*
+GenerateRepoCreated describes a response with status code 201, with default header values.
+
+Repository
+*/
+type GenerateRepoCreated struct {
+	Payload *models.Repository
+}
+
+// IsSuccess returns true when this generate repo created response has a 2xx status code
+func (o *GenerateRepoCreated) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this generate repo created response has a 3xx status code
+func (o *GenerateRepoCreated) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this generate repo created response has a 4xx status code
+func (o *GenerateRepoCreated) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this generate repo created response has a 5xx status code
+func (o *GenerateRepoCreated) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this generate repo created response a status code equal to that given
+func (o *GenerateRepoCreated) IsCode(code int) bool {
+	return code == 201
+}
+
+// Code gets the status code for the generate repo created response
+func (o *GenerateRepoCreated) Code() int {
+	return 201
+}
+
+func (o *GenerateRepoCreated) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /repos/{template_owner}/{template_repo}/generate][%d] generateRepoCreated %s", 201, payload)
+}
+
+func (o *GenerateRepoCreated) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /repos/{template_owner}/{template_repo}/generate][%d] generateRepoCreated %s", 201, payload)
+}
+
+func (o *GenerateRepoCreated) GetPayload() *models.Repository {
+	return o.Payload
+}
+
+func (o *GenerateRepoCreated) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.Repository)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewGenerateRepoForbidden creates a GenerateRepoForbidden with default headers values
+func NewGenerateRepoForbidden() *GenerateRepoForbidden {
+	return &GenerateRepoForbidden{}
+}
+
+/*
+GenerateRepoForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type GenerateRepoForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this generate repo forbidden response has a 2xx status code
+func (o *GenerateRepoForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this generate repo forbidden response has a 3xx status code
+func (o *GenerateRepoForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this generate repo forbidden response has a 4xx status code
+func (o *GenerateRepoForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this generate repo forbidden response has a 5xx status code
+func (o *GenerateRepoForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this generate repo forbidden response a status code equal to that given
+func (o *GenerateRepoForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the generate repo forbidden response
+func (o *GenerateRepoForbidden) Code() int {
+	return 403
+}
+
+func (o *GenerateRepoForbidden) Error() string {
+	return fmt.Sprintf("[POST /repos/{template_owner}/{template_repo}/generate][%d] generateRepoForbidden", 403)
+}
+
+func (o *GenerateRepoForbidden) String() string {
+	return fmt.Sprintf("[POST /repos/{template_owner}/{template_repo}/generate][%d] generateRepoForbidden", 403)
+}
+
+func (o *GenerateRepoForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewGenerateRepoNotFound creates a GenerateRepoNotFound with default headers values
+func NewGenerateRepoNotFound() *GenerateRepoNotFound {
+	return &GenerateRepoNotFound{}
+}
+
+/*
+GenerateRepoNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type GenerateRepoNotFound struct {
+}
+
+// IsSuccess returns true when this generate repo not found response has a 2xx status code
+func (o *GenerateRepoNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this generate repo not found response has a 3xx status code
+func (o *GenerateRepoNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this generate repo not found response has a 4xx status code
+func (o *GenerateRepoNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this generate repo not found response has a 5xx status code
+func (o *GenerateRepoNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this generate repo not found response a status code equal to that given
+func (o *GenerateRepoNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the generate repo not found response
+func (o *GenerateRepoNotFound) Code() int {
+	return 404
+}
+
+func (o *GenerateRepoNotFound) Error() string {
+	return fmt.Sprintf("[POST /repos/{template_owner}/{template_repo}/generate][%d] generateRepoNotFound", 404)
+}
+
+func (o *GenerateRepoNotFound) String() string {
+	return fmt.Sprintf("[POST /repos/{template_owner}/{template_repo}/generate][%d] generateRepoNotFound", 404)
+}
+
+func (o *GenerateRepoNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewGenerateRepoConflict creates a GenerateRepoConflict with default headers values
+func NewGenerateRepoConflict() *GenerateRepoConflict {
+	return &GenerateRepoConflict{}
+}
+
+/*
+GenerateRepoConflict describes a response with status code 409, with default header values.
+
+The repository with the same name already exists.
+*/
+type GenerateRepoConflict struct {
+}
+
+// IsSuccess returns true when this generate repo conflict response has a 2xx status code
+func (o *GenerateRepoConflict) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this generate repo conflict response has a 3xx status code
+func (o *GenerateRepoConflict) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this generate repo conflict response has a 4xx status code
+func (o *GenerateRepoConflict) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this generate repo conflict response has a 5xx status code
+func (o *GenerateRepoConflict) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this generate repo conflict response a status code equal to that given
+func (o *GenerateRepoConflict) IsCode(code int) bool {
+	return code == 409
+}
+
+// Code gets the status code for the generate repo conflict response
+func (o *GenerateRepoConflict) Code() int {
+	return 409
+}
+
+func (o *GenerateRepoConflict) Error() string {
+	return fmt.Sprintf("[POST /repos/{template_owner}/{template_repo}/generate][%d] generateRepoConflict", 409)
+}
+
+func (o *GenerateRepoConflict) String() string {
+	return fmt.Sprintf("[POST /repos/{template_owner}/{template_repo}/generate][%d] generateRepoConflict", 409)
+}
+
+func (o *GenerateRepoConflict) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewGenerateRepoUnprocessableEntity creates a GenerateRepoUnprocessableEntity with default headers values
+func NewGenerateRepoUnprocessableEntity() *GenerateRepoUnprocessableEntity {
+	return &GenerateRepoUnprocessableEntity{}
+}
+
+/*
+GenerateRepoUnprocessableEntity describes a response with status code 422, with default header values.
+
+APIValidationError is error format response related to input validation
+*/
+type GenerateRepoUnprocessableEntity struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this generate repo unprocessable entity response has a 2xx status code
+func (o *GenerateRepoUnprocessableEntity) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this generate repo unprocessable entity response has a 3xx status code
+func (o *GenerateRepoUnprocessableEntity) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this generate repo unprocessable entity response has a 4xx status code
+func (o *GenerateRepoUnprocessableEntity) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this generate repo unprocessable entity response has a 5xx status code
+func (o *GenerateRepoUnprocessableEntity) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this generate repo unprocessable entity response a status code equal to that given
+func (o *GenerateRepoUnprocessableEntity) IsCode(code int) bool {
+	return code == 422
+}
+
+// Code gets the status code for the generate repo unprocessable entity response
+func (o *GenerateRepoUnprocessableEntity) Code() int {
+	return 422
+}
+
+func (o *GenerateRepoUnprocessableEntity) Error() string {
+	return fmt.Sprintf("[POST /repos/{template_owner}/{template_repo}/generate][%d] generateRepoUnprocessableEntity", 422)
+}
+
+func (o *GenerateRepoUnprocessableEntity) String() string {
+	return fmt.Sprintf("[POST /repos/{template_owner}/{template_repo}/generate][%d] generateRepoUnprocessableEntity", 422)
+}
+
+func (o *GenerateRepoUnprocessableEntity) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/get_annotated_tag_parameters.go b/bots-common/gitea-generated/client/repository/get_annotated_tag_parameters.go
new file mode 100644
index 0000000..cc5ea16
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/get_annotated_tag_parameters.go
@@ -0,0 +1,195 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewGetAnnotatedTagParams creates a new GetAnnotatedTagParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewGetAnnotatedTagParams() *GetAnnotatedTagParams {
+	return &GetAnnotatedTagParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewGetAnnotatedTagParamsWithTimeout creates a new GetAnnotatedTagParams object
+// with the ability to set a timeout on a request.
+func NewGetAnnotatedTagParamsWithTimeout(timeout time.Duration) *GetAnnotatedTagParams {
+	return &GetAnnotatedTagParams{
+		timeout: timeout,
+	}
+}
+
+// NewGetAnnotatedTagParamsWithContext creates a new GetAnnotatedTagParams object
+// with the ability to set a context for a request.
+func NewGetAnnotatedTagParamsWithContext(ctx context.Context) *GetAnnotatedTagParams {
+	return &GetAnnotatedTagParams{
+		Context: ctx,
+	}
+}
+
+// NewGetAnnotatedTagParamsWithHTTPClient creates a new GetAnnotatedTagParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewGetAnnotatedTagParamsWithHTTPClient(client *http.Client) *GetAnnotatedTagParams {
+	return &GetAnnotatedTagParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+GetAnnotatedTagParams contains all the parameters to send to the API endpoint
+
+	for the get annotated tag operation.
+
+	Typically these are written to a http.Request.
+*/
+type GetAnnotatedTagParams struct {
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	/* Sha.
+
+	   sha of the tag. The Git tags API only supports annotated tag objects, not lightweight tags.
+	*/
+	Sha string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the get annotated tag params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *GetAnnotatedTagParams) WithDefaults() *GetAnnotatedTagParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the get annotated tag params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *GetAnnotatedTagParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the get annotated tag params
+func (o *GetAnnotatedTagParams) WithTimeout(timeout time.Duration) *GetAnnotatedTagParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the get annotated tag params
+func (o *GetAnnotatedTagParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the get annotated tag params
+func (o *GetAnnotatedTagParams) WithContext(ctx context.Context) *GetAnnotatedTagParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the get annotated tag params
+func (o *GetAnnotatedTagParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the get annotated tag params
+func (o *GetAnnotatedTagParams) WithHTTPClient(client *http.Client) *GetAnnotatedTagParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the get annotated tag params
+func (o *GetAnnotatedTagParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithOwner adds the owner to the get annotated tag params
+func (o *GetAnnotatedTagParams) WithOwner(owner string) *GetAnnotatedTagParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the get annotated tag params
+func (o *GetAnnotatedTagParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the get annotated tag params
+func (o *GetAnnotatedTagParams) WithRepo(repo string) *GetAnnotatedTagParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the get annotated tag params
+func (o *GetAnnotatedTagParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WithSha adds the sha to the get annotated tag params
+func (o *GetAnnotatedTagParams) WithSha(sha string) *GetAnnotatedTagParams {
+	o.SetSha(sha)
+	return o
+}
+
+// SetSha adds the sha to the get annotated tag params
+func (o *GetAnnotatedTagParams) SetSha(sha string) {
+	o.Sha = sha
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *GetAnnotatedTagParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	// path param sha
+	if err := r.SetPathParam("sha", o.Sha); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/get_annotated_tag_responses.go b/bots-common/gitea-generated/client/repository/get_annotated_tag_responses.go
new file mode 100644
index 0000000..70d2465
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/get_annotated_tag_responses.go
@@ -0,0 +1,246 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// GetAnnotatedTagReader is a Reader for the GetAnnotatedTag structure.
+type GetAnnotatedTagReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *GetAnnotatedTagReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewGetAnnotatedTagOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 400:
+		result := NewGetAnnotatedTagBadRequest()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewGetAnnotatedTagNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/git/tags/{sha}] GetAnnotatedTag", response, response.Code())
+	}
+}
+
+// NewGetAnnotatedTagOK creates a GetAnnotatedTagOK with default headers values
+func NewGetAnnotatedTagOK() *GetAnnotatedTagOK {
+	return &GetAnnotatedTagOK{}
+}
+
+/*
+GetAnnotatedTagOK describes a response with status code 200, with default header values.
+
+AnnotatedTag
+*/
+type GetAnnotatedTagOK struct {
+	Payload *models.AnnotatedTag
+}
+
+// IsSuccess returns true when this get annotated tag o k response has a 2xx status code
+func (o *GetAnnotatedTagOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this get annotated tag o k response has a 3xx status code
+func (o *GetAnnotatedTagOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this get annotated tag o k response has a 4xx status code
+func (o *GetAnnotatedTagOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this get annotated tag o k response has a 5xx status code
+func (o *GetAnnotatedTagOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this get annotated tag o k response a status code equal to that given
+func (o *GetAnnotatedTagOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the get annotated tag o k response
+func (o *GetAnnotatedTagOK) Code() int {
+	return 200
+}
+
+func (o *GetAnnotatedTagOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/git/tags/{sha}][%d] getAnnotatedTagOK %s", 200, payload)
+}
+
+func (o *GetAnnotatedTagOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/git/tags/{sha}][%d] getAnnotatedTagOK %s", 200, payload)
+}
+
+func (o *GetAnnotatedTagOK) GetPayload() *models.AnnotatedTag {
+	return o.Payload
+}
+
+func (o *GetAnnotatedTagOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.AnnotatedTag)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewGetAnnotatedTagBadRequest creates a GetAnnotatedTagBadRequest with default headers values
+func NewGetAnnotatedTagBadRequest() *GetAnnotatedTagBadRequest {
+	return &GetAnnotatedTagBadRequest{}
+}
+
+/*
+GetAnnotatedTagBadRequest describes a response with status code 400, with default header values.
+
+APIError is error format response
+*/
+type GetAnnotatedTagBadRequest struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this get annotated tag bad request response has a 2xx status code
+func (o *GetAnnotatedTagBadRequest) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this get annotated tag bad request response has a 3xx status code
+func (o *GetAnnotatedTagBadRequest) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this get annotated tag bad request response has a 4xx status code
+func (o *GetAnnotatedTagBadRequest) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this get annotated tag bad request response has a 5xx status code
+func (o *GetAnnotatedTagBadRequest) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this get annotated tag bad request response a status code equal to that given
+func (o *GetAnnotatedTagBadRequest) IsCode(code int) bool {
+	return code == 400
+}
+
+// Code gets the status code for the get annotated tag bad request response
+func (o *GetAnnotatedTagBadRequest) Code() int {
+	return 400
+}
+
+func (o *GetAnnotatedTagBadRequest) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/git/tags/{sha}][%d] getAnnotatedTagBadRequest", 400)
+}
+
+func (o *GetAnnotatedTagBadRequest) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/git/tags/{sha}][%d] getAnnotatedTagBadRequest", 400)
+}
+
+func (o *GetAnnotatedTagBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewGetAnnotatedTagNotFound creates a GetAnnotatedTagNotFound with default headers values
+func NewGetAnnotatedTagNotFound() *GetAnnotatedTagNotFound {
+	return &GetAnnotatedTagNotFound{}
+}
+
+/*
+GetAnnotatedTagNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type GetAnnotatedTagNotFound struct {
+}
+
+// IsSuccess returns true when this get annotated tag not found response has a 2xx status code
+func (o *GetAnnotatedTagNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this get annotated tag not found response has a 3xx status code
+func (o *GetAnnotatedTagNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this get annotated tag not found response has a 4xx status code
+func (o *GetAnnotatedTagNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this get annotated tag not found response has a 5xx status code
+func (o *GetAnnotatedTagNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this get annotated tag not found response a status code equal to that given
+func (o *GetAnnotatedTagNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the get annotated tag not found response
+func (o *GetAnnotatedTagNotFound) Code() int {
+	return 404
+}
+
+func (o *GetAnnotatedTagNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/git/tags/{sha}][%d] getAnnotatedTagNotFound", 404)
+}
+
+func (o *GetAnnotatedTagNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/git/tags/{sha}][%d] getAnnotatedTagNotFound", 404)
+}
+
+func (o *GetAnnotatedTagNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/get_blob_parameters.go b/bots-common/gitea-generated/client/repository/get_blob_parameters.go
new file mode 100644
index 0000000..2824d3f
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/get_blob_parameters.go
@@ -0,0 +1,195 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewGetBlobParams creates a new GetBlobParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewGetBlobParams() *GetBlobParams {
+	return &GetBlobParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewGetBlobParamsWithTimeout creates a new GetBlobParams object
+// with the ability to set a timeout on a request.
+func NewGetBlobParamsWithTimeout(timeout time.Duration) *GetBlobParams {
+	return &GetBlobParams{
+		timeout: timeout,
+	}
+}
+
+// NewGetBlobParamsWithContext creates a new GetBlobParams object
+// with the ability to set a context for a request.
+func NewGetBlobParamsWithContext(ctx context.Context) *GetBlobParams {
+	return &GetBlobParams{
+		Context: ctx,
+	}
+}
+
+// NewGetBlobParamsWithHTTPClient creates a new GetBlobParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewGetBlobParamsWithHTTPClient(client *http.Client) *GetBlobParams {
+	return &GetBlobParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+GetBlobParams contains all the parameters to send to the API endpoint
+
+	for the get blob operation.
+
+	Typically these are written to a http.Request.
+*/
+type GetBlobParams struct {
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	/* Sha.
+
+	   sha of the commit
+	*/
+	Sha string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the get blob params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *GetBlobParams) WithDefaults() *GetBlobParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the get blob params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *GetBlobParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the get blob params
+func (o *GetBlobParams) WithTimeout(timeout time.Duration) *GetBlobParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the get blob params
+func (o *GetBlobParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the get blob params
+func (o *GetBlobParams) WithContext(ctx context.Context) *GetBlobParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the get blob params
+func (o *GetBlobParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the get blob params
+func (o *GetBlobParams) WithHTTPClient(client *http.Client) *GetBlobParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the get blob params
+func (o *GetBlobParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithOwner adds the owner to the get blob params
+func (o *GetBlobParams) WithOwner(owner string) *GetBlobParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the get blob params
+func (o *GetBlobParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the get blob params
+func (o *GetBlobParams) WithRepo(repo string) *GetBlobParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the get blob params
+func (o *GetBlobParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WithSha adds the sha to the get blob params
+func (o *GetBlobParams) WithSha(sha string) *GetBlobParams {
+	o.SetSha(sha)
+	return o
+}
+
+// SetSha adds the sha to the get blob params
+func (o *GetBlobParams) SetSha(sha string) {
+	o.Sha = sha
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *GetBlobParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	// path param sha
+	if err := r.SetPathParam("sha", o.Sha); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/get_blob_responses.go b/bots-common/gitea-generated/client/repository/get_blob_responses.go
new file mode 100644
index 0000000..2fc231c
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/get_blob_responses.go
@@ -0,0 +1,246 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// GetBlobReader is a Reader for the GetBlob structure.
+type GetBlobReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *GetBlobReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewGetBlobOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 400:
+		result := NewGetBlobBadRequest()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewGetBlobNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/git/blobs/{sha}] GetBlob", response, response.Code())
+	}
+}
+
+// NewGetBlobOK creates a GetBlobOK with default headers values
+func NewGetBlobOK() *GetBlobOK {
+	return &GetBlobOK{}
+}
+
+/*
+GetBlobOK describes a response with status code 200, with default header values.
+
+GitBlobResponse
+*/
+type GetBlobOK struct {
+	Payload *models.GitBlobResponse
+}
+
+// IsSuccess returns true when this get blob o k response has a 2xx status code
+func (o *GetBlobOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this get blob o k response has a 3xx status code
+func (o *GetBlobOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this get blob o k response has a 4xx status code
+func (o *GetBlobOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this get blob o k response has a 5xx status code
+func (o *GetBlobOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this get blob o k response a status code equal to that given
+func (o *GetBlobOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the get blob o k response
+func (o *GetBlobOK) Code() int {
+	return 200
+}
+
+func (o *GetBlobOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/git/blobs/{sha}][%d] getBlobOK %s", 200, payload)
+}
+
+func (o *GetBlobOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/git/blobs/{sha}][%d] getBlobOK %s", 200, payload)
+}
+
+func (o *GetBlobOK) GetPayload() *models.GitBlobResponse {
+	return o.Payload
+}
+
+func (o *GetBlobOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.GitBlobResponse)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewGetBlobBadRequest creates a GetBlobBadRequest with default headers values
+func NewGetBlobBadRequest() *GetBlobBadRequest {
+	return &GetBlobBadRequest{}
+}
+
+/*
+GetBlobBadRequest describes a response with status code 400, with default header values.
+
+APIError is error format response
+*/
+type GetBlobBadRequest struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this get blob bad request response has a 2xx status code
+func (o *GetBlobBadRequest) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this get blob bad request response has a 3xx status code
+func (o *GetBlobBadRequest) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this get blob bad request response has a 4xx status code
+func (o *GetBlobBadRequest) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this get blob bad request response has a 5xx status code
+func (o *GetBlobBadRequest) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this get blob bad request response a status code equal to that given
+func (o *GetBlobBadRequest) IsCode(code int) bool {
+	return code == 400
+}
+
+// Code gets the status code for the get blob bad request response
+func (o *GetBlobBadRequest) Code() int {
+	return 400
+}
+
+func (o *GetBlobBadRequest) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/git/blobs/{sha}][%d] getBlobBadRequest", 400)
+}
+
+func (o *GetBlobBadRequest) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/git/blobs/{sha}][%d] getBlobBadRequest", 400)
+}
+
+func (o *GetBlobBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewGetBlobNotFound creates a GetBlobNotFound with default headers values
+func NewGetBlobNotFound() *GetBlobNotFound {
+	return &GetBlobNotFound{}
+}
+
+/*
+GetBlobNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type GetBlobNotFound struct {
+}
+
+// IsSuccess returns true when this get blob not found response has a 2xx status code
+func (o *GetBlobNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this get blob not found response has a 3xx status code
+func (o *GetBlobNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this get blob not found response has a 4xx status code
+func (o *GetBlobNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this get blob not found response has a 5xx status code
+func (o *GetBlobNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this get blob not found response a status code equal to that given
+func (o *GetBlobNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the get blob not found response
+func (o *GetBlobNotFound) Code() int {
+	return 404
+}
+
+func (o *GetBlobNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/git/blobs/{sha}][%d] getBlobNotFound", 404)
+}
+
+func (o *GetBlobNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/git/blobs/{sha}][%d] getBlobNotFound", 404)
+}
+
+func (o *GetBlobNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/get_repo_variable_parameters.go b/bots-common/gitea-generated/client/repository/get_repo_variable_parameters.go
new file mode 100644
index 0000000..66df811
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/get_repo_variable_parameters.go
@@ -0,0 +1,195 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewGetRepoVariableParams creates a new GetRepoVariableParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewGetRepoVariableParams() *GetRepoVariableParams {
+	return &GetRepoVariableParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewGetRepoVariableParamsWithTimeout creates a new GetRepoVariableParams object
+// with the ability to set a timeout on a request.
+func NewGetRepoVariableParamsWithTimeout(timeout time.Duration) *GetRepoVariableParams {
+	return &GetRepoVariableParams{
+		timeout: timeout,
+	}
+}
+
+// NewGetRepoVariableParamsWithContext creates a new GetRepoVariableParams object
+// with the ability to set a context for a request.
+func NewGetRepoVariableParamsWithContext(ctx context.Context) *GetRepoVariableParams {
+	return &GetRepoVariableParams{
+		Context: ctx,
+	}
+}
+
+// NewGetRepoVariableParamsWithHTTPClient creates a new GetRepoVariableParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewGetRepoVariableParamsWithHTTPClient(client *http.Client) *GetRepoVariableParams {
+	return &GetRepoVariableParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+GetRepoVariableParams contains all the parameters to send to the API endpoint
+
+	for the get repo variable operation.
+
+	Typically these are written to a http.Request.
+*/
+type GetRepoVariableParams struct {
+
+	/* Owner.
+
+	   name of the owner
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repository
+	*/
+	Repo string
+
+	/* Variablename.
+
+	   name of the variable
+	*/
+	Variablename string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the get repo variable params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *GetRepoVariableParams) WithDefaults() *GetRepoVariableParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the get repo variable params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *GetRepoVariableParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the get repo variable params
+func (o *GetRepoVariableParams) WithTimeout(timeout time.Duration) *GetRepoVariableParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the get repo variable params
+func (o *GetRepoVariableParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the get repo variable params
+func (o *GetRepoVariableParams) WithContext(ctx context.Context) *GetRepoVariableParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the get repo variable params
+func (o *GetRepoVariableParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the get repo variable params
+func (o *GetRepoVariableParams) WithHTTPClient(client *http.Client) *GetRepoVariableParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the get repo variable params
+func (o *GetRepoVariableParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithOwner adds the owner to the get repo variable params
+func (o *GetRepoVariableParams) WithOwner(owner string) *GetRepoVariableParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the get repo variable params
+func (o *GetRepoVariableParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the get repo variable params
+func (o *GetRepoVariableParams) WithRepo(repo string) *GetRepoVariableParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the get repo variable params
+func (o *GetRepoVariableParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WithVariablename adds the variablename to the get repo variable params
+func (o *GetRepoVariableParams) WithVariablename(variablename string) *GetRepoVariableParams {
+	o.SetVariablename(variablename)
+	return o
+}
+
+// SetVariablename adds the variablename to the get repo variable params
+func (o *GetRepoVariableParams) SetVariablename(variablename string) {
+	o.Variablename = variablename
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *GetRepoVariableParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	// path param variablename
+	if err := r.SetPathParam("variablename", o.Variablename); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/get_repo_variable_responses.go b/bots-common/gitea-generated/client/repository/get_repo_variable_responses.go
new file mode 100644
index 0000000..3883ee9
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/get_repo_variable_responses.go
@@ -0,0 +1,246 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// GetRepoVariableReader is a Reader for the GetRepoVariable structure.
+type GetRepoVariableReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *GetRepoVariableReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewGetRepoVariableOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 400:
+		result := NewGetRepoVariableBadRequest()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewGetRepoVariableNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/actions/variables/{variablename}] getRepoVariable", response, response.Code())
+	}
+}
+
+// NewGetRepoVariableOK creates a GetRepoVariableOK with default headers values
+func NewGetRepoVariableOK() *GetRepoVariableOK {
+	return &GetRepoVariableOK{}
+}
+
+/*
+GetRepoVariableOK describes a response with status code 200, with default header values.
+
+ActionVariable
+*/
+type GetRepoVariableOK struct {
+	Payload *models.ActionVariable
+}
+
+// IsSuccess returns true when this get repo variable o k response has a 2xx status code
+func (o *GetRepoVariableOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this get repo variable o k response has a 3xx status code
+func (o *GetRepoVariableOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this get repo variable o k response has a 4xx status code
+func (o *GetRepoVariableOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this get repo variable o k response has a 5xx status code
+func (o *GetRepoVariableOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this get repo variable o k response a status code equal to that given
+func (o *GetRepoVariableOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the get repo variable o k response
+func (o *GetRepoVariableOK) Code() int {
+	return 200
+}
+
+func (o *GetRepoVariableOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/actions/variables/{variablename}][%d] getRepoVariableOK %s", 200, payload)
+}
+
+func (o *GetRepoVariableOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/actions/variables/{variablename}][%d] getRepoVariableOK %s", 200, payload)
+}
+
+func (o *GetRepoVariableOK) GetPayload() *models.ActionVariable {
+	return o.Payload
+}
+
+func (o *GetRepoVariableOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.ActionVariable)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewGetRepoVariableBadRequest creates a GetRepoVariableBadRequest with default headers values
+func NewGetRepoVariableBadRequest() *GetRepoVariableBadRequest {
+	return &GetRepoVariableBadRequest{}
+}
+
+/*
+GetRepoVariableBadRequest describes a response with status code 400, with default header values.
+
+APIError is error format response
+*/
+type GetRepoVariableBadRequest struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this get repo variable bad request response has a 2xx status code
+func (o *GetRepoVariableBadRequest) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this get repo variable bad request response has a 3xx status code
+func (o *GetRepoVariableBadRequest) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this get repo variable bad request response has a 4xx status code
+func (o *GetRepoVariableBadRequest) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this get repo variable bad request response has a 5xx status code
+func (o *GetRepoVariableBadRequest) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this get repo variable bad request response a status code equal to that given
+func (o *GetRepoVariableBadRequest) IsCode(code int) bool {
+	return code == 400
+}
+
+// Code gets the status code for the get repo variable bad request response
+func (o *GetRepoVariableBadRequest) Code() int {
+	return 400
+}
+
+func (o *GetRepoVariableBadRequest) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/actions/variables/{variablename}][%d] getRepoVariableBadRequest", 400)
+}
+
+func (o *GetRepoVariableBadRequest) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/actions/variables/{variablename}][%d] getRepoVariableBadRequest", 400)
+}
+
+func (o *GetRepoVariableBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewGetRepoVariableNotFound creates a GetRepoVariableNotFound with default headers values
+func NewGetRepoVariableNotFound() *GetRepoVariableNotFound {
+	return &GetRepoVariableNotFound{}
+}
+
+/*
+GetRepoVariableNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type GetRepoVariableNotFound struct {
+}
+
+// IsSuccess returns true when this get repo variable not found response has a 2xx status code
+func (o *GetRepoVariableNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this get repo variable not found response has a 3xx status code
+func (o *GetRepoVariableNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this get repo variable not found response has a 4xx status code
+func (o *GetRepoVariableNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this get repo variable not found response has a 5xx status code
+func (o *GetRepoVariableNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this get repo variable not found response a status code equal to that given
+func (o *GetRepoVariableNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the get repo variable not found response
+func (o *GetRepoVariableNotFound) Code() int {
+	return 404
+}
+
+func (o *GetRepoVariableNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/actions/variables/{variablename}][%d] getRepoVariableNotFound", 404)
+}
+
+func (o *GetRepoVariableNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/actions/variables/{variablename}][%d] getRepoVariableNotFound", 404)
+}
+
+func (o *GetRepoVariableNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/get_repo_variables_list_parameters.go b/bots-common/gitea-generated/client/repository/get_repo_variables_list_parameters.go
new file mode 100644
index 0000000..b88e368
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/get_repo_variables_list_parameters.go
@@ -0,0 +1,242 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewGetRepoVariablesListParams creates a new GetRepoVariablesListParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewGetRepoVariablesListParams() *GetRepoVariablesListParams {
+	return &GetRepoVariablesListParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewGetRepoVariablesListParamsWithTimeout creates a new GetRepoVariablesListParams object
+// with the ability to set a timeout on a request.
+func NewGetRepoVariablesListParamsWithTimeout(timeout time.Duration) *GetRepoVariablesListParams {
+	return &GetRepoVariablesListParams{
+		timeout: timeout,
+	}
+}
+
+// NewGetRepoVariablesListParamsWithContext creates a new GetRepoVariablesListParams object
+// with the ability to set a context for a request.
+func NewGetRepoVariablesListParamsWithContext(ctx context.Context) *GetRepoVariablesListParams {
+	return &GetRepoVariablesListParams{
+		Context: ctx,
+	}
+}
+
+// NewGetRepoVariablesListParamsWithHTTPClient creates a new GetRepoVariablesListParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewGetRepoVariablesListParamsWithHTTPClient(client *http.Client) *GetRepoVariablesListParams {
+	return &GetRepoVariablesListParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+GetRepoVariablesListParams contains all the parameters to send to the API endpoint
+
+	for the get repo variables list operation.
+
+	Typically these are written to a http.Request.
+*/
+type GetRepoVariablesListParams struct {
+
+	/* Limit.
+
+	   page size of results
+	*/
+	Limit *int64
+
+	/* Owner.
+
+	   name of the owner
+	*/
+	Owner string
+
+	/* Page.
+
+	   page number of results to return (1-based)
+	*/
+	Page *int64
+
+	/* Repo.
+
+	   name of the repository
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the get repo variables list params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *GetRepoVariablesListParams) WithDefaults() *GetRepoVariablesListParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the get repo variables list params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *GetRepoVariablesListParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the get repo variables list params
+func (o *GetRepoVariablesListParams) WithTimeout(timeout time.Duration) *GetRepoVariablesListParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the get repo variables list params
+func (o *GetRepoVariablesListParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the get repo variables list params
+func (o *GetRepoVariablesListParams) WithContext(ctx context.Context) *GetRepoVariablesListParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the get repo variables list params
+func (o *GetRepoVariablesListParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the get repo variables list params
+func (o *GetRepoVariablesListParams) WithHTTPClient(client *http.Client) *GetRepoVariablesListParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the get repo variables list params
+func (o *GetRepoVariablesListParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithLimit adds the limit to the get repo variables list params
+func (o *GetRepoVariablesListParams) WithLimit(limit *int64) *GetRepoVariablesListParams {
+	o.SetLimit(limit)
+	return o
+}
+
+// SetLimit adds the limit to the get repo variables list params
+func (o *GetRepoVariablesListParams) SetLimit(limit *int64) {
+	o.Limit = limit
+}
+
+// WithOwner adds the owner to the get repo variables list params
+func (o *GetRepoVariablesListParams) WithOwner(owner string) *GetRepoVariablesListParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the get repo variables list params
+func (o *GetRepoVariablesListParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithPage adds the page to the get repo variables list params
+func (o *GetRepoVariablesListParams) WithPage(page *int64) *GetRepoVariablesListParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the get repo variables list params
+func (o *GetRepoVariablesListParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WithRepo adds the repo to the get repo variables list params
+func (o *GetRepoVariablesListParams) WithRepo(repo string) *GetRepoVariablesListParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the get repo variables list params
+func (o *GetRepoVariablesListParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *GetRepoVariablesListParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.Limit != nil {
+
+		// query param limit
+		var qrLimit int64
+
+		if o.Limit != nil {
+			qrLimit = *o.Limit
+		}
+		qLimit := swag.FormatInt64(qrLimit)
+		if qLimit != "" {
+
+			if err := r.SetQueryParam("limit", qLimit); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/get_repo_variables_list_responses.go b/bots-common/gitea-generated/client/repository/get_repo_variables_list_responses.go
new file mode 100644
index 0000000..34ece37
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/get_repo_variables_list_responses.go
@@ -0,0 +1,244 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// GetRepoVariablesListReader is a Reader for the GetRepoVariablesList structure.
+type GetRepoVariablesListReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *GetRepoVariablesListReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewGetRepoVariablesListOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 400:
+		result := NewGetRepoVariablesListBadRequest()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewGetRepoVariablesListNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/actions/variables] getRepoVariablesList", response, response.Code())
+	}
+}
+
+// NewGetRepoVariablesListOK creates a GetRepoVariablesListOK with default headers values
+func NewGetRepoVariablesListOK() *GetRepoVariablesListOK {
+	return &GetRepoVariablesListOK{}
+}
+
+/*
+GetRepoVariablesListOK describes a response with status code 200, with default header values.
+
+VariableList
+*/
+type GetRepoVariablesListOK struct {
+	Payload []*models.ActionVariable
+}
+
+// IsSuccess returns true when this get repo variables list o k response has a 2xx status code
+func (o *GetRepoVariablesListOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this get repo variables list o k response has a 3xx status code
+func (o *GetRepoVariablesListOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this get repo variables list o k response has a 4xx status code
+func (o *GetRepoVariablesListOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this get repo variables list o k response has a 5xx status code
+func (o *GetRepoVariablesListOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this get repo variables list o k response a status code equal to that given
+func (o *GetRepoVariablesListOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the get repo variables list o k response
+func (o *GetRepoVariablesListOK) Code() int {
+	return 200
+}
+
+func (o *GetRepoVariablesListOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/actions/variables][%d] getRepoVariablesListOK %s", 200, payload)
+}
+
+func (o *GetRepoVariablesListOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/actions/variables][%d] getRepoVariablesListOK %s", 200, payload)
+}
+
+func (o *GetRepoVariablesListOK) GetPayload() []*models.ActionVariable {
+	return o.Payload
+}
+
+func (o *GetRepoVariablesListOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewGetRepoVariablesListBadRequest creates a GetRepoVariablesListBadRequest with default headers values
+func NewGetRepoVariablesListBadRequest() *GetRepoVariablesListBadRequest {
+	return &GetRepoVariablesListBadRequest{}
+}
+
+/*
+GetRepoVariablesListBadRequest describes a response with status code 400, with default header values.
+
+APIError is error format response
+*/
+type GetRepoVariablesListBadRequest struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this get repo variables list bad request response has a 2xx status code
+func (o *GetRepoVariablesListBadRequest) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this get repo variables list bad request response has a 3xx status code
+func (o *GetRepoVariablesListBadRequest) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this get repo variables list bad request response has a 4xx status code
+func (o *GetRepoVariablesListBadRequest) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this get repo variables list bad request response has a 5xx status code
+func (o *GetRepoVariablesListBadRequest) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this get repo variables list bad request response a status code equal to that given
+func (o *GetRepoVariablesListBadRequest) IsCode(code int) bool {
+	return code == 400
+}
+
+// Code gets the status code for the get repo variables list bad request response
+func (o *GetRepoVariablesListBadRequest) Code() int {
+	return 400
+}
+
+func (o *GetRepoVariablesListBadRequest) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/actions/variables][%d] getRepoVariablesListBadRequest", 400)
+}
+
+func (o *GetRepoVariablesListBadRequest) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/actions/variables][%d] getRepoVariablesListBadRequest", 400)
+}
+
+func (o *GetRepoVariablesListBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewGetRepoVariablesListNotFound creates a GetRepoVariablesListNotFound with default headers values
+func NewGetRepoVariablesListNotFound() *GetRepoVariablesListNotFound {
+	return &GetRepoVariablesListNotFound{}
+}
+
+/*
+GetRepoVariablesListNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type GetRepoVariablesListNotFound struct {
+}
+
+// IsSuccess returns true when this get repo variables list not found response has a 2xx status code
+func (o *GetRepoVariablesListNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this get repo variables list not found response has a 3xx status code
+func (o *GetRepoVariablesListNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this get repo variables list not found response has a 4xx status code
+func (o *GetRepoVariablesListNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this get repo variables list not found response has a 5xx status code
+func (o *GetRepoVariablesListNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this get repo variables list not found response a status code equal to that given
+func (o *GetRepoVariablesListNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the get repo variables list not found response
+func (o *GetRepoVariablesListNotFound) Code() int {
+	return 404
+}
+
+func (o *GetRepoVariablesListNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/actions/variables][%d] getRepoVariablesListNotFound", 404)
+}
+
+func (o *GetRepoVariablesListNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/actions/variables][%d] getRepoVariablesListNotFound", 404)
+}
+
+func (o *GetRepoVariablesListNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/get_tree_parameters.go b/bots-common/gitea-generated/client/repository/get_tree_parameters.go
new file mode 100644
index 0000000..e4fc225
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/get_tree_parameters.go
@@ -0,0 +1,298 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewGetTreeParams creates a new GetTreeParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewGetTreeParams() *GetTreeParams {
+	return &GetTreeParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewGetTreeParamsWithTimeout creates a new GetTreeParams object
+// with the ability to set a timeout on a request.
+func NewGetTreeParamsWithTimeout(timeout time.Duration) *GetTreeParams {
+	return &GetTreeParams{
+		timeout: timeout,
+	}
+}
+
+// NewGetTreeParamsWithContext creates a new GetTreeParams object
+// with the ability to set a context for a request.
+func NewGetTreeParamsWithContext(ctx context.Context) *GetTreeParams {
+	return &GetTreeParams{
+		Context: ctx,
+	}
+}
+
+// NewGetTreeParamsWithHTTPClient creates a new GetTreeParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewGetTreeParamsWithHTTPClient(client *http.Client) *GetTreeParams {
+	return &GetTreeParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+GetTreeParams contains all the parameters to send to the API endpoint
+
+	for the get tree operation.
+
+	Typically these are written to a http.Request.
+*/
+type GetTreeParams struct {
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Page.
+
+	   page number; the 'truncated' field in the response will be true if there are still more items after this page, false if the last page
+	*/
+	Page *int64
+
+	/* PerPage.
+
+	   number of items per page
+	*/
+	PerPage *int64
+
+	/* Recursive.
+
+	   show all directories and files
+	*/
+	Recursive *bool
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	/* Sha.
+
+	   sha of the commit
+	*/
+	Sha string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the get tree params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *GetTreeParams) WithDefaults() *GetTreeParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the get tree params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *GetTreeParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the get tree params
+func (o *GetTreeParams) WithTimeout(timeout time.Duration) *GetTreeParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the get tree params
+func (o *GetTreeParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the get tree params
+func (o *GetTreeParams) WithContext(ctx context.Context) *GetTreeParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the get tree params
+func (o *GetTreeParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the get tree params
+func (o *GetTreeParams) WithHTTPClient(client *http.Client) *GetTreeParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the get tree params
+func (o *GetTreeParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithOwner adds the owner to the get tree params
+func (o *GetTreeParams) WithOwner(owner string) *GetTreeParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the get tree params
+func (o *GetTreeParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithPage adds the page to the get tree params
+func (o *GetTreeParams) WithPage(page *int64) *GetTreeParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the get tree params
+func (o *GetTreeParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WithPerPage adds the perPage to the get tree params
+func (o *GetTreeParams) WithPerPage(perPage *int64) *GetTreeParams {
+	o.SetPerPage(perPage)
+	return o
+}
+
+// SetPerPage adds the perPage to the get tree params
+func (o *GetTreeParams) SetPerPage(perPage *int64) {
+	o.PerPage = perPage
+}
+
+// WithRecursive adds the recursive to the get tree params
+func (o *GetTreeParams) WithRecursive(recursive *bool) *GetTreeParams {
+	o.SetRecursive(recursive)
+	return o
+}
+
+// SetRecursive adds the recursive to the get tree params
+func (o *GetTreeParams) SetRecursive(recursive *bool) {
+	o.Recursive = recursive
+}
+
+// WithRepo adds the repo to the get tree params
+func (o *GetTreeParams) WithRepo(repo string) *GetTreeParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the get tree params
+func (o *GetTreeParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WithSha adds the sha to the get tree params
+func (o *GetTreeParams) WithSha(sha string) *GetTreeParams {
+	o.SetSha(sha)
+	return o
+}
+
+// SetSha adds the sha to the get tree params
+func (o *GetTreeParams) SetSha(sha string) {
+	o.Sha = sha
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *GetTreeParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.PerPage != nil {
+
+		// query param per_page
+		var qrPerPage int64
+
+		if o.PerPage != nil {
+			qrPerPage = *o.PerPage
+		}
+		qPerPage := swag.FormatInt64(qrPerPage)
+		if qPerPage != "" {
+
+			if err := r.SetQueryParam("per_page", qPerPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Recursive != nil {
+
+		// query param recursive
+		var qrRecursive bool
+
+		if o.Recursive != nil {
+			qrRecursive = *o.Recursive
+		}
+		qRecursive := swag.FormatBool(qrRecursive)
+		if qRecursive != "" {
+
+			if err := r.SetQueryParam("recursive", qRecursive); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	// path param sha
+	if err := r.SetPathParam("sha", o.Sha); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/get_tree_responses.go b/bots-common/gitea-generated/client/repository/get_tree_responses.go
new file mode 100644
index 0000000..a53cff2
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/get_tree_responses.go
@@ -0,0 +1,246 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// GetTreeReader is a Reader for the GetTree structure.
+type GetTreeReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *GetTreeReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewGetTreeOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 400:
+		result := NewGetTreeBadRequest()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewGetTreeNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/git/trees/{sha}] GetTree", response, response.Code())
+	}
+}
+
+// NewGetTreeOK creates a GetTreeOK with default headers values
+func NewGetTreeOK() *GetTreeOK {
+	return &GetTreeOK{}
+}
+
+/*
+GetTreeOK describes a response with status code 200, with default header values.
+
+GitTreeResponse
+*/
+type GetTreeOK struct {
+	Payload *models.GitTreeResponse
+}
+
+// IsSuccess returns true when this get tree o k response has a 2xx status code
+func (o *GetTreeOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this get tree o k response has a 3xx status code
+func (o *GetTreeOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this get tree o k response has a 4xx status code
+func (o *GetTreeOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this get tree o k response has a 5xx status code
+func (o *GetTreeOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this get tree o k response a status code equal to that given
+func (o *GetTreeOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the get tree o k response
+func (o *GetTreeOK) Code() int {
+	return 200
+}
+
+func (o *GetTreeOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/git/trees/{sha}][%d] getTreeOK %s", 200, payload)
+}
+
+func (o *GetTreeOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/git/trees/{sha}][%d] getTreeOK %s", 200, payload)
+}
+
+func (o *GetTreeOK) GetPayload() *models.GitTreeResponse {
+	return o.Payload
+}
+
+func (o *GetTreeOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.GitTreeResponse)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewGetTreeBadRequest creates a GetTreeBadRequest with default headers values
+func NewGetTreeBadRequest() *GetTreeBadRequest {
+	return &GetTreeBadRequest{}
+}
+
+/*
+GetTreeBadRequest describes a response with status code 400, with default header values.
+
+APIError is error format response
+*/
+type GetTreeBadRequest struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this get tree bad request response has a 2xx status code
+func (o *GetTreeBadRequest) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this get tree bad request response has a 3xx status code
+func (o *GetTreeBadRequest) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this get tree bad request response has a 4xx status code
+func (o *GetTreeBadRequest) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this get tree bad request response has a 5xx status code
+func (o *GetTreeBadRequest) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this get tree bad request response a status code equal to that given
+func (o *GetTreeBadRequest) IsCode(code int) bool {
+	return code == 400
+}
+
+// Code gets the status code for the get tree bad request response
+func (o *GetTreeBadRequest) Code() int {
+	return 400
+}
+
+func (o *GetTreeBadRequest) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/git/trees/{sha}][%d] getTreeBadRequest", 400)
+}
+
+func (o *GetTreeBadRequest) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/git/trees/{sha}][%d] getTreeBadRequest", 400)
+}
+
+func (o *GetTreeBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewGetTreeNotFound creates a GetTreeNotFound with default headers values
+func NewGetTreeNotFound() *GetTreeNotFound {
+	return &GetTreeNotFound{}
+}
+
+/*
+GetTreeNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type GetTreeNotFound struct {
+}
+
+// IsSuccess returns true when this get tree not found response has a 2xx status code
+func (o *GetTreeNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this get tree not found response has a 3xx status code
+func (o *GetTreeNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this get tree not found response has a 4xx status code
+func (o *GetTreeNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this get tree not found response has a 5xx status code
+func (o *GetTreeNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this get tree not found response a status code equal to that given
+func (o *GetTreeNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the get tree not found response
+func (o *GetTreeNotFound) Code() int {
+	return 404
+}
+
+func (o *GetTreeNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/git/trees/{sha}][%d] getTreeNotFound", 404)
+}
+
+func (o *GetTreeNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/git/trees/{sha}][%d] getTreeNotFound", 404)
+}
+
+func (o *GetTreeNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/list_forks_parameters.go b/bots-common/gitea-generated/client/repository/list_forks_parameters.go
new file mode 100644
index 0000000..3d9a953
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/list_forks_parameters.go
@@ -0,0 +1,242 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewListForksParams creates a new ListForksParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewListForksParams() *ListForksParams {
+	return &ListForksParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewListForksParamsWithTimeout creates a new ListForksParams object
+// with the ability to set a timeout on a request.
+func NewListForksParamsWithTimeout(timeout time.Duration) *ListForksParams {
+	return &ListForksParams{
+		timeout: timeout,
+	}
+}
+
+// NewListForksParamsWithContext creates a new ListForksParams object
+// with the ability to set a context for a request.
+func NewListForksParamsWithContext(ctx context.Context) *ListForksParams {
+	return &ListForksParams{
+		Context: ctx,
+	}
+}
+
+// NewListForksParamsWithHTTPClient creates a new ListForksParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewListForksParamsWithHTTPClient(client *http.Client) *ListForksParams {
+	return &ListForksParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+ListForksParams contains all the parameters to send to the API endpoint
+
+	for the list forks operation.
+
+	Typically these are written to a http.Request.
+*/
+type ListForksParams struct {
+
+	/* Limit.
+
+	   page size of results
+	*/
+	Limit *int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Page.
+
+	   page number of results to return (1-based)
+	*/
+	Page *int64
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the list forks params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *ListForksParams) WithDefaults() *ListForksParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the list forks params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *ListForksParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the list forks params
+func (o *ListForksParams) WithTimeout(timeout time.Duration) *ListForksParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the list forks params
+func (o *ListForksParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the list forks params
+func (o *ListForksParams) WithContext(ctx context.Context) *ListForksParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the list forks params
+func (o *ListForksParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the list forks params
+func (o *ListForksParams) WithHTTPClient(client *http.Client) *ListForksParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the list forks params
+func (o *ListForksParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithLimit adds the limit to the list forks params
+func (o *ListForksParams) WithLimit(limit *int64) *ListForksParams {
+	o.SetLimit(limit)
+	return o
+}
+
+// SetLimit adds the limit to the list forks params
+func (o *ListForksParams) SetLimit(limit *int64) {
+	o.Limit = limit
+}
+
+// WithOwner adds the owner to the list forks params
+func (o *ListForksParams) WithOwner(owner string) *ListForksParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the list forks params
+func (o *ListForksParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithPage adds the page to the list forks params
+func (o *ListForksParams) WithPage(page *int64) *ListForksParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the list forks params
+func (o *ListForksParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WithRepo adds the repo to the list forks params
+func (o *ListForksParams) WithRepo(repo string) *ListForksParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the list forks params
+func (o *ListForksParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *ListForksParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.Limit != nil {
+
+		// query param limit
+		var qrLimit int64
+
+		if o.Limit != nil {
+			qrLimit = *o.Limit
+		}
+		qLimit := swag.FormatInt64(qrLimit)
+		if qLimit != "" {
+
+			if err := r.SetQueryParam("limit", qLimit); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/list_forks_responses.go b/bots-common/gitea-generated/client/repository/list_forks_responses.go
new file mode 100644
index 0000000..6e11eed
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/list_forks_responses.go
@@ -0,0 +1,166 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// ListForksReader is a Reader for the ListForks structure.
+type ListForksReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *ListForksReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewListForksOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewListForksNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/forks] listForks", response, response.Code())
+	}
+}
+
+// NewListForksOK creates a ListForksOK with default headers values
+func NewListForksOK() *ListForksOK {
+	return &ListForksOK{}
+}
+
+/*
+ListForksOK describes a response with status code 200, with default header values.
+
+RepositoryList
+*/
+type ListForksOK struct {
+	Payload []*models.Repository
+}
+
+// IsSuccess returns true when this list forks o k response has a 2xx status code
+func (o *ListForksOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this list forks o k response has a 3xx status code
+func (o *ListForksOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this list forks o k response has a 4xx status code
+func (o *ListForksOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this list forks o k response has a 5xx status code
+func (o *ListForksOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this list forks o k response a status code equal to that given
+func (o *ListForksOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the list forks o k response
+func (o *ListForksOK) Code() int {
+	return 200
+}
+
+func (o *ListForksOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/forks][%d] listForksOK %s", 200, payload)
+}
+
+func (o *ListForksOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/forks][%d] listForksOK %s", 200, payload)
+}
+
+func (o *ListForksOK) GetPayload() []*models.Repository {
+	return o.Payload
+}
+
+func (o *ListForksOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewListForksNotFound creates a ListForksNotFound with default headers values
+func NewListForksNotFound() *ListForksNotFound {
+	return &ListForksNotFound{}
+}
+
+/*
+ListForksNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type ListForksNotFound struct {
+}
+
+// IsSuccess returns true when this list forks not found response has a 2xx status code
+func (o *ListForksNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this list forks not found response has a 3xx status code
+func (o *ListForksNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this list forks not found response has a 4xx status code
+func (o *ListForksNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this list forks not found response has a 5xx status code
+func (o *ListForksNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this list forks not found response a status code equal to that given
+func (o *ListForksNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the list forks not found response
+func (o *ListForksNotFound) Code() int {
+	return 404
+}
+
+func (o *ListForksNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/forks][%d] listForksNotFound", 404)
+}
+
+func (o *ListForksNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/forks][%d] listForksNotFound", 404)
+}
+
+func (o *ListForksNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/reject_repo_transfer_parameters.go b/bots-common/gitea-generated/client/repository/reject_repo_transfer_parameters.go
new file mode 100644
index 0000000..259c437
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/reject_repo_transfer_parameters.go
@@ -0,0 +1,173 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewRejectRepoTransferParams creates a new RejectRepoTransferParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRejectRepoTransferParams() *RejectRepoTransferParams {
+	return &RejectRepoTransferParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRejectRepoTransferParamsWithTimeout creates a new RejectRepoTransferParams object
+// with the ability to set a timeout on a request.
+func NewRejectRepoTransferParamsWithTimeout(timeout time.Duration) *RejectRepoTransferParams {
+	return &RejectRepoTransferParams{
+		timeout: timeout,
+	}
+}
+
+// NewRejectRepoTransferParamsWithContext creates a new RejectRepoTransferParams object
+// with the ability to set a context for a request.
+func NewRejectRepoTransferParamsWithContext(ctx context.Context) *RejectRepoTransferParams {
+	return &RejectRepoTransferParams{
+		Context: ctx,
+	}
+}
+
+// NewRejectRepoTransferParamsWithHTTPClient creates a new RejectRepoTransferParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRejectRepoTransferParamsWithHTTPClient(client *http.Client) *RejectRepoTransferParams {
+	return &RejectRepoTransferParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RejectRepoTransferParams contains all the parameters to send to the API endpoint
+
+	for the reject repo transfer operation.
+
+	Typically these are written to a http.Request.
+*/
+type RejectRepoTransferParams struct {
+
+	/* Owner.
+
+	   owner of the repo to transfer
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo to transfer
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the reject repo transfer params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RejectRepoTransferParams) WithDefaults() *RejectRepoTransferParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the reject repo transfer params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RejectRepoTransferParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the reject repo transfer params
+func (o *RejectRepoTransferParams) WithTimeout(timeout time.Duration) *RejectRepoTransferParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the reject repo transfer params
+func (o *RejectRepoTransferParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the reject repo transfer params
+func (o *RejectRepoTransferParams) WithContext(ctx context.Context) *RejectRepoTransferParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the reject repo transfer params
+func (o *RejectRepoTransferParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the reject repo transfer params
+func (o *RejectRepoTransferParams) WithHTTPClient(client *http.Client) *RejectRepoTransferParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the reject repo transfer params
+func (o *RejectRepoTransferParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithOwner adds the owner to the reject repo transfer params
+func (o *RejectRepoTransferParams) WithOwner(owner string) *RejectRepoTransferParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the reject repo transfer params
+func (o *RejectRepoTransferParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the reject repo transfer params
+func (o *RejectRepoTransferParams) WithRepo(repo string) *RejectRepoTransferParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the reject repo transfer params
+func (o *RejectRepoTransferParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RejectRepoTransferParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/reject_repo_transfer_responses.go b/bots-common/gitea-generated/client/repository/reject_repo_transfer_responses.go
new file mode 100644
index 0000000..d84be14
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/reject_repo_transfer_responses.go
@@ -0,0 +1,246 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RejectRepoTransferReader is a Reader for the RejectRepoTransfer structure.
+type RejectRepoTransferReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RejectRepoTransferReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRejectRepoTransferOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 403:
+		result := NewRejectRepoTransferForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewRejectRepoTransferNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[POST /repos/{owner}/{repo}/transfer/reject] rejectRepoTransfer", response, response.Code())
+	}
+}
+
+// NewRejectRepoTransferOK creates a RejectRepoTransferOK with default headers values
+func NewRejectRepoTransferOK() *RejectRepoTransferOK {
+	return &RejectRepoTransferOK{}
+}
+
+/*
+RejectRepoTransferOK describes a response with status code 200, with default header values.
+
+Repository
+*/
+type RejectRepoTransferOK struct {
+	Payload *models.Repository
+}
+
+// IsSuccess returns true when this reject repo transfer o k response has a 2xx status code
+func (o *RejectRepoTransferOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this reject repo transfer o k response has a 3xx status code
+func (o *RejectRepoTransferOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this reject repo transfer o k response has a 4xx status code
+func (o *RejectRepoTransferOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this reject repo transfer o k response has a 5xx status code
+func (o *RejectRepoTransferOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this reject repo transfer o k response a status code equal to that given
+func (o *RejectRepoTransferOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the reject repo transfer o k response
+func (o *RejectRepoTransferOK) Code() int {
+	return 200
+}
+
+func (o *RejectRepoTransferOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/transfer/reject][%d] rejectRepoTransferOK %s", 200, payload)
+}
+
+func (o *RejectRepoTransferOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/transfer/reject][%d] rejectRepoTransferOK %s", 200, payload)
+}
+
+func (o *RejectRepoTransferOK) GetPayload() *models.Repository {
+	return o.Payload
+}
+
+func (o *RejectRepoTransferOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.Repository)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRejectRepoTransferForbidden creates a RejectRepoTransferForbidden with default headers values
+func NewRejectRepoTransferForbidden() *RejectRepoTransferForbidden {
+	return &RejectRepoTransferForbidden{}
+}
+
+/*
+RejectRepoTransferForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type RejectRepoTransferForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this reject repo transfer forbidden response has a 2xx status code
+func (o *RejectRepoTransferForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this reject repo transfer forbidden response has a 3xx status code
+func (o *RejectRepoTransferForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this reject repo transfer forbidden response has a 4xx status code
+func (o *RejectRepoTransferForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this reject repo transfer forbidden response has a 5xx status code
+func (o *RejectRepoTransferForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this reject repo transfer forbidden response a status code equal to that given
+func (o *RejectRepoTransferForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the reject repo transfer forbidden response
+func (o *RejectRepoTransferForbidden) Code() int {
+	return 403
+}
+
+func (o *RejectRepoTransferForbidden) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/transfer/reject][%d] rejectRepoTransferForbidden", 403)
+}
+
+func (o *RejectRepoTransferForbidden) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/transfer/reject][%d] rejectRepoTransferForbidden", 403)
+}
+
+func (o *RejectRepoTransferForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewRejectRepoTransferNotFound creates a RejectRepoTransferNotFound with default headers values
+func NewRejectRepoTransferNotFound() *RejectRepoTransferNotFound {
+	return &RejectRepoTransferNotFound{}
+}
+
+/*
+RejectRepoTransferNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RejectRepoTransferNotFound struct {
+}
+
+// IsSuccess returns true when this reject repo transfer not found response has a 2xx status code
+func (o *RejectRepoTransferNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this reject repo transfer not found response has a 3xx status code
+func (o *RejectRepoTransferNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this reject repo transfer not found response has a 4xx status code
+func (o *RejectRepoTransferNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this reject repo transfer not found response has a 5xx status code
+func (o *RejectRepoTransferNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this reject repo transfer not found response a status code equal to that given
+func (o *RejectRepoTransferNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the reject repo transfer not found response
+func (o *RejectRepoTransferNotFound) Code() int {
+	return 404
+}
+
+func (o *RejectRepoTransferNotFound) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/transfer/reject][%d] rejectRepoTransferNotFound", 404)
+}
+
+func (o *RejectRepoTransferNotFound) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/transfer/reject][%d] rejectRepoTransferNotFound", 404)
+}
+
+func (o *RejectRepoTransferNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_add_collaborator_parameters.go b/bots-common/gitea-generated/client/repository/repo_add_collaborator_parameters.go
new file mode 100644
index 0000000..a43fcb9
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_add_collaborator_parameters.go
@@ -0,0 +1,216 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewRepoAddCollaboratorParams creates a new RepoAddCollaboratorParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoAddCollaboratorParams() *RepoAddCollaboratorParams {
+	return &RepoAddCollaboratorParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoAddCollaboratorParamsWithTimeout creates a new RepoAddCollaboratorParams object
+// with the ability to set a timeout on a request.
+func NewRepoAddCollaboratorParamsWithTimeout(timeout time.Duration) *RepoAddCollaboratorParams {
+	return &RepoAddCollaboratorParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoAddCollaboratorParamsWithContext creates a new RepoAddCollaboratorParams object
+// with the ability to set a context for a request.
+func NewRepoAddCollaboratorParamsWithContext(ctx context.Context) *RepoAddCollaboratorParams {
+	return &RepoAddCollaboratorParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoAddCollaboratorParamsWithHTTPClient creates a new RepoAddCollaboratorParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoAddCollaboratorParamsWithHTTPClient(client *http.Client) *RepoAddCollaboratorParams {
+	return &RepoAddCollaboratorParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoAddCollaboratorParams contains all the parameters to send to the API endpoint
+
+	for the repo add collaborator operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoAddCollaboratorParams struct {
+
+	// Body.
+	Body *models.AddCollaboratorOption
+
+	/* Collaborator.
+
+	   username of the collaborator to add
+	*/
+	Collaborator string
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo add collaborator params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoAddCollaboratorParams) WithDefaults() *RepoAddCollaboratorParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo add collaborator params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoAddCollaboratorParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo add collaborator params
+func (o *RepoAddCollaboratorParams) WithTimeout(timeout time.Duration) *RepoAddCollaboratorParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo add collaborator params
+func (o *RepoAddCollaboratorParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo add collaborator params
+func (o *RepoAddCollaboratorParams) WithContext(ctx context.Context) *RepoAddCollaboratorParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo add collaborator params
+func (o *RepoAddCollaboratorParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo add collaborator params
+func (o *RepoAddCollaboratorParams) WithHTTPClient(client *http.Client) *RepoAddCollaboratorParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo add collaborator params
+func (o *RepoAddCollaboratorParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the repo add collaborator params
+func (o *RepoAddCollaboratorParams) WithBody(body *models.AddCollaboratorOption) *RepoAddCollaboratorParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the repo add collaborator params
+func (o *RepoAddCollaboratorParams) SetBody(body *models.AddCollaboratorOption) {
+	o.Body = body
+}
+
+// WithCollaborator adds the collaborator to the repo add collaborator params
+func (o *RepoAddCollaboratorParams) WithCollaborator(collaborator string) *RepoAddCollaboratorParams {
+	o.SetCollaborator(collaborator)
+	return o
+}
+
+// SetCollaborator adds the collaborator to the repo add collaborator params
+func (o *RepoAddCollaboratorParams) SetCollaborator(collaborator string) {
+	o.Collaborator = collaborator
+}
+
+// WithOwner adds the owner to the repo add collaborator params
+func (o *RepoAddCollaboratorParams) WithOwner(owner string) *RepoAddCollaboratorParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo add collaborator params
+func (o *RepoAddCollaboratorParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo add collaborator params
+func (o *RepoAddCollaboratorParams) WithRepo(repo string) *RepoAddCollaboratorParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo add collaborator params
+func (o *RepoAddCollaboratorParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoAddCollaboratorParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	// path param collaborator
+	if err := r.SetPathParam("collaborator", o.Collaborator); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_add_collaborator_responses.go b/bots-common/gitea-generated/client/repository/repo_add_collaborator_responses.go
new file mode 100644
index 0000000..8ed51d2
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_add_collaborator_responses.go
@@ -0,0 +1,306 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// RepoAddCollaboratorReader is a Reader for the RepoAddCollaborator structure.
+type RepoAddCollaboratorReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoAddCollaboratorReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewRepoAddCollaboratorNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 403:
+		result := NewRepoAddCollaboratorForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewRepoAddCollaboratorNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 422:
+		result := NewRepoAddCollaboratorUnprocessableEntity()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[PUT /repos/{owner}/{repo}/collaborators/{collaborator}] repoAddCollaborator", response, response.Code())
+	}
+}
+
+// NewRepoAddCollaboratorNoContent creates a RepoAddCollaboratorNoContent with default headers values
+func NewRepoAddCollaboratorNoContent() *RepoAddCollaboratorNoContent {
+	return &RepoAddCollaboratorNoContent{}
+}
+
+/*
+RepoAddCollaboratorNoContent describes a response with status code 204, with default header values.
+
+APIEmpty is an empty response
+*/
+type RepoAddCollaboratorNoContent struct {
+}
+
+// IsSuccess returns true when this repo add collaborator no content response has a 2xx status code
+func (o *RepoAddCollaboratorNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo add collaborator no content response has a 3xx status code
+func (o *RepoAddCollaboratorNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo add collaborator no content response has a 4xx status code
+func (o *RepoAddCollaboratorNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo add collaborator no content response has a 5xx status code
+func (o *RepoAddCollaboratorNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo add collaborator no content response a status code equal to that given
+func (o *RepoAddCollaboratorNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the repo add collaborator no content response
+func (o *RepoAddCollaboratorNoContent) Code() int {
+	return 204
+}
+
+func (o *RepoAddCollaboratorNoContent) Error() string {
+	return fmt.Sprintf("[PUT /repos/{owner}/{repo}/collaborators/{collaborator}][%d] repoAddCollaboratorNoContent", 204)
+}
+
+func (o *RepoAddCollaboratorNoContent) String() string {
+	return fmt.Sprintf("[PUT /repos/{owner}/{repo}/collaborators/{collaborator}][%d] repoAddCollaboratorNoContent", 204)
+}
+
+func (o *RepoAddCollaboratorNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewRepoAddCollaboratorForbidden creates a RepoAddCollaboratorForbidden with default headers values
+func NewRepoAddCollaboratorForbidden() *RepoAddCollaboratorForbidden {
+	return &RepoAddCollaboratorForbidden{}
+}
+
+/*
+RepoAddCollaboratorForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type RepoAddCollaboratorForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo add collaborator forbidden response has a 2xx status code
+func (o *RepoAddCollaboratorForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo add collaborator forbidden response has a 3xx status code
+func (o *RepoAddCollaboratorForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo add collaborator forbidden response has a 4xx status code
+func (o *RepoAddCollaboratorForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo add collaborator forbidden response has a 5xx status code
+func (o *RepoAddCollaboratorForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo add collaborator forbidden response a status code equal to that given
+func (o *RepoAddCollaboratorForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the repo add collaborator forbidden response
+func (o *RepoAddCollaboratorForbidden) Code() int {
+	return 403
+}
+
+func (o *RepoAddCollaboratorForbidden) Error() string {
+	return fmt.Sprintf("[PUT /repos/{owner}/{repo}/collaborators/{collaborator}][%d] repoAddCollaboratorForbidden", 403)
+}
+
+func (o *RepoAddCollaboratorForbidden) String() string {
+	return fmt.Sprintf("[PUT /repos/{owner}/{repo}/collaborators/{collaborator}][%d] repoAddCollaboratorForbidden", 403)
+}
+
+func (o *RepoAddCollaboratorForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewRepoAddCollaboratorNotFound creates a RepoAddCollaboratorNotFound with default headers values
+func NewRepoAddCollaboratorNotFound() *RepoAddCollaboratorNotFound {
+	return &RepoAddCollaboratorNotFound{}
+}
+
+/*
+RepoAddCollaboratorNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoAddCollaboratorNotFound struct {
+}
+
+// IsSuccess returns true when this repo add collaborator not found response has a 2xx status code
+func (o *RepoAddCollaboratorNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo add collaborator not found response has a 3xx status code
+func (o *RepoAddCollaboratorNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo add collaborator not found response has a 4xx status code
+func (o *RepoAddCollaboratorNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo add collaborator not found response has a 5xx status code
+func (o *RepoAddCollaboratorNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo add collaborator not found response a status code equal to that given
+func (o *RepoAddCollaboratorNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo add collaborator not found response
+func (o *RepoAddCollaboratorNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoAddCollaboratorNotFound) Error() string {
+	return fmt.Sprintf("[PUT /repos/{owner}/{repo}/collaborators/{collaborator}][%d] repoAddCollaboratorNotFound", 404)
+}
+
+func (o *RepoAddCollaboratorNotFound) String() string {
+	return fmt.Sprintf("[PUT /repos/{owner}/{repo}/collaborators/{collaborator}][%d] repoAddCollaboratorNotFound", 404)
+}
+
+func (o *RepoAddCollaboratorNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewRepoAddCollaboratorUnprocessableEntity creates a RepoAddCollaboratorUnprocessableEntity with default headers values
+func NewRepoAddCollaboratorUnprocessableEntity() *RepoAddCollaboratorUnprocessableEntity {
+	return &RepoAddCollaboratorUnprocessableEntity{}
+}
+
+/*
+RepoAddCollaboratorUnprocessableEntity describes a response with status code 422, with default header values.
+
+APIValidationError is error format response related to input validation
+*/
+type RepoAddCollaboratorUnprocessableEntity struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo add collaborator unprocessable entity response has a 2xx status code
+func (o *RepoAddCollaboratorUnprocessableEntity) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo add collaborator unprocessable entity response has a 3xx status code
+func (o *RepoAddCollaboratorUnprocessableEntity) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo add collaborator unprocessable entity response has a 4xx status code
+func (o *RepoAddCollaboratorUnprocessableEntity) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo add collaborator unprocessable entity response has a 5xx status code
+func (o *RepoAddCollaboratorUnprocessableEntity) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo add collaborator unprocessable entity response a status code equal to that given
+func (o *RepoAddCollaboratorUnprocessableEntity) IsCode(code int) bool {
+	return code == 422
+}
+
+// Code gets the status code for the repo add collaborator unprocessable entity response
+func (o *RepoAddCollaboratorUnprocessableEntity) Code() int {
+	return 422
+}
+
+func (o *RepoAddCollaboratorUnprocessableEntity) Error() string {
+	return fmt.Sprintf("[PUT /repos/{owner}/{repo}/collaborators/{collaborator}][%d] repoAddCollaboratorUnprocessableEntity", 422)
+}
+
+func (o *RepoAddCollaboratorUnprocessableEntity) String() string {
+	return fmt.Sprintf("[PUT /repos/{owner}/{repo}/collaborators/{collaborator}][%d] repoAddCollaboratorUnprocessableEntity", 422)
+}
+
+func (o *RepoAddCollaboratorUnprocessableEntity) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_add_push_mirror_parameters.go b/bots-common/gitea-generated/client/repository/repo_add_push_mirror_parameters.go
new file mode 100644
index 0000000..f7abcff
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_add_push_mirror_parameters.go
@@ -0,0 +1,194 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewRepoAddPushMirrorParams creates a new RepoAddPushMirrorParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoAddPushMirrorParams() *RepoAddPushMirrorParams {
+	return &RepoAddPushMirrorParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoAddPushMirrorParamsWithTimeout creates a new RepoAddPushMirrorParams object
+// with the ability to set a timeout on a request.
+func NewRepoAddPushMirrorParamsWithTimeout(timeout time.Duration) *RepoAddPushMirrorParams {
+	return &RepoAddPushMirrorParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoAddPushMirrorParamsWithContext creates a new RepoAddPushMirrorParams object
+// with the ability to set a context for a request.
+func NewRepoAddPushMirrorParamsWithContext(ctx context.Context) *RepoAddPushMirrorParams {
+	return &RepoAddPushMirrorParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoAddPushMirrorParamsWithHTTPClient creates a new RepoAddPushMirrorParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoAddPushMirrorParamsWithHTTPClient(client *http.Client) *RepoAddPushMirrorParams {
+	return &RepoAddPushMirrorParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoAddPushMirrorParams contains all the parameters to send to the API endpoint
+
+	for the repo add push mirror operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoAddPushMirrorParams struct {
+
+	// Body.
+	Body *models.CreatePushMirrorOption
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo add push mirror params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoAddPushMirrorParams) WithDefaults() *RepoAddPushMirrorParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo add push mirror params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoAddPushMirrorParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo add push mirror params
+func (o *RepoAddPushMirrorParams) WithTimeout(timeout time.Duration) *RepoAddPushMirrorParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo add push mirror params
+func (o *RepoAddPushMirrorParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo add push mirror params
+func (o *RepoAddPushMirrorParams) WithContext(ctx context.Context) *RepoAddPushMirrorParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo add push mirror params
+func (o *RepoAddPushMirrorParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo add push mirror params
+func (o *RepoAddPushMirrorParams) WithHTTPClient(client *http.Client) *RepoAddPushMirrorParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo add push mirror params
+func (o *RepoAddPushMirrorParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the repo add push mirror params
+func (o *RepoAddPushMirrorParams) WithBody(body *models.CreatePushMirrorOption) *RepoAddPushMirrorParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the repo add push mirror params
+func (o *RepoAddPushMirrorParams) SetBody(body *models.CreatePushMirrorOption) {
+	o.Body = body
+}
+
+// WithOwner adds the owner to the repo add push mirror params
+func (o *RepoAddPushMirrorParams) WithOwner(owner string) *RepoAddPushMirrorParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo add push mirror params
+func (o *RepoAddPushMirrorParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo add push mirror params
+func (o *RepoAddPushMirrorParams) WithRepo(repo string) *RepoAddPushMirrorParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo add push mirror params
+func (o *RepoAddPushMirrorParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoAddPushMirrorParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_add_push_mirror_responses.go b/bots-common/gitea-generated/client/repository/repo_add_push_mirror_responses.go
new file mode 100644
index 0000000..c621bde
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_add_push_mirror_responses.go
@@ -0,0 +1,324 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoAddPushMirrorReader is a Reader for the RepoAddPushMirror structure.
+type RepoAddPushMirrorReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoAddPushMirrorReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoAddPushMirrorOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 400:
+		result := NewRepoAddPushMirrorBadRequest()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 403:
+		result := NewRepoAddPushMirrorForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewRepoAddPushMirrorNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[POST /repos/{owner}/{repo}/push_mirrors] repoAddPushMirror", response, response.Code())
+	}
+}
+
+// NewRepoAddPushMirrorOK creates a RepoAddPushMirrorOK with default headers values
+func NewRepoAddPushMirrorOK() *RepoAddPushMirrorOK {
+	return &RepoAddPushMirrorOK{}
+}
+
+/*
+RepoAddPushMirrorOK describes a response with status code 200, with default header values.
+
+PushMirror
+*/
+type RepoAddPushMirrorOK struct {
+	Payload *models.PushMirror
+}
+
+// IsSuccess returns true when this repo add push mirror o k response has a 2xx status code
+func (o *RepoAddPushMirrorOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo add push mirror o k response has a 3xx status code
+func (o *RepoAddPushMirrorOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo add push mirror o k response has a 4xx status code
+func (o *RepoAddPushMirrorOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo add push mirror o k response has a 5xx status code
+func (o *RepoAddPushMirrorOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo add push mirror o k response a status code equal to that given
+func (o *RepoAddPushMirrorOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo add push mirror o k response
+func (o *RepoAddPushMirrorOK) Code() int {
+	return 200
+}
+
+func (o *RepoAddPushMirrorOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/push_mirrors][%d] repoAddPushMirrorOK %s", 200, payload)
+}
+
+func (o *RepoAddPushMirrorOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/push_mirrors][%d] repoAddPushMirrorOK %s", 200, payload)
+}
+
+func (o *RepoAddPushMirrorOK) GetPayload() *models.PushMirror {
+	return o.Payload
+}
+
+func (o *RepoAddPushMirrorOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.PushMirror)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoAddPushMirrorBadRequest creates a RepoAddPushMirrorBadRequest with default headers values
+func NewRepoAddPushMirrorBadRequest() *RepoAddPushMirrorBadRequest {
+	return &RepoAddPushMirrorBadRequest{}
+}
+
+/*
+RepoAddPushMirrorBadRequest describes a response with status code 400, with default header values.
+
+APIError is error format response
+*/
+type RepoAddPushMirrorBadRequest struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo add push mirror bad request response has a 2xx status code
+func (o *RepoAddPushMirrorBadRequest) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo add push mirror bad request response has a 3xx status code
+func (o *RepoAddPushMirrorBadRequest) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo add push mirror bad request response has a 4xx status code
+func (o *RepoAddPushMirrorBadRequest) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo add push mirror bad request response has a 5xx status code
+func (o *RepoAddPushMirrorBadRequest) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo add push mirror bad request response a status code equal to that given
+func (o *RepoAddPushMirrorBadRequest) IsCode(code int) bool {
+	return code == 400
+}
+
+// Code gets the status code for the repo add push mirror bad request response
+func (o *RepoAddPushMirrorBadRequest) Code() int {
+	return 400
+}
+
+func (o *RepoAddPushMirrorBadRequest) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/push_mirrors][%d] repoAddPushMirrorBadRequest", 400)
+}
+
+func (o *RepoAddPushMirrorBadRequest) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/push_mirrors][%d] repoAddPushMirrorBadRequest", 400)
+}
+
+func (o *RepoAddPushMirrorBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewRepoAddPushMirrorForbidden creates a RepoAddPushMirrorForbidden with default headers values
+func NewRepoAddPushMirrorForbidden() *RepoAddPushMirrorForbidden {
+	return &RepoAddPushMirrorForbidden{}
+}
+
+/*
+RepoAddPushMirrorForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type RepoAddPushMirrorForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo add push mirror forbidden response has a 2xx status code
+func (o *RepoAddPushMirrorForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo add push mirror forbidden response has a 3xx status code
+func (o *RepoAddPushMirrorForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo add push mirror forbidden response has a 4xx status code
+func (o *RepoAddPushMirrorForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo add push mirror forbidden response has a 5xx status code
+func (o *RepoAddPushMirrorForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo add push mirror forbidden response a status code equal to that given
+func (o *RepoAddPushMirrorForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the repo add push mirror forbidden response
+func (o *RepoAddPushMirrorForbidden) Code() int {
+	return 403
+}
+
+func (o *RepoAddPushMirrorForbidden) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/push_mirrors][%d] repoAddPushMirrorForbidden", 403)
+}
+
+func (o *RepoAddPushMirrorForbidden) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/push_mirrors][%d] repoAddPushMirrorForbidden", 403)
+}
+
+func (o *RepoAddPushMirrorForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewRepoAddPushMirrorNotFound creates a RepoAddPushMirrorNotFound with default headers values
+func NewRepoAddPushMirrorNotFound() *RepoAddPushMirrorNotFound {
+	return &RepoAddPushMirrorNotFound{}
+}
+
+/*
+RepoAddPushMirrorNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoAddPushMirrorNotFound struct {
+}
+
+// IsSuccess returns true when this repo add push mirror not found response has a 2xx status code
+func (o *RepoAddPushMirrorNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo add push mirror not found response has a 3xx status code
+func (o *RepoAddPushMirrorNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo add push mirror not found response has a 4xx status code
+func (o *RepoAddPushMirrorNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo add push mirror not found response has a 5xx status code
+func (o *RepoAddPushMirrorNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo add push mirror not found response a status code equal to that given
+func (o *RepoAddPushMirrorNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo add push mirror not found response
+func (o *RepoAddPushMirrorNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoAddPushMirrorNotFound) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/push_mirrors][%d] repoAddPushMirrorNotFound", 404)
+}
+
+func (o *RepoAddPushMirrorNotFound) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/push_mirrors][%d] repoAddPushMirrorNotFound", 404)
+}
+
+func (o *RepoAddPushMirrorNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_add_team_parameters.go b/bots-common/gitea-generated/client/repository/repo_add_team_parameters.go
new file mode 100644
index 0000000..4885c0e
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_add_team_parameters.go
@@ -0,0 +1,195 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewRepoAddTeamParams creates a new RepoAddTeamParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoAddTeamParams() *RepoAddTeamParams {
+	return &RepoAddTeamParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoAddTeamParamsWithTimeout creates a new RepoAddTeamParams object
+// with the ability to set a timeout on a request.
+func NewRepoAddTeamParamsWithTimeout(timeout time.Duration) *RepoAddTeamParams {
+	return &RepoAddTeamParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoAddTeamParamsWithContext creates a new RepoAddTeamParams object
+// with the ability to set a context for a request.
+func NewRepoAddTeamParamsWithContext(ctx context.Context) *RepoAddTeamParams {
+	return &RepoAddTeamParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoAddTeamParamsWithHTTPClient creates a new RepoAddTeamParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoAddTeamParamsWithHTTPClient(client *http.Client) *RepoAddTeamParams {
+	return &RepoAddTeamParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoAddTeamParams contains all the parameters to send to the API endpoint
+
+	for the repo add team operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoAddTeamParams struct {
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	/* Team.
+
+	   team name
+	*/
+	Team string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo add team params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoAddTeamParams) WithDefaults() *RepoAddTeamParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo add team params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoAddTeamParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo add team params
+func (o *RepoAddTeamParams) WithTimeout(timeout time.Duration) *RepoAddTeamParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo add team params
+func (o *RepoAddTeamParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo add team params
+func (o *RepoAddTeamParams) WithContext(ctx context.Context) *RepoAddTeamParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo add team params
+func (o *RepoAddTeamParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo add team params
+func (o *RepoAddTeamParams) WithHTTPClient(client *http.Client) *RepoAddTeamParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo add team params
+func (o *RepoAddTeamParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithOwner adds the owner to the repo add team params
+func (o *RepoAddTeamParams) WithOwner(owner string) *RepoAddTeamParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo add team params
+func (o *RepoAddTeamParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo add team params
+func (o *RepoAddTeamParams) WithRepo(repo string) *RepoAddTeamParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo add team params
+func (o *RepoAddTeamParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WithTeam adds the team to the repo add team params
+func (o *RepoAddTeamParams) WithTeam(team string) *RepoAddTeamParams {
+	o.SetTeam(team)
+	return o
+}
+
+// SetTeam adds the team to the repo add team params
+func (o *RepoAddTeamParams) SetTeam(team string) {
+	o.Team = team
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoAddTeamParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	// path param team
+	if err := r.SetPathParam("team", o.Team); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_add_team_responses.go b/bots-common/gitea-generated/client/repository/repo_add_team_responses.go
new file mode 100644
index 0000000..c0921d0
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_add_team_responses.go
@@ -0,0 +1,306 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// RepoAddTeamReader is a Reader for the RepoAddTeam structure.
+type RepoAddTeamReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoAddTeamReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewRepoAddTeamNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoAddTeamNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 405:
+		result := NewRepoAddTeamMethodNotAllowed()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 422:
+		result := NewRepoAddTeamUnprocessableEntity()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[PUT /repos/{owner}/{repo}/teams/{team}] repoAddTeam", response, response.Code())
+	}
+}
+
+// NewRepoAddTeamNoContent creates a RepoAddTeamNoContent with default headers values
+func NewRepoAddTeamNoContent() *RepoAddTeamNoContent {
+	return &RepoAddTeamNoContent{}
+}
+
+/*
+RepoAddTeamNoContent describes a response with status code 204, with default header values.
+
+APIEmpty is an empty response
+*/
+type RepoAddTeamNoContent struct {
+}
+
+// IsSuccess returns true when this repo add team no content response has a 2xx status code
+func (o *RepoAddTeamNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo add team no content response has a 3xx status code
+func (o *RepoAddTeamNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo add team no content response has a 4xx status code
+func (o *RepoAddTeamNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo add team no content response has a 5xx status code
+func (o *RepoAddTeamNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo add team no content response a status code equal to that given
+func (o *RepoAddTeamNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the repo add team no content response
+func (o *RepoAddTeamNoContent) Code() int {
+	return 204
+}
+
+func (o *RepoAddTeamNoContent) Error() string {
+	return fmt.Sprintf("[PUT /repos/{owner}/{repo}/teams/{team}][%d] repoAddTeamNoContent", 204)
+}
+
+func (o *RepoAddTeamNoContent) String() string {
+	return fmt.Sprintf("[PUT /repos/{owner}/{repo}/teams/{team}][%d] repoAddTeamNoContent", 204)
+}
+
+func (o *RepoAddTeamNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewRepoAddTeamNotFound creates a RepoAddTeamNotFound with default headers values
+func NewRepoAddTeamNotFound() *RepoAddTeamNotFound {
+	return &RepoAddTeamNotFound{}
+}
+
+/*
+RepoAddTeamNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoAddTeamNotFound struct {
+}
+
+// IsSuccess returns true when this repo add team not found response has a 2xx status code
+func (o *RepoAddTeamNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo add team not found response has a 3xx status code
+func (o *RepoAddTeamNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo add team not found response has a 4xx status code
+func (o *RepoAddTeamNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo add team not found response has a 5xx status code
+func (o *RepoAddTeamNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo add team not found response a status code equal to that given
+func (o *RepoAddTeamNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo add team not found response
+func (o *RepoAddTeamNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoAddTeamNotFound) Error() string {
+	return fmt.Sprintf("[PUT /repos/{owner}/{repo}/teams/{team}][%d] repoAddTeamNotFound", 404)
+}
+
+func (o *RepoAddTeamNotFound) String() string {
+	return fmt.Sprintf("[PUT /repos/{owner}/{repo}/teams/{team}][%d] repoAddTeamNotFound", 404)
+}
+
+func (o *RepoAddTeamNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewRepoAddTeamMethodNotAllowed creates a RepoAddTeamMethodNotAllowed with default headers values
+func NewRepoAddTeamMethodNotAllowed() *RepoAddTeamMethodNotAllowed {
+	return &RepoAddTeamMethodNotAllowed{}
+}
+
+/*
+RepoAddTeamMethodNotAllowed describes a response with status code 405, with default header values.
+
+APIError is error format response
+*/
+type RepoAddTeamMethodNotAllowed struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo add team method not allowed response has a 2xx status code
+func (o *RepoAddTeamMethodNotAllowed) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo add team method not allowed response has a 3xx status code
+func (o *RepoAddTeamMethodNotAllowed) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo add team method not allowed response has a 4xx status code
+func (o *RepoAddTeamMethodNotAllowed) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo add team method not allowed response has a 5xx status code
+func (o *RepoAddTeamMethodNotAllowed) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo add team method not allowed response a status code equal to that given
+func (o *RepoAddTeamMethodNotAllowed) IsCode(code int) bool {
+	return code == 405
+}
+
+// Code gets the status code for the repo add team method not allowed response
+func (o *RepoAddTeamMethodNotAllowed) Code() int {
+	return 405
+}
+
+func (o *RepoAddTeamMethodNotAllowed) Error() string {
+	return fmt.Sprintf("[PUT /repos/{owner}/{repo}/teams/{team}][%d] repoAddTeamMethodNotAllowed", 405)
+}
+
+func (o *RepoAddTeamMethodNotAllowed) String() string {
+	return fmt.Sprintf("[PUT /repos/{owner}/{repo}/teams/{team}][%d] repoAddTeamMethodNotAllowed", 405)
+}
+
+func (o *RepoAddTeamMethodNotAllowed) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewRepoAddTeamUnprocessableEntity creates a RepoAddTeamUnprocessableEntity with default headers values
+func NewRepoAddTeamUnprocessableEntity() *RepoAddTeamUnprocessableEntity {
+	return &RepoAddTeamUnprocessableEntity{}
+}
+
+/*
+RepoAddTeamUnprocessableEntity describes a response with status code 422, with default header values.
+
+APIValidationError is error format response related to input validation
+*/
+type RepoAddTeamUnprocessableEntity struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo add team unprocessable entity response has a 2xx status code
+func (o *RepoAddTeamUnprocessableEntity) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo add team unprocessable entity response has a 3xx status code
+func (o *RepoAddTeamUnprocessableEntity) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo add team unprocessable entity response has a 4xx status code
+func (o *RepoAddTeamUnprocessableEntity) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo add team unprocessable entity response has a 5xx status code
+func (o *RepoAddTeamUnprocessableEntity) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo add team unprocessable entity response a status code equal to that given
+func (o *RepoAddTeamUnprocessableEntity) IsCode(code int) bool {
+	return code == 422
+}
+
+// Code gets the status code for the repo add team unprocessable entity response
+func (o *RepoAddTeamUnprocessableEntity) Code() int {
+	return 422
+}
+
+func (o *RepoAddTeamUnprocessableEntity) Error() string {
+	return fmt.Sprintf("[PUT /repos/{owner}/{repo}/teams/{team}][%d] repoAddTeamUnprocessableEntity", 422)
+}
+
+func (o *RepoAddTeamUnprocessableEntity) String() string {
+	return fmt.Sprintf("[PUT /repos/{owner}/{repo}/teams/{team}][%d] repoAddTeamUnprocessableEntity", 422)
+}
+
+func (o *RepoAddTeamUnprocessableEntity) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_add_topic_parameters.go b/bots-common/gitea-generated/client/repository/repo_add_topic_parameters.go
new file mode 100644
index 0000000..2210f71
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_add_topic_parameters.go
@@ -0,0 +1,195 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewRepoAddTopicParams creates a new RepoAddTopicParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoAddTopicParams() *RepoAddTopicParams {
+	return &RepoAddTopicParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoAddTopicParamsWithTimeout creates a new RepoAddTopicParams object
+// with the ability to set a timeout on a request.
+func NewRepoAddTopicParamsWithTimeout(timeout time.Duration) *RepoAddTopicParams {
+	return &RepoAddTopicParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoAddTopicParamsWithContext creates a new RepoAddTopicParams object
+// with the ability to set a context for a request.
+func NewRepoAddTopicParamsWithContext(ctx context.Context) *RepoAddTopicParams {
+	return &RepoAddTopicParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoAddTopicParamsWithHTTPClient creates a new RepoAddTopicParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoAddTopicParamsWithHTTPClient(client *http.Client) *RepoAddTopicParams {
+	return &RepoAddTopicParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoAddTopicParams contains all the parameters to send to the API endpoint
+
+	for the repo add topic operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoAddTopicParams struct {
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	/* Topic.
+
+	   name of the topic to add
+	*/
+	Topic string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo add topic params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoAddTopicParams) WithDefaults() *RepoAddTopicParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo add topic params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoAddTopicParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo add topic params
+func (o *RepoAddTopicParams) WithTimeout(timeout time.Duration) *RepoAddTopicParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo add topic params
+func (o *RepoAddTopicParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo add topic params
+func (o *RepoAddTopicParams) WithContext(ctx context.Context) *RepoAddTopicParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo add topic params
+func (o *RepoAddTopicParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo add topic params
+func (o *RepoAddTopicParams) WithHTTPClient(client *http.Client) *RepoAddTopicParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo add topic params
+func (o *RepoAddTopicParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithOwner adds the owner to the repo add topic params
+func (o *RepoAddTopicParams) WithOwner(owner string) *RepoAddTopicParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo add topic params
+func (o *RepoAddTopicParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo add topic params
+func (o *RepoAddTopicParams) WithRepo(repo string) *RepoAddTopicParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo add topic params
+func (o *RepoAddTopicParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WithTopic adds the topic to the repo add topic params
+func (o *RepoAddTopicParams) WithTopic(topic string) *RepoAddTopicParams {
+	o.SetTopic(topic)
+	return o
+}
+
+// SetTopic adds the topic to the repo add topic params
+func (o *RepoAddTopicParams) SetTopic(topic string) {
+	o.Topic = topic
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoAddTopicParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	// path param topic
+	if err := r.SetPathParam("topic", o.Topic); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_add_topic_responses.go b/bots-common/gitea-generated/client/repository/repo_add_topic_responses.go
new file mode 100644
index 0000000..10a8fbc
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_add_topic_responses.go
@@ -0,0 +1,256 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// RepoAddTopicReader is a Reader for the RepoAddTopic structure.
+type RepoAddTopicReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoAddTopicReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewRepoAddTopicNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoAddTopicNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 422:
+		result := NewRepoAddTopicUnprocessableEntity()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[PUT /repos/{owner}/{repo}/topics/{topic}] repoAddTopic", response, response.Code())
+	}
+}
+
+// NewRepoAddTopicNoContent creates a RepoAddTopicNoContent with default headers values
+func NewRepoAddTopicNoContent() *RepoAddTopicNoContent {
+	return &RepoAddTopicNoContent{}
+}
+
+/*
+RepoAddTopicNoContent describes a response with status code 204, with default header values.
+
+APIEmpty is an empty response
+*/
+type RepoAddTopicNoContent struct {
+}
+
+// IsSuccess returns true when this repo add topic no content response has a 2xx status code
+func (o *RepoAddTopicNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo add topic no content response has a 3xx status code
+func (o *RepoAddTopicNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo add topic no content response has a 4xx status code
+func (o *RepoAddTopicNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo add topic no content response has a 5xx status code
+func (o *RepoAddTopicNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo add topic no content response a status code equal to that given
+func (o *RepoAddTopicNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the repo add topic no content response
+func (o *RepoAddTopicNoContent) Code() int {
+	return 204
+}
+
+func (o *RepoAddTopicNoContent) Error() string {
+	return fmt.Sprintf("[PUT /repos/{owner}/{repo}/topics/{topic}][%d] repoAddTopicNoContent", 204)
+}
+
+func (o *RepoAddTopicNoContent) String() string {
+	return fmt.Sprintf("[PUT /repos/{owner}/{repo}/topics/{topic}][%d] repoAddTopicNoContent", 204)
+}
+
+func (o *RepoAddTopicNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewRepoAddTopicNotFound creates a RepoAddTopicNotFound with default headers values
+func NewRepoAddTopicNotFound() *RepoAddTopicNotFound {
+	return &RepoAddTopicNotFound{}
+}
+
+/*
+RepoAddTopicNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoAddTopicNotFound struct {
+}
+
+// IsSuccess returns true when this repo add topic not found response has a 2xx status code
+func (o *RepoAddTopicNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo add topic not found response has a 3xx status code
+func (o *RepoAddTopicNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo add topic not found response has a 4xx status code
+func (o *RepoAddTopicNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo add topic not found response has a 5xx status code
+func (o *RepoAddTopicNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo add topic not found response a status code equal to that given
+func (o *RepoAddTopicNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo add topic not found response
+func (o *RepoAddTopicNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoAddTopicNotFound) Error() string {
+	return fmt.Sprintf("[PUT /repos/{owner}/{repo}/topics/{topic}][%d] repoAddTopicNotFound", 404)
+}
+
+func (o *RepoAddTopicNotFound) String() string {
+	return fmt.Sprintf("[PUT /repos/{owner}/{repo}/topics/{topic}][%d] repoAddTopicNotFound", 404)
+}
+
+func (o *RepoAddTopicNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewRepoAddTopicUnprocessableEntity creates a RepoAddTopicUnprocessableEntity with default headers values
+func NewRepoAddTopicUnprocessableEntity() *RepoAddTopicUnprocessableEntity {
+	return &RepoAddTopicUnprocessableEntity{}
+}
+
+/*
+RepoAddTopicUnprocessableEntity describes a response with status code 422, with default header values.
+
+APIInvalidTopicsError is error format response to invalid topics
+*/
+type RepoAddTopicUnprocessableEntity struct {
+	InvalidTopics []string
+	Message       string
+}
+
+// IsSuccess returns true when this repo add topic unprocessable entity response has a 2xx status code
+func (o *RepoAddTopicUnprocessableEntity) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo add topic unprocessable entity response has a 3xx status code
+func (o *RepoAddTopicUnprocessableEntity) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo add topic unprocessable entity response has a 4xx status code
+func (o *RepoAddTopicUnprocessableEntity) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo add topic unprocessable entity response has a 5xx status code
+func (o *RepoAddTopicUnprocessableEntity) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo add topic unprocessable entity response a status code equal to that given
+func (o *RepoAddTopicUnprocessableEntity) IsCode(code int) bool {
+	return code == 422
+}
+
+// Code gets the status code for the repo add topic unprocessable entity response
+func (o *RepoAddTopicUnprocessableEntity) Code() int {
+	return 422
+}
+
+func (o *RepoAddTopicUnprocessableEntity) Error() string {
+	return fmt.Sprintf("[PUT /repos/{owner}/{repo}/topics/{topic}][%d] repoAddTopicUnprocessableEntity", 422)
+}
+
+func (o *RepoAddTopicUnprocessableEntity) String() string {
+	return fmt.Sprintf("[PUT /repos/{owner}/{repo}/topics/{topic}][%d] repoAddTopicUnprocessableEntity", 422)
+}
+
+func (o *RepoAddTopicUnprocessableEntity) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header invalidTopics
+	hdrInvalidTopics := response.GetHeader("invalidTopics")
+
+	if hdrInvalidTopics != "" {
+
+		// binding header items for invalidTopics
+		valInvalidTopics, err := o.bindHeaderInvalidTopics(hdrInvalidTopics, formats)
+		if err != nil {
+			return err
+		}
+
+		o.InvalidTopics = valInvalidTopics
+	}
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	return nil
+}
+
+// bindHeaderRepoAddTopicUnprocessableEntity binds the response header invalidTopics
+func (o *RepoAddTopicUnprocessableEntity) bindHeaderInvalidTopics(hdr string, formats strfmt.Registry) ([]string, error) {
+	invalidTopicsIV := hdr
+
+	var (
+		invalidTopicsIC []string
+	)
+	// items.CollectionFormat: ""
+	invalidTopicsIR := swag.SplitByFormat(invalidTopicsIV, "")
+
+	for _, invalidTopicsIIV := range invalidTopicsIR {
+
+		// convert split string to string
+		invalidTopicsIIC := invalidTopicsIIV                        // string as string
+		invalidTopicsIC = append(invalidTopicsIC, invalidTopicsIIC) // roll-up string into []string
+	}
+
+	return invalidTopicsIC, nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_apply_diff_patch_parameters.go b/bots-common/gitea-generated/client/repository/repo_apply_diff_patch_parameters.go
new file mode 100644
index 0000000..198f71d
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_apply_diff_patch_parameters.go
@@ -0,0 +1,194 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewRepoApplyDiffPatchParams creates a new RepoApplyDiffPatchParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoApplyDiffPatchParams() *RepoApplyDiffPatchParams {
+	return &RepoApplyDiffPatchParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoApplyDiffPatchParamsWithTimeout creates a new RepoApplyDiffPatchParams object
+// with the ability to set a timeout on a request.
+func NewRepoApplyDiffPatchParamsWithTimeout(timeout time.Duration) *RepoApplyDiffPatchParams {
+	return &RepoApplyDiffPatchParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoApplyDiffPatchParamsWithContext creates a new RepoApplyDiffPatchParams object
+// with the ability to set a context for a request.
+func NewRepoApplyDiffPatchParamsWithContext(ctx context.Context) *RepoApplyDiffPatchParams {
+	return &RepoApplyDiffPatchParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoApplyDiffPatchParamsWithHTTPClient creates a new RepoApplyDiffPatchParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoApplyDiffPatchParamsWithHTTPClient(client *http.Client) *RepoApplyDiffPatchParams {
+	return &RepoApplyDiffPatchParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoApplyDiffPatchParams contains all the parameters to send to the API endpoint
+
+	for the repo apply diff patch operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoApplyDiffPatchParams struct {
+
+	// Body.
+	Body *models.UpdateFileOptions
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo apply diff patch params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoApplyDiffPatchParams) WithDefaults() *RepoApplyDiffPatchParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo apply diff patch params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoApplyDiffPatchParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo apply diff patch params
+func (o *RepoApplyDiffPatchParams) WithTimeout(timeout time.Duration) *RepoApplyDiffPatchParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo apply diff patch params
+func (o *RepoApplyDiffPatchParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo apply diff patch params
+func (o *RepoApplyDiffPatchParams) WithContext(ctx context.Context) *RepoApplyDiffPatchParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo apply diff patch params
+func (o *RepoApplyDiffPatchParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo apply diff patch params
+func (o *RepoApplyDiffPatchParams) WithHTTPClient(client *http.Client) *RepoApplyDiffPatchParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo apply diff patch params
+func (o *RepoApplyDiffPatchParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the repo apply diff patch params
+func (o *RepoApplyDiffPatchParams) WithBody(body *models.UpdateFileOptions) *RepoApplyDiffPatchParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the repo apply diff patch params
+func (o *RepoApplyDiffPatchParams) SetBody(body *models.UpdateFileOptions) {
+	o.Body = body
+}
+
+// WithOwner adds the owner to the repo apply diff patch params
+func (o *RepoApplyDiffPatchParams) WithOwner(owner string) *RepoApplyDiffPatchParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo apply diff patch params
+func (o *RepoApplyDiffPatchParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo apply diff patch params
+func (o *RepoApplyDiffPatchParams) WithRepo(repo string) *RepoApplyDiffPatchParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo apply diff patch params
+func (o *RepoApplyDiffPatchParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoApplyDiffPatchParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_apply_diff_patch_responses.go b/bots-common/gitea-generated/client/repository/repo_apply_diff_patch_responses.go
new file mode 100644
index 0000000..0b983c5
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_apply_diff_patch_responses.go
@@ -0,0 +1,246 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoApplyDiffPatchReader is a Reader for the RepoApplyDiffPatch structure.
+type RepoApplyDiffPatchReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoApplyDiffPatchReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoApplyDiffPatchOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoApplyDiffPatchNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 423:
+		result := NewRepoApplyDiffPatchLocked()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[POST /repos/{owner}/{repo}/diffpatch] repoApplyDiffPatch", response, response.Code())
+	}
+}
+
+// NewRepoApplyDiffPatchOK creates a RepoApplyDiffPatchOK with default headers values
+func NewRepoApplyDiffPatchOK() *RepoApplyDiffPatchOK {
+	return &RepoApplyDiffPatchOK{}
+}
+
+/*
+RepoApplyDiffPatchOK describes a response with status code 200, with default header values.
+
+FileResponse
+*/
+type RepoApplyDiffPatchOK struct {
+	Payload *models.FileResponse
+}
+
+// IsSuccess returns true when this repo apply diff patch o k response has a 2xx status code
+func (o *RepoApplyDiffPatchOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo apply diff patch o k response has a 3xx status code
+func (o *RepoApplyDiffPatchOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo apply diff patch o k response has a 4xx status code
+func (o *RepoApplyDiffPatchOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo apply diff patch o k response has a 5xx status code
+func (o *RepoApplyDiffPatchOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo apply diff patch o k response a status code equal to that given
+func (o *RepoApplyDiffPatchOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo apply diff patch o k response
+func (o *RepoApplyDiffPatchOK) Code() int {
+	return 200
+}
+
+func (o *RepoApplyDiffPatchOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/diffpatch][%d] repoApplyDiffPatchOK %s", 200, payload)
+}
+
+func (o *RepoApplyDiffPatchOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/diffpatch][%d] repoApplyDiffPatchOK %s", 200, payload)
+}
+
+func (o *RepoApplyDiffPatchOK) GetPayload() *models.FileResponse {
+	return o.Payload
+}
+
+func (o *RepoApplyDiffPatchOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.FileResponse)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoApplyDiffPatchNotFound creates a RepoApplyDiffPatchNotFound with default headers values
+func NewRepoApplyDiffPatchNotFound() *RepoApplyDiffPatchNotFound {
+	return &RepoApplyDiffPatchNotFound{}
+}
+
+/*
+RepoApplyDiffPatchNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoApplyDiffPatchNotFound struct {
+}
+
+// IsSuccess returns true when this repo apply diff patch not found response has a 2xx status code
+func (o *RepoApplyDiffPatchNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo apply diff patch not found response has a 3xx status code
+func (o *RepoApplyDiffPatchNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo apply diff patch not found response has a 4xx status code
+func (o *RepoApplyDiffPatchNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo apply diff patch not found response has a 5xx status code
+func (o *RepoApplyDiffPatchNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo apply diff patch not found response a status code equal to that given
+func (o *RepoApplyDiffPatchNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo apply diff patch not found response
+func (o *RepoApplyDiffPatchNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoApplyDiffPatchNotFound) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/diffpatch][%d] repoApplyDiffPatchNotFound", 404)
+}
+
+func (o *RepoApplyDiffPatchNotFound) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/diffpatch][%d] repoApplyDiffPatchNotFound", 404)
+}
+
+func (o *RepoApplyDiffPatchNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewRepoApplyDiffPatchLocked creates a RepoApplyDiffPatchLocked with default headers values
+func NewRepoApplyDiffPatchLocked() *RepoApplyDiffPatchLocked {
+	return &RepoApplyDiffPatchLocked{}
+}
+
+/*
+RepoApplyDiffPatchLocked describes a response with status code 423, with default header values.
+
+APIRepoArchivedError is an error that is raised when an archived repo should be modified
+*/
+type RepoApplyDiffPatchLocked struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo apply diff patch locked response has a 2xx status code
+func (o *RepoApplyDiffPatchLocked) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo apply diff patch locked response has a 3xx status code
+func (o *RepoApplyDiffPatchLocked) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo apply diff patch locked response has a 4xx status code
+func (o *RepoApplyDiffPatchLocked) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo apply diff patch locked response has a 5xx status code
+func (o *RepoApplyDiffPatchLocked) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo apply diff patch locked response a status code equal to that given
+func (o *RepoApplyDiffPatchLocked) IsCode(code int) bool {
+	return code == 423
+}
+
+// Code gets the status code for the repo apply diff patch locked response
+func (o *RepoApplyDiffPatchLocked) Code() int {
+	return 423
+}
+
+func (o *RepoApplyDiffPatchLocked) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/diffpatch][%d] repoApplyDiffPatchLocked", 423)
+}
+
+func (o *RepoApplyDiffPatchLocked) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/diffpatch][%d] repoApplyDiffPatchLocked", 423)
+}
+
+func (o *RepoApplyDiffPatchLocked) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_cancel_scheduled_auto_merge_parameters.go b/bots-common/gitea-generated/client/repository/repo_cancel_scheduled_auto_merge_parameters.go
new file mode 100644
index 0000000..608fd71
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_cancel_scheduled_auto_merge_parameters.go
@@ -0,0 +1,198 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewRepoCancelScheduledAutoMergeParams creates a new RepoCancelScheduledAutoMergeParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoCancelScheduledAutoMergeParams() *RepoCancelScheduledAutoMergeParams {
+	return &RepoCancelScheduledAutoMergeParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoCancelScheduledAutoMergeParamsWithTimeout creates a new RepoCancelScheduledAutoMergeParams object
+// with the ability to set a timeout on a request.
+func NewRepoCancelScheduledAutoMergeParamsWithTimeout(timeout time.Duration) *RepoCancelScheduledAutoMergeParams {
+	return &RepoCancelScheduledAutoMergeParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoCancelScheduledAutoMergeParamsWithContext creates a new RepoCancelScheduledAutoMergeParams object
+// with the ability to set a context for a request.
+func NewRepoCancelScheduledAutoMergeParamsWithContext(ctx context.Context) *RepoCancelScheduledAutoMergeParams {
+	return &RepoCancelScheduledAutoMergeParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoCancelScheduledAutoMergeParamsWithHTTPClient creates a new RepoCancelScheduledAutoMergeParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoCancelScheduledAutoMergeParamsWithHTTPClient(client *http.Client) *RepoCancelScheduledAutoMergeParams {
+	return &RepoCancelScheduledAutoMergeParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoCancelScheduledAutoMergeParams contains all the parameters to send to the API endpoint
+
+	for the repo cancel scheduled auto merge operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoCancelScheduledAutoMergeParams struct {
+
+	/* Index.
+
+	   index of the pull request to merge
+
+	   Format: int64
+	*/
+	Index int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo cancel scheduled auto merge params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoCancelScheduledAutoMergeParams) WithDefaults() *RepoCancelScheduledAutoMergeParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo cancel scheduled auto merge params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoCancelScheduledAutoMergeParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo cancel scheduled auto merge params
+func (o *RepoCancelScheduledAutoMergeParams) WithTimeout(timeout time.Duration) *RepoCancelScheduledAutoMergeParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo cancel scheduled auto merge params
+func (o *RepoCancelScheduledAutoMergeParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo cancel scheduled auto merge params
+func (o *RepoCancelScheduledAutoMergeParams) WithContext(ctx context.Context) *RepoCancelScheduledAutoMergeParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo cancel scheduled auto merge params
+func (o *RepoCancelScheduledAutoMergeParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo cancel scheduled auto merge params
+func (o *RepoCancelScheduledAutoMergeParams) WithHTTPClient(client *http.Client) *RepoCancelScheduledAutoMergeParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo cancel scheduled auto merge params
+func (o *RepoCancelScheduledAutoMergeParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithIndex adds the index to the repo cancel scheduled auto merge params
+func (o *RepoCancelScheduledAutoMergeParams) WithIndex(index int64) *RepoCancelScheduledAutoMergeParams {
+	o.SetIndex(index)
+	return o
+}
+
+// SetIndex adds the index to the repo cancel scheduled auto merge params
+func (o *RepoCancelScheduledAutoMergeParams) SetIndex(index int64) {
+	o.Index = index
+}
+
+// WithOwner adds the owner to the repo cancel scheduled auto merge params
+func (o *RepoCancelScheduledAutoMergeParams) WithOwner(owner string) *RepoCancelScheduledAutoMergeParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo cancel scheduled auto merge params
+func (o *RepoCancelScheduledAutoMergeParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo cancel scheduled auto merge params
+func (o *RepoCancelScheduledAutoMergeParams) WithRepo(repo string) *RepoCancelScheduledAutoMergeParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo cancel scheduled auto merge params
+func (o *RepoCancelScheduledAutoMergeParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoCancelScheduledAutoMergeParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param index
+	if err := r.SetPathParam("index", swag.FormatInt64(o.Index)); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_cancel_scheduled_auto_merge_responses.go b/bots-common/gitea-generated/client/repository/repo_cancel_scheduled_auto_merge_responses.go
new file mode 100644
index 0000000..c55b068
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_cancel_scheduled_auto_merge_responses.go
@@ -0,0 +1,306 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// RepoCancelScheduledAutoMergeReader is a Reader for the RepoCancelScheduledAutoMerge structure.
+type RepoCancelScheduledAutoMergeReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoCancelScheduledAutoMergeReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewRepoCancelScheduledAutoMergeNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 403:
+		result := NewRepoCancelScheduledAutoMergeForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewRepoCancelScheduledAutoMergeNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 423:
+		result := NewRepoCancelScheduledAutoMergeLocked()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[DELETE /repos/{owner}/{repo}/pulls/{index}/merge] repoCancelScheduledAutoMerge", response, response.Code())
+	}
+}
+
+// NewRepoCancelScheduledAutoMergeNoContent creates a RepoCancelScheduledAutoMergeNoContent with default headers values
+func NewRepoCancelScheduledAutoMergeNoContent() *RepoCancelScheduledAutoMergeNoContent {
+	return &RepoCancelScheduledAutoMergeNoContent{}
+}
+
+/*
+RepoCancelScheduledAutoMergeNoContent describes a response with status code 204, with default header values.
+
+APIEmpty is an empty response
+*/
+type RepoCancelScheduledAutoMergeNoContent struct {
+}
+
+// IsSuccess returns true when this repo cancel scheduled auto merge no content response has a 2xx status code
+func (o *RepoCancelScheduledAutoMergeNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo cancel scheduled auto merge no content response has a 3xx status code
+func (o *RepoCancelScheduledAutoMergeNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo cancel scheduled auto merge no content response has a 4xx status code
+func (o *RepoCancelScheduledAutoMergeNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo cancel scheduled auto merge no content response has a 5xx status code
+func (o *RepoCancelScheduledAutoMergeNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo cancel scheduled auto merge no content response a status code equal to that given
+func (o *RepoCancelScheduledAutoMergeNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the repo cancel scheduled auto merge no content response
+func (o *RepoCancelScheduledAutoMergeNoContent) Code() int {
+	return 204
+}
+
+func (o *RepoCancelScheduledAutoMergeNoContent) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/pulls/{index}/merge][%d] repoCancelScheduledAutoMergeNoContent", 204)
+}
+
+func (o *RepoCancelScheduledAutoMergeNoContent) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/pulls/{index}/merge][%d] repoCancelScheduledAutoMergeNoContent", 204)
+}
+
+func (o *RepoCancelScheduledAutoMergeNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewRepoCancelScheduledAutoMergeForbidden creates a RepoCancelScheduledAutoMergeForbidden with default headers values
+func NewRepoCancelScheduledAutoMergeForbidden() *RepoCancelScheduledAutoMergeForbidden {
+	return &RepoCancelScheduledAutoMergeForbidden{}
+}
+
+/*
+RepoCancelScheduledAutoMergeForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type RepoCancelScheduledAutoMergeForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo cancel scheduled auto merge forbidden response has a 2xx status code
+func (o *RepoCancelScheduledAutoMergeForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo cancel scheduled auto merge forbidden response has a 3xx status code
+func (o *RepoCancelScheduledAutoMergeForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo cancel scheduled auto merge forbidden response has a 4xx status code
+func (o *RepoCancelScheduledAutoMergeForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo cancel scheduled auto merge forbidden response has a 5xx status code
+func (o *RepoCancelScheduledAutoMergeForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo cancel scheduled auto merge forbidden response a status code equal to that given
+func (o *RepoCancelScheduledAutoMergeForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the repo cancel scheduled auto merge forbidden response
+func (o *RepoCancelScheduledAutoMergeForbidden) Code() int {
+	return 403
+}
+
+func (o *RepoCancelScheduledAutoMergeForbidden) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/pulls/{index}/merge][%d] repoCancelScheduledAutoMergeForbidden", 403)
+}
+
+func (o *RepoCancelScheduledAutoMergeForbidden) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/pulls/{index}/merge][%d] repoCancelScheduledAutoMergeForbidden", 403)
+}
+
+func (o *RepoCancelScheduledAutoMergeForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewRepoCancelScheduledAutoMergeNotFound creates a RepoCancelScheduledAutoMergeNotFound with default headers values
+func NewRepoCancelScheduledAutoMergeNotFound() *RepoCancelScheduledAutoMergeNotFound {
+	return &RepoCancelScheduledAutoMergeNotFound{}
+}
+
+/*
+RepoCancelScheduledAutoMergeNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoCancelScheduledAutoMergeNotFound struct {
+}
+
+// IsSuccess returns true when this repo cancel scheduled auto merge not found response has a 2xx status code
+func (o *RepoCancelScheduledAutoMergeNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo cancel scheduled auto merge not found response has a 3xx status code
+func (o *RepoCancelScheduledAutoMergeNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo cancel scheduled auto merge not found response has a 4xx status code
+func (o *RepoCancelScheduledAutoMergeNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo cancel scheduled auto merge not found response has a 5xx status code
+func (o *RepoCancelScheduledAutoMergeNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo cancel scheduled auto merge not found response a status code equal to that given
+func (o *RepoCancelScheduledAutoMergeNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo cancel scheduled auto merge not found response
+func (o *RepoCancelScheduledAutoMergeNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoCancelScheduledAutoMergeNotFound) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/pulls/{index}/merge][%d] repoCancelScheduledAutoMergeNotFound", 404)
+}
+
+func (o *RepoCancelScheduledAutoMergeNotFound) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/pulls/{index}/merge][%d] repoCancelScheduledAutoMergeNotFound", 404)
+}
+
+func (o *RepoCancelScheduledAutoMergeNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewRepoCancelScheduledAutoMergeLocked creates a RepoCancelScheduledAutoMergeLocked with default headers values
+func NewRepoCancelScheduledAutoMergeLocked() *RepoCancelScheduledAutoMergeLocked {
+	return &RepoCancelScheduledAutoMergeLocked{}
+}
+
+/*
+RepoCancelScheduledAutoMergeLocked describes a response with status code 423, with default header values.
+
+APIRepoArchivedError is an error that is raised when an archived repo should be modified
+*/
+type RepoCancelScheduledAutoMergeLocked struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo cancel scheduled auto merge locked response has a 2xx status code
+func (o *RepoCancelScheduledAutoMergeLocked) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo cancel scheduled auto merge locked response has a 3xx status code
+func (o *RepoCancelScheduledAutoMergeLocked) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo cancel scheduled auto merge locked response has a 4xx status code
+func (o *RepoCancelScheduledAutoMergeLocked) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo cancel scheduled auto merge locked response has a 5xx status code
+func (o *RepoCancelScheduledAutoMergeLocked) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo cancel scheduled auto merge locked response a status code equal to that given
+func (o *RepoCancelScheduledAutoMergeLocked) IsCode(code int) bool {
+	return code == 423
+}
+
+// Code gets the status code for the repo cancel scheduled auto merge locked response
+func (o *RepoCancelScheduledAutoMergeLocked) Code() int {
+	return 423
+}
+
+func (o *RepoCancelScheduledAutoMergeLocked) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/pulls/{index}/merge][%d] repoCancelScheduledAutoMergeLocked", 423)
+}
+
+func (o *RepoCancelScheduledAutoMergeLocked) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/pulls/{index}/merge][%d] repoCancelScheduledAutoMergeLocked", 423)
+}
+
+func (o *RepoCancelScheduledAutoMergeLocked) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_change_files_parameters.go b/bots-common/gitea-generated/client/repository/repo_change_files_parameters.go
new file mode 100644
index 0000000..6cf3691
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_change_files_parameters.go
@@ -0,0 +1,194 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewRepoChangeFilesParams creates a new RepoChangeFilesParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoChangeFilesParams() *RepoChangeFilesParams {
+	return &RepoChangeFilesParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoChangeFilesParamsWithTimeout creates a new RepoChangeFilesParams object
+// with the ability to set a timeout on a request.
+func NewRepoChangeFilesParamsWithTimeout(timeout time.Duration) *RepoChangeFilesParams {
+	return &RepoChangeFilesParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoChangeFilesParamsWithContext creates a new RepoChangeFilesParams object
+// with the ability to set a context for a request.
+func NewRepoChangeFilesParamsWithContext(ctx context.Context) *RepoChangeFilesParams {
+	return &RepoChangeFilesParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoChangeFilesParamsWithHTTPClient creates a new RepoChangeFilesParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoChangeFilesParamsWithHTTPClient(client *http.Client) *RepoChangeFilesParams {
+	return &RepoChangeFilesParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoChangeFilesParams contains all the parameters to send to the API endpoint
+
+	for the repo change files operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoChangeFilesParams struct {
+
+	// Body.
+	Body *models.ChangeFilesOptions
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo change files params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoChangeFilesParams) WithDefaults() *RepoChangeFilesParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo change files params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoChangeFilesParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo change files params
+func (o *RepoChangeFilesParams) WithTimeout(timeout time.Duration) *RepoChangeFilesParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo change files params
+func (o *RepoChangeFilesParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo change files params
+func (o *RepoChangeFilesParams) WithContext(ctx context.Context) *RepoChangeFilesParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo change files params
+func (o *RepoChangeFilesParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo change files params
+func (o *RepoChangeFilesParams) WithHTTPClient(client *http.Client) *RepoChangeFilesParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo change files params
+func (o *RepoChangeFilesParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the repo change files params
+func (o *RepoChangeFilesParams) WithBody(body *models.ChangeFilesOptions) *RepoChangeFilesParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the repo change files params
+func (o *RepoChangeFilesParams) SetBody(body *models.ChangeFilesOptions) {
+	o.Body = body
+}
+
+// WithOwner adds the owner to the repo change files params
+func (o *RepoChangeFilesParams) WithOwner(owner string) *RepoChangeFilesParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo change files params
+func (o *RepoChangeFilesParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo change files params
+func (o *RepoChangeFilesParams) WithRepo(repo string) *RepoChangeFilesParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo change files params
+func (o *RepoChangeFilesParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoChangeFilesParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_change_files_responses.go b/bots-common/gitea-generated/client/repository/repo_change_files_responses.go
new file mode 100644
index 0000000..1fc1dd1
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_change_files_responses.go
@@ -0,0 +1,402 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoChangeFilesReader is a Reader for the RepoChangeFiles structure.
+type RepoChangeFilesReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoChangeFilesReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 201:
+		result := NewRepoChangeFilesCreated()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 403:
+		result := NewRepoChangeFilesForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewRepoChangeFilesNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 422:
+		result := NewRepoChangeFilesUnprocessableEntity()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 423:
+		result := NewRepoChangeFilesLocked()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[POST /repos/{owner}/{repo}/contents] repoChangeFiles", response, response.Code())
+	}
+}
+
+// NewRepoChangeFilesCreated creates a RepoChangeFilesCreated with default headers values
+func NewRepoChangeFilesCreated() *RepoChangeFilesCreated {
+	return &RepoChangeFilesCreated{}
+}
+
+/*
+RepoChangeFilesCreated describes a response with status code 201, with default header values.
+
+FilesResponse
+*/
+type RepoChangeFilesCreated struct {
+	Payload *models.FilesResponse
+}
+
+// IsSuccess returns true when this repo change files created response has a 2xx status code
+func (o *RepoChangeFilesCreated) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo change files created response has a 3xx status code
+func (o *RepoChangeFilesCreated) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo change files created response has a 4xx status code
+func (o *RepoChangeFilesCreated) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo change files created response has a 5xx status code
+func (o *RepoChangeFilesCreated) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo change files created response a status code equal to that given
+func (o *RepoChangeFilesCreated) IsCode(code int) bool {
+	return code == 201
+}
+
+// Code gets the status code for the repo change files created response
+func (o *RepoChangeFilesCreated) Code() int {
+	return 201
+}
+
+func (o *RepoChangeFilesCreated) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/contents][%d] repoChangeFilesCreated %s", 201, payload)
+}
+
+func (o *RepoChangeFilesCreated) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/contents][%d] repoChangeFilesCreated %s", 201, payload)
+}
+
+func (o *RepoChangeFilesCreated) GetPayload() *models.FilesResponse {
+	return o.Payload
+}
+
+func (o *RepoChangeFilesCreated) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.FilesResponse)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoChangeFilesForbidden creates a RepoChangeFilesForbidden with default headers values
+func NewRepoChangeFilesForbidden() *RepoChangeFilesForbidden {
+	return &RepoChangeFilesForbidden{}
+}
+
+/*
+RepoChangeFilesForbidden describes a response with status code 403, with default header values.
+
+APIError is error format response
+*/
+type RepoChangeFilesForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo change files forbidden response has a 2xx status code
+func (o *RepoChangeFilesForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo change files forbidden response has a 3xx status code
+func (o *RepoChangeFilesForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo change files forbidden response has a 4xx status code
+func (o *RepoChangeFilesForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo change files forbidden response has a 5xx status code
+func (o *RepoChangeFilesForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo change files forbidden response a status code equal to that given
+func (o *RepoChangeFilesForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the repo change files forbidden response
+func (o *RepoChangeFilesForbidden) Code() int {
+	return 403
+}
+
+func (o *RepoChangeFilesForbidden) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/contents][%d] repoChangeFilesForbidden", 403)
+}
+
+func (o *RepoChangeFilesForbidden) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/contents][%d] repoChangeFilesForbidden", 403)
+}
+
+func (o *RepoChangeFilesForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewRepoChangeFilesNotFound creates a RepoChangeFilesNotFound with default headers values
+func NewRepoChangeFilesNotFound() *RepoChangeFilesNotFound {
+	return &RepoChangeFilesNotFound{}
+}
+
+/*
+RepoChangeFilesNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoChangeFilesNotFound struct {
+}
+
+// IsSuccess returns true when this repo change files not found response has a 2xx status code
+func (o *RepoChangeFilesNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo change files not found response has a 3xx status code
+func (o *RepoChangeFilesNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo change files not found response has a 4xx status code
+func (o *RepoChangeFilesNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo change files not found response has a 5xx status code
+func (o *RepoChangeFilesNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo change files not found response a status code equal to that given
+func (o *RepoChangeFilesNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo change files not found response
+func (o *RepoChangeFilesNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoChangeFilesNotFound) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/contents][%d] repoChangeFilesNotFound", 404)
+}
+
+func (o *RepoChangeFilesNotFound) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/contents][%d] repoChangeFilesNotFound", 404)
+}
+
+func (o *RepoChangeFilesNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewRepoChangeFilesUnprocessableEntity creates a RepoChangeFilesUnprocessableEntity with default headers values
+func NewRepoChangeFilesUnprocessableEntity() *RepoChangeFilesUnprocessableEntity {
+	return &RepoChangeFilesUnprocessableEntity{}
+}
+
+/*
+RepoChangeFilesUnprocessableEntity describes a response with status code 422, with default header values.
+
+APIError is error format response
+*/
+type RepoChangeFilesUnprocessableEntity struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo change files unprocessable entity response has a 2xx status code
+func (o *RepoChangeFilesUnprocessableEntity) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo change files unprocessable entity response has a 3xx status code
+func (o *RepoChangeFilesUnprocessableEntity) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo change files unprocessable entity response has a 4xx status code
+func (o *RepoChangeFilesUnprocessableEntity) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo change files unprocessable entity response has a 5xx status code
+func (o *RepoChangeFilesUnprocessableEntity) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo change files unprocessable entity response a status code equal to that given
+func (o *RepoChangeFilesUnprocessableEntity) IsCode(code int) bool {
+	return code == 422
+}
+
+// Code gets the status code for the repo change files unprocessable entity response
+func (o *RepoChangeFilesUnprocessableEntity) Code() int {
+	return 422
+}
+
+func (o *RepoChangeFilesUnprocessableEntity) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/contents][%d] repoChangeFilesUnprocessableEntity", 422)
+}
+
+func (o *RepoChangeFilesUnprocessableEntity) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/contents][%d] repoChangeFilesUnprocessableEntity", 422)
+}
+
+func (o *RepoChangeFilesUnprocessableEntity) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewRepoChangeFilesLocked creates a RepoChangeFilesLocked with default headers values
+func NewRepoChangeFilesLocked() *RepoChangeFilesLocked {
+	return &RepoChangeFilesLocked{}
+}
+
+/*
+RepoChangeFilesLocked describes a response with status code 423, with default header values.
+
+APIRepoArchivedError is an error that is raised when an archived repo should be modified
+*/
+type RepoChangeFilesLocked struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo change files locked response has a 2xx status code
+func (o *RepoChangeFilesLocked) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo change files locked response has a 3xx status code
+func (o *RepoChangeFilesLocked) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo change files locked response has a 4xx status code
+func (o *RepoChangeFilesLocked) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo change files locked response has a 5xx status code
+func (o *RepoChangeFilesLocked) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo change files locked response a status code equal to that given
+func (o *RepoChangeFilesLocked) IsCode(code int) bool {
+	return code == 423
+}
+
+// Code gets the status code for the repo change files locked response
+func (o *RepoChangeFilesLocked) Code() int {
+	return 423
+}
+
+func (o *RepoChangeFilesLocked) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/contents][%d] repoChangeFilesLocked", 423)
+}
+
+func (o *RepoChangeFilesLocked) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/contents][%d] repoChangeFilesLocked", 423)
+}
+
+func (o *RepoChangeFilesLocked) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_check_collaborator_parameters.go b/bots-common/gitea-generated/client/repository/repo_check_collaborator_parameters.go
new file mode 100644
index 0000000..e31c703
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_check_collaborator_parameters.go
@@ -0,0 +1,195 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewRepoCheckCollaboratorParams creates a new RepoCheckCollaboratorParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoCheckCollaboratorParams() *RepoCheckCollaboratorParams {
+	return &RepoCheckCollaboratorParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoCheckCollaboratorParamsWithTimeout creates a new RepoCheckCollaboratorParams object
+// with the ability to set a timeout on a request.
+func NewRepoCheckCollaboratorParamsWithTimeout(timeout time.Duration) *RepoCheckCollaboratorParams {
+	return &RepoCheckCollaboratorParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoCheckCollaboratorParamsWithContext creates a new RepoCheckCollaboratorParams object
+// with the ability to set a context for a request.
+func NewRepoCheckCollaboratorParamsWithContext(ctx context.Context) *RepoCheckCollaboratorParams {
+	return &RepoCheckCollaboratorParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoCheckCollaboratorParamsWithHTTPClient creates a new RepoCheckCollaboratorParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoCheckCollaboratorParamsWithHTTPClient(client *http.Client) *RepoCheckCollaboratorParams {
+	return &RepoCheckCollaboratorParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoCheckCollaboratorParams contains all the parameters to send to the API endpoint
+
+	for the repo check collaborator operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoCheckCollaboratorParams struct {
+
+	/* Collaborator.
+
+	   username of the collaborator
+	*/
+	Collaborator string
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo check collaborator params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoCheckCollaboratorParams) WithDefaults() *RepoCheckCollaboratorParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo check collaborator params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoCheckCollaboratorParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo check collaborator params
+func (o *RepoCheckCollaboratorParams) WithTimeout(timeout time.Duration) *RepoCheckCollaboratorParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo check collaborator params
+func (o *RepoCheckCollaboratorParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo check collaborator params
+func (o *RepoCheckCollaboratorParams) WithContext(ctx context.Context) *RepoCheckCollaboratorParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo check collaborator params
+func (o *RepoCheckCollaboratorParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo check collaborator params
+func (o *RepoCheckCollaboratorParams) WithHTTPClient(client *http.Client) *RepoCheckCollaboratorParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo check collaborator params
+func (o *RepoCheckCollaboratorParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithCollaborator adds the collaborator to the repo check collaborator params
+func (o *RepoCheckCollaboratorParams) WithCollaborator(collaborator string) *RepoCheckCollaboratorParams {
+	o.SetCollaborator(collaborator)
+	return o
+}
+
+// SetCollaborator adds the collaborator to the repo check collaborator params
+func (o *RepoCheckCollaboratorParams) SetCollaborator(collaborator string) {
+	o.Collaborator = collaborator
+}
+
+// WithOwner adds the owner to the repo check collaborator params
+func (o *RepoCheckCollaboratorParams) WithOwner(owner string) *RepoCheckCollaboratorParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo check collaborator params
+func (o *RepoCheckCollaboratorParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo check collaborator params
+func (o *RepoCheckCollaboratorParams) WithRepo(repo string) *RepoCheckCollaboratorParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo check collaborator params
+func (o *RepoCheckCollaboratorParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoCheckCollaboratorParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param collaborator
+	if err := r.SetPathParam("collaborator", o.Collaborator); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_check_collaborator_responses.go b/bots-common/gitea-generated/client/repository/repo_check_collaborator_responses.go
new file mode 100644
index 0000000..165d2f3
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_check_collaborator_responses.go
@@ -0,0 +1,228 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// RepoCheckCollaboratorReader is a Reader for the RepoCheckCollaborator structure.
+type RepoCheckCollaboratorReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoCheckCollaboratorReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewRepoCheckCollaboratorNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoCheckCollaboratorNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 422:
+		result := NewRepoCheckCollaboratorUnprocessableEntity()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/collaborators/{collaborator}] repoCheckCollaborator", response, response.Code())
+	}
+}
+
+// NewRepoCheckCollaboratorNoContent creates a RepoCheckCollaboratorNoContent with default headers values
+func NewRepoCheckCollaboratorNoContent() *RepoCheckCollaboratorNoContent {
+	return &RepoCheckCollaboratorNoContent{}
+}
+
+/*
+RepoCheckCollaboratorNoContent describes a response with status code 204, with default header values.
+
+APIEmpty is an empty response
+*/
+type RepoCheckCollaboratorNoContent struct {
+}
+
+// IsSuccess returns true when this repo check collaborator no content response has a 2xx status code
+func (o *RepoCheckCollaboratorNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo check collaborator no content response has a 3xx status code
+func (o *RepoCheckCollaboratorNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo check collaborator no content response has a 4xx status code
+func (o *RepoCheckCollaboratorNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo check collaborator no content response has a 5xx status code
+func (o *RepoCheckCollaboratorNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo check collaborator no content response a status code equal to that given
+func (o *RepoCheckCollaboratorNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the repo check collaborator no content response
+func (o *RepoCheckCollaboratorNoContent) Code() int {
+	return 204
+}
+
+func (o *RepoCheckCollaboratorNoContent) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/collaborators/{collaborator}][%d] repoCheckCollaboratorNoContent", 204)
+}
+
+func (o *RepoCheckCollaboratorNoContent) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/collaborators/{collaborator}][%d] repoCheckCollaboratorNoContent", 204)
+}
+
+func (o *RepoCheckCollaboratorNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewRepoCheckCollaboratorNotFound creates a RepoCheckCollaboratorNotFound with default headers values
+func NewRepoCheckCollaboratorNotFound() *RepoCheckCollaboratorNotFound {
+	return &RepoCheckCollaboratorNotFound{}
+}
+
+/*
+RepoCheckCollaboratorNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoCheckCollaboratorNotFound struct {
+}
+
+// IsSuccess returns true when this repo check collaborator not found response has a 2xx status code
+func (o *RepoCheckCollaboratorNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo check collaborator not found response has a 3xx status code
+func (o *RepoCheckCollaboratorNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo check collaborator not found response has a 4xx status code
+func (o *RepoCheckCollaboratorNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo check collaborator not found response has a 5xx status code
+func (o *RepoCheckCollaboratorNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo check collaborator not found response a status code equal to that given
+func (o *RepoCheckCollaboratorNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo check collaborator not found response
+func (o *RepoCheckCollaboratorNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoCheckCollaboratorNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/collaborators/{collaborator}][%d] repoCheckCollaboratorNotFound", 404)
+}
+
+func (o *RepoCheckCollaboratorNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/collaborators/{collaborator}][%d] repoCheckCollaboratorNotFound", 404)
+}
+
+func (o *RepoCheckCollaboratorNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewRepoCheckCollaboratorUnprocessableEntity creates a RepoCheckCollaboratorUnprocessableEntity with default headers values
+func NewRepoCheckCollaboratorUnprocessableEntity() *RepoCheckCollaboratorUnprocessableEntity {
+	return &RepoCheckCollaboratorUnprocessableEntity{}
+}
+
+/*
+RepoCheckCollaboratorUnprocessableEntity describes a response with status code 422, with default header values.
+
+APIValidationError is error format response related to input validation
+*/
+type RepoCheckCollaboratorUnprocessableEntity struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo check collaborator unprocessable entity response has a 2xx status code
+func (o *RepoCheckCollaboratorUnprocessableEntity) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo check collaborator unprocessable entity response has a 3xx status code
+func (o *RepoCheckCollaboratorUnprocessableEntity) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo check collaborator unprocessable entity response has a 4xx status code
+func (o *RepoCheckCollaboratorUnprocessableEntity) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo check collaborator unprocessable entity response has a 5xx status code
+func (o *RepoCheckCollaboratorUnprocessableEntity) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo check collaborator unprocessable entity response a status code equal to that given
+func (o *RepoCheckCollaboratorUnprocessableEntity) IsCode(code int) bool {
+	return code == 422
+}
+
+// Code gets the status code for the repo check collaborator unprocessable entity response
+func (o *RepoCheckCollaboratorUnprocessableEntity) Code() int {
+	return 422
+}
+
+func (o *RepoCheckCollaboratorUnprocessableEntity) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/collaborators/{collaborator}][%d] repoCheckCollaboratorUnprocessableEntity", 422)
+}
+
+func (o *RepoCheckCollaboratorUnprocessableEntity) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/collaborators/{collaborator}][%d] repoCheckCollaboratorUnprocessableEntity", 422)
+}
+
+func (o *RepoCheckCollaboratorUnprocessableEntity) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_check_team_parameters.go b/bots-common/gitea-generated/client/repository/repo_check_team_parameters.go
new file mode 100644
index 0000000..e5321ad
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_check_team_parameters.go
@@ -0,0 +1,195 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewRepoCheckTeamParams creates a new RepoCheckTeamParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoCheckTeamParams() *RepoCheckTeamParams {
+	return &RepoCheckTeamParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoCheckTeamParamsWithTimeout creates a new RepoCheckTeamParams object
+// with the ability to set a timeout on a request.
+func NewRepoCheckTeamParamsWithTimeout(timeout time.Duration) *RepoCheckTeamParams {
+	return &RepoCheckTeamParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoCheckTeamParamsWithContext creates a new RepoCheckTeamParams object
+// with the ability to set a context for a request.
+func NewRepoCheckTeamParamsWithContext(ctx context.Context) *RepoCheckTeamParams {
+	return &RepoCheckTeamParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoCheckTeamParamsWithHTTPClient creates a new RepoCheckTeamParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoCheckTeamParamsWithHTTPClient(client *http.Client) *RepoCheckTeamParams {
+	return &RepoCheckTeamParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoCheckTeamParams contains all the parameters to send to the API endpoint
+
+	for the repo check team operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoCheckTeamParams struct {
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	/* Team.
+
+	   team name
+	*/
+	Team string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo check team params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoCheckTeamParams) WithDefaults() *RepoCheckTeamParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo check team params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoCheckTeamParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo check team params
+func (o *RepoCheckTeamParams) WithTimeout(timeout time.Duration) *RepoCheckTeamParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo check team params
+func (o *RepoCheckTeamParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo check team params
+func (o *RepoCheckTeamParams) WithContext(ctx context.Context) *RepoCheckTeamParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo check team params
+func (o *RepoCheckTeamParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo check team params
+func (o *RepoCheckTeamParams) WithHTTPClient(client *http.Client) *RepoCheckTeamParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo check team params
+func (o *RepoCheckTeamParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithOwner adds the owner to the repo check team params
+func (o *RepoCheckTeamParams) WithOwner(owner string) *RepoCheckTeamParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo check team params
+func (o *RepoCheckTeamParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo check team params
+func (o *RepoCheckTeamParams) WithRepo(repo string) *RepoCheckTeamParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo check team params
+func (o *RepoCheckTeamParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WithTeam adds the team to the repo check team params
+func (o *RepoCheckTeamParams) WithTeam(team string) *RepoCheckTeamParams {
+	o.SetTeam(team)
+	return o
+}
+
+// SetTeam adds the team to the repo check team params
+func (o *RepoCheckTeamParams) SetTeam(team string) {
+	o.Team = team
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoCheckTeamParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	// path param team
+	if err := r.SetPathParam("team", o.Team); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_check_team_responses.go b/bots-common/gitea-generated/client/repository/repo_check_team_responses.go
new file mode 100644
index 0000000..b77dee1
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_check_team_responses.go
@@ -0,0 +1,246 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoCheckTeamReader is a Reader for the RepoCheckTeam structure.
+type RepoCheckTeamReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoCheckTeamReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoCheckTeamOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoCheckTeamNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 405:
+		result := NewRepoCheckTeamMethodNotAllowed()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/teams/{team}] repoCheckTeam", response, response.Code())
+	}
+}
+
+// NewRepoCheckTeamOK creates a RepoCheckTeamOK with default headers values
+func NewRepoCheckTeamOK() *RepoCheckTeamOK {
+	return &RepoCheckTeamOK{}
+}
+
+/*
+RepoCheckTeamOK describes a response with status code 200, with default header values.
+
+Team
+*/
+type RepoCheckTeamOK struct {
+	Payload *models.Team
+}
+
+// IsSuccess returns true when this repo check team o k response has a 2xx status code
+func (o *RepoCheckTeamOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo check team o k response has a 3xx status code
+func (o *RepoCheckTeamOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo check team o k response has a 4xx status code
+func (o *RepoCheckTeamOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo check team o k response has a 5xx status code
+func (o *RepoCheckTeamOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo check team o k response a status code equal to that given
+func (o *RepoCheckTeamOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo check team o k response
+func (o *RepoCheckTeamOK) Code() int {
+	return 200
+}
+
+func (o *RepoCheckTeamOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/teams/{team}][%d] repoCheckTeamOK %s", 200, payload)
+}
+
+func (o *RepoCheckTeamOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/teams/{team}][%d] repoCheckTeamOK %s", 200, payload)
+}
+
+func (o *RepoCheckTeamOK) GetPayload() *models.Team {
+	return o.Payload
+}
+
+func (o *RepoCheckTeamOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.Team)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoCheckTeamNotFound creates a RepoCheckTeamNotFound with default headers values
+func NewRepoCheckTeamNotFound() *RepoCheckTeamNotFound {
+	return &RepoCheckTeamNotFound{}
+}
+
+/*
+RepoCheckTeamNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoCheckTeamNotFound struct {
+}
+
+// IsSuccess returns true when this repo check team not found response has a 2xx status code
+func (o *RepoCheckTeamNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo check team not found response has a 3xx status code
+func (o *RepoCheckTeamNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo check team not found response has a 4xx status code
+func (o *RepoCheckTeamNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo check team not found response has a 5xx status code
+func (o *RepoCheckTeamNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo check team not found response a status code equal to that given
+func (o *RepoCheckTeamNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo check team not found response
+func (o *RepoCheckTeamNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoCheckTeamNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/teams/{team}][%d] repoCheckTeamNotFound", 404)
+}
+
+func (o *RepoCheckTeamNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/teams/{team}][%d] repoCheckTeamNotFound", 404)
+}
+
+func (o *RepoCheckTeamNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewRepoCheckTeamMethodNotAllowed creates a RepoCheckTeamMethodNotAllowed with default headers values
+func NewRepoCheckTeamMethodNotAllowed() *RepoCheckTeamMethodNotAllowed {
+	return &RepoCheckTeamMethodNotAllowed{}
+}
+
+/*
+RepoCheckTeamMethodNotAllowed describes a response with status code 405, with default header values.
+
+APIError is error format response
+*/
+type RepoCheckTeamMethodNotAllowed struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo check team method not allowed response has a 2xx status code
+func (o *RepoCheckTeamMethodNotAllowed) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo check team method not allowed response has a 3xx status code
+func (o *RepoCheckTeamMethodNotAllowed) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo check team method not allowed response has a 4xx status code
+func (o *RepoCheckTeamMethodNotAllowed) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo check team method not allowed response has a 5xx status code
+func (o *RepoCheckTeamMethodNotAllowed) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo check team method not allowed response a status code equal to that given
+func (o *RepoCheckTeamMethodNotAllowed) IsCode(code int) bool {
+	return code == 405
+}
+
+// Code gets the status code for the repo check team method not allowed response
+func (o *RepoCheckTeamMethodNotAllowed) Code() int {
+	return 405
+}
+
+func (o *RepoCheckTeamMethodNotAllowed) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/teams/{team}][%d] repoCheckTeamMethodNotAllowed", 405)
+}
+
+func (o *RepoCheckTeamMethodNotAllowed) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/teams/{team}][%d] repoCheckTeamMethodNotAllowed", 405)
+}
+
+func (o *RepoCheckTeamMethodNotAllowed) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_compare_diff_parameters.go b/bots-common/gitea-generated/client/repository/repo_compare_diff_parameters.go
new file mode 100644
index 0000000..2a631c2
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_compare_diff_parameters.go
@@ -0,0 +1,195 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewRepoCompareDiffParams creates a new RepoCompareDiffParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoCompareDiffParams() *RepoCompareDiffParams {
+	return &RepoCompareDiffParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoCompareDiffParamsWithTimeout creates a new RepoCompareDiffParams object
+// with the ability to set a timeout on a request.
+func NewRepoCompareDiffParamsWithTimeout(timeout time.Duration) *RepoCompareDiffParams {
+	return &RepoCompareDiffParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoCompareDiffParamsWithContext creates a new RepoCompareDiffParams object
+// with the ability to set a context for a request.
+func NewRepoCompareDiffParamsWithContext(ctx context.Context) *RepoCompareDiffParams {
+	return &RepoCompareDiffParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoCompareDiffParamsWithHTTPClient creates a new RepoCompareDiffParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoCompareDiffParamsWithHTTPClient(client *http.Client) *RepoCompareDiffParams {
+	return &RepoCompareDiffParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoCompareDiffParams contains all the parameters to send to the API endpoint
+
+	for the repo compare diff operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoCompareDiffParams struct {
+
+	/* Basehead.
+
+	   compare two branches or commits
+	*/
+	Basehead string
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo compare diff params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoCompareDiffParams) WithDefaults() *RepoCompareDiffParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo compare diff params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoCompareDiffParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo compare diff params
+func (o *RepoCompareDiffParams) WithTimeout(timeout time.Duration) *RepoCompareDiffParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo compare diff params
+func (o *RepoCompareDiffParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo compare diff params
+func (o *RepoCompareDiffParams) WithContext(ctx context.Context) *RepoCompareDiffParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo compare diff params
+func (o *RepoCompareDiffParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo compare diff params
+func (o *RepoCompareDiffParams) WithHTTPClient(client *http.Client) *RepoCompareDiffParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo compare diff params
+func (o *RepoCompareDiffParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBasehead adds the basehead to the repo compare diff params
+func (o *RepoCompareDiffParams) WithBasehead(basehead string) *RepoCompareDiffParams {
+	o.SetBasehead(basehead)
+	return o
+}
+
+// SetBasehead adds the basehead to the repo compare diff params
+func (o *RepoCompareDiffParams) SetBasehead(basehead string) {
+	o.Basehead = basehead
+}
+
+// WithOwner adds the owner to the repo compare diff params
+func (o *RepoCompareDiffParams) WithOwner(owner string) *RepoCompareDiffParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo compare diff params
+func (o *RepoCompareDiffParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo compare diff params
+func (o *RepoCompareDiffParams) WithRepo(repo string) *RepoCompareDiffParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo compare diff params
+func (o *RepoCompareDiffParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoCompareDiffParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param basehead
+	if err := r.SetPathParam("basehead", o.Basehead); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_compare_diff_responses.go b/bots-common/gitea-generated/client/repository/repo_compare_diff_responses.go
new file mode 100644
index 0000000..4f0ae39
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_compare_diff_responses.go
@@ -0,0 +1,168 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoCompareDiffReader is a Reader for the RepoCompareDiff structure.
+type RepoCompareDiffReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoCompareDiffReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoCompareDiffOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoCompareDiffNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/compare/{basehead}] repoCompareDiff", response, response.Code())
+	}
+}
+
+// NewRepoCompareDiffOK creates a RepoCompareDiffOK with default headers values
+func NewRepoCompareDiffOK() *RepoCompareDiffOK {
+	return &RepoCompareDiffOK{}
+}
+
+/*
+RepoCompareDiffOK describes a response with status code 200, with default header values.
+
+RepoCompareDiffOK repo compare diff o k
+*/
+type RepoCompareDiffOK struct {
+	Payload *models.Compare
+}
+
+// IsSuccess returns true when this repo compare diff o k response has a 2xx status code
+func (o *RepoCompareDiffOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo compare diff o k response has a 3xx status code
+func (o *RepoCompareDiffOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo compare diff o k response has a 4xx status code
+func (o *RepoCompareDiffOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo compare diff o k response has a 5xx status code
+func (o *RepoCompareDiffOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo compare diff o k response a status code equal to that given
+func (o *RepoCompareDiffOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo compare diff o k response
+func (o *RepoCompareDiffOK) Code() int {
+	return 200
+}
+
+func (o *RepoCompareDiffOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/compare/{basehead}][%d] repoCompareDiffOK %s", 200, payload)
+}
+
+func (o *RepoCompareDiffOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/compare/{basehead}][%d] repoCompareDiffOK %s", 200, payload)
+}
+
+func (o *RepoCompareDiffOK) GetPayload() *models.Compare {
+	return o.Payload
+}
+
+func (o *RepoCompareDiffOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.Compare)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoCompareDiffNotFound creates a RepoCompareDiffNotFound with default headers values
+func NewRepoCompareDiffNotFound() *RepoCompareDiffNotFound {
+	return &RepoCompareDiffNotFound{}
+}
+
+/*
+RepoCompareDiffNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoCompareDiffNotFound struct {
+}
+
+// IsSuccess returns true when this repo compare diff not found response has a 2xx status code
+func (o *RepoCompareDiffNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo compare diff not found response has a 3xx status code
+func (o *RepoCompareDiffNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo compare diff not found response has a 4xx status code
+func (o *RepoCompareDiffNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo compare diff not found response has a 5xx status code
+func (o *RepoCompareDiffNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo compare diff not found response a status code equal to that given
+func (o *RepoCompareDiffNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo compare diff not found response
+func (o *RepoCompareDiffNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoCompareDiffNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/compare/{basehead}][%d] repoCompareDiffNotFound", 404)
+}
+
+func (o *RepoCompareDiffNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/compare/{basehead}][%d] repoCompareDiffNotFound", 404)
+}
+
+func (o *RepoCompareDiffNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_create_branch_parameters.go b/bots-common/gitea-generated/client/repository/repo_create_branch_parameters.go
new file mode 100644
index 0000000..e7fdbf5
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_create_branch_parameters.go
@@ -0,0 +1,194 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewRepoCreateBranchParams creates a new RepoCreateBranchParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoCreateBranchParams() *RepoCreateBranchParams {
+	return &RepoCreateBranchParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoCreateBranchParamsWithTimeout creates a new RepoCreateBranchParams object
+// with the ability to set a timeout on a request.
+func NewRepoCreateBranchParamsWithTimeout(timeout time.Duration) *RepoCreateBranchParams {
+	return &RepoCreateBranchParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoCreateBranchParamsWithContext creates a new RepoCreateBranchParams object
+// with the ability to set a context for a request.
+func NewRepoCreateBranchParamsWithContext(ctx context.Context) *RepoCreateBranchParams {
+	return &RepoCreateBranchParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoCreateBranchParamsWithHTTPClient creates a new RepoCreateBranchParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoCreateBranchParamsWithHTTPClient(client *http.Client) *RepoCreateBranchParams {
+	return &RepoCreateBranchParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoCreateBranchParams contains all the parameters to send to the API endpoint
+
+	for the repo create branch operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoCreateBranchParams struct {
+
+	// Body.
+	Body *models.CreateBranchRepoOption
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo create branch params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoCreateBranchParams) WithDefaults() *RepoCreateBranchParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo create branch params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoCreateBranchParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo create branch params
+func (o *RepoCreateBranchParams) WithTimeout(timeout time.Duration) *RepoCreateBranchParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo create branch params
+func (o *RepoCreateBranchParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo create branch params
+func (o *RepoCreateBranchParams) WithContext(ctx context.Context) *RepoCreateBranchParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo create branch params
+func (o *RepoCreateBranchParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo create branch params
+func (o *RepoCreateBranchParams) WithHTTPClient(client *http.Client) *RepoCreateBranchParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo create branch params
+func (o *RepoCreateBranchParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the repo create branch params
+func (o *RepoCreateBranchParams) WithBody(body *models.CreateBranchRepoOption) *RepoCreateBranchParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the repo create branch params
+func (o *RepoCreateBranchParams) SetBody(body *models.CreateBranchRepoOption) {
+	o.Body = body
+}
+
+// WithOwner adds the owner to the repo create branch params
+func (o *RepoCreateBranchParams) WithOwner(owner string) *RepoCreateBranchParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo create branch params
+func (o *RepoCreateBranchParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo create branch params
+func (o *RepoCreateBranchParams) WithRepo(repo string) *RepoCreateBranchParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo create branch params
+func (o *RepoCreateBranchParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoCreateBranchParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_create_branch_protection_parameters.go b/bots-common/gitea-generated/client/repository/repo_create_branch_protection_parameters.go
new file mode 100644
index 0000000..0803136
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_create_branch_protection_parameters.go
@@ -0,0 +1,194 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewRepoCreateBranchProtectionParams creates a new RepoCreateBranchProtectionParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoCreateBranchProtectionParams() *RepoCreateBranchProtectionParams {
+	return &RepoCreateBranchProtectionParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoCreateBranchProtectionParamsWithTimeout creates a new RepoCreateBranchProtectionParams object
+// with the ability to set a timeout on a request.
+func NewRepoCreateBranchProtectionParamsWithTimeout(timeout time.Duration) *RepoCreateBranchProtectionParams {
+	return &RepoCreateBranchProtectionParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoCreateBranchProtectionParamsWithContext creates a new RepoCreateBranchProtectionParams object
+// with the ability to set a context for a request.
+func NewRepoCreateBranchProtectionParamsWithContext(ctx context.Context) *RepoCreateBranchProtectionParams {
+	return &RepoCreateBranchProtectionParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoCreateBranchProtectionParamsWithHTTPClient creates a new RepoCreateBranchProtectionParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoCreateBranchProtectionParamsWithHTTPClient(client *http.Client) *RepoCreateBranchProtectionParams {
+	return &RepoCreateBranchProtectionParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoCreateBranchProtectionParams contains all the parameters to send to the API endpoint
+
+	for the repo create branch protection operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoCreateBranchProtectionParams struct {
+
+	// Body.
+	Body *models.CreateBranchProtectionOption
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo create branch protection params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoCreateBranchProtectionParams) WithDefaults() *RepoCreateBranchProtectionParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo create branch protection params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoCreateBranchProtectionParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo create branch protection params
+func (o *RepoCreateBranchProtectionParams) WithTimeout(timeout time.Duration) *RepoCreateBranchProtectionParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo create branch protection params
+func (o *RepoCreateBranchProtectionParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo create branch protection params
+func (o *RepoCreateBranchProtectionParams) WithContext(ctx context.Context) *RepoCreateBranchProtectionParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo create branch protection params
+func (o *RepoCreateBranchProtectionParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo create branch protection params
+func (o *RepoCreateBranchProtectionParams) WithHTTPClient(client *http.Client) *RepoCreateBranchProtectionParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo create branch protection params
+func (o *RepoCreateBranchProtectionParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the repo create branch protection params
+func (o *RepoCreateBranchProtectionParams) WithBody(body *models.CreateBranchProtectionOption) *RepoCreateBranchProtectionParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the repo create branch protection params
+func (o *RepoCreateBranchProtectionParams) SetBody(body *models.CreateBranchProtectionOption) {
+	o.Body = body
+}
+
+// WithOwner adds the owner to the repo create branch protection params
+func (o *RepoCreateBranchProtectionParams) WithOwner(owner string) *RepoCreateBranchProtectionParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo create branch protection params
+func (o *RepoCreateBranchProtectionParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo create branch protection params
+func (o *RepoCreateBranchProtectionParams) WithRepo(repo string) *RepoCreateBranchProtectionParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo create branch protection params
+func (o *RepoCreateBranchProtectionParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoCreateBranchProtectionParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_create_branch_protection_responses.go b/bots-common/gitea-generated/client/repository/repo_create_branch_protection_responses.go
new file mode 100644
index 0000000..e7267a4
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_create_branch_protection_responses.go
@@ -0,0 +1,402 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoCreateBranchProtectionReader is a Reader for the RepoCreateBranchProtection structure.
+type RepoCreateBranchProtectionReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoCreateBranchProtectionReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 201:
+		result := NewRepoCreateBranchProtectionCreated()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 403:
+		result := NewRepoCreateBranchProtectionForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewRepoCreateBranchProtectionNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 422:
+		result := NewRepoCreateBranchProtectionUnprocessableEntity()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 423:
+		result := NewRepoCreateBranchProtectionLocked()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[POST /repos/{owner}/{repo}/branch_protections] repoCreateBranchProtection", response, response.Code())
+	}
+}
+
+// NewRepoCreateBranchProtectionCreated creates a RepoCreateBranchProtectionCreated with default headers values
+func NewRepoCreateBranchProtectionCreated() *RepoCreateBranchProtectionCreated {
+	return &RepoCreateBranchProtectionCreated{}
+}
+
+/*
+RepoCreateBranchProtectionCreated describes a response with status code 201, with default header values.
+
+BranchProtection
+*/
+type RepoCreateBranchProtectionCreated struct {
+	Payload *models.BranchProtection
+}
+
+// IsSuccess returns true when this repo create branch protection created response has a 2xx status code
+func (o *RepoCreateBranchProtectionCreated) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo create branch protection created response has a 3xx status code
+func (o *RepoCreateBranchProtectionCreated) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo create branch protection created response has a 4xx status code
+func (o *RepoCreateBranchProtectionCreated) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo create branch protection created response has a 5xx status code
+func (o *RepoCreateBranchProtectionCreated) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo create branch protection created response a status code equal to that given
+func (o *RepoCreateBranchProtectionCreated) IsCode(code int) bool {
+	return code == 201
+}
+
+// Code gets the status code for the repo create branch protection created response
+func (o *RepoCreateBranchProtectionCreated) Code() int {
+	return 201
+}
+
+func (o *RepoCreateBranchProtectionCreated) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/branch_protections][%d] repoCreateBranchProtectionCreated %s", 201, payload)
+}
+
+func (o *RepoCreateBranchProtectionCreated) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/branch_protections][%d] repoCreateBranchProtectionCreated %s", 201, payload)
+}
+
+func (o *RepoCreateBranchProtectionCreated) GetPayload() *models.BranchProtection {
+	return o.Payload
+}
+
+func (o *RepoCreateBranchProtectionCreated) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.BranchProtection)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoCreateBranchProtectionForbidden creates a RepoCreateBranchProtectionForbidden with default headers values
+func NewRepoCreateBranchProtectionForbidden() *RepoCreateBranchProtectionForbidden {
+	return &RepoCreateBranchProtectionForbidden{}
+}
+
+/*
+RepoCreateBranchProtectionForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type RepoCreateBranchProtectionForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo create branch protection forbidden response has a 2xx status code
+func (o *RepoCreateBranchProtectionForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo create branch protection forbidden response has a 3xx status code
+func (o *RepoCreateBranchProtectionForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo create branch protection forbidden response has a 4xx status code
+func (o *RepoCreateBranchProtectionForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo create branch protection forbidden response has a 5xx status code
+func (o *RepoCreateBranchProtectionForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo create branch protection forbidden response a status code equal to that given
+func (o *RepoCreateBranchProtectionForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the repo create branch protection forbidden response
+func (o *RepoCreateBranchProtectionForbidden) Code() int {
+	return 403
+}
+
+func (o *RepoCreateBranchProtectionForbidden) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/branch_protections][%d] repoCreateBranchProtectionForbidden", 403)
+}
+
+func (o *RepoCreateBranchProtectionForbidden) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/branch_protections][%d] repoCreateBranchProtectionForbidden", 403)
+}
+
+func (o *RepoCreateBranchProtectionForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewRepoCreateBranchProtectionNotFound creates a RepoCreateBranchProtectionNotFound with default headers values
+func NewRepoCreateBranchProtectionNotFound() *RepoCreateBranchProtectionNotFound {
+	return &RepoCreateBranchProtectionNotFound{}
+}
+
+/*
+RepoCreateBranchProtectionNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoCreateBranchProtectionNotFound struct {
+}
+
+// IsSuccess returns true when this repo create branch protection not found response has a 2xx status code
+func (o *RepoCreateBranchProtectionNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo create branch protection not found response has a 3xx status code
+func (o *RepoCreateBranchProtectionNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo create branch protection not found response has a 4xx status code
+func (o *RepoCreateBranchProtectionNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo create branch protection not found response has a 5xx status code
+func (o *RepoCreateBranchProtectionNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo create branch protection not found response a status code equal to that given
+func (o *RepoCreateBranchProtectionNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo create branch protection not found response
+func (o *RepoCreateBranchProtectionNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoCreateBranchProtectionNotFound) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/branch_protections][%d] repoCreateBranchProtectionNotFound", 404)
+}
+
+func (o *RepoCreateBranchProtectionNotFound) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/branch_protections][%d] repoCreateBranchProtectionNotFound", 404)
+}
+
+func (o *RepoCreateBranchProtectionNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewRepoCreateBranchProtectionUnprocessableEntity creates a RepoCreateBranchProtectionUnprocessableEntity with default headers values
+func NewRepoCreateBranchProtectionUnprocessableEntity() *RepoCreateBranchProtectionUnprocessableEntity {
+	return &RepoCreateBranchProtectionUnprocessableEntity{}
+}
+
+/*
+RepoCreateBranchProtectionUnprocessableEntity describes a response with status code 422, with default header values.
+
+APIValidationError is error format response related to input validation
+*/
+type RepoCreateBranchProtectionUnprocessableEntity struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo create branch protection unprocessable entity response has a 2xx status code
+func (o *RepoCreateBranchProtectionUnprocessableEntity) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo create branch protection unprocessable entity response has a 3xx status code
+func (o *RepoCreateBranchProtectionUnprocessableEntity) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo create branch protection unprocessable entity response has a 4xx status code
+func (o *RepoCreateBranchProtectionUnprocessableEntity) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo create branch protection unprocessable entity response has a 5xx status code
+func (o *RepoCreateBranchProtectionUnprocessableEntity) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo create branch protection unprocessable entity response a status code equal to that given
+func (o *RepoCreateBranchProtectionUnprocessableEntity) IsCode(code int) bool {
+	return code == 422
+}
+
+// Code gets the status code for the repo create branch protection unprocessable entity response
+func (o *RepoCreateBranchProtectionUnprocessableEntity) Code() int {
+	return 422
+}
+
+func (o *RepoCreateBranchProtectionUnprocessableEntity) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/branch_protections][%d] repoCreateBranchProtectionUnprocessableEntity", 422)
+}
+
+func (o *RepoCreateBranchProtectionUnprocessableEntity) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/branch_protections][%d] repoCreateBranchProtectionUnprocessableEntity", 422)
+}
+
+func (o *RepoCreateBranchProtectionUnprocessableEntity) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewRepoCreateBranchProtectionLocked creates a RepoCreateBranchProtectionLocked with default headers values
+func NewRepoCreateBranchProtectionLocked() *RepoCreateBranchProtectionLocked {
+	return &RepoCreateBranchProtectionLocked{}
+}
+
+/*
+RepoCreateBranchProtectionLocked describes a response with status code 423, with default header values.
+
+APIRepoArchivedError is an error that is raised when an archived repo should be modified
+*/
+type RepoCreateBranchProtectionLocked struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo create branch protection locked response has a 2xx status code
+func (o *RepoCreateBranchProtectionLocked) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo create branch protection locked response has a 3xx status code
+func (o *RepoCreateBranchProtectionLocked) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo create branch protection locked response has a 4xx status code
+func (o *RepoCreateBranchProtectionLocked) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo create branch protection locked response has a 5xx status code
+func (o *RepoCreateBranchProtectionLocked) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo create branch protection locked response a status code equal to that given
+func (o *RepoCreateBranchProtectionLocked) IsCode(code int) bool {
+	return code == 423
+}
+
+// Code gets the status code for the repo create branch protection locked response
+func (o *RepoCreateBranchProtectionLocked) Code() int {
+	return 423
+}
+
+func (o *RepoCreateBranchProtectionLocked) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/branch_protections][%d] repoCreateBranchProtectionLocked", 423)
+}
+
+func (o *RepoCreateBranchProtectionLocked) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/branch_protections][%d] repoCreateBranchProtectionLocked", 423)
+}
+
+func (o *RepoCreateBranchProtectionLocked) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_create_branch_responses.go b/bots-common/gitea-generated/client/repository/repo_create_branch_responses.go
new file mode 100644
index 0000000..9334084
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_create_branch_responses.go
@@ -0,0 +1,370 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoCreateBranchReader is a Reader for the RepoCreateBranch structure.
+type RepoCreateBranchReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoCreateBranchReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 201:
+		result := NewRepoCreateBranchCreated()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 403:
+		result := NewRepoCreateBranchForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewRepoCreateBranchNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 409:
+		result := NewRepoCreateBranchConflict()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 423:
+		result := NewRepoCreateBranchLocked()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[POST /repos/{owner}/{repo}/branches] repoCreateBranch", response, response.Code())
+	}
+}
+
+// NewRepoCreateBranchCreated creates a RepoCreateBranchCreated with default headers values
+func NewRepoCreateBranchCreated() *RepoCreateBranchCreated {
+	return &RepoCreateBranchCreated{}
+}
+
+/*
+RepoCreateBranchCreated describes a response with status code 201, with default header values.
+
+Branch
+*/
+type RepoCreateBranchCreated struct {
+	Payload *models.Branch
+}
+
+// IsSuccess returns true when this repo create branch created response has a 2xx status code
+func (o *RepoCreateBranchCreated) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo create branch created response has a 3xx status code
+func (o *RepoCreateBranchCreated) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo create branch created response has a 4xx status code
+func (o *RepoCreateBranchCreated) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo create branch created response has a 5xx status code
+func (o *RepoCreateBranchCreated) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo create branch created response a status code equal to that given
+func (o *RepoCreateBranchCreated) IsCode(code int) bool {
+	return code == 201
+}
+
+// Code gets the status code for the repo create branch created response
+func (o *RepoCreateBranchCreated) Code() int {
+	return 201
+}
+
+func (o *RepoCreateBranchCreated) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/branches][%d] repoCreateBranchCreated %s", 201, payload)
+}
+
+func (o *RepoCreateBranchCreated) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/branches][%d] repoCreateBranchCreated %s", 201, payload)
+}
+
+func (o *RepoCreateBranchCreated) GetPayload() *models.Branch {
+	return o.Payload
+}
+
+func (o *RepoCreateBranchCreated) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.Branch)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoCreateBranchForbidden creates a RepoCreateBranchForbidden with default headers values
+func NewRepoCreateBranchForbidden() *RepoCreateBranchForbidden {
+	return &RepoCreateBranchForbidden{}
+}
+
+/*
+RepoCreateBranchForbidden describes a response with status code 403, with default header values.
+
+The branch is archived or a mirror.
+*/
+type RepoCreateBranchForbidden struct {
+}
+
+// IsSuccess returns true when this repo create branch forbidden response has a 2xx status code
+func (o *RepoCreateBranchForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo create branch forbidden response has a 3xx status code
+func (o *RepoCreateBranchForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo create branch forbidden response has a 4xx status code
+func (o *RepoCreateBranchForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo create branch forbidden response has a 5xx status code
+func (o *RepoCreateBranchForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo create branch forbidden response a status code equal to that given
+func (o *RepoCreateBranchForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the repo create branch forbidden response
+func (o *RepoCreateBranchForbidden) Code() int {
+	return 403
+}
+
+func (o *RepoCreateBranchForbidden) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/branches][%d] repoCreateBranchForbidden", 403)
+}
+
+func (o *RepoCreateBranchForbidden) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/branches][%d] repoCreateBranchForbidden", 403)
+}
+
+func (o *RepoCreateBranchForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewRepoCreateBranchNotFound creates a RepoCreateBranchNotFound with default headers values
+func NewRepoCreateBranchNotFound() *RepoCreateBranchNotFound {
+	return &RepoCreateBranchNotFound{}
+}
+
+/*
+RepoCreateBranchNotFound describes a response with status code 404, with default header values.
+
+The old branch does not exist.
+*/
+type RepoCreateBranchNotFound struct {
+}
+
+// IsSuccess returns true when this repo create branch not found response has a 2xx status code
+func (o *RepoCreateBranchNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo create branch not found response has a 3xx status code
+func (o *RepoCreateBranchNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo create branch not found response has a 4xx status code
+func (o *RepoCreateBranchNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo create branch not found response has a 5xx status code
+func (o *RepoCreateBranchNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo create branch not found response a status code equal to that given
+func (o *RepoCreateBranchNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo create branch not found response
+func (o *RepoCreateBranchNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoCreateBranchNotFound) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/branches][%d] repoCreateBranchNotFound", 404)
+}
+
+func (o *RepoCreateBranchNotFound) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/branches][%d] repoCreateBranchNotFound", 404)
+}
+
+func (o *RepoCreateBranchNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewRepoCreateBranchConflict creates a RepoCreateBranchConflict with default headers values
+func NewRepoCreateBranchConflict() *RepoCreateBranchConflict {
+	return &RepoCreateBranchConflict{}
+}
+
+/*
+RepoCreateBranchConflict describes a response with status code 409, with default header values.
+
+The branch with the same name already exists.
+*/
+type RepoCreateBranchConflict struct {
+}
+
+// IsSuccess returns true when this repo create branch conflict response has a 2xx status code
+func (o *RepoCreateBranchConflict) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo create branch conflict response has a 3xx status code
+func (o *RepoCreateBranchConflict) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo create branch conflict response has a 4xx status code
+func (o *RepoCreateBranchConflict) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo create branch conflict response has a 5xx status code
+func (o *RepoCreateBranchConflict) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo create branch conflict response a status code equal to that given
+func (o *RepoCreateBranchConflict) IsCode(code int) bool {
+	return code == 409
+}
+
+// Code gets the status code for the repo create branch conflict response
+func (o *RepoCreateBranchConflict) Code() int {
+	return 409
+}
+
+func (o *RepoCreateBranchConflict) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/branches][%d] repoCreateBranchConflict", 409)
+}
+
+func (o *RepoCreateBranchConflict) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/branches][%d] repoCreateBranchConflict", 409)
+}
+
+func (o *RepoCreateBranchConflict) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewRepoCreateBranchLocked creates a RepoCreateBranchLocked with default headers values
+func NewRepoCreateBranchLocked() *RepoCreateBranchLocked {
+	return &RepoCreateBranchLocked{}
+}
+
+/*
+RepoCreateBranchLocked describes a response with status code 423, with default header values.
+
+APIRepoArchivedError is an error that is raised when an archived repo should be modified
+*/
+type RepoCreateBranchLocked struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo create branch locked response has a 2xx status code
+func (o *RepoCreateBranchLocked) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo create branch locked response has a 3xx status code
+func (o *RepoCreateBranchLocked) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo create branch locked response has a 4xx status code
+func (o *RepoCreateBranchLocked) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo create branch locked response has a 5xx status code
+func (o *RepoCreateBranchLocked) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo create branch locked response a status code equal to that given
+func (o *RepoCreateBranchLocked) IsCode(code int) bool {
+	return code == 423
+}
+
+// Code gets the status code for the repo create branch locked response
+func (o *RepoCreateBranchLocked) Code() int {
+	return 423
+}
+
+func (o *RepoCreateBranchLocked) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/branches][%d] repoCreateBranchLocked", 423)
+}
+
+func (o *RepoCreateBranchLocked) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/branches][%d] repoCreateBranchLocked", 423)
+}
+
+func (o *RepoCreateBranchLocked) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_create_file_parameters.go b/bots-common/gitea-generated/client/repository/repo_create_file_parameters.go
new file mode 100644
index 0000000..be22a78
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_create_file_parameters.go
@@ -0,0 +1,216 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewRepoCreateFileParams creates a new RepoCreateFileParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoCreateFileParams() *RepoCreateFileParams {
+	return &RepoCreateFileParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoCreateFileParamsWithTimeout creates a new RepoCreateFileParams object
+// with the ability to set a timeout on a request.
+func NewRepoCreateFileParamsWithTimeout(timeout time.Duration) *RepoCreateFileParams {
+	return &RepoCreateFileParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoCreateFileParamsWithContext creates a new RepoCreateFileParams object
+// with the ability to set a context for a request.
+func NewRepoCreateFileParamsWithContext(ctx context.Context) *RepoCreateFileParams {
+	return &RepoCreateFileParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoCreateFileParamsWithHTTPClient creates a new RepoCreateFileParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoCreateFileParamsWithHTTPClient(client *http.Client) *RepoCreateFileParams {
+	return &RepoCreateFileParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoCreateFileParams contains all the parameters to send to the API endpoint
+
+	for the repo create file operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoCreateFileParams struct {
+
+	// Body.
+	Body *models.CreateFileOptions
+
+	/* Filepath.
+
+	   path of the file to create
+	*/
+	Filepath string
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo create file params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoCreateFileParams) WithDefaults() *RepoCreateFileParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo create file params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoCreateFileParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo create file params
+func (o *RepoCreateFileParams) WithTimeout(timeout time.Duration) *RepoCreateFileParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo create file params
+func (o *RepoCreateFileParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo create file params
+func (o *RepoCreateFileParams) WithContext(ctx context.Context) *RepoCreateFileParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo create file params
+func (o *RepoCreateFileParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo create file params
+func (o *RepoCreateFileParams) WithHTTPClient(client *http.Client) *RepoCreateFileParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo create file params
+func (o *RepoCreateFileParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the repo create file params
+func (o *RepoCreateFileParams) WithBody(body *models.CreateFileOptions) *RepoCreateFileParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the repo create file params
+func (o *RepoCreateFileParams) SetBody(body *models.CreateFileOptions) {
+	o.Body = body
+}
+
+// WithFilepath adds the filepath to the repo create file params
+func (o *RepoCreateFileParams) WithFilepath(filepath string) *RepoCreateFileParams {
+	o.SetFilepath(filepath)
+	return o
+}
+
+// SetFilepath adds the filepath to the repo create file params
+func (o *RepoCreateFileParams) SetFilepath(filepath string) {
+	o.Filepath = filepath
+}
+
+// WithOwner adds the owner to the repo create file params
+func (o *RepoCreateFileParams) WithOwner(owner string) *RepoCreateFileParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo create file params
+func (o *RepoCreateFileParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo create file params
+func (o *RepoCreateFileParams) WithRepo(repo string) *RepoCreateFileParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo create file params
+func (o *RepoCreateFileParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoCreateFileParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	// path param filepath
+	if err := r.SetPathParam("filepath", o.Filepath); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_create_file_responses.go b/bots-common/gitea-generated/client/repository/repo_create_file_responses.go
new file mode 100644
index 0000000..3d2ca9c
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_create_file_responses.go
@@ -0,0 +1,402 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoCreateFileReader is a Reader for the RepoCreateFile structure.
+type RepoCreateFileReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoCreateFileReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 201:
+		result := NewRepoCreateFileCreated()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 403:
+		result := NewRepoCreateFileForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewRepoCreateFileNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 422:
+		result := NewRepoCreateFileUnprocessableEntity()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 423:
+		result := NewRepoCreateFileLocked()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[POST /repos/{owner}/{repo}/contents/{filepath}] repoCreateFile", response, response.Code())
+	}
+}
+
+// NewRepoCreateFileCreated creates a RepoCreateFileCreated with default headers values
+func NewRepoCreateFileCreated() *RepoCreateFileCreated {
+	return &RepoCreateFileCreated{}
+}
+
+/*
+RepoCreateFileCreated describes a response with status code 201, with default header values.
+
+FileResponse
+*/
+type RepoCreateFileCreated struct {
+	Payload *models.FileResponse
+}
+
+// IsSuccess returns true when this repo create file created response has a 2xx status code
+func (o *RepoCreateFileCreated) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo create file created response has a 3xx status code
+func (o *RepoCreateFileCreated) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo create file created response has a 4xx status code
+func (o *RepoCreateFileCreated) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo create file created response has a 5xx status code
+func (o *RepoCreateFileCreated) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo create file created response a status code equal to that given
+func (o *RepoCreateFileCreated) IsCode(code int) bool {
+	return code == 201
+}
+
+// Code gets the status code for the repo create file created response
+func (o *RepoCreateFileCreated) Code() int {
+	return 201
+}
+
+func (o *RepoCreateFileCreated) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/contents/{filepath}][%d] repoCreateFileCreated %s", 201, payload)
+}
+
+func (o *RepoCreateFileCreated) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/contents/{filepath}][%d] repoCreateFileCreated %s", 201, payload)
+}
+
+func (o *RepoCreateFileCreated) GetPayload() *models.FileResponse {
+	return o.Payload
+}
+
+func (o *RepoCreateFileCreated) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.FileResponse)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoCreateFileForbidden creates a RepoCreateFileForbidden with default headers values
+func NewRepoCreateFileForbidden() *RepoCreateFileForbidden {
+	return &RepoCreateFileForbidden{}
+}
+
+/*
+RepoCreateFileForbidden describes a response with status code 403, with default header values.
+
+APIError is error format response
+*/
+type RepoCreateFileForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo create file forbidden response has a 2xx status code
+func (o *RepoCreateFileForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo create file forbidden response has a 3xx status code
+func (o *RepoCreateFileForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo create file forbidden response has a 4xx status code
+func (o *RepoCreateFileForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo create file forbidden response has a 5xx status code
+func (o *RepoCreateFileForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo create file forbidden response a status code equal to that given
+func (o *RepoCreateFileForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the repo create file forbidden response
+func (o *RepoCreateFileForbidden) Code() int {
+	return 403
+}
+
+func (o *RepoCreateFileForbidden) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/contents/{filepath}][%d] repoCreateFileForbidden", 403)
+}
+
+func (o *RepoCreateFileForbidden) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/contents/{filepath}][%d] repoCreateFileForbidden", 403)
+}
+
+func (o *RepoCreateFileForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewRepoCreateFileNotFound creates a RepoCreateFileNotFound with default headers values
+func NewRepoCreateFileNotFound() *RepoCreateFileNotFound {
+	return &RepoCreateFileNotFound{}
+}
+
+/*
+RepoCreateFileNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoCreateFileNotFound struct {
+}
+
+// IsSuccess returns true when this repo create file not found response has a 2xx status code
+func (o *RepoCreateFileNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo create file not found response has a 3xx status code
+func (o *RepoCreateFileNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo create file not found response has a 4xx status code
+func (o *RepoCreateFileNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo create file not found response has a 5xx status code
+func (o *RepoCreateFileNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo create file not found response a status code equal to that given
+func (o *RepoCreateFileNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo create file not found response
+func (o *RepoCreateFileNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoCreateFileNotFound) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/contents/{filepath}][%d] repoCreateFileNotFound", 404)
+}
+
+func (o *RepoCreateFileNotFound) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/contents/{filepath}][%d] repoCreateFileNotFound", 404)
+}
+
+func (o *RepoCreateFileNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewRepoCreateFileUnprocessableEntity creates a RepoCreateFileUnprocessableEntity with default headers values
+func NewRepoCreateFileUnprocessableEntity() *RepoCreateFileUnprocessableEntity {
+	return &RepoCreateFileUnprocessableEntity{}
+}
+
+/*
+RepoCreateFileUnprocessableEntity describes a response with status code 422, with default header values.
+
+APIError is error format response
+*/
+type RepoCreateFileUnprocessableEntity struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo create file unprocessable entity response has a 2xx status code
+func (o *RepoCreateFileUnprocessableEntity) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo create file unprocessable entity response has a 3xx status code
+func (o *RepoCreateFileUnprocessableEntity) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo create file unprocessable entity response has a 4xx status code
+func (o *RepoCreateFileUnprocessableEntity) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo create file unprocessable entity response has a 5xx status code
+func (o *RepoCreateFileUnprocessableEntity) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo create file unprocessable entity response a status code equal to that given
+func (o *RepoCreateFileUnprocessableEntity) IsCode(code int) bool {
+	return code == 422
+}
+
+// Code gets the status code for the repo create file unprocessable entity response
+func (o *RepoCreateFileUnprocessableEntity) Code() int {
+	return 422
+}
+
+func (o *RepoCreateFileUnprocessableEntity) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/contents/{filepath}][%d] repoCreateFileUnprocessableEntity", 422)
+}
+
+func (o *RepoCreateFileUnprocessableEntity) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/contents/{filepath}][%d] repoCreateFileUnprocessableEntity", 422)
+}
+
+func (o *RepoCreateFileUnprocessableEntity) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewRepoCreateFileLocked creates a RepoCreateFileLocked with default headers values
+func NewRepoCreateFileLocked() *RepoCreateFileLocked {
+	return &RepoCreateFileLocked{}
+}
+
+/*
+RepoCreateFileLocked describes a response with status code 423, with default header values.
+
+APIRepoArchivedError is an error that is raised when an archived repo should be modified
+*/
+type RepoCreateFileLocked struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo create file locked response has a 2xx status code
+func (o *RepoCreateFileLocked) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo create file locked response has a 3xx status code
+func (o *RepoCreateFileLocked) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo create file locked response has a 4xx status code
+func (o *RepoCreateFileLocked) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo create file locked response has a 5xx status code
+func (o *RepoCreateFileLocked) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo create file locked response a status code equal to that given
+func (o *RepoCreateFileLocked) IsCode(code int) bool {
+	return code == 423
+}
+
+// Code gets the status code for the repo create file locked response
+func (o *RepoCreateFileLocked) Code() int {
+	return 423
+}
+
+func (o *RepoCreateFileLocked) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/contents/{filepath}][%d] repoCreateFileLocked", 423)
+}
+
+func (o *RepoCreateFileLocked) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/contents/{filepath}][%d] repoCreateFileLocked", 423)
+}
+
+func (o *RepoCreateFileLocked) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_create_hook_parameters.go b/bots-common/gitea-generated/client/repository/repo_create_hook_parameters.go
new file mode 100644
index 0000000..ae17b96
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_create_hook_parameters.go
@@ -0,0 +1,194 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewRepoCreateHookParams creates a new RepoCreateHookParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoCreateHookParams() *RepoCreateHookParams {
+	return &RepoCreateHookParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoCreateHookParamsWithTimeout creates a new RepoCreateHookParams object
+// with the ability to set a timeout on a request.
+func NewRepoCreateHookParamsWithTimeout(timeout time.Duration) *RepoCreateHookParams {
+	return &RepoCreateHookParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoCreateHookParamsWithContext creates a new RepoCreateHookParams object
+// with the ability to set a context for a request.
+func NewRepoCreateHookParamsWithContext(ctx context.Context) *RepoCreateHookParams {
+	return &RepoCreateHookParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoCreateHookParamsWithHTTPClient creates a new RepoCreateHookParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoCreateHookParamsWithHTTPClient(client *http.Client) *RepoCreateHookParams {
+	return &RepoCreateHookParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoCreateHookParams contains all the parameters to send to the API endpoint
+
+	for the repo create hook operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoCreateHookParams struct {
+
+	// Body.
+	Body *models.CreateHookOption
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo create hook params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoCreateHookParams) WithDefaults() *RepoCreateHookParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo create hook params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoCreateHookParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo create hook params
+func (o *RepoCreateHookParams) WithTimeout(timeout time.Duration) *RepoCreateHookParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo create hook params
+func (o *RepoCreateHookParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo create hook params
+func (o *RepoCreateHookParams) WithContext(ctx context.Context) *RepoCreateHookParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo create hook params
+func (o *RepoCreateHookParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo create hook params
+func (o *RepoCreateHookParams) WithHTTPClient(client *http.Client) *RepoCreateHookParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo create hook params
+func (o *RepoCreateHookParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the repo create hook params
+func (o *RepoCreateHookParams) WithBody(body *models.CreateHookOption) *RepoCreateHookParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the repo create hook params
+func (o *RepoCreateHookParams) SetBody(body *models.CreateHookOption) {
+	o.Body = body
+}
+
+// WithOwner adds the owner to the repo create hook params
+func (o *RepoCreateHookParams) WithOwner(owner string) *RepoCreateHookParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo create hook params
+func (o *RepoCreateHookParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo create hook params
+func (o *RepoCreateHookParams) WithRepo(repo string) *RepoCreateHookParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo create hook params
+func (o *RepoCreateHookParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoCreateHookParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_create_hook_responses.go b/bots-common/gitea-generated/client/repository/repo_create_hook_responses.go
new file mode 100644
index 0000000..8fbfbf7
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_create_hook_responses.go
@@ -0,0 +1,168 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoCreateHookReader is a Reader for the RepoCreateHook structure.
+type RepoCreateHookReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoCreateHookReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 201:
+		result := NewRepoCreateHookCreated()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoCreateHookNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[POST /repos/{owner}/{repo}/hooks] repoCreateHook", response, response.Code())
+	}
+}
+
+// NewRepoCreateHookCreated creates a RepoCreateHookCreated with default headers values
+func NewRepoCreateHookCreated() *RepoCreateHookCreated {
+	return &RepoCreateHookCreated{}
+}
+
+/*
+RepoCreateHookCreated describes a response with status code 201, with default header values.
+
+Hook
+*/
+type RepoCreateHookCreated struct {
+	Payload *models.Hook
+}
+
+// IsSuccess returns true when this repo create hook created response has a 2xx status code
+func (o *RepoCreateHookCreated) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo create hook created response has a 3xx status code
+func (o *RepoCreateHookCreated) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo create hook created response has a 4xx status code
+func (o *RepoCreateHookCreated) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo create hook created response has a 5xx status code
+func (o *RepoCreateHookCreated) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo create hook created response a status code equal to that given
+func (o *RepoCreateHookCreated) IsCode(code int) bool {
+	return code == 201
+}
+
+// Code gets the status code for the repo create hook created response
+func (o *RepoCreateHookCreated) Code() int {
+	return 201
+}
+
+func (o *RepoCreateHookCreated) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/hooks][%d] repoCreateHookCreated %s", 201, payload)
+}
+
+func (o *RepoCreateHookCreated) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/hooks][%d] repoCreateHookCreated %s", 201, payload)
+}
+
+func (o *RepoCreateHookCreated) GetPayload() *models.Hook {
+	return o.Payload
+}
+
+func (o *RepoCreateHookCreated) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.Hook)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoCreateHookNotFound creates a RepoCreateHookNotFound with default headers values
+func NewRepoCreateHookNotFound() *RepoCreateHookNotFound {
+	return &RepoCreateHookNotFound{}
+}
+
+/*
+RepoCreateHookNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoCreateHookNotFound struct {
+}
+
+// IsSuccess returns true when this repo create hook not found response has a 2xx status code
+func (o *RepoCreateHookNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo create hook not found response has a 3xx status code
+func (o *RepoCreateHookNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo create hook not found response has a 4xx status code
+func (o *RepoCreateHookNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo create hook not found response has a 5xx status code
+func (o *RepoCreateHookNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo create hook not found response a status code equal to that given
+func (o *RepoCreateHookNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo create hook not found response
+func (o *RepoCreateHookNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoCreateHookNotFound) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/hooks][%d] repoCreateHookNotFound", 404)
+}
+
+func (o *RepoCreateHookNotFound) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/hooks][%d] repoCreateHookNotFound", 404)
+}
+
+func (o *RepoCreateHookNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_create_key_parameters.go b/bots-common/gitea-generated/client/repository/repo_create_key_parameters.go
new file mode 100644
index 0000000..35d5280
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_create_key_parameters.go
@@ -0,0 +1,194 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewRepoCreateKeyParams creates a new RepoCreateKeyParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoCreateKeyParams() *RepoCreateKeyParams {
+	return &RepoCreateKeyParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoCreateKeyParamsWithTimeout creates a new RepoCreateKeyParams object
+// with the ability to set a timeout on a request.
+func NewRepoCreateKeyParamsWithTimeout(timeout time.Duration) *RepoCreateKeyParams {
+	return &RepoCreateKeyParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoCreateKeyParamsWithContext creates a new RepoCreateKeyParams object
+// with the ability to set a context for a request.
+func NewRepoCreateKeyParamsWithContext(ctx context.Context) *RepoCreateKeyParams {
+	return &RepoCreateKeyParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoCreateKeyParamsWithHTTPClient creates a new RepoCreateKeyParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoCreateKeyParamsWithHTTPClient(client *http.Client) *RepoCreateKeyParams {
+	return &RepoCreateKeyParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoCreateKeyParams contains all the parameters to send to the API endpoint
+
+	for the repo create key operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoCreateKeyParams struct {
+
+	// Body.
+	Body *models.CreateKeyOption
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo create key params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoCreateKeyParams) WithDefaults() *RepoCreateKeyParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo create key params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoCreateKeyParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo create key params
+func (o *RepoCreateKeyParams) WithTimeout(timeout time.Duration) *RepoCreateKeyParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo create key params
+func (o *RepoCreateKeyParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo create key params
+func (o *RepoCreateKeyParams) WithContext(ctx context.Context) *RepoCreateKeyParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo create key params
+func (o *RepoCreateKeyParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo create key params
+func (o *RepoCreateKeyParams) WithHTTPClient(client *http.Client) *RepoCreateKeyParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo create key params
+func (o *RepoCreateKeyParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the repo create key params
+func (o *RepoCreateKeyParams) WithBody(body *models.CreateKeyOption) *RepoCreateKeyParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the repo create key params
+func (o *RepoCreateKeyParams) SetBody(body *models.CreateKeyOption) {
+	o.Body = body
+}
+
+// WithOwner adds the owner to the repo create key params
+func (o *RepoCreateKeyParams) WithOwner(owner string) *RepoCreateKeyParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo create key params
+func (o *RepoCreateKeyParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo create key params
+func (o *RepoCreateKeyParams) WithRepo(repo string) *RepoCreateKeyParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo create key params
+func (o *RepoCreateKeyParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoCreateKeyParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_create_key_responses.go b/bots-common/gitea-generated/client/repository/repo_create_key_responses.go
new file mode 100644
index 0000000..2c1239f
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_create_key_responses.go
@@ -0,0 +1,246 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoCreateKeyReader is a Reader for the RepoCreateKey structure.
+type RepoCreateKeyReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoCreateKeyReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 201:
+		result := NewRepoCreateKeyCreated()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoCreateKeyNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 422:
+		result := NewRepoCreateKeyUnprocessableEntity()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[POST /repos/{owner}/{repo}/keys] repoCreateKey", response, response.Code())
+	}
+}
+
+// NewRepoCreateKeyCreated creates a RepoCreateKeyCreated with default headers values
+func NewRepoCreateKeyCreated() *RepoCreateKeyCreated {
+	return &RepoCreateKeyCreated{}
+}
+
+/*
+RepoCreateKeyCreated describes a response with status code 201, with default header values.
+
+DeployKey
+*/
+type RepoCreateKeyCreated struct {
+	Payload *models.DeployKey
+}
+
+// IsSuccess returns true when this repo create key created response has a 2xx status code
+func (o *RepoCreateKeyCreated) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo create key created response has a 3xx status code
+func (o *RepoCreateKeyCreated) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo create key created response has a 4xx status code
+func (o *RepoCreateKeyCreated) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo create key created response has a 5xx status code
+func (o *RepoCreateKeyCreated) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo create key created response a status code equal to that given
+func (o *RepoCreateKeyCreated) IsCode(code int) bool {
+	return code == 201
+}
+
+// Code gets the status code for the repo create key created response
+func (o *RepoCreateKeyCreated) Code() int {
+	return 201
+}
+
+func (o *RepoCreateKeyCreated) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/keys][%d] repoCreateKeyCreated %s", 201, payload)
+}
+
+func (o *RepoCreateKeyCreated) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/keys][%d] repoCreateKeyCreated %s", 201, payload)
+}
+
+func (o *RepoCreateKeyCreated) GetPayload() *models.DeployKey {
+	return o.Payload
+}
+
+func (o *RepoCreateKeyCreated) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.DeployKey)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoCreateKeyNotFound creates a RepoCreateKeyNotFound with default headers values
+func NewRepoCreateKeyNotFound() *RepoCreateKeyNotFound {
+	return &RepoCreateKeyNotFound{}
+}
+
+/*
+RepoCreateKeyNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoCreateKeyNotFound struct {
+}
+
+// IsSuccess returns true when this repo create key not found response has a 2xx status code
+func (o *RepoCreateKeyNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo create key not found response has a 3xx status code
+func (o *RepoCreateKeyNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo create key not found response has a 4xx status code
+func (o *RepoCreateKeyNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo create key not found response has a 5xx status code
+func (o *RepoCreateKeyNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo create key not found response a status code equal to that given
+func (o *RepoCreateKeyNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo create key not found response
+func (o *RepoCreateKeyNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoCreateKeyNotFound) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/keys][%d] repoCreateKeyNotFound", 404)
+}
+
+func (o *RepoCreateKeyNotFound) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/keys][%d] repoCreateKeyNotFound", 404)
+}
+
+func (o *RepoCreateKeyNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewRepoCreateKeyUnprocessableEntity creates a RepoCreateKeyUnprocessableEntity with default headers values
+func NewRepoCreateKeyUnprocessableEntity() *RepoCreateKeyUnprocessableEntity {
+	return &RepoCreateKeyUnprocessableEntity{}
+}
+
+/*
+RepoCreateKeyUnprocessableEntity describes a response with status code 422, with default header values.
+
+APIValidationError is error format response related to input validation
+*/
+type RepoCreateKeyUnprocessableEntity struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo create key unprocessable entity response has a 2xx status code
+func (o *RepoCreateKeyUnprocessableEntity) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo create key unprocessable entity response has a 3xx status code
+func (o *RepoCreateKeyUnprocessableEntity) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo create key unprocessable entity response has a 4xx status code
+func (o *RepoCreateKeyUnprocessableEntity) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo create key unprocessable entity response has a 5xx status code
+func (o *RepoCreateKeyUnprocessableEntity) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo create key unprocessable entity response a status code equal to that given
+func (o *RepoCreateKeyUnprocessableEntity) IsCode(code int) bool {
+	return code == 422
+}
+
+// Code gets the status code for the repo create key unprocessable entity response
+func (o *RepoCreateKeyUnprocessableEntity) Code() int {
+	return 422
+}
+
+func (o *RepoCreateKeyUnprocessableEntity) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/keys][%d] repoCreateKeyUnprocessableEntity", 422)
+}
+
+func (o *RepoCreateKeyUnprocessableEntity) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/keys][%d] repoCreateKeyUnprocessableEntity", 422)
+}
+
+func (o *RepoCreateKeyUnprocessableEntity) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_create_pull_request_parameters.go b/bots-common/gitea-generated/client/repository/repo_create_pull_request_parameters.go
new file mode 100644
index 0000000..28ed954
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_create_pull_request_parameters.go
@@ -0,0 +1,194 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewRepoCreatePullRequestParams creates a new RepoCreatePullRequestParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoCreatePullRequestParams() *RepoCreatePullRequestParams {
+	return &RepoCreatePullRequestParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoCreatePullRequestParamsWithTimeout creates a new RepoCreatePullRequestParams object
+// with the ability to set a timeout on a request.
+func NewRepoCreatePullRequestParamsWithTimeout(timeout time.Duration) *RepoCreatePullRequestParams {
+	return &RepoCreatePullRequestParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoCreatePullRequestParamsWithContext creates a new RepoCreatePullRequestParams object
+// with the ability to set a context for a request.
+func NewRepoCreatePullRequestParamsWithContext(ctx context.Context) *RepoCreatePullRequestParams {
+	return &RepoCreatePullRequestParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoCreatePullRequestParamsWithHTTPClient creates a new RepoCreatePullRequestParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoCreatePullRequestParamsWithHTTPClient(client *http.Client) *RepoCreatePullRequestParams {
+	return &RepoCreatePullRequestParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoCreatePullRequestParams contains all the parameters to send to the API endpoint
+
+	for the repo create pull request operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoCreatePullRequestParams struct {
+
+	// Body.
+	Body *models.CreatePullRequestOption
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo create pull request params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoCreatePullRequestParams) WithDefaults() *RepoCreatePullRequestParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo create pull request params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoCreatePullRequestParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo create pull request params
+func (o *RepoCreatePullRequestParams) WithTimeout(timeout time.Duration) *RepoCreatePullRequestParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo create pull request params
+func (o *RepoCreatePullRequestParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo create pull request params
+func (o *RepoCreatePullRequestParams) WithContext(ctx context.Context) *RepoCreatePullRequestParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo create pull request params
+func (o *RepoCreatePullRequestParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo create pull request params
+func (o *RepoCreatePullRequestParams) WithHTTPClient(client *http.Client) *RepoCreatePullRequestParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo create pull request params
+func (o *RepoCreatePullRequestParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the repo create pull request params
+func (o *RepoCreatePullRequestParams) WithBody(body *models.CreatePullRequestOption) *RepoCreatePullRequestParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the repo create pull request params
+func (o *RepoCreatePullRequestParams) SetBody(body *models.CreatePullRequestOption) {
+	o.Body = body
+}
+
+// WithOwner adds the owner to the repo create pull request params
+func (o *RepoCreatePullRequestParams) WithOwner(owner string) *RepoCreatePullRequestParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo create pull request params
+func (o *RepoCreatePullRequestParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo create pull request params
+func (o *RepoCreatePullRequestParams) WithRepo(repo string) *RepoCreatePullRequestParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo create pull request params
+func (o *RepoCreatePullRequestParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoCreatePullRequestParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_create_pull_request_responses.go b/bots-common/gitea-generated/client/repository/repo_create_pull_request_responses.go
new file mode 100644
index 0000000..f47a013
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_create_pull_request_responses.go
@@ -0,0 +1,480 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoCreatePullRequestReader is a Reader for the RepoCreatePullRequest structure.
+type RepoCreatePullRequestReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoCreatePullRequestReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 201:
+		result := NewRepoCreatePullRequestCreated()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 403:
+		result := NewRepoCreatePullRequestForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewRepoCreatePullRequestNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 409:
+		result := NewRepoCreatePullRequestConflict()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 422:
+		result := NewRepoCreatePullRequestUnprocessableEntity()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 423:
+		result := NewRepoCreatePullRequestLocked()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[POST /repos/{owner}/{repo}/pulls] repoCreatePullRequest", response, response.Code())
+	}
+}
+
+// NewRepoCreatePullRequestCreated creates a RepoCreatePullRequestCreated with default headers values
+func NewRepoCreatePullRequestCreated() *RepoCreatePullRequestCreated {
+	return &RepoCreatePullRequestCreated{}
+}
+
+/*
+RepoCreatePullRequestCreated describes a response with status code 201, with default header values.
+
+PullRequest
+*/
+type RepoCreatePullRequestCreated struct {
+	Payload *models.PullRequest
+}
+
+// IsSuccess returns true when this repo create pull request created response has a 2xx status code
+func (o *RepoCreatePullRequestCreated) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo create pull request created response has a 3xx status code
+func (o *RepoCreatePullRequestCreated) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo create pull request created response has a 4xx status code
+func (o *RepoCreatePullRequestCreated) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo create pull request created response has a 5xx status code
+func (o *RepoCreatePullRequestCreated) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo create pull request created response a status code equal to that given
+func (o *RepoCreatePullRequestCreated) IsCode(code int) bool {
+	return code == 201
+}
+
+// Code gets the status code for the repo create pull request created response
+func (o *RepoCreatePullRequestCreated) Code() int {
+	return 201
+}
+
+func (o *RepoCreatePullRequestCreated) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/pulls][%d] repoCreatePullRequestCreated %s", 201, payload)
+}
+
+func (o *RepoCreatePullRequestCreated) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/pulls][%d] repoCreatePullRequestCreated %s", 201, payload)
+}
+
+func (o *RepoCreatePullRequestCreated) GetPayload() *models.PullRequest {
+	return o.Payload
+}
+
+func (o *RepoCreatePullRequestCreated) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.PullRequest)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoCreatePullRequestForbidden creates a RepoCreatePullRequestForbidden with default headers values
+func NewRepoCreatePullRequestForbidden() *RepoCreatePullRequestForbidden {
+	return &RepoCreatePullRequestForbidden{}
+}
+
+/*
+RepoCreatePullRequestForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type RepoCreatePullRequestForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo create pull request forbidden response has a 2xx status code
+func (o *RepoCreatePullRequestForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo create pull request forbidden response has a 3xx status code
+func (o *RepoCreatePullRequestForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo create pull request forbidden response has a 4xx status code
+func (o *RepoCreatePullRequestForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo create pull request forbidden response has a 5xx status code
+func (o *RepoCreatePullRequestForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo create pull request forbidden response a status code equal to that given
+func (o *RepoCreatePullRequestForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the repo create pull request forbidden response
+func (o *RepoCreatePullRequestForbidden) Code() int {
+	return 403
+}
+
+func (o *RepoCreatePullRequestForbidden) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/pulls][%d] repoCreatePullRequestForbidden", 403)
+}
+
+func (o *RepoCreatePullRequestForbidden) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/pulls][%d] repoCreatePullRequestForbidden", 403)
+}
+
+func (o *RepoCreatePullRequestForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewRepoCreatePullRequestNotFound creates a RepoCreatePullRequestNotFound with default headers values
+func NewRepoCreatePullRequestNotFound() *RepoCreatePullRequestNotFound {
+	return &RepoCreatePullRequestNotFound{}
+}
+
+/*
+RepoCreatePullRequestNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoCreatePullRequestNotFound struct {
+}
+
+// IsSuccess returns true when this repo create pull request not found response has a 2xx status code
+func (o *RepoCreatePullRequestNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo create pull request not found response has a 3xx status code
+func (o *RepoCreatePullRequestNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo create pull request not found response has a 4xx status code
+func (o *RepoCreatePullRequestNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo create pull request not found response has a 5xx status code
+func (o *RepoCreatePullRequestNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo create pull request not found response a status code equal to that given
+func (o *RepoCreatePullRequestNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo create pull request not found response
+func (o *RepoCreatePullRequestNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoCreatePullRequestNotFound) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/pulls][%d] repoCreatePullRequestNotFound", 404)
+}
+
+func (o *RepoCreatePullRequestNotFound) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/pulls][%d] repoCreatePullRequestNotFound", 404)
+}
+
+func (o *RepoCreatePullRequestNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewRepoCreatePullRequestConflict creates a RepoCreatePullRequestConflict with default headers values
+func NewRepoCreatePullRequestConflict() *RepoCreatePullRequestConflict {
+	return &RepoCreatePullRequestConflict{}
+}
+
+/*
+RepoCreatePullRequestConflict describes a response with status code 409, with default header values.
+
+APIError is error format response
+*/
+type RepoCreatePullRequestConflict struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo create pull request conflict response has a 2xx status code
+func (o *RepoCreatePullRequestConflict) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo create pull request conflict response has a 3xx status code
+func (o *RepoCreatePullRequestConflict) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo create pull request conflict response has a 4xx status code
+func (o *RepoCreatePullRequestConflict) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo create pull request conflict response has a 5xx status code
+func (o *RepoCreatePullRequestConflict) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo create pull request conflict response a status code equal to that given
+func (o *RepoCreatePullRequestConflict) IsCode(code int) bool {
+	return code == 409
+}
+
+// Code gets the status code for the repo create pull request conflict response
+func (o *RepoCreatePullRequestConflict) Code() int {
+	return 409
+}
+
+func (o *RepoCreatePullRequestConflict) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/pulls][%d] repoCreatePullRequestConflict", 409)
+}
+
+func (o *RepoCreatePullRequestConflict) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/pulls][%d] repoCreatePullRequestConflict", 409)
+}
+
+func (o *RepoCreatePullRequestConflict) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewRepoCreatePullRequestUnprocessableEntity creates a RepoCreatePullRequestUnprocessableEntity with default headers values
+func NewRepoCreatePullRequestUnprocessableEntity() *RepoCreatePullRequestUnprocessableEntity {
+	return &RepoCreatePullRequestUnprocessableEntity{}
+}
+
+/*
+RepoCreatePullRequestUnprocessableEntity describes a response with status code 422, with default header values.
+
+APIValidationError is error format response related to input validation
+*/
+type RepoCreatePullRequestUnprocessableEntity struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo create pull request unprocessable entity response has a 2xx status code
+func (o *RepoCreatePullRequestUnprocessableEntity) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo create pull request unprocessable entity response has a 3xx status code
+func (o *RepoCreatePullRequestUnprocessableEntity) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo create pull request unprocessable entity response has a 4xx status code
+func (o *RepoCreatePullRequestUnprocessableEntity) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo create pull request unprocessable entity response has a 5xx status code
+func (o *RepoCreatePullRequestUnprocessableEntity) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo create pull request unprocessable entity response a status code equal to that given
+func (o *RepoCreatePullRequestUnprocessableEntity) IsCode(code int) bool {
+	return code == 422
+}
+
+// Code gets the status code for the repo create pull request unprocessable entity response
+func (o *RepoCreatePullRequestUnprocessableEntity) Code() int {
+	return 422
+}
+
+func (o *RepoCreatePullRequestUnprocessableEntity) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/pulls][%d] repoCreatePullRequestUnprocessableEntity", 422)
+}
+
+func (o *RepoCreatePullRequestUnprocessableEntity) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/pulls][%d] repoCreatePullRequestUnprocessableEntity", 422)
+}
+
+func (o *RepoCreatePullRequestUnprocessableEntity) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewRepoCreatePullRequestLocked creates a RepoCreatePullRequestLocked with default headers values
+func NewRepoCreatePullRequestLocked() *RepoCreatePullRequestLocked {
+	return &RepoCreatePullRequestLocked{}
+}
+
+/*
+RepoCreatePullRequestLocked describes a response with status code 423, with default header values.
+
+APIRepoArchivedError is an error that is raised when an archived repo should be modified
+*/
+type RepoCreatePullRequestLocked struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo create pull request locked response has a 2xx status code
+func (o *RepoCreatePullRequestLocked) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo create pull request locked response has a 3xx status code
+func (o *RepoCreatePullRequestLocked) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo create pull request locked response has a 4xx status code
+func (o *RepoCreatePullRequestLocked) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo create pull request locked response has a 5xx status code
+func (o *RepoCreatePullRequestLocked) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo create pull request locked response a status code equal to that given
+func (o *RepoCreatePullRequestLocked) IsCode(code int) bool {
+	return code == 423
+}
+
+// Code gets the status code for the repo create pull request locked response
+func (o *RepoCreatePullRequestLocked) Code() int {
+	return 423
+}
+
+func (o *RepoCreatePullRequestLocked) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/pulls][%d] repoCreatePullRequestLocked", 423)
+}
+
+func (o *RepoCreatePullRequestLocked) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/pulls][%d] repoCreatePullRequestLocked", 423)
+}
+
+func (o *RepoCreatePullRequestLocked) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_create_pull_review_parameters.go b/bots-common/gitea-generated/client/repository/repo_create_pull_review_parameters.go
new file mode 100644
index 0000000..8c18d7f
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_create_pull_review_parameters.go
@@ -0,0 +1,219 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewRepoCreatePullReviewParams creates a new RepoCreatePullReviewParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoCreatePullReviewParams() *RepoCreatePullReviewParams {
+	return &RepoCreatePullReviewParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoCreatePullReviewParamsWithTimeout creates a new RepoCreatePullReviewParams object
+// with the ability to set a timeout on a request.
+func NewRepoCreatePullReviewParamsWithTimeout(timeout time.Duration) *RepoCreatePullReviewParams {
+	return &RepoCreatePullReviewParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoCreatePullReviewParamsWithContext creates a new RepoCreatePullReviewParams object
+// with the ability to set a context for a request.
+func NewRepoCreatePullReviewParamsWithContext(ctx context.Context) *RepoCreatePullReviewParams {
+	return &RepoCreatePullReviewParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoCreatePullReviewParamsWithHTTPClient creates a new RepoCreatePullReviewParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoCreatePullReviewParamsWithHTTPClient(client *http.Client) *RepoCreatePullReviewParams {
+	return &RepoCreatePullReviewParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoCreatePullReviewParams contains all the parameters to send to the API endpoint
+
+	for the repo create pull review operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoCreatePullReviewParams struct {
+
+	// Body.
+	Body *models.CreatePullReviewOptions
+
+	/* Index.
+
+	   index of the pull request
+
+	   Format: int64
+	*/
+	Index int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo create pull review params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoCreatePullReviewParams) WithDefaults() *RepoCreatePullReviewParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo create pull review params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoCreatePullReviewParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo create pull review params
+func (o *RepoCreatePullReviewParams) WithTimeout(timeout time.Duration) *RepoCreatePullReviewParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo create pull review params
+func (o *RepoCreatePullReviewParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo create pull review params
+func (o *RepoCreatePullReviewParams) WithContext(ctx context.Context) *RepoCreatePullReviewParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo create pull review params
+func (o *RepoCreatePullReviewParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo create pull review params
+func (o *RepoCreatePullReviewParams) WithHTTPClient(client *http.Client) *RepoCreatePullReviewParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo create pull review params
+func (o *RepoCreatePullReviewParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the repo create pull review params
+func (o *RepoCreatePullReviewParams) WithBody(body *models.CreatePullReviewOptions) *RepoCreatePullReviewParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the repo create pull review params
+func (o *RepoCreatePullReviewParams) SetBody(body *models.CreatePullReviewOptions) {
+	o.Body = body
+}
+
+// WithIndex adds the index to the repo create pull review params
+func (o *RepoCreatePullReviewParams) WithIndex(index int64) *RepoCreatePullReviewParams {
+	o.SetIndex(index)
+	return o
+}
+
+// SetIndex adds the index to the repo create pull review params
+func (o *RepoCreatePullReviewParams) SetIndex(index int64) {
+	o.Index = index
+}
+
+// WithOwner adds the owner to the repo create pull review params
+func (o *RepoCreatePullReviewParams) WithOwner(owner string) *RepoCreatePullReviewParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo create pull review params
+func (o *RepoCreatePullReviewParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo create pull review params
+func (o *RepoCreatePullReviewParams) WithRepo(repo string) *RepoCreatePullReviewParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo create pull review params
+func (o *RepoCreatePullReviewParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoCreatePullReviewParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	// path param index
+	if err := r.SetPathParam("index", swag.FormatInt64(o.Index)); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_create_pull_review_requests_parameters.go b/bots-common/gitea-generated/client/repository/repo_create_pull_review_requests_parameters.go
new file mode 100644
index 0000000..7fb638f
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_create_pull_review_requests_parameters.go
@@ -0,0 +1,219 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewRepoCreatePullReviewRequestsParams creates a new RepoCreatePullReviewRequestsParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoCreatePullReviewRequestsParams() *RepoCreatePullReviewRequestsParams {
+	return &RepoCreatePullReviewRequestsParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoCreatePullReviewRequestsParamsWithTimeout creates a new RepoCreatePullReviewRequestsParams object
+// with the ability to set a timeout on a request.
+func NewRepoCreatePullReviewRequestsParamsWithTimeout(timeout time.Duration) *RepoCreatePullReviewRequestsParams {
+	return &RepoCreatePullReviewRequestsParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoCreatePullReviewRequestsParamsWithContext creates a new RepoCreatePullReviewRequestsParams object
+// with the ability to set a context for a request.
+func NewRepoCreatePullReviewRequestsParamsWithContext(ctx context.Context) *RepoCreatePullReviewRequestsParams {
+	return &RepoCreatePullReviewRequestsParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoCreatePullReviewRequestsParamsWithHTTPClient creates a new RepoCreatePullReviewRequestsParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoCreatePullReviewRequestsParamsWithHTTPClient(client *http.Client) *RepoCreatePullReviewRequestsParams {
+	return &RepoCreatePullReviewRequestsParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoCreatePullReviewRequestsParams contains all the parameters to send to the API endpoint
+
+	for the repo create pull review requests operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoCreatePullReviewRequestsParams struct {
+
+	// Body.
+	Body *models.PullReviewRequestOptions
+
+	/* Index.
+
+	   index of the pull request
+
+	   Format: int64
+	*/
+	Index int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo create pull review requests params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoCreatePullReviewRequestsParams) WithDefaults() *RepoCreatePullReviewRequestsParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo create pull review requests params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoCreatePullReviewRequestsParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo create pull review requests params
+func (o *RepoCreatePullReviewRequestsParams) WithTimeout(timeout time.Duration) *RepoCreatePullReviewRequestsParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo create pull review requests params
+func (o *RepoCreatePullReviewRequestsParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo create pull review requests params
+func (o *RepoCreatePullReviewRequestsParams) WithContext(ctx context.Context) *RepoCreatePullReviewRequestsParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo create pull review requests params
+func (o *RepoCreatePullReviewRequestsParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo create pull review requests params
+func (o *RepoCreatePullReviewRequestsParams) WithHTTPClient(client *http.Client) *RepoCreatePullReviewRequestsParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo create pull review requests params
+func (o *RepoCreatePullReviewRequestsParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the repo create pull review requests params
+func (o *RepoCreatePullReviewRequestsParams) WithBody(body *models.PullReviewRequestOptions) *RepoCreatePullReviewRequestsParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the repo create pull review requests params
+func (o *RepoCreatePullReviewRequestsParams) SetBody(body *models.PullReviewRequestOptions) {
+	o.Body = body
+}
+
+// WithIndex adds the index to the repo create pull review requests params
+func (o *RepoCreatePullReviewRequestsParams) WithIndex(index int64) *RepoCreatePullReviewRequestsParams {
+	o.SetIndex(index)
+	return o
+}
+
+// SetIndex adds the index to the repo create pull review requests params
+func (o *RepoCreatePullReviewRequestsParams) SetIndex(index int64) {
+	o.Index = index
+}
+
+// WithOwner adds the owner to the repo create pull review requests params
+func (o *RepoCreatePullReviewRequestsParams) WithOwner(owner string) *RepoCreatePullReviewRequestsParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo create pull review requests params
+func (o *RepoCreatePullReviewRequestsParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo create pull review requests params
+func (o *RepoCreatePullReviewRequestsParams) WithRepo(repo string) *RepoCreatePullReviewRequestsParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo create pull review requests params
+func (o *RepoCreatePullReviewRequestsParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoCreatePullReviewRequestsParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	// path param index
+	if err := r.SetPathParam("index", swag.FormatInt64(o.Index)); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_create_pull_review_requests_responses.go b/bots-common/gitea-generated/client/repository/repo_create_pull_review_requests_responses.go
new file mode 100644
index 0000000..fc71d27
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_create_pull_review_requests_responses.go
@@ -0,0 +1,244 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoCreatePullReviewRequestsReader is a Reader for the RepoCreatePullReviewRequests structure.
+type RepoCreatePullReviewRequestsReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoCreatePullReviewRequestsReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 201:
+		result := NewRepoCreatePullReviewRequestsCreated()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoCreatePullReviewRequestsNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 422:
+		result := NewRepoCreatePullReviewRequestsUnprocessableEntity()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[POST /repos/{owner}/{repo}/pulls/{index}/requested_reviewers] repoCreatePullReviewRequests", response, response.Code())
+	}
+}
+
+// NewRepoCreatePullReviewRequestsCreated creates a RepoCreatePullReviewRequestsCreated with default headers values
+func NewRepoCreatePullReviewRequestsCreated() *RepoCreatePullReviewRequestsCreated {
+	return &RepoCreatePullReviewRequestsCreated{}
+}
+
+/*
+RepoCreatePullReviewRequestsCreated describes a response with status code 201, with default header values.
+
+PullReviewList
+*/
+type RepoCreatePullReviewRequestsCreated struct {
+	Payload []*models.PullReview
+}
+
+// IsSuccess returns true when this repo create pull review requests created response has a 2xx status code
+func (o *RepoCreatePullReviewRequestsCreated) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo create pull review requests created response has a 3xx status code
+func (o *RepoCreatePullReviewRequestsCreated) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo create pull review requests created response has a 4xx status code
+func (o *RepoCreatePullReviewRequestsCreated) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo create pull review requests created response has a 5xx status code
+func (o *RepoCreatePullReviewRequestsCreated) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo create pull review requests created response a status code equal to that given
+func (o *RepoCreatePullReviewRequestsCreated) IsCode(code int) bool {
+	return code == 201
+}
+
+// Code gets the status code for the repo create pull review requests created response
+func (o *RepoCreatePullReviewRequestsCreated) Code() int {
+	return 201
+}
+
+func (o *RepoCreatePullReviewRequestsCreated) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/pulls/{index}/requested_reviewers][%d] repoCreatePullReviewRequestsCreated %s", 201, payload)
+}
+
+func (o *RepoCreatePullReviewRequestsCreated) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/pulls/{index}/requested_reviewers][%d] repoCreatePullReviewRequestsCreated %s", 201, payload)
+}
+
+func (o *RepoCreatePullReviewRequestsCreated) GetPayload() []*models.PullReview {
+	return o.Payload
+}
+
+func (o *RepoCreatePullReviewRequestsCreated) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoCreatePullReviewRequestsNotFound creates a RepoCreatePullReviewRequestsNotFound with default headers values
+func NewRepoCreatePullReviewRequestsNotFound() *RepoCreatePullReviewRequestsNotFound {
+	return &RepoCreatePullReviewRequestsNotFound{}
+}
+
+/*
+RepoCreatePullReviewRequestsNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoCreatePullReviewRequestsNotFound struct {
+}
+
+// IsSuccess returns true when this repo create pull review requests not found response has a 2xx status code
+func (o *RepoCreatePullReviewRequestsNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo create pull review requests not found response has a 3xx status code
+func (o *RepoCreatePullReviewRequestsNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo create pull review requests not found response has a 4xx status code
+func (o *RepoCreatePullReviewRequestsNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo create pull review requests not found response has a 5xx status code
+func (o *RepoCreatePullReviewRequestsNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo create pull review requests not found response a status code equal to that given
+func (o *RepoCreatePullReviewRequestsNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo create pull review requests not found response
+func (o *RepoCreatePullReviewRequestsNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoCreatePullReviewRequestsNotFound) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/pulls/{index}/requested_reviewers][%d] repoCreatePullReviewRequestsNotFound", 404)
+}
+
+func (o *RepoCreatePullReviewRequestsNotFound) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/pulls/{index}/requested_reviewers][%d] repoCreatePullReviewRequestsNotFound", 404)
+}
+
+func (o *RepoCreatePullReviewRequestsNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewRepoCreatePullReviewRequestsUnprocessableEntity creates a RepoCreatePullReviewRequestsUnprocessableEntity with default headers values
+func NewRepoCreatePullReviewRequestsUnprocessableEntity() *RepoCreatePullReviewRequestsUnprocessableEntity {
+	return &RepoCreatePullReviewRequestsUnprocessableEntity{}
+}
+
+/*
+RepoCreatePullReviewRequestsUnprocessableEntity describes a response with status code 422, with default header values.
+
+APIValidationError is error format response related to input validation
+*/
+type RepoCreatePullReviewRequestsUnprocessableEntity struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo create pull review requests unprocessable entity response has a 2xx status code
+func (o *RepoCreatePullReviewRequestsUnprocessableEntity) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo create pull review requests unprocessable entity response has a 3xx status code
+func (o *RepoCreatePullReviewRequestsUnprocessableEntity) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo create pull review requests unprocessable entity response has a 4xx status code
+func (o *RepoCreatePullReviewRequestsUnprocessableEntity) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo create pull review requests unprocessable entity response has a 5xx status code
+func (o *RepoCreatePullReviewRequestsUnprocessableEntity) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo create pull review requests unprocessable entity response a status code equal to that given
+func (o *RepoCreatePullReviewRequestsUnprocessableEntity) IsCode(code int) bool {
+	return code == 422
+}
+
+// Code gets the status code for the repo create pull review requests unprocessable entity response
+func (o *RepoCreatePullReviewRequestsUnprocessableEntity) Code() int {
+	return 422
+}
+
+func (o *RepoCreatePullReviewRequestsUnprocessableEntity) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/pulls/{index}/requested_reviewers][%d] repoCreatePullReviewRequestsUnprocessableEntity", 422)
+}
+
+func (o *RepoCreatePullReviewRequestsUnprocessableEntity) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/pulls/{index}/requested_reviewers][%d] repoCreatePullReviewRequestsUnprocessableEntity", 422)
+}
+
+func (o *RepoCreatePullReviewRequestsUnprocessableEntity) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_create_pull_review_responses.go b/bots-common/gitea-generated/client/repository/repo_create_pull_review_responses.go
new file mode 100644
index 0000000..5adbb77
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_create_pull_review_responses.go
@@ -0,0 +1,246 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoCreatePullReviewReader is a Reader for the RepoCreatePullReview structure.
+type RepoCreatePullReviewReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoCreatePullReviewReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoCreatePullReviewOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoCreatePullReviewNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 422:
+		result := NewRepoCreatePullReviewUnprocessableEntity()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[POST /repos/{owner}/{repo}/pulls/{index}/reviews] repoCreatePullReview", response, response.Code())
+	}
+}
+
+// NewRepoCreatePullReviewOK creates a RepoCreatePullReviewOK with default headers values
+func NewRepoCreatePullReviewOK() *RepoCreatePullReviewOK {
+	return &RepoCreatePullReviewOK{}
+}
+
+/*
+RepoCreatePullReviewOK describes a response with status code 200, with default header values.
+
+PullReview
+*/
+type RepoCreatePullReviewOK struct {
+	Payload *models.PullReview
+}
+
+// IsSuccess returns true when this repo create pull review o k response has a 2xx status code
+func (o *RepoCreatePullReviewOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo create pull review o k response has a 3xx status code
+func (o *RepoCreatePullReviewOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo create pull review o k response has a 4xx status code
+func (o *RepoCreatePullReviewOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo create pull review o k response has a 5xx status code
+func (o *RepoCreatePullReviewOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo create pull review o k response a status code equal to that given
+func (o *RepoCreatePullReviewOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo create pull review o k response
+func (o *RepoCreatePullReviewOK) Code() int {
+	return 200
+}
+
+func (o *RepoCreatePullReviewOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/pulls/{index}/reviews][%d] repoCreatePullReviewOK %s", 200, payload)
+}
+
+func (o *RepoCreatePullReviewOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/pulls/{index}/reviews][%d] repoCreatePullReviewOK %s", 200, payload)
+}
+
+func (o *RepoCreatePullReviewOK) GetPayload() *models.PullReview {
+	return o.Payload
+}
+
+func (o *RepoCreatePullReviewOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.PullReview)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoCreatePullReviewNotFound creates a RepoCreatePullReviewNotFound with default headers values
+func NewRepoCreatePullReviewNotFound() *RepoCreatePullReviewNotFound {
+	return &RepoCreatePullReviewNotFound{}
+}
+
+/*
+RepoCreatePullReviewNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoCreatePullReviewNotFound struct {
+}
+
+// IsSuccess returns true when this repo create pull review not found response has a 2xx status code
+func (o *RepoCreatePullReviewNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo create pull review not found response has a 3xx status code
+func (o *RepoCreatePullReviewNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo create pull review not found response has a 4xx status code
+func (o *RepoCreatePullReviewNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo create pull review not found response has a 5xx status code
+func (o *RepoCreatePullReviewNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo create pull review not found response a status code equal to that given
+func (o *RepoCreatePullReviewNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo create pull review not found response
+func (o *RepoCreatePullReviewNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoCreatePullReviewNotFound) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/pulls/{index}/reviews][%d] repoCreatePullReviewNotFound", 404)
+}
+
+func (o *RepoCreatePullReviewNotFound) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/pulls/{index}/reviews][%d] repoCreatePullReviewNotFound", 404)
+}
+
+func (o *RepoCreatePullReviewNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewRepoCreatePullReviewUnprocessableEntity creates a RepoCreatePullReviewUnprocessableEntity with default headers values
+func NewRepoCreatePullReviewUnprocessableEntity() *RepoCreatePullReviewUnprocessableEntity {
+	return &RepoCreatePullReviewUnprocessableEntity{}
+}
+
+/*
+RepoCreatePullReviewUnprocessableEntity describes a response with status code 422, with default header values.
+
+APIValidationError is error format response related to input validation
+*/
+type RepoCreatePullReviewUnprocessableEntity struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo create pull review unprocessable entity response has a 2xx status code
+func (o *RepoCreatePullReviewUnprocessableEntity) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo create pull review unprocessable entity response has a 3xx status code
+func (o *RepoCreatePullReviewUnprocessableEntity) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo create pull review unprocessable entity response has a 4xx status code
+func (o *RepoCreatePullReviewUnprocessableEntity) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo create pull review unprocessable entity response has a 5xx status code
+func (o *RepoCreatePullReviewUnprocessableEntity) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo create pull review unprocessable entity response a status code equal to that given
+func (o *RepoCreatePullReviewUnprocessableEntity) IsCode(code int) bool {
+	return code == 422
+}
+
+// Code gets the status code for the repo create pull review unprocessable entity response
+func (o *RepoCreatePullReviewUnprocessableEntity) Code() int {
+	return 422
+}
+
+func (o *RepoCreatePullReviewUnprocessableEntity) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/pulls/{index}/reviews][%d] repoCreatePullReviewUnprocessableEntity", 422)
+}
+
+func (o *RepoCreatePullReviewUnprocessableEntity) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/pulls/{index}/reviews][%d] repoCreatePullReviewUnprocessableEntity", 422)
+}
+
+func (o *RepoCreatePullReviewUnprocessableEntity) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_create_release_attachment_parameters.go b/bots-common/gitea-generated/client/repository/repo_create_release_attachment_parameters.go
new file mode 100644
index 0000000..e233b7b
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_create_release_attachment_parameters.go
@@ -0,0 +1,259 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewRepoCreateReleaseAttachmentParams creates a new RepoCreateReleaseAttachmentParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoCreateReleaseAttachmentParams() *RepoCreateReleaseAttachmentParams {
+	return &RepoCreateReleaseAttachmentParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoCreateReleaseAttachmentParamsWithTimeout creates a new RepoCreateReleaseAttachmentParams object
+// with the ability to set a timeout on a request.
+func NewRepoCreateReleaseAttachmentParamsWithTimeout(timeout time.Duration) *RepoCreateReleaseAttachmentParams {
+	return &RepoCreateReleaseAttachmentParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoCreateReleaseAttachmentParamsWithContext creates a new RepoCreateReleaseAttachmentParams object
+// with the ability to set a context for a request.
+func NewRepoCreateReleaseAttachmentParamsWithContext(ctx context.Context) *RepoCreateReleaseAttachmentParams {
+	return &RepoCreateReleaseAttachmentParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoCreateReleaseAttachmentParamsWithHTTPClient creates a new RepoCreateReleaseAttachmentParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoCreateReleaseAttachmentParamsWithHTTPClient(client *http.Client) *RepoCreateReleaseAttachmentParams {
+	return &RepoCreateReleaseAttachmentParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoCreateReleaseAttachmentParams contains all the parameters to send to the API endpoint
+
+	for the repo create release attachment operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoCreateReleaseAttachmentParams struct {
+
+	/* Attachment.
+
+	   attachment to upload
+	*/
+	Attachment runtime.NamedReadCloser
+
+	/* ID.
+
+	   id of the release
+
+	   Format: int64
+	*/
+	ID int64
+
+	/* Name.
+
+	   name of the attachment
+	*/
+	Name *string
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo create release attachment params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoCreateReleaseAttachmentParams) WithDefaults() *RepoCreateReleaseAttachmentParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo create release attachment params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoCreateReleaseAttachmentParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo create release attachment params
+func (o *RepoCreateReleaseAttachmentParams) WithTimeout(timeout time.Duration) *RepoCreateReleaseAttachmentParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo create release attachment params
+func (o *RepoCreateReleaseAttachmentParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo create release attachment params
+func (o *RepoCreateReleaseAttachmentParams) WithContext(ctx context.Context) *RepoCreateReleaseAttachmentParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo create release attachment params
+func (o *RepoCreateReleaseAttachmentParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo create release attachment params
+func (o *RepoCreateReleaseAttachmentParams) WithHTTPClient(client *http.Client) *RepoCreateReleaseAttachmentParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo create release attachment params
+func (o *RepoCreateReleaseAttachmentParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithAttachment adds the attachment to the repo create release attachment params
+func (o *RepoCreateReleaseAttachmentParams) WithAttachment(attachment runtime.NamedReadCloser) *RepoCreateReleaseAttachmentParams {
+	o.SetAttachment(attachment)
+	return o
+}
+
+// SetAttachment adds the attachment to the repo create release attachment params
+func (o *RepoCreateReleaseAttachmentParams) SetAttachment(attachment runtime.NamedReadCloser) {
+	o.Attachment = attachment
+}
+
+// WithID adds the id to the repo create release attachment params
+func (o *RepoCreateReleaseAttachmentParams) WithID(id int64) *RepoCreateReleaseAttachmentParams {
+	o.SetID(id)
+	return o
+}
+
+// SetID adds the id to the repo create release attachment params
+func (o *RepoCreateReleaseAttachmentParams) SetID(id int64) {
+	o.ID = id
+}
+
+// WithName adds the name to the repo create release attachment params
+func (o *RepoCreateReleaseAttachmentParams) WithName(name *string) *RepoCreateReleaseAttachmentParams {
+	o.SetName(name)
+	return o
+}
+
+// SetName adds the name to the repo create release attachment params
+func (o *RepoCreateReleaseAttachmentParams) SetName(name *string) {
+	o.Name = name
+}
+
+// WithOwner adds the owner to the repo create release attachment params
+func (o *RepoCreateReleaseAttachmentParams) WithOwner(owner string) *RepoCreateReleaseAttachmentParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo create release attachment params
+func (o *RepoCreateReleaseAttachmentParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo create release attachment params
+func (o *RepoCreateReleaseAttachmentParams) WithRepo(repo string) *RepoCreateReleaseAttachmentParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo create release attachment params
+func (o *RepoCreateReleaseAttachmentParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoCreateReleaseAttachmentParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.Attachment != nil {
+
+		if o.Attachment != nil {
+			// form file param attachment
+			if err := r.SetFileParam("attachment", o.Attachment); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param id
+	if err := r.SetPathParam("id", swag.FormatInt64(o.ID)); err != nil {
+		return err
+	}
+
+	if o.Name != nil {
+
+		// query param name
+		var qrName string
+
+		if o.Name != nil {
+			qrName = *o.Name
+		}
+		qName := qrName
+		if qName != "" {
+
+			if err := r.SetQueryParam("name", qName); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_create_release_attachment_responses.go b/bots-common/gitea-generated/client/repository/repo_create_release_attachment_responses.go
new file mode 100644
index 0000000..2f4fa5d
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_create_release_attachment_responses.go
@@ -0,0 +1,246 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoCreateReleaseAttachmentReader is a Reader for the RepoCreateReleaseAttachment structure.
+type RepoCreateReleaseAttachmentReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoCreateReleaseAttachmentReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 201:
+		result := NewRepoCreateReleaseAttachmentCreated()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 400:
+		result := NewRepoCreateReleaseAttachmentBadRequest()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewRepoCreateReleaseAttachmentNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[POST /repos/{owner}/{repo}/releases/{id}/assets] repoCreateReleaseAttachment", response, response.Code())
+	}
+}
+
+// NewRepoCreateReleaseAttachmentCreated creates a RepoCreateReleaseAttachmentCreated with default headers values
+func NewRepoCreateReleaseAttachmentCreated() *RepoCreateReleaseAttachmentCreated {
+	return &RepoCreateReleaseAttachmentCreated{}
+}
+
+/*
+RepoCreateReleaseAttachmentCreated describes a response with status code 201, with default header values.
+
+Attachment
+*/
+type RepoCreateReleaseAttachmentCreated struct {
+	Payload *models.Attachment
+}
+
+// IsSuccess returns true when this repo create release attachment created response has a 2xx status code
+func (o *RepoCreateReleaseAttachmentCreated) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo create release attachment created response has a 3xx status code
+func (o *RepoCreateReleaseAttachmentCreated) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo create release attachment created response has a 4xx status code
+func (o *RepoCreateReleaseAttachmentCreated) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo create release attachment created response has a 5xx status code
+func (o *RepoCreateReleaseAttachmentCreated) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo create release attachment created response a status code equal to that given
+func (o *RepoCreateReleaseAttachmentCreated) IsCode(code int) bool {
+	return code == 201
+}
+
+// Code gets the status code for the repo create release attachment created response
+func (o *RepoCreateReleaseAttachmentCreated) Code() int {
+	return 201
+}
+
+func (o *RepoCreateReleaseAttachmentCreated) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/releases/{id}/assets][%d] repoCreateReleaseAttachmentCreated %s", 201, payload)
+}
+
+func (o *RepoCreateReleaseAttachmentCreated) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/releases/{id}/assets][%d] repoCreateReleaseAttachmentCreated %s", 201, payload)
+}
+
+func (o *RepoCreateReleaseAttachmentCreated) GetPayload() *models.Attachment {
+	return o.Payload
+}
+
+func (o *RepoCreateReleaseAttachmentCreated) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.Attachment)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoCreateReleaseAttachmentBadRequest creates a RepoCreateReleaseAttachmentBadRequest with default headers values
+func NewRepoCreateReleaseAttachmentBadRequest() *RepoCreateReleaseAttachmentBadRequest {
+	return &RepoCreateReleaseAttachmentBadRequest{}
+}
+
+/*
+RepoCreateReleaseAttachmentBadRequest describes a response with status code 400, with default header values.
+
+APIError is error format response
+*/
+type RepoCreateReleaseAttachmentBadRequest struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo create release attachment bad request response has a 2xx status code
+func (o *RepoCreateReleaseAttachmentBadRequest) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo create release attachment bad request response has a 3xx status code
+func (o *RepoCreateReleaseAttachmentBadRequest) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo create release attachment bad request response has a 4xx status code
+func (o *RepoCreateReleaseAttachmentBadRequest) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo create release attachment bad request response has a 5xx status code
+func (o *RepoCreateReleaseAttachmentBadRequest) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo create release attachment bad request response a status code equal to that given
+func (o *RepoCreateReleaseAttachmentBadRequest) IsCode(code int) bool {
+	return code == 400
+}
+
+// Code gets the status code for the repo create release attachment bad request response
+func (o *RepoCreateReleaseAttachmentBadRequest) Code() int {
+	return 400
+}
+
+func (o *RepoCreateReleaseAttachmentBadRequest) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/releases/{id}/assets][%d] repoCreateReleaseAttachmentBadRequest", 400)
+}
+
+func (o *RepoCreateReleaseAttachmentBadRequest) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/releases/{id}/assets][%d] repoCreateReleaseAttachmentBadRequest", 400)
+}
+
+func (o *RepoCreateReleaseAttachmentBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewRepoCreateReleaseAttachmentNotFound creates a RepoCreateReleaseAttachmentNotFound with default headers values
+func NewRepoCreateReleaseAttachmentNotFound() *RepoCreateReleaseAttachmentNotFound {
+	return &RepoCreateReleaseAttachmentNotFound{}
+}
+
+/*
+RepoCreateReleaseAttachmentNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoCreateReleaseAttachmentNotFound struct {
+}
+
+// IsSuccess returns true when this repo create release attachment not found response has a 2xx status code
+func (o *RepoCreateReleaseAttachmentNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo create release attachment not found response has a 3xx status code
+func (o *RepoCreateReleaseAttachmentNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo create release attachment not found response has a 4xx status code
+func (o *RepoCreateReleaseAttachmentNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo create release attachment not found response has a 5xx status code
+func (o *RepoCreateReleaseAttachmentNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo create release attachment not found response a status code equal to that given
+func (o *RepoCreateReleaseAttachmentNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo create release attachment not found response
+func (o *RepoCreateReleaseAttachmentNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoCreateReleaseAttachmentNotFound) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/releases/{id}/assets][%d] repoCreateReleaseAttachmentNotFound", 404)
+}
+
+func (o *RepoCreateReleaseAttachmentNotFound) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/releases/{id}/assets][%d] repoCreateReleaseAttachmentNotFound", 404)
+}
+
+func (o *RepoCreateReleaseAttachmentNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_create_release_parameters.go b/bots-common/gitea-generated/client/repository/repo_create_release_parameters.go
new file mode 100644
index 0000000..55e8ac1
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_create_release_parameters.go
@@ -0,0 +1,194 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewRepoCreateReleaseParams creates a new RepoCreateReleaseParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoCreateReleaseParams() *RepoCreateReleaseParams {
+	return &RepoCreateReleaseParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoCreateReleaseParamsWithTimeout creates a new RepoCreateReleaseParams object
+// with the ability to set a timeout on a request.
+func NewRepoCreateReleaseParamsWithTimeout(timeout time.Duration) *RepoCreateReleaseParams {
+	return &RepoCreateReleaseParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoCreateReleaseParamsWithContext creates a new RepoCreateReleaseParams object
+// with the ability to set a context for a request.
+func NewRepoCreateReleaseParamsWithContext(ctx context.Context) *RepoCreateReleaseParams {
+	return &RepoCreateReleaseParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoCreateReleaseParamsWithHTTPClient creates a new RepoCreateReleaseParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoCreateReleaseParamsWithHTTPClient(client *http.Client) *RepoCreateReleaseParams {
+	return &RepoCreateReleaseParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoCreateReleaseParams contains all the parameters to send to the API endpoint
+
+	for the repo create release operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoCreateReleaseParams struct {
+
+	// Body.
+	Body *models.CreateReleaseOption
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo create release params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoCreateReleaseParams) WithDefaults() *RepoCreateReleaseParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo create release params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoCreateReleaseParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo create release params
+func (o *RepoCreateReleaseParams) WithTimeout(timeout time.Duration) *RepoCreateReleaseParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo create release params
+func (o *RepoCreateReleaseParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo create release params
+func (o *RepoCreateReleaseParams) WithContext(ctx context.Context) *RepoCreateReleaseParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo create release params
+func (o *RepoCreateReleaseParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo create release params
+func (o *RepoCreateReleaseParams) WithHTTPClient(client *http.Client) *RepoCreateReleaseParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo create release params
+func (o *RepoCreateReleaseParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the repo create release params
+func (o *RepoCreateReleaseParams) WithBody(body *models.CreateReleaseOption) *RepoCreateReleaseParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the repo create release params
+func (o *RepoCreateReleaseParams) SetBody(body *models.CreateReleaseOption) {
+	o.Body = body
+}
+
+// WithOwner adds the owner to the repo create release params
+func (o *RepoCreateReleaseParams) WithOwner(owner string) *RepoCreateReleaseParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo create release params
+func (o *RepoCreateReleaseParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo create release params
+func (o *RepoCreateReleaseParams) WithRepo(repo string) *RepoCreateReleaseParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo create release params
+func (o *RepoCreateReleaseParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoCreateReleaseParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_create_release_responses.go b/bots-common/gitea-generated/client/repository/repo_create_release_responses.go
new file mode 100644
index 0000000..3be9813
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_create_release_responses.go
@@ -0,0 +1,324 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoCreateReleaseReader is a Reader for the RepoCreateRelease structure.
+type RepoCreateReleaseReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoCreateReleaseReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 201:
+		result := NewRepoCreateReleaseCreated()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoCreateReleaseNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 409:
+		result := NewRepoCreateReleaseConflict()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 422:
+		result := NewRepoCreateReleaseUnprocessableEntity()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[POST /repos/{owner}/{repo}/releases] repoCreateRelease", response, response.Code())
+	}
+}
+
+// NewRepoCreateReleaseCreated creates a RepoCreateReleaseCreated with default headers values
+func NewRepoCreateReleaseCreated() *RepoCreateReleaseCreated {
+	return &RepoCreateReleaseCreated{}
+}
+
+/*
+RepoCreateReleaseCreated describes a response with status code 201, with default header values.
+
+Release
+*/
+type RepoCreateReleaseCreated struct {
+	Payload *models.Release
+}
+
+// IsSuccess returns true when this repo create release created response has a 2xx status code
+func (o *RepoCreateReleaseCreated) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo create release created response has a 3xx status code
+func (o *RepoCreateReleaseCreated) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo create release created response has a 4xx status code
+func (o *RepoCreateReleaseCreated) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo create release created response has a 5xx status code
+func (o *RepoCreateReleaseCreated) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo create release created response a status code equal to that given
+func (o *RepoCreateReleaseCreated) IsCode(code int) bool {
+	return code == 201
+}
+
+// Code gets the status code for the repo create release created response
+func (o *RepoCreateReleaseCreated) Code() int {
+	return 201
+}
+
+func (o *RepoCreateReleaseCreated) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/releases][%d] repoCreateReleaseCreated %s", 201, payload)
+}
+
+func (o *RepoCreateReleaseCreated) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/releases][%d] repoCreateReleaseCreated %s", 201, payload)
+}
+
+func (o *RepoCreateReleaseCreated) GetPayload() *models.Release {
+	return o.Payload
+}
+
+func (o *RepoCreateReleaseCreated) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.Release)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoCreateReleaseNotFound creates a RepoCreateReleaseNotFound with default headers values
+func NewRepoCreateReleaseNotFound() *RepoCreateReleaseNotFound {
+	return &RepoCreateReleaseNotFound{}
+}
+
+/*
+RepoCreateReleaseNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoCreateReleaseNotFound struct {
+}
+
+// IsSuccess returns true when this repo create release not found response has a 2xx status code
+func (o *RepoCreateReleaseNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo create release not found response has a 3xx status code
+func (o *RepoCreateReleaseNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo create release not found response has a 4xx status code
+func (o *RepoCreateReleaseNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo create release not found response has a 5xx status code
+func (o *RepoCreateReleaseNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo create release not found response a status code equal to that given
+func (o *RepoCreateReleaseNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo create release not found response
+func (o *RepoCreateReleaseNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoCreateReleaseNotFound) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/releases][%d] repoCreateReleaseNotFound", 404)
+}
+
+func (o *RepoCreateReleaseNotFound) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/releases][%d] repoCreateReleaseNotFound", 404)
+}
+
+func (o *RepoCreateReleaseNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewRepoCreateReleaseConflict creates a RepoCreateReleaseConflict with default headers values
+func NewRepoCreateReleaseConflict() *RepoCreateReleaseConflict {
+	return &RepoCreateReleaseConflict{}
+}
+
+/*
+RepoCreateReleaseConflict describes a response with status code 409, with default header values.
+
+APIError is error format response
+*/
+type RepoCreateReleaseConflict struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo create release conflict response has a 2xx status code
+func (o *RepoCreateReleaseConflict) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo create release conflict response has a 3xx status code
+func (o *RepoCreateReleaseConflict) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo create release conflict response has a 4xx status code
+func (o *RepoCreateReleaseConflict) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo create release conflict response has a 5xx status code
+func (o *RepoCreateReleaseConflict) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo create release conflict response a status code equal to that given
+func (o *RepoCreateReleaseConflict) IsCode(code int) bool {
+	return code == 409
+}
+
+// Code gets the status code for the repo create release conflict response
+func (o *RepoCreateReleaseConflict) Code() int {
+	return 409
+}
+
+func (o *RepoCreateReleaseConflict) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/releases][%d] repoCreateReleaseConflict", 409)
+}
+
+func (o *RepoCreateReleaseConflict) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/releases][%d] repoCreateReleaseConflict", 409)
+}
+
+func (o *RepoCreateReleaseConflict) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewRepoCreateReleaseUnprocessableEntity creates a RepoCreateReleaseUnprocessableEntity with default headers values
+func NewRepoCreateReleaseUnprocessableEntity() *RepoCreateReleaseUnprocessableEntity {
+	return &RepoCreateReleaseUnprocessableEntity{}
+}
+
+/*
+RepoCreateReleaseUnprocessableEntity describes a response with status code 422, with default header values.
+
+APIValidationError is error format response related to input validation
+*/
+type RepoCreateReleaseUnprocessableEntity struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo create release unprocessable entity response has a 2xx status code
+func (o *RepoCreateReleaseUnprocessableEntity) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo create release unprocessable entity response has a 3xx status code
+func (o *RepoCreateReleaseUnprocessableEntity) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo create release unprocessable entity response has a 4xx status code
+func (o *RepoCreateReleaseUnprocessableEntity) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo create release unprocessable entity response has a 5xx status code
+func (o *RepoCreateReleaseUnprocessableEntity) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo create release unprocessable entity response a status code equal to that given
+func (o *RepoCreateReleaseUnprocessableEntity) IsCode(code int) bool {
+	return code == 422
+}
+
+// Code gets the status code for the repo create release unprocessable entity response
+func (o *RepoCreateReleaseUnprocessableEntity) Code() int {
+	return 422
+}
+
+func (o *RepoCreateReleaseUnprocessableEntity) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/releases][%d] repoCreateReleaseUnprocessableEntity", 422)
+}
+
+func (o *RepoCreateReleaseUnprocessableEntity) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/releases][%d] repoCreateReleaseUnprocessableEntity", 422)
+}
+
+func (o *RepoCreateReleaseUnprocessableEntity) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_create_status_parameters.go b/bots-common/gitea-generated/client/repository/repo_create_status_parameters.go
new file mode 100644
index 0000000..77c65e4
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_create_status_parameters.go
@@ -0,0 +1,216 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewRepoCreateStatusParams creates a new RepoCreateStatusParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoCreateStatusParams() *RepoCreateStatusParams {
+	return &RepoCreateStatusParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoCreateStatusParamsWithTimeout creates a new RepoCreateStatusParams object
+// with the ability to set a timeout on a request.
+func NewRepoCreateStatusParamsWithTimeout(timeout time.Duration) *RepoCreateStatusParams {
+	return &RepoCreateStatusParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoCreateStatusParamsWithContext creates a new RepoCreateStatusParams object
+// with the ability to set a context for a request.
+func NewRepoCreateStatusParamsWithContext(ctx context.Context) *RepoCreateStatusParams {
+	return &RepoCreateStatusParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoCreateStatusParamsWithHTTPClient creates a new RepoCreateStatusParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoCreateStatusParamsWithHTTPClient(client *http.Client) *RepoCreateStatusParams {
+	return &RepoCreateStatusParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoCreateStatusParams contains all the parameters to send to the API endpoint
+
+	for the repo create status operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoCreateStatusParams struct {
+
+	// Body.
+	Body *models.CreateStatusOption
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	/* Sha.
+
+	   sha of the commit
+	*/
+	Sha string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo create status params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoCreateStatusParams) WithDefaults() *RepoCreateStatusParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo create status params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoCreateStatusParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo create status params
+func (o *RepoCreateStatusParams) WithTimeout(timeout time.Duration) *RepoCreateStatusParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo create status params
+func (o *RepoCreateStatusParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo create status params
+func (o *RepoCreateStatusParams) WithContext(ctx context.Context) *RepoCreateStatusParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo create status params
+func (o *RepoCreateStatusParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo create status params
+func (o *RepoCreateStatusParams) WithHTTPClient(client *http.Client) *RepoCreateStatusParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo create status params
+func (o *RepoCreateStatusParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the repo create status params
+func (o *RepoCreateStatusParams) WithBody(body *models.CreateStatusOption) *RepoCreateStatusParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the repo create status params
+func (o *RepoCreateStatusParams) SetBody(body *models.CreateStatusOption) {
+	o.Body = body
+}
+
+// WithOwner adds the owner to the repo create status params
+func (o *RepoCreateStatusParams) WithOwner(owner string) *RepoCreateStatusParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo create status params
+func (o *RepoCreateStatusParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo create status params
+func (o *RepoCreateStatusParams) WithRepo(repo string) *RepoCreateStatusParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo create status params
+func (o *RepoCreateStatusParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WithSha adds the sha to the repo create status params
+func (o *RepoCreateStatusParams) WithSha(sha string) *RepoCreateStatusParams {
+	o.SetSha(sha)
+	return o
+}
+
+// SetSha adds the sha to the repo create status params
+func (o *RepoCreateStatusParams) SetSha(sha string) {
+	o.Sha = sha
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoCreateStatusParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	// path param sha
+	if err := r.SetPathParam("sha", o.Sha); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_create_status_responses.go b/bots-common/gitea-generated/client/repository/repo_create_status_responses.go
new file mode 100644
index 0000000..83a54bd
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_create_status_responses.go
@@ -0,0 +1,246 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoCreateStatusReader is a Reader for the RepoCreateStatus structure.
+type RepoCreateStatusReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoCreateStatusReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 201:
+		result := NewRepoCreateStatusCreated()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 400:
+		result := NewRepoCreateStatusBadRequest()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewRepoCreateStatusNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[POST /repos/{owner}/{repo}/statuses/{sha}] repoCreateStatus", response, response.Code())
+	}
+}
+
+// NewRepoCreateStatusCreated creates a RepoCreateStatusCreated with default headers values
+func NewRepoCreateStatusCreated() *RepoCreateStatusCreated {
+	return &RepoCreateStatusCreated{}
+}
+
+/*
+RepoCreateStatusCreated describes a response with status code 201, with default header values.
+
+CommitStatus
+*/
+type RepoCreateStatusCreated struct {
+	Payload *models.CommitStatus
+}
+
+// IsSuccess returns true when this repo create status created response has a 2xx status code
+func (o *RepoCreateStatusCreated) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo create status created response has a 3xx status code
+func (o *RepoCreateStatusCreated) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo create status created response has a 4xx status code
+func (o *RepoCreateStatusCreated) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo create status created response has a 5xx status code
+func (o *RepoCreateStatusCreated) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo create status created response a status code equal to that given
+func (o *RepoCreateStatusCreated) IsCode(code int) bool {
+	return code == 201
+}
+
+// Code gets the status code for the repo create status created response
+func (o *RepoCreateStatusCreated) Code() int {
+	return 201
+}
+
+func (o *RepoCreateStatusCreated) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/statuses/{sha}][%d] repoCreateStatusCreated %s", 201, payload)
+}
+
+func (o *RepoCreateStatusCreated) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/statuses/{sha}][%d] repoCreateStatusCreated %s", 201, payload)
+}
+
+func (o *RepoCreateStatusCreated) GetPayload() *models.CommitStatus {
+	return o.Payload
+}
+
+func (o *RepoCreateStatusCreated) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.CommitStatus)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoCreateStatusBadRequest creates a RepoCreateStatusBadRequest with default headers values
+func NewRepoCreateStatusBadRequest() *RepoCreateStatusBadRequest {
+	return &RepoCreateStatusBadRequest{}
+}
+
+/*
+RepoCreateStatusBadRequest describes a response with status code 400, with default header values.
+
+APIError is error format response
+*/
+type RepoCreateStatusBadRequest struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo create status bad request response has a 2xx status code
+func (o *RepoCreateStatusBadRequest) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo create status bad request response has a 3xx status code
+func (o *RepoCreateStatusBadRequest) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo create status bad request response has a 4xx status code
+func (o *RepoCreateStatusBadRequest) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo create status bad request response has a 5xx status code
+func (o *RepoCreateStatusBadRequest) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo create status bad request response a status code equal to that given
+func (o *RepoCreateStatusBadRequest) IsCode(code int) bool {
+	return code == 400
+}
+
+// Code gets the status code for the repo create status bad request response
+func (o *RepoCreateStatusBadRequest) Code() int {
+	return 400
+}
+
+func (o *RepoCreateStatusBadRequest) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/statuses/{sha}][%d] repoCreateStatusBadRequest", 400)
+}
+
+func (o *RepoCreateStatusBadRequest) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/statuses/{sha}][%d] repoCreateStatusBadRequest", 400)
+}
+
+func (o *RepoCreateStatusBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewRepoCreateStatusNotFound creates a RepoCreateStatusNotFound with default headers values
+func NewRepoCreateStatusNotFound() *RepoCreateStatusNotFound {
+	return &RepoCreateStatusNotFound{}
+}
+
+/*
+RepoCreateStatusNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoCreateStatusNotFound struct {
+}
+
+// IsSuccess returns true when this repo create status not found response has a 2xx status code
+func (o *RepoCreateStatusNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo create status not found response has a 3xx status code
+func (o *RepoCreateStatusNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo create status not found response has a 4xx status code
+func (o *RepoCreateStatusNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo create status not found response has a 5xx status code
+func (o *RepoCreateStatusNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo create status not found response a status code equal to that given
+func (o *RepoCreateStatusNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo create status not found response
+func (o *RepoCreateStatusNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoCreateStatusNotFound) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/statuses/{sha}][%d] repoCreateStatusNotFound", 404)
+}
+
+func (o *RepoCreateStatusNotFound) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/statuses/{sha}][%d] repoCreateStatusNotFound", 404)
+}
+
+func (o *RepoCreateStatusNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_create_tag_parameters.go b/bots-common/gitea-generated/client/repository/repo_create_tag_parameters.go
new file mode 100644
index 0000000..137e1b8
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_create_tag_parameters.go
@@ -0,0 +1,194 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewRepoCreateTagParams creates a new RepoCreateTagParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoCreateTagParams() *RepoCreateTagParams {
+	return &RepoCreateTagParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoCreateTagParamsWithTimeout creates a new RepoCreateTagParams object
+// with the ability to set a timeout on a request.
+func NewRepoCreateTagParamsWithTimeout(timeout time.Duration) *RepoCreateTagParams {
+	return &RepoCreateTagParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoCreateTagParamsWithContext creates a new RepoCreateTagParams object
+// with the ability to set a context for a request.
+func NewRepoCreateTagParamsWithContext(ctx context.Context) *RepoCreateTagParams {
+	return &RepoCreateTagParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoCreateTagParamsWithHTTPClient creates a new RepoCreateTagParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoCreateTagParamsWithHTTPClient(client *http.Client) *RepoCreateTagParams {
+	return &RepoCreateTagParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoCreateTagParams contains all the parameters to send to the API endpoint
+
+	for the repo create tag operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoCreateTagParams struct {
+
+	// Body.
+	Body *models.CreateTagOption
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo create tag params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoCreateTagParams) WithDefaults() *RepoCreateTagParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo create tag params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoCreateTagParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo create tag params
+func (o *RepoCreateTagParams) WithTimeout(timeout time.Duration) *RepoCreateTagParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo create tag params
+func (o *RepoCreateTagParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo create tag params
+func (o *RepoCreateTagParams) WithContext(ctx context.Context) *RepoCreateTagParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo create tag params
+func (o *RepoCreateTagParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo create tag params
+func (o *RepoCreateTagParams) WithHTTPClient(client *http.Client) *RepoCreateTagParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo create tag params
+func (o *RepoCreateTagParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the repo create tag params
+func (o *RepoCreateTagParams) WithBody(body *models.CreateTagOption) *RepoCreateTagParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the repo create tag params
+func (o *RepoCreateTagParams) SetBody(body *models.CreateTagOption) {
+	o.Body = body
+}
+
+// WithOwner adds the owner to the repo create tag params
+func (o *RepoCreateTagParams) WithOwner(owner string) *RepoCreateTagParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo create tag params
+func (o *RepoCreateTagParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo create tag params
+func (o *RepoCreateTagParams) WithRepo(repo string) *RepoCreateTagParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo create tag params
+func (o *RepoCreateTagParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoCreateTagParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_create_tag_responses.go b/bots-common/gitea-generated/client/repository/repo_create_tag_responses.go
new file mode 100644
index 0000000..618e288
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_create_tag_responses.go
@@ -0,0 +1,448 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoCreateTagReader is a Reader for the RepoCreateTag structure.
+type RepoCreateTagReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoCreateTagReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoCreateTagOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoCreateTagNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 405:
+		result := NewRepoCreateTagMethodNotAllowed()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 409:
+		result := NewRepoCreateTagConflict()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 422:
+		result := NewRepoCreateTagUnprocessableEntity()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 423:
+		result := NewRepoCreateTagLocked()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[POST /repos/{owner}/{repo}/tags] repoCreateTag", response, response.Code())
+	}
+}
+
+// NewRepoCreateTagOK creates a RepoCreateTagOK with default headers values
+func NewRepoCreateTagOK() *RepoCreateTagOK {
+	return &RepoCreateTagOK{}
+}
+
+/*
+RepoCreateTagOK describes a response with status code 200, with default header values.
+
+Tag
+*/
+type RepoCreateTagOK struct {
+	Payload *models.Tag
+}
+
+// IsSuccess returns true when this repo create tag o k response has a 2xx status code
+func (o *RepoCreateTagOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo create tag o k response has a 3xx status code
+func (o *RepoCreateTagOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo create tag o k response has a 4xx status code
+func (o *RepoCreateTagOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo create tag o k response has a 5xx status code
+func (o *RepoCreateTagOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo create tag o k response a status code equal to that given
+func (o *RepoCreateTagOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo create tag o k response
+func (o *RepoCreateTagOK) Code() int {
+	return 200
+}
+
+func (o *RepoCreateTagOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/tags][%d] repoCreateTagOK %s", 200, payload)
+}
+
+func (o *RepoCreateTagOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/tags][%d] repoCreateTagOK %s", 200, payload)
+}
+
+func (o *RepoCreateTagOK) GetPayload() *models.Tag {
+	return o.Payload
+}
+
+func (o *RepoCreateTagOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.Tag)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoCreateTagNotFound creates a RepoCreateTagNotFound with default headers values
+func NewRepoCreateTagNotFound() *RepoCreateTagNotFound {
+	return &RepoCreateTagNotFound{}
+}
+
+/*
+RepoCreateTagNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoCreateTagNotFound struct {
+}
+
+// IsSuccess returns true when this repo create tag not found response has a 2xx status code
+func (o *RepoCreateTagNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo create tag not found response has a 3xx status code
+func (o *RepoCreateTagNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo create tag not found response has a 4xx status code
+func (o *RepoCreateTagNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo create tag not found response has a 5xx status code
+func (o *RepoCreateTagNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo create tag not found response a status code equal to that given
+func (o *RepoCreateTagNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo create tag not found response
+func (o *RepoCreateTagNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoCreateTagNotFound) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/tags][%d] repoCreateTagNotFound", 404)
+}
+
+func (o *RepoCreateTagNotFound) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/tags][%d] repoCreateTagNotFound", 404)
+}
+
+func (o *RepoCreateTagNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewRepoCreateTagMethodNotAllowed creates a RepoCreateTagMethodNotAllowed with default headers values
+func NewRepoCreateTagMethodNotAllowed() *RepoCreateTagMethodNotAllowed {
+	return &RepoCreateTagMethodNotAllowed{}
+}
+
+/*
+RepoCreateTagMethodNotAllowed describes a response with status code 405, with default header values.
+
+APIEmpty is an empty response
+*/
+type RepoCreateTagMethodNotAllowed struct {
+}
+
+// IsSuccess returns true when this repo create tag method not allowed response has a 2xx status code
+func (o *RepoCreateTagMethodNotAllowed) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo create tag method not allowed response has a 3xx status code
+func (o *RepoCreateTagMethodNotAllowed) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo create tag method not allowed response has a 4xx status code
+func (o *RepoCreateTagMethodNotAllowed) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo create tag method not allowed response has a 5xx status code
+func (o *RepoCreateTagMethodNotAllowed) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo create tag method not allowed response a status code equal to that given
+func (o *RepoCreateTagMethodNotAllowed) IsCode(code int) bool {
+	return code == 405
+}
+
+// Code gets the status code for the repo create tag method not allowed response
+func (o *RepoCreateTagMethodNotAllowed) Code() int {
+	return 405
+}
+
+func (o *RepoCreateTagMethodNotAllowed) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/tags][%d] repoCreateTagMethodNotAllowed", 405)
+}
+
+func (o *RepoCreateTagMethodNotAllowed) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/tags][%d] repoCreateTagMethodNotAllowed", 405)
+}
+
+func (o *RepoCreateTagMethodNotAllowed) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewRepoCreateTagConflict creates a RepoCreateTagConflict with default headers values
+func NewRepoCreateTagConflict() *RepoCreateTagConflict {
+	return &RepoCreateTagConflict{}
+}
+
+/*
+RepoCreateTagConflict describes a response with status code 409, with default header values.
+
+APIConflict is a conflict empty response
+*/
+type RepoCreateTagConflict struct {
+}
+
+// IsSuccess returns true when this repo create tag conflict response has a 2xx status code
+func (o *RepoCreateTagConflict) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo create tag conflict response has a 3xx status code
+func (o *RepoCreateTagConflict) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo create tag conflict response has a 4xx status code
+func (o *RepoCreateTagConflict) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo create tag conflict response has a 5xx status code
+func (o *RepoCreateTagConflict) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo create tag conflict response a status code equal to that given
+func (o *RepoCreateTagConflict) IsCode(code int) bool {
+	return code == 409
+}
+
+// Code gets the status code for the repo create tag conflict response
+func (o *RepoCreateTagConflict) Code() int {
+	return 409
+}
+
+func (o *RepoCreateTagConflict) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/tags][%d] repoCreateTagConflict", 409)
+}
+
+func (o *RepoCreateTagConflict) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/tags][%d] repoCreateTagConflict", 409)
+}
+
+func (o *RepoCreateTagConflict) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewRepoCreateTagUnprocessableEntity creates a RepoCreateTagUnprocessableEntity with default headers values
+func NewRepoCreateTagUnprocessableEntity() *RepoCreateTagUnprocessableEntity {
+	return &RepoCreateTagUnprocessableEntity{}
+}
+
+/*
+RepoCreateTagUnprocessableEntity describes a response with status code 422, with default header values.
+
+APIValidationError is error format response related to input validation
+*/
+type RepoCreateTagUnprocessableEntity struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo create tag unprocessable entity response has a 2xx status code
+func (o *RepoCreateTagUnprocessableEntity) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo create tag unprocessable entity response has a 3xx status code
+func (o *RepoCreateTagUnprocessableEntity) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo create tag unprocessable entity response has a 4xx status code
+func (o *RepoCreateTagUnprocessableEntity) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo create tag unprocessable entity response has a 5xx status code
+func (o *RepoCreateTagUnprocessableEntity) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo create tag unprocessable entity response a status code equal to that given
+func (o *RepoCreateTagUnprocessableEntity) IsCode(code int) bool {
+	return code == 422
+}
+
+// Code gets the status code for the repo create tag unprocessable entity response
+func (o *RepoCreateTagUnprocessableEntity) Code() int {
+	return 422
+}
+
+func (o *RepoCreateTagUnprocessableEntity) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/tags][%d] repoCreateTagUnprocessableEntity", 422)
+}
+
+func (o *RepoCreateTagUnprocessableEntity) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/tags][%d] repoCreateTagUnprocessableEntity", 422)
+}
+
+func (o *RepoCreateTagUnprocessableEntity) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewRepoCreateTagLocked creates a RepoCreateTagLocked with default headers values
+func NewRepoCreateTagLocked() *RepoCreateTagLocked {
+	return &RepoCreateTagLocked{}
+}
+
+/*
+RepoCreateTagLocked describes a response with status code 423, with default header values.
+
+APIRepoArchivedError is an error that is raised when an archived repo should be modified
+*/
+type RepoCreateTagLocked struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo create tag locked response has a 2xx status code
+func (o *RepoCreateTagLocked) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo create tag locked response has a 3xx status code
+func (o *RepoCreateTagLocked) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo create tag locked response has a 4xx status code
+func (o *RepoCreateTagLocked) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo create tag locked response has a 5xx status code
+func (o *RepoCreateTagLocked) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo create tag locked response a status code equal to that given
+func (o *RepoCreateTagLocked) IsCode(code int) bool {
+	return code == 423
+}
+
+// Code gets the status code for the repo create tag locked response
+func (o *RepoCreateTagLocked) Code() int {
+	return 423
+}
+
+func (o *RepoCreateTagLocked) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/tags][%d] repoCreateTagLocked", 423)
+}
+
+func (o *RepoCreateTagLocked) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/tags][%d] repoCreateTagLocked", 423)
+}
+
+func (o *RepoCreateTagLocked) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_create_wiki_page_parameters.go b/bots-common/gitea-generated/client/repository/repo_create_wiki_page_parameters.go
new file mode 100644
index 0000000..745160e
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_create_wiki_page_parameters.go
@@ -0,0 +1,194 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewRepoCreateWikiPageParams creates a new RepoCreateWikiPageParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoCreateWikiPageParams() *RepoCreateWikiPageParams {
+	return &RepoCreateWikiPageParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoCreateWikiPageParamsWithTimeout creates a new RepoCreateWikiPageParams object
+// with the ability to set a timeout on a request.
+func NewRepoCreateWikiPageParamsWithTimeout(timeout time.Duration) *RepoCreateWikiPageParams {
+	return &RepoCreateWikiPageParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoCreateWikiPageParamsWithContext creates a new RepoCreateWikiPageParams object
+// with the ability to set a context for a request.
+func NewRepoCreateWikiPageParamsWithContext(ctx context.Context) *RepoCreateWikiPageParams {
+	return &RepoCreateWikiPageParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoCreateWikiPageParamsWithHTTPClient creates a new RepoCreateWikiPageParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoCreateWikiPageParamsWithHTTPClient(client *http.Client) *RepoCreateWikiPageParams {
+	return &RepoCreateWikiPageParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoCreateWikiPageParams contains all the parameters to send to the API endpoint
+
+	for the repo create wiki page operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoCreateWikiPageParams struct {
+
+	// Body.
+	Body *models.CreateWikiPageOptions
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo create wiki page params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoCreateWikiPageParams) WithDefaults() *RepoCreateWikiPageParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo create wiki page params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoCreateWikiPageParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo create wiki page params
+func (o *RepoCreateWikiPageParams) WithTimeout(timeout time.Duration) *RepoCreateWikiPageParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo create wiki page params
+func (o *RepoCreateWikiPageParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo create wiki page params
+func (o *RepoCreateWikiPageParams) WithContext(ctx context.Context) *RepoCreateWikiPageParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo create wiki page params
+func (o *RepoCreateWikiPageParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo create wiki page params
+func (o *RepoCreateWikiPageParams) WithHTTPClient(client *http.Client) *RepoCreateWikiPageParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo create wiki page params
+func (o *RepoCreateWikiPageParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the repo create wiki page params
+func (o *RepoCreateWikiPageParams) WithBody(body *models.CreateWikiPageOptions) *RepoCreateWikiPageParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the repo create wiki page params
+func (o *RepoCreateWikiPageParams) SetBody(body *models.CreateWikiPageOptions) {
+	o.Body = body
+}
+
+// WithOwner adds the owner to the repo create wiki page params
+func (o *RepoCreateWikiPageParams) WithOwner(owner string) *RepoCreateWikiPageParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo create wiki page params
+func (o *RepoCreateWikiPageParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo create wiki page params
+func (o *RepoCreateWikiPageParams) WithRepo(repo string) *RepoCreateWikiPageParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo create wiki page params
+func (o *RepoCreateWikiPageParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoCreateWikiPageParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_create_wiki_page_responses.go b/bots-common/gitea-generated/client/repository/repo_create_wiki_page_responses.go
new file mode 100644
index 0000000..be49d65
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_create_wiki_page_responses.go
@@ -0,0 +1,402 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoCreateWikiPageReader is a Reader for the RepoCreateWikiPage structure.
+type RepoCreateWikiPageReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoCreateWikiPageReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 201:
+		result := NewRepoCreateWikiPageCreated()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 400:
+		result := NewRepoCreateWikiPageBadRequest()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 403:
+		result := NewRepoCreateWikiPageForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewRepoCreateWikiPageNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 423:
+		result := NewRepoCreateWikiPageLocked()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[POST /repos/{owner}/{repo}/wiki/new] repoCreateWikiPage", response, response.Code())
+	}
+}
+
+// NewRepoCreateWikiPageCreated creates a RepoCreateWikiPageCreated with default headers values
+func NewRepoCreateWikiPageCreated() *RepoCreateWikiPageCreated {
+	return &RepoCreateWikiPageCreated{}
+}
+
+/*
+RepoCreateWikiPageCreated describes a response with status code 201, with default header values.
+
+WikiPage
+*/
+type RepoCreateWikiPageCreated struct {
+	Payload *models.WikiPage
+}
+
+// IsSuccess returns true when this repo create wiki page created response has a 2xx status code
+func (o *RepoCreateWikiPageCreated) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo create wiki page created response has a 3xx status code
+func (o *RepoCreateWikiPageCreated) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo create wiki page created response has a 4xx status code
+func (o *RepoCreateWikiPageCreated) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo create wiki page created response has a 5xx status code
+func (o *RepoCreateWikiPageCreated) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo create wiki page created response a status code equal to that given
+func (o *RepoCreateWikiPageCreated) IsCode(code int) bool {
+	return code == 201
+}
+
+// Code gets the status code for the repo create wiki page created response
+func (o *RepoCreateWikiPageCreated) Code() int {
+	return 201
+}
+
+func (o *RepoCreateWikiPageCreated) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/wiki/new][%d] repoCreateWikiPageCreated %s", 201, payload)
+}
+
+func (o *RepoCreateWikiPageCreated) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/wiki/new][%d] repoCreateWikiPageCreated %s", 201, payload)
+}
+
+func (o *RepoCreateWikiPageCreated) GetPayload() *models.WikiPage {
+	return o.Payload
+}
+
+func (o *RepoCreateWikiPageCreated) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.WikiPage)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoCreateWikiPageBadRequest creates a RepoCreateWikiPageBadRequest with default headers values
+func NewRepoCreateWikiPageBadRequest() *RepoCreateWikiPageBadRequest {
+	return &RepoCreateWikiPageBadRequest{}
+}
+
+/*
+RepoCreateWikiPageBadRequest describes a response with status code 400, with default header values.
+
+APIError is error format response
+*/
+type RepoCreateWikiPageBadRequest struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo create wiki page bad request response has a 2xx status code
+func (o *RepoCreateWikiPageBadRequest) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo create wiki page bad request response has a 3xx status code
+func (o *RepoCreateWikiPageBadRequest) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo create wiki page bad request response has a 4xx status code
+func (o *RepoCreateWikiPageBadRequest) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo create wiki page bad request response has a 5xx status code
+func (o *RepoCreateWikiPageBadRequest) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo create wiki page bad request response a status code equal to that given
+func (o *RepoCreateWikiPageBadRequest) IsCode(code int) bool {
+	return code == 400
+}
+
+// Code gets the status code for the repo create wiki page bad request response
+func (o *RepoCreateWikiPageBadRequest) Code() int {
+	return 400
+}
+
+func (o *RepoCreateWikiPageBadRequest) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/wiki/new][%d] repoCreateWikiPageBadRequest", 400)
+}
+
+func (o *RepoCreateWikiPageBadRequest) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/wiki/new][%d] repoCreateWikiPageBadRequest", 400)
+}
+
+func (o *RepoCreateWikiPageBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewRepoCreateWikiPageForbidden creates a RepoCreateWikiPageForbidden with default headers values
+func NewRepoCreateWikiPageForbidden() *RepoCreateWikiPageForbidden {
+	return &RepoCreateWikiPageForbidden{}
+}
+
+/*
+RepoCreateWikiPageForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type RepoCreateWikiPageForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo create wiki page forbidden response has a 2xx status code
+func (o *RepoCreateWikiPageForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo create wiki page forbidden response has a 3xx status code
+func (o *RepoCreateWikiPageForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo create wiki page forbidden response has a 4xx status code
+func (o *RepoCreateWikiPageForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo create wiki page forbidden response has a 5xx status code
+func (o *RepoCreateWikiPageForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo create wiki page forbidden response a status code equal to that given
+func (o *RepoCreateWikiPageForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the repo create wiki page forbidden response
+func (o *RepoCreateWikiPageForbidden) Code() int {
+	return 403
+}
+
+func (o *RepoCreateWikiPageForbidden) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/wiki/new][%d] repoCreateWikiPageForbidden", 403)
+}
+
+func (o *RepoCreateWikiPageForbidden) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/wiki/new][%d] repoCreateWikiPageForbidden", 403)
+}
+
+func (o *RepoCreateWikiPageForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewRepoCreateWikiPageNotFound creates a RepoCreateWikiPageNotFound with default headers values
+func NewRepoCreateWikiPageNotFound() *RepoCreateWikiPageNotFound {
+	return &RepoCreateWikiPageNotFound{}
+}
+
+/*
+RepoCreateWikiPageNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoCreateWikiPageNotFound struct {
+}
+
+// IsSuccess returns true when this repo create wiki page not found response has a 2xx status code
+func (o *RepoCreateWikiPageNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo create wiki page not found response has a 3xx status code
+func (o *RepoCreateWikiPageNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo create wiki page not found response has a 4xx status code
+func (o *RepoCreateWikiPageNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo create wiki page not found response has a 5xx status code
+func (o *RepoCreateWikiPageNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo create wiki page not found response a status code equal to that given
+func (o *RepoCreateWikiPageNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo create wiki page not found response
+func (o *RepoCreateWikiPageNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoCreateWikiPageNotFound) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/wiki/new][%d] repoCreateWikiPageNotFound", 404)
+}
+
+func (o *RepoCreateWikiPageNotFound) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/wiki/new][%d] repoCreateWikiPageNotFound", 404)
+}
+
+func (o *RepoCreateWikiPageNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewRepoCreateWikiPageLocked creates a RepoCreateWikiPageLocked with default headers values
+func NewRepoCreateWikiPageLocked() *RepoCreateWikiPageLocked {
+	return &RepoCreateWikiPageLocked{}
+}
+
+/*
+RepoCreateWikiPageLocked describes a response with status code 423, with default header values.
+
+APIRepoArchivedError is an error that is raised when an archived repo should be modified
+*/
+type RepoCreateWikiPageLocked struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo create wiki page locked response has a 2xx status code
+func (o *RepoCreateWikiPageLocked) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo create wiki page locked response has a 3xx status code
+func (o *RepoCreateWikiPageLocked) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo create wiki page locked response has a 4xx status code
+func (o *RepoCreateWikiPageLocked) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo create wiki page locked response has a 5xx status code
+func (o *RepoCreateWikiPageLocked) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo create wiki page locked response a status code equal to that given
+func (o *RepoCreateWikiPageLocked) IsCode(code int) bool {
+	return code == 423
+}
+
+// Code gets the status code for the repo create wiki page locked response
+func (o *RepoCreateWikiPageLocked) Code() int {
+	return 423
+}
+
+func (o *RepoCreateWikiPageLocked) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/wiki/new][%d] repoCreateWikiPageLocked", 423)
+}
+
+func (o *RepoCreateWikiPageLocked) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/wiki/new][%d] repoCreateWikiPageLocked", 423)
+}
+
+func (o *RepoCreateWikiPageLocked) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_delete_avatar_parameters.go b/bots-common/gitea-generated/client/repository/repo_delete_avatar_parameters.go
new file mode 100644
index 0000000..c5efbc8
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_delete_avatar_parameters.go
@@ -0,0 +1,173 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewRepoDeleteAvatarParams creates a new RepoDeleteAvatarParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoDeleteAvatarParams() *RepoDeleteAvatarParams {
+	return &RepoDeleteAvatarParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoDeleteAvatarParamsWithTimeout creates a new RepoDeleteAvatarParams object
+// with the ability to set a timeout on a request.
+func NewRepoDeleteAvatarParamsWithTimeout(timeout time.Duration) *RepoDeleteAvatarParams {
+	return &RepoDeleteAvatarParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoDeleteAvatarParamsWithContext creates a new RepoDeleteAvatarParams object
+// with the ability to set a context for a request.
+func NewRepoDeleteAvatarParamsWithContext(ctx context.Context) *RepoDeleteAvatarParams {
+	return &RepoDeleteAvatarParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoDeleteAvatarParamsWithHTTPClient creates a new RepoDeleteAvatarParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoDeleteAvatarParamsWithHTTPClient(client *http.Client) *RepoDeleteAvatarParams {
+	return &RepoDeleteAvatarParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoDeleteAvatarParams contains all the parameters to send to the API endpoint
+
+	for the repo delete avatar operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoDeleteAvatarParams struct {
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo delete avatar params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoDeleteAvatarParams) WithDefaults() *RepoDeleteAvatarParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo delete avatar params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoDeleteAvatarParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo delete avatar params
+func (o *RepoDeleteAvatarParams) WithTimeout(timeout time.Duration) *RepoDeleteAvatarParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo delete avatar params
+func (o *RepoDeleteAvatarParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo delete avatar params
+func (o *RepoDeleteAvatarParams) WithContext(ctx context.Context) *RepoDeleteAvatarParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo delete avatar params
+func (o *RepoDeleteAvatarParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo delete avatar params
+func (o *RepoDeleteAvatarParams) WithHTTPClient(client *http.Client) *RepoDeleteAvatarParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo delete avatar params
+func (o *RepoDeleteAvatarParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithOwner adds the owner to the repo delete avatar params
+func (o *RepoDeleteAvatarParams) WithOwner(owner string) *RepoDeleteAvatarParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo delete avatar params
+func (o *RepoDeleteAvatarParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo delete avatar params
+func (o *RepoDeleteAvatarParams) WithRepo(repo string) *RepoDeleteAvatarParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo delete avatar params
+func (o *RepoDeleteAvatarParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoDeleteAvatarParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_delete_avatar_responses.go b/bots-common/gitea-generated/client/repository/repo_delete_avatar_responses.go
new file mode 100644
index 0000000..3c1b9d7
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_delete_avatar_responses.go
@@ -0,0 +1,150 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// RepoDeleteAvatarReader is a Reader for the RepoDeleteAvatar structure.
+type RepoDeleteAvatarReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoDeleteAvatarReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewRepoDeleteAvatarNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoDeleteAvatarNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[DELETE /repos/{owner}/{repo}/avatar] repoDeleteAvatar", response, response.Code())
+	}
+}
+
+// NewRepoDeleteAvatarNoContent creates a RepoDeleteAvatarNoContent with default headers values
+func NewRepoDeleteAvatarNoContent() *RepoDeleteAvatarNoContent {
+	return &RepoDeleteAvatarNoContent{}
+}
+
+/*
+RepoDeleteAvatarNoContent describes a response with status code 204, with default header values.
+
+APIEmpty is an empty response
+*/
+type RepoDeleteAvatarNoContent struct {
+}
+
+// IsSuccess returns true when this repo delete avatar no content response has a 2xx status code
+func (o *RepoDeleteAvatarNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo delete avatar no content response has a 3xx status code
+func (o *RepoDeleteAvatarNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo delete avatar no content response has a 4xx status code
+func (o *RepoDeleteAvatarNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo delete avatar no content response has a 5xx status code
+func (o *RepoDeleteAvatarNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo delete avatar no content response a status code equal to that given
+func (o *RepoDeleteAvatarNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the repo delete avatar no content response
+func (o *RepoDeleteAvatarNoContent) Code() int {
+	return 204
+}
+
+func (o *RepoDeleteAvatarNoContent) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/avatar][%d] repoDeleteAvatarNoContent", 204)
+}
+
+func (o *RepoDeleteAvatarNoContent) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/avatar][%d] repoDeleteAvatarNoContent", 204)
+}
+
+func (o *RepoDeleteAvatarNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewRepoDeleteAvatarNotFound creates a RepoDeleteAvatarNotFound with default headers values
+func NewRepoDeleteAvatarNotFound() *RepoDeleteAvatarNotFound {
+	return &RepoDeleteAvatarNotFound{}
+}
+
+/*
+RepoDeleteAvatarNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoDeleteAvatarNotFound struct {
+}
+
+// IsSuccess returns true when this repo delete avatar not found response has a 2xx status code
+func (o *RepoDeleteAvatarNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo delete avatar not found response has a 3xx status code
+func (o *RepoDeleteAvatarNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo delete avatar not found response has a 4xx status code
+func (o *RepoDeleteAvatarNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo delete avatar not found response has a 5xx status code
+func (o *RepoDeleteAvatarNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo delete avatar not found response a status code equal to that given
+func (o *RepoDeleteAvatarNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo delete avatar not found response
+func (o *RepoDeleteAvatarNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoDeleteAvatarNotFound) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/avatar][%d] repoDeleteAvatarNotFound", 404)
+}
+
+func (o *RepoDeleteAvatarNotFound) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/avatar][%d] repoDeleteAvatarNotFound", 404)
+}
+
+func (o *RepoDeleteAvatarNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_delete_branch_parameters.go b/bots-common/gitea-generated/client/repository/repo_delete_branch_parameters.go
new file mode 100644
index 0000000..13270eb
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_delete_branch_parameters.go
@@ -0,0 +1,195 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewRepoDeleteBranchParams creates a new RepoDeleteBranchParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoDeleteBranchParams() *RepoDeleteBranchParams {
+	return &RepoDeleteBranchParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoDeleteBranchParamsWithTimeout creates a new RepoDeleteBranchParams object
+// with the ability to set a timeout on a request.
+func NewRepoDeleteBranchParamsWithTimeout(timeout time.Duration) *RepoDeleteBranchParams {
+	return &RepoDeleteBranchParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoDeleteBranchParamsWithContext creates a new RepoDeleteBranchParams object
+// with the ability to set a context for a request.
+func NewRepoDeleteBranchParamsWithContext(ctx context.Context) *RepoDeleteBranchParams {
+	return &RepoDeleteBranchParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoDeleteBranchParamsWithHTTPClient creates a new RepoDeleteBranchParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoDeleteBranchParamsWithHTTPClient(client *http.Client) *RepoDeleteBranchParams {
+	return &RepoDeleteBranchParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoDeleteBranchParams contains all the parameters to send to the API endpoint
+
+	for the repo delete branch operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoDeleteBranchParams struct {
+
+	/* Branch.
+
+	   branch to delete
+	*/
+	Branch string
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo delete branch params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoDeleteBranchParams) WithDefaults() *RepoDeleteBranchParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo delete branch params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoDeleteBranchParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo delete branch params
+func (o *RepoDeleteBranchParams) WithTimeout(timeout time.Duration) *RepoDeleteBranchParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo delete branch params
+func (o *RepoDeleteBranchParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo delete branch params
+func (o *RepoDeleteBranchParams) WithContext(ctx context.Context) *RepoDeleteBranchParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo delete branch params
+func (o *RepoDeleteBranchParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo delete branch params
+func (o *RepoDeleteBranchParams) WithHTTPClient(client *http.Client) *RepoDeleteBranchParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo delete branch params
+func (o *RepoDeleteBranchParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBranch adds the branch to the repo delete branch params
+func (o *RepoDeleteBranchParams) WithBranch(branch string) *RepoDeleteBranchParams {
+	o.SetBranch(branch)
+	return o
+}
+
+// SetBranch adds the branch to the repo delete branch params
+func (o *RepoDeleteBranchParams) SetBranch(branch string) {
+	o.Branch = branch
+}
+
+// WithOwner adds the owner to the repo delete branch params
+func (o *RepoDeleteBranchParams) WithOwner(owner string) *RepoDeleteBranchParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo delete branch params
+func (o *RepoDeleteBranchParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo delete branch params
+func (o *RepoDeleteBranchParams) WithRepo(repo string) *RepoDeleteBranchParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo delete branch params
+func (o *RepoDeleteBranchParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoDeleteBranchParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param branch
+	if err := r.SetPathParam("branch", o.Branch); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_delete_branch_protection_parameters.go b/bots-common/gitea-generated/client/repository/repo_delete_branch_protection_parameters.go
new file mode 100644
index 0000000..9778c8e
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_delete_branch_protection_parameters.go
@@ -0,0 +1,195 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewRepoDeleteBranchProtectionParams creates a new RepoDeleteBranchProtectionParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoDeleteBranchProtectionParams() *RepoDeleteBranchProtectionParams {
+	return &RepoDeleteBranchProtectionParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoDeleteBranchProtectionParamsWithTimeout creates a new RepoDeleteBranchProtectionParams object
+// with the ability to set a timeout on a request.
+func NewRepoDeleteBranchProtectionParamsWithTimeout(timeout time.Duration) *RepoDeleteBranchProtectionParams {
+	return &RepoDeleteBranchProtectionParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoDeleteBranchProtectionParamsWithContext creates a new RepoDeleteBranchProtectionParams object
+// with the ability to set a context for a request.
+func NewRepoDeleteBranchProtectionParamsWithContext(ctx context.Context) *RepoDeleteBranchProtectionParams {
+	return &RepoDeleteBranchProtectionParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoDeleteBranchProtectionParamsWithHTTPClient creates a new RepoDeleteBranchProtectionParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoDeleteBranchProtectionParamsWithHTTPClient(client *http.Client) *RepoDeleteBranchProtectionParams {
+	return &RepoDeleteBranchProtectionParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoDeleteBranchProtectionParams contains all the parameters to send to the API endpoint
+
+	for the repo delete branch protection operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoDeleteBranchProtectionParams struct {
+
+	/* Name.
+
+	   name of protected branch
+	*/
+	Name string
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo delete branch protection params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoDeleteBranchProtectionParams) WithDefaults() *RepoDeleteBranchProtectionParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo delete branch protection params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoDeleteBranchProtectionParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo delete branch protection params
+func (o *RepoDeleteBranchProtectionParams) WithTimeout(timeout time.Duration) *RepoDeleteBranchProtectionParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo delete branch protection params
+func (o *RepoDeleteBranchProtectionParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo delete branch protection params
+func (o *RepoDeleteBranchProtectionParams) WithContext(ctx context.Context) *RepoDeleteBranchProtectionParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo delete branch protection params
+func (o *RepoDeleteBranchProtectionParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo delete branch protection params
+func (o *RepoDeleteBranchProtectionParams) WithHTTPClient(client *http.Client) *RepoDeleteBranchProtectionParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo delete branch protection params
+func (o *RepoDeleteBranchProtectionParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithName adds the name to the repo delete branch protection params
+func (o *RepoDeleteBranchProtectionParams) WithName(name string) *RepoDeleteBranchProtectionParams {
+	o.SetName(name)
+	return o
+}
+
+// SetName adds the name to the repo delete branch protection params
+func (o *RepoDeleteBranchProtectionParams) SetName(name string) {
+	o.Name = name
+}
+
+// WithOwner adds the owner to the repo delete branch protection params
+func (o *RepoDeleteBranchProtectionParams) WithOwner(owner string) *RepoDeleteBranchProtectionParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo delete branch protection params
+func (o *RepoDeleteBranchProtectionParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo delete branch protection params
+func (o *RepoDeleteBranchProtectionParams) WithRepo(repo string) *RepoDeleteBranchProtectionParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo delete branch protection params
+func (o *RepoDeleteBranchProtectionParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoDeleteBranchProtectionParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param name
+	if err := r.SetPathParam("name", o.Name); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_delete_branch_protection_responses.go b/bots-common/gitea-generated/client/repository/repo_delete_branch_protection_responses.go
new file mode 100644
index 0000000..ccc5a13
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_delete_branch_protection_responses.go
@@ -0,0 +1,150 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// RepoDeleteBranchProtectionReader is a Reader for the RepoDeleteBranchProtection structure.
+type RepoDeleteBranchProtectionReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoDeleteBranchProtectionReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewRepoDeleteBranchProtectionNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoDeleteBranchProtectionNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[DELETE /repos/{owner}/{repo}/branch_protections/{name}] repoDeleteBranchProtection", response, response.Code())
+	}
+}
+
+// NewRepoDeleteBranchProtectionNoContent creates a RepoDeleteBranchProtectionNoContent with default headers values
+func NewRepoDeleteBranchProtectionNoContent() *RepoDeleteBranchProtectionNoContent {
+	return &RepoDeleteBranchProtectionNoContent{}
+}
+
+/*
+RepoDeleteBranchProtectionNoContent describes a response with status code 204, with default header values.
+
+APIEmpty is an empty response
+*/
+type RepoDeleteBranchProtectionNoContent struct {
+}
+
+// IsSuccess returns true when this repo delete branch protection no content response has a 2xx status code
+func (o *RepoDeleteBranchProtectionNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo delete branch protection no content response has a 3xx status code
+func (o *RepoDeleteBranchProtectionNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo delete branch protection no content response has a 4xx status code
+func (o *RepoDeleteBranchProtectionNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo delete branch protection no content response has a 5xx status code
+func (o *RepoDeleteBranchProtectionNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo delete branch protection no content response a status code equal to that given
+func (o *RepoDeleteBranchProtectionNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the repo delete branch protection no content response
+func (o *RepoDeleteBranchProtectionNoContent) Code() int {
+	return 204
+}
+
+func (o *RepoDeleteBranchProtectionNoContent) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/branch_protections/{name}][%d] repoDeleteBranchProtectionNoContent", 204)
+}
+
+func (o *RepoDeleteBranchProtectionNoContent) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/branch_protections/{name}][%d] repoDeleteBranchProtectionNoContent", 204)
+}
+
+func (o *RepoDeleteBranchProtectionNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewRepoDeleteBranchProtectionNotFound creates a RepoDeleteBranchProtectionNotFound with default headers values
+func NewRepoDeleteBranchProtectionNotFound() *RepoDeleteBranchProtectionNotFound {
+	return &RepoDeleteBranchProtectionNotFound{}
+}
+
+/*
+RepoDeleteBranchProtectionNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoDeleteBranchProtectionNotFound struct {
+}
+
+// IsSuccess returns true when this repo delete branch protection not found response has a 2xx status code
+func (o *RepoDeleteBranchProtectionNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo delete branch protection not found response has a 3xx status code
+func (o *RepoDeleteBranchProtectionNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo delete branch protection not found response has a 4xx status code
+func (o *RepoDeleteBranchProtectionNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo delete branch protection not found response has a 5xx status code
+func (o *RepoDeleteBranchProtectionNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo delete branch protection not found response a status code equal to that given
+func (o *RepoDeleteBranchProtectionNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo delete branch protection not found response
+func (o *RepoDeleteBranchProtectionNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoDeleteBranchProtectionNotFound) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/branch_protections/{name}][%d] repoDeleteBranchProtectionNotFound", 404)
+}
+
+func (o *RepoDeleteBranchProtectionNotFound) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/branch_protections/{name}][%d] repoDeleteBranchProtectionNotFound", 404)
+}
+
+func (o *RepoDeleteBranchProtectionNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_delete_branch_responses.go b/bots-common/gitea-generated/client/repository/repo_delete_branch_responses.go
new file mode 100644
index 0000000..36a257a
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_delete_branch_responses.go
@@ -0,0 +1,306 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// RepoDeleteBranchReader is a Reader for the RepoDeleteBranch structure.
+type RepoDeleteBranchReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoDeleteBranchReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewRepoDeleteBranchNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 403:
+		result := NewRepoDeleteBranchForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewRepoDeleteBranchNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 423:
+		result := NewRepoDeleteBranchLocked()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[DELETE /repos/{owner}/{repo}/branches/{branch}] repoDeleteBranch", response, response.Code())
+	}
+}
+
+// NewRepoDeleteBranchNoContent creates a RepoDeleteBranchNoContent with default headers values
+func NewRepoDeleteBranchNoContent() *RepoDeleteBranchNoContent {
+	return &RepoDeleteBranchNoContent{}
+}
+
+/*
+RepoDeleteBranchNoContent describes a response with status code 204, with default header values.
+
+APIEmpty is an empty response
+*/
+type RepoDeleteBranchNoContent struct {
+}
+
+// IsSuccess returns true when this repo delete branch no content response has a 2xx status code
+func (o *RepoDeleteBranchNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo delete branch no content response has a 3xx status code
+func (o *RepoDeleteBranchNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo delete branch no content response has a 4xx status code
+func (o *RepoDeleteBranchNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo delete branch no content response has a 5xx status code
+func (o *RepoDeleteBranchNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo delete branch no content response a status code equal to that given
+func (o *RepoDeleteBranchNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the repo delete branch no content response
+func (o *RepoDeleteBranchNoContent) Code() int {
+	return 204
+}
+
+func (o *RepoDeleteBranchNoContent) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/branches/{branch}][%d] repoDeleteBranchNoContent", 204)
+}
+
+func (o *RepoDeleteBranchNoContent) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/branches/{branch}][%d] repoDeleteBranchNoContent", 204)
+}
+
+func (o *RepoDeleteBranchNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewRepoDeleteBranchForbidden creates a RepoDeleteBranchForbidden with default headers values
+func NewRepoDeleteBranchForbidden() *RepoDeleteBranchForbidden {
+	return &RepoDeleteBranchForbidden{}
+}
+
+/*
+RepoDeleteBranchForbidden describes a response with status code 403, with default header values.
+
+APIError is error format response
+*/
+type RepoDeleteBranchForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo delete branch forbidden response has a 2xx status code
+func (o *RepoDeleteBranchForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo delete branch forbidden response has a 3xx status code
+func (o *RepoDeleteBranchForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo delete branch forbidden response has a 4xx status code
+func (o *RepoDeleteBranchForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo delete branch forbidden response has a 5xx status code
+func (o *RepoDeleteBranchForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo delete branch forbidden response a status code equal to that given
+func (o *RepoDeleteBranchForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the repo delete branch forbidden response
+func (o *RepoDeleteBranchForbidden) Code() int {
+	return 403
+}
+
+func (o *RepoDeleteBranchForbidden) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/branches/{branch}][%d] repoDeleteBranchForbidden", 403)
+}
+
+func (o *RepoDeleteBranchForbidden) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/branches/{branch}][%d] repoDeleteBranchForbidden", 403)
+}
+
+func (o *RepoDeleteBranchForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewRepoDeleteBranchNotFound creates a RepoDeleteBranchNotFound with default headers values
+func NewRepoDeleteBranchNotFound() *RepoDeleteBranchNotFound {
+	return &RepoDeleteBranchNotFound{}
+}
+
+/*
+RepoDeleteBranchNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoDeleteBranchNotFound struct {
+}
+
+// IsSuccess returns true when this repo delete branch not found response has a 2xx status code
+func (o *RepoDeleteBranchNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo delete branch not found response has a 3xx status code
+func (o *RepoDeleteBranchNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo delete branch not found response has a 4xx status code
+func (o *RepoDeleteBranchNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo delete branch not found response has a 5xx status code
+func (o *RepoDeleteBranchNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo delete branch not found response a status code equal to that given
+func (o *RepoDeleteBranchNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo delete branch not found response
+func (o *RepoDeleteBranchNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoDeleteBranchNotFound) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/branches/{branch}][%d] repoDeleteBranchNotFound", 404)
+}
+
+func (o *RepoDeleteBranchNotFound) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/branches/{branch}][%d] repoDeleteBranchNotFound", 404)
+}
+
+func (o *RepoDeleteBranchNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewRepoDeleteBranchLocked creates a RepoDeleteBranchLocked with default headers values
+func NewRepoDeleteBranchLocked() *RepoDeleteBranchLocked {
+	return &RepoDeleteBranchLocked{}
+}
+
+/*
+RepoDeleteBranchLocked describes a response with status code 423, with default header values.
+
+APIRepoArchivedError is an error that is raised when an archived repo should be modified
+*/
+type RepoDeleteBranchLocked struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo delete branch locked response has a 2xx status code
+func (o *RepoDeleteBranchLocked) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo delete branch locked response has a 3xx status code
+func (o *RepoDeleteBranchLocked) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo delete branch locked response has a 4xx status code
+func (o *RepoDeleteBranchLocked) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo delete branch locked response has a 5xx status code
+func (o *RepoDeleteBranchLocked) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo delete branch locked response a status code equal to that given
+func (o *RepoDeleteBranchLocked) IsCode(code int) bool {
+	return code == 423
+}
+
+// Code gets the status code for the repo delete branch locked response
+func (o *RepoDeleteBranchLocked) Code() int {
+	return 423
+}
+
+func (o *RepoDeleteBranchLocked) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/branches/{branch}][%d] repoDeleteBranchLocked", 423)
+}
+
+func (o *RepoDeleteBranchLocked) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/branches/{branch}][%d] repoDeleteBranchLocked", 423)
+}
+
+func (o *RepoDeleteBranchLocked) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_delete_collaborator_parameters.go b/bots-common/gitea-generated/client/repository/repo_delete_collaborator_parameters.go
new file mode 100644
index 0000000..9697825
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_delete_collaborator_parameters.go
@@ -0,0 +1,195 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewRepoDeleteCollaboratorParams creates a new RepoDeleteCollaboratorParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoDeleteCollaboratorParams() *RepoDeleteCollaboratorParams {
+	return &RepoDeleteCollaboratorParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoDeleteCollaboratorParamsWithTimeout creates a new RepoDeleteCollaboratorParams object
+// with the ability to set a timeout on a request.
+func NewRepoDeleteCollaboratorParamsWithTimeout(timeout time.Duration) *RepoDeleteCollaboratorParams {
+	return &RepoDeleteCollaboratorParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoDeleteCollaboratorParamsWithContext creates a new RepoDeleteCollaboratorParams object
+// with the ability to set a context for a request.
+func NewRepoDeleteCollaboratorParamsWithContext(ctx context.Context) *RepoDeleteCollaboratorParams {
+	return &RepoDeleteCollaboratorParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoDeleteCollaboratorParamsWithHTTPClient creates a new RepoDeleteCollaboratorParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoDeleteCollaboratorParamsWithHTTPClient(client *http.Client) *RepoDeleteCollaboratorParams {
+	return &RepoDeleteCollaboratorParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoDeleteCollaboratorParams contains all the parameters to send to the API endpoint
+
+	for the repo delete collaborator operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoDeleteCollaboratorParams struct {
+
+	/* Collaborator.
+
+	   username of the collaborator to delete
+	*/
+	Collaborator string
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo delete collaborator params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoDeleteCollaboratorParams) WithDefaults() *RepoDeleteCollaboratorParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo delete collaborator params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoDeleteCollaboratorParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo delete collaborator params
+func (o *RepoDeleteCollaboratorParams) WithTimeout(timeout time.Duration) *RepoDeleteCollaboratorParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo delete collaborator params
+func (o *RepoDeleteCollaboratorParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo delete collaborator params
+func (o *RepoDeleteCollaboratorParams) WithContext(ctx context.Context) *RepoDeleteCollaboratorParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo delete collaborator params
+func (o *RepoDeleteCollaboratorParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo delete collaborator params
+func (o *RepoDeleteCollaboratorParams) WithHTTPClient(client *http.Client) *RepoDeleteCollaboratorParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo delete collaborator params
+func (o *RepoDeleteCollaboratorParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithCollaborator adds the collaborator to the repo delete collaborator params
+func (o *RepoDeleteCollaboratorParams) WithCollaborator(collaborator string) *RepoDeleteCollaboratorParams {
+	o.SetCollaborator(collaborator)
+	return o
+}
+
+// SetCollaborator adds the collaborator to the repo delete collaborator params
+func (o *RepoDeleteCollaboratorParams) SetCollaborator(collaborator string) {
+	o.Collaborator = collaborator
+}
+
+// WithOwner adds the owner to the repo delete collaborator params
+func (o *RepoDeleteCollaboratorParams) WithOwner(owner string) *RepoDeleteCollaboratorParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo delete collaborator params
+func (o *RepoDeleteCollaboratorParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo delete collaborator params
+func (o *RepoDeleteCollaboratorParams) WithRepo(repo string) *RepoDeleteCollaboratorParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo delete collaborator params
+func (o *RepoDeleteCollaboratorParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoDeleteCollaboratorParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param collaborator
+	if err := r.SetPathParam("collaborator", o.Collaborator); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_delete_collaborator_responses.go b/bots-common/gitea-generated/client/repository/repo_delete_collaborator_responses.go
new file mode 100644
index 0000000..bc62dd2
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_delete_collaborator_responses.go
@@ -0,0 +1,228 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// RepoDeleteCollaboratorReader is a Reader for the RepoDeleteCollaborator structure.
+type RepoDeleteCollaboratorReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoDeleteCollaboratorReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewRepoDeleteCollaboratorNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoDeleteCollaboratorNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 422:
+		result := NewRepoDeleteCollaboratorUnprocessableEntity()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[DELETE /repos/{owner}/{repo}/collaborators/{collaborator}] repoDeleteCollaborator", response, response.Code())
+	}
+}
+
+// NewRepoDeleteCollaboratorNoContent creates a RepoDeleteCollaboratorNoContent with default headers values
+func NewRepoDeleteCollaboratorNoContent() *RepoDeleteCollaboratorNoContent {
+	return &RepoDeleteCollaboratorNoContent{}
+}
+
+/*
+RepoDeleteCollaboratorNoContent describes a response with status code 204, with default header values.
+
+APIEmpty is an empty response
+*/
+type RepoDeleteCollaboratorNoContent struct {
+}
+
+// IsSuccess returns true when this repo delete collaborator no content response has a 2xx status code
+func (o *RepoDeleteCollaboratorNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo delete collaborator no content response has a 3xx status code
+func (o *RepoDeleteCollaboratorNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo delete collaborator no content response has a 4xx status code
+func (o *RepoDeleteCollaboratorNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo delete collaborator no content response has a 5xx status code
+func (o *RepoDeleteCollaboratorNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo delete collaborator no content response a status code equal to that given
+func (o *RepoDeleteCollaboratorNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the repo delete collaborator no content response
+func (o *RepoDeleteCollaboratorNoContent) Code() int {
+	return 204
+}
+
+func (o *RepoDeleteCollaboratorNoContent) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/collaborators/{collaborator}][%d] repoDeleteCollaboratorNoContent", 204)
+}
+
+func (o *RepoDeleteCollaboratorNoContent) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/collaborators/{collaborator}][%d] repoDeleteCollaboratorNoContent", 204)
+}
+
+func (o *RepoDeleteCollaboratorNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewRepoDeleteCollaboratorNotFound creates a RepoDeleteCollaboratorNotFound with default headers values
+func NewRepoDeleteCollaboratorNotFound() *RepoDeleteCollaboratorNotFound {
+	return &RepoDeleteCollaboratorNotFound{}
+}
+
+/*
+RepoDeleteCollaboratorNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoDeleteCollaboratorNotFound struct {
+}
+
+// IsSuccess returns true when this repo delete collaborator not found response has a 2xx status code
+func (o *RepoDeleteCollaboratorNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo delete collaborator not found response has a 3xx status code
+func (o *RepoDeleteCollaboratorNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo delete collaborator not found response has a 4xx status code
+func (o *RepoDeleteCollaboratorNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo delete collaborator not found response has a 5xx status code
+func (o *RepoDeleteCollaboratorNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo delete collaborator not found response a status code equal to that given
+func (o *RepoDeleteCollaboratorNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo delete collaborator not found response
+func (o *RepoDeleteCollaboratorNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoDeleteCollaboratorNotFound) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/collaborators/{collaborator}][%d] repoDeleteCollaboratorNotFound", 404)
+}
+
+func (o *RepoDeleteCollaboratorNotFound) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/collaborators/{collaborator}][%d] repoDeleteCollaboratorNotFound", 404)
+}
+
+func (o *RepoDeleteCollaboratorNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewRepoDeleteCollaboratorUnprocessableEntity creates a RepoDeleteCollaboratorUnprocessableEntity with default headers values
+func NewRepoDeleteCollaboratorUnprocessableEntity() *RepoDeleteCollaboratorUnprocessableEntity {
+	return &RepoDeleteCollaboratorUnprocessableEntity{}
+}
+
+/*
+RepoDeleteCollaboratorUnprocessableEntity describes a response with status code 422, with default header values.
+
+APIValidationError is error format response related to input validation
+*/
+type RepoDeleteCollaboratorUnprocessableEntity struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo delete collaborator unprocessable entity response has a 2xx status code
+func (o *RepoDeleteCollaboratorUnprocessableEntity) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo delete collaborator unprocessable entity response has a 3xx status code
+func (o *RepoDeleteCollaboratorUnprocessableEntity) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo delete collaborator unprocessable entity response has a 4xx status code
+func (o *RepoDeleteCollaboratorUnprocessableEntity) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo delete collaborator unprocessable entity response has a 5xx status code
+func (o *RepoDeleteCollaboratorUnprocessableEntity) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo delete collaborator unprocessable entity response a status code equal to that given
+func (o *RepoDeleteCollaboratorUnprocessableEntity) IsCode(code int) bool {
+	return code == 422
+}
+
+// Code gets the status code for the repo delete collaborator unprocessable entity response
+func (o *RepoDeleteCollaboratorUnprocessableEntity) Code() int {
+	return 422
+}
+
+func (o *RepoDeleteCollaboratorUnprocessableEntity) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/collaborators/{collaborator}][%d] repoDeleteCollaboratorUnprocessableEntity", 422)
+}
+
+func (o *RepoDeleteCollaboratorUnprocessableEntity) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/collaborators/{collaborator}][%d] repoDeleteCollaboratorUnprocessableEntity", 422)
+}
+
+func (o *RepoDeleteCollaboratorUnprocessableEntity) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_delete_file_parameters.go b/bots-common/gitea-generated/client/repository/repo_delete_file_parameters.go
new file mode 100644
index 0000000..2c9fa33
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_delete_file_parameters.go
@@ -0,0 +1,216 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewRepoDeleteFileParams creates a new RepoDeleteFileParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoDeleteFileParams() *RepoDeleteFileParams {
+	return &RepoDeleteFileParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoDeleteFileParamsWithTimeout creates a new RepoDeleteFileParams object
+// with the ability to set a timeout on a request.
+func NewRepoDeleteFileParamsWithTimeout(timeout time.Duration) *RepoDeleteFileParams {
+	return &RepoDeleteFileParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoDeleteFileParamsWithContext creates a new RepoDeleteFileParams object
+// with the ability to set a context for a request.
+func NewRepoDeleteFileParamsWithContext(ctx context.Context) *RepoDeleteFileParams {
+	return &RepoDeleteFileParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoDeleteFileParamsWithHTTPClient creates a new RepoDeleteFileParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoDeleteFileParamsWithHTTPClient(client *http.Client) *RepoDeleteFileParams {
+	return &RepoDeleteFileParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoDeleteFileParams contains all the parameters to send to the API endpoint
+
+	for the repo delete file operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoDeleteFileParams struct {
+
+	// Body.
+	Body *models.DeleteFileOptions
+
+	/* Filepath.
+
+	   path of the file to delete
+	*/
+	Filepath string
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo delete file params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoDeleteFileParams) WithDefaults() *RepoDeleteFileParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo delete file params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoDeleteFileParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo delete file params
+func (o *RepoDeleteFileParams) WithTimeout(timeout time.Duration) *RepoDeleteFileParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo delete file params
+func (o *RepoDeleteFileParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo delete file params
+func (o *RepoDeleteFileParams) WithContext(ctx context.Context) *RepoDeleteFileParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo delete file params
+func (o *RepoDeleteFileParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo delete file params
+func (o *RepoDeleteFileParams) WithHTTPClient(client *http.Client) *RepoDeleteFileParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo delete file params
+func (o *RepoDeleteFileParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the repo delete file params
+func (o *RepoDeleteFileParams) WithBody(body *models.DeleteFileOptions) *RepoDeleteFileParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the repo delete file params
+func (o *RepoDeleteFileParams) SetBody(body *models.DeleteFileOptions) {
+	o.Body = body
+}
+
+// WithFilepath adds the filepath to the repo delete file params
+func (o *RepoDeleteFileParams) WithFilepath(filepath string) *RepoDeleteFileParams {
+	o.SetFilepath(filepath)
+	return o
+}
+
+// SetFilepath adds the filepath to the repo delete file params
+func (o *RepoDeleteFileParams) SetFilepath(filepath string) {
+	o.Filepath = filepath
+}
+
+// WithOwner adds the owner to the repo delete file params
+func (o *RepoDeleteFileParams) WithOwner(owner string) *RepoDeleteFileParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo delete file params
+func (o *RepoDeleteFileParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo delete file params
+func (o *RepoDeleteFileParams) WithRepo(repo string) *RepoDeleteFileParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo delete file params
+func (o *RepoDeleteFileParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoDeleteFileParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	// path param filepath
+	if err := r.SetPathParam("filepath", o.Filepath); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_delete_file_responses.go b/bots-common/gitea-generated/client/repository/repo_delete_file_responses.go
new file mode 100644
index 0000000..9e12751
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_delete_file_responses.go
@@ -0,0 +1,418 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoDeleteFileReader is a Reader for the RepoDeleteFile structure.
+type RepoDeleteFileReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoDeleteFileReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoDeleteFileOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 400:
+		result := NewRepoDeleteFileBadRequest()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 403:
+		result := NewRepoDeleteFileForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewRepoDeleteFileNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 423:
+		result := NewRepoDeleteFileLocked()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[DELETE /repos/{owner}/{repo}/contents/{filepath}] repoDeleteFile", response, response.Code())
+	}
+}
+
+// NewRepoDeleteFileOK creates a RepoDeleteFileOK with default headers values
+func NewRepoDeleteFileOK() *RepoDeleteFileOK {
+	return &RepoDeleteFileOK{}
+}
+
+/*
+RepoDeleteFileOK describes a response with status code 200, with default header values.
+
+FileDeleteResponse
+*/
+type RepoDeleteFileOK struct {
+	Payload *models.FileDeleteResponse
+}
+
+// IsSuccess returns true when this repo delete file o k response has a 2xx status code
+func (o *RepoDeleteFileOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo delete file o k response has a 3xx status code
+func (o *RepoDeleteFileOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo delete file o k response has a 4xx status code
+func (o *RepoDeleteFileOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo delete file o k response has a 5xx status code
+func (o *RepoDeleteFileOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo delete file o k response a status code equal to that given
+func (o *RepoDeleteFileOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo delete file o k response
+func (o *RepoDeleteFileOK) Code() int {
+	return 200
+}
+
+func (o *RepoDeleteFileOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/contents/{filepath}][%d] repoDeleteFileOK %s", 200, payload)
+}
+
+func (o *RepoDeleteFileOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/contents/{filepath}][%d] repoDeleteFileOK %s", 200, payload)
+}
+
+func (o *RepoDeleteFileOK) GetPayload() *models.FileDeleteResponse {
+	return o.Payload
+}
+
+func (o *RepoDeleteFileOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.FileDeleteResponse)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoDeleteFileBadRequest creates a RepoDeleteFileBadRequest with default headers values
+func NewRepoDeleteFileBadRequest() *RepoDeleteFileBadRequest {
+	return &RepoDeleteFileBadRequest{}
+}
+
+/*
+RepoDeleteFileBadRequest describes a response with status code 400, with default header values.
+
+APIError is error format response
+*/
+type RepoDeleteFileBadRequest struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo delete file bad request response has a 2xx status code
+func (o *RepoDeleteFileBadRequest) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo delete file bad request response has a 3xx status code
+func (o *RepoDeleteFileBadRequest) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo delete file bad request response has a 4xx status code
+func (o *RepoDeleteFileBadRequest) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo delete file bad request response has a 5xx status code
+func (o *RepoDeleteFileBadRequest) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo delete file bad request response a status code equal to that given
+func (o *RepoDeleteFileBadRequest) IsCode(code int) bool {
+	return code == 400
+}
+
+// Code gets the status code for the repo delete file bad request response
+func (o *RepoDeleteFileBadRequest) Code() int {
+	return 400
+}
+
+func (o *RepoDeleteFileBadRequest) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/contents/{filepath}][%d] repoDeleteFileBadRequest", 400)
+}
+
+func (o *RepoDeleteFileBadRequest) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/contents/{filepath}][%d] repoDeleteFileBadRequest", 400)
+}
+
+func (o *RepoDeleteFileBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewRepoDeleteFileForbidden creates a RepoDeleteFileForbidden with default headers values
+func NewRepoDeleteFileForbidden() *RepoDeleteFileForbidden {
+	return &RepoDeleteFileForbidden{}
+}
+
+/*
+RepoDeleteFileForbidden describes a response with status code 403, with default header values.
+
+APIError is error format response
+*/
+type RepoDeleteFileForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo delete file forbidden response has a 2xx status code
+func (o *RepoDeleteFileForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo delete file forbidden response has a 3xx status code
+func (o *RepoDeleteFileForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo delete file forbidden response has a 4xx status code
+func (o *RepoDeleteFileForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo delete file forbidden response has a 5xx status code
+func (o *RepoDeleteFileForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo delete file forbidden response a status code equal to that given
+func (o *RepoDeleteFileForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the repo delete file forbidden response
+func (o *RepoDeleteFileForbidden) Code() int {
+	return 403
+}
+
+func (o *RepoDeleteFileForbidden) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/contents/{filepath}][%d] repoDeleteFileForbidden", 403)
+}
+
+func (o *RepoDeleteFileForbidden) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/contents/{filepath}][%d] repoDeleteFileForbidden", 403)
+}
+
+func (o *RepoDeleteFileForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewRepoDeleteFileNotFound creates a RepoDeleteFileNotFound with default headers values
+func NewRepoDeleteFileNotFound() *RepoDeleteFileNotFound {
+	return &RepoDeleteFileNotFound{}
+}
+
+/*
+RepoDeleteFileNotFound describes a response with status code 404, with default header values.
+
+APIError is error format response
+*/
+type RepoDeleteFileNotFound struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo delete file not found response has a 2xx status code
+func (o *RepoDeleteFileNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo delete file not found response has a 3xx status code
+func (o *RepoDeleteFileNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo delete file not found response has a 4xx status code
+func (o *RepoDeleteFileNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo delete file not found response has a 5xx status code
+func (o *RepoDeleteFileNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo delete file not found response a status code equal to that given
+func (o *RepoDeleteFileNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo delete file not found response
+func (o *RepoDeleteFileNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoDeleteFileNotFound) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/contents/{filepath}][%d] repoDeleteFileNotFound", 404)
+}
+
+func (o *RepoDeleteFileNotFound) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/contents/{filepath}][%d] repoDeleteFileNotFound", 404)
+}
+
+func (o *RepoDeleteFileNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewRepoDeleteFileLocked creates a RepoDeleteFileLocked with default headers values
+func NewRepoDeleteFileLocked() *RepoDeleteFileLocked {
+	return &RepoDeleteFileLocked{}
+}
+
+/*
+RepoDeleteFileLocked describes a response with status code 423, with default header values.
+
+APIRepoArchivedError is an error that is raised when an archived repo should be modified
+*/
+type RepoDeleteFileLocked struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo delete file locked response has a 2xx status code
+func (o *RepoDeleteFileLocked) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo delete file locked response has a 3xx status code
+func (o *RepoDeleteFileLocked) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo delete file locked response has a 4xx status code
+func (o *RepoDeleteFileLocked) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo delete file locked response has a 5xx status code
+func (o *RepoDeleteFileLocked) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo delete file locked response a status code equal to that given
+func (o *RepoDeleteFileLocked) IsCode(code int) bool {
+	return code == 423
+}
+
+// Code gets the status code for the repo delete file locked response
+func (o *RepoDeleteFileLocked) Code() int {
+	return 423
+}
+
+func (o *RepoDeleteFileLocked) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/contents/{filepath}][%d] repoDeleteFileLocked", 423)
+}
+
+func (o *RepoDeleteFileLocked) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/contents/{filepath}][%d] repoDeleteFileLocked", 423)
+}
+
+func (o *RepoDeleteFileLocked) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_delete_git_hook_parameters.go b/bots-common/gitea-generated/client/repository/repo_delete_git_hook_parameters.go
new file mode 100644
index 0000000..13677c7
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_delete_git_hook_parameters.go
@@ -0,0 +1,195 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewRepoDeleteGitHookParams creates a new RepoDeleteGitHookParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoDeleteGitHookParams() *RepoDeleteGitHookParams {
+	return &RepoDeleteGitHookParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoDeleteGitHookParamsWithTimeout creates a new RepoDeleteGitHookParams object
+// with the ability to set a timeout on a request.
+func NewRepoDeleteGitHookParamsWithTimeout(timeout time.Duration) *RepoDeleteGitHookParams {
+	return &RepoDeleteGitHookParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoDeleteGitHookParamsWithContext creates a new RepoDeleteGitHookParams object
+// with the ability to set a context for a request.
+func NewRepoDeleteGitHookParamsWithContext(ctx context.Context) *RepoDeleteGitHookParams {
+	return &RepoDeleteGitHookParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoDeleteGitHookParamsWithHTTPClient creates a new RepoDeleteGitHookParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoDeleteGitHookParamsWithHTTPClient(client *http.Client) *RepoDeleteGitHookParams {
+	return &RepoDeleteGitHookParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoDeleteGitHookParams contains all the parameters to send to the API endpoint
+
+	for the repo delete git hook operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoDeleteGitHookParams struct {
+
+	/* ID.
+
+	   id of the hook to get
+	*/
+	ID string
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo delete git hook params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoDeleteGitHookParams) WithDefaults() *RepoDeleteGitHookParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo delete git hook params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoDeleteGitHookParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo delete git hook params
+func (o *RepoDeleteGitHookParams) WithTimeout(timeout time.Duration) *RepoDeleteGitHookParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo delete git hook params
+func (o *RepoDeleteGitHookParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo delete git hook params
+func (o *RepoDeleteGitHookParams) WithContext(ctx context.Context) *RepoDeleteGitHookParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo delete git hook params
+func (o *RepoDeleteGitHookParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo delete git hook params
+func (o *RepoDeleteGitHookParams) WithHTTPClient(client *http.Client) *RepoDeleteGitHookParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo delete git hook params
+func (o *RepoDeleteGitHookParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithID adds the id to the repo delete git hook params
+func (o *RepoDeleteGitHookParams) WithID(id string) *RepoDeleteGitHookParams {
+	o.SetID(id)
+	return o
+}
+
+// SetID adds the id to the repo delete git hook params
+func (o *RepoDeleteGitHookParams) SetID(id string) {
+	o.ID = id
+}
+
+// WithOwner adds the owner to the repo delete git hook params
+func (o *RepoDeleteGitHookParams) WithOwner(owner string) *RepoDeleteGitHookParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo delete git hook params
+func (o *RepoDeleteGitHookParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo delete git hook params
+func (o *RepoDeleteGitHookParams) WithRepo(repo string) *RepoDeleteGitHookParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo delete git hook params
+func (o *RepoDeleteGitHookParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoDeleteGitHookParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param id
+	if err := r.SetPathParam("id", o.ID); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_delete_git_hook_responses.go b/bots-common/gitea-generated/client/repository/repo_delete_git_hook_responses.go
new file mode 100644
index 0000000..33cca67
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_delete_git_hook_responses.go
@@ -0,0 +1,150 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// RepoDeleteGitHookReader is a Reader for the RepoDeleteGitHook structure.
+type RepoDeleteGitHookReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoDeleteGitHookReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewRepoDeleteGitHookNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoDeleteGitHookNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[DELETE /repos/{owner}/{repo}/hooks/git/{id}] repoDeleteGitHook", response, response.Code())
+	}
+}
+
+// NewRepoDeleteGitHookNoContent creates a RepoDeleteGitHookNoContent with default headers values
+func NewRepoDeleteGitHookNoContent() *RepoDeleteGitHookNoContent {
+	return &RepoDeleteGitHookNoContent{}
+}
+
+/*
+RepoDeleteGitHookNoContent describes a response with status code 204, with default header values.
+
+APIEmpty is an empty response
+*/
+type RepoDeleteGitHookNoContent struct {
+}
+
+// IsSuccess returns true when this repo delete git hook no content response has a 2xx status code
+func (o *RepoDeleteGitHookNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo delete git hook no content response has a 3xx status code
+func (o *RepoDeleteGitHookNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo delete git hook no content response has a 4xx status code
+func (o *RepoDeleteGitHookNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo delete git hook no content response has a 5xx status code
+func (o *RepoDeleteGitHookNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo delete git hook no content response a status code equal to that given
+func (o *RepoDeleteGitHookNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the repo delete git hook no content response
+func (o *RepoDeleteGitHookNoContent) Code() int {
+	return 204
+}
+
+func (o *RepoDeleteGitHookNoContent) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/hooks/git/{id}][%d] repoDeleteGitHookNoContent", 204)
+}
+
+func (o *RepoDeleteGitHookNoContent) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/hooks/git/{id}][%d] repoDeleteGitHookNoContent", 204)
+}
+
+func (o *RepoDeleteGitHookNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewRepoDeleteGitHookNotFound creates a RepoDeleteGitHookNotFound with default headers values
+func NewRepoDeleteGitHookNotFound() *RepoDeleteGitHookNotFound {
+	return &RepoDeleteGitHookNotFound{}
+}
+
+/*
+RepoDeleteGitHookNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoDeleteGitHookNotFound struct {
+}
+
+// IsSuccess returns true when this repo delete git hook not found response has a 2xx status code
+func (o *RepoDeleteGitHookNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo delete git hook not found response has a 3xx status code
+func (o *RepoDeleteGitHookNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo delete git hook not found response has a 4xx status code
+func (o *RepoDeleteGitHookNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo delete git hook not found response has a 5xx status code
+func (o *RepoDeleteGitHookNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo delete git hook not found response a status code equal to that given
+func (o *RepoDeleteGitHookNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo delete git hook not found response
+func (o *RepoDeleteGitHookNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoDeleteGitHookNotFound) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/hooks/git/{id}][%d] repoDeleteGitHookNotFound", 404)
+}
+
+func (o *RepoDeleteGitHookNotFound) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/hooks/git/{id}][%d] repoDeleteGitHookNotFound", 404)
+}
+
+func (o *RepoDeleteGitHookNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_delete_hook_parameters.go b/bots-common/gitea-generated/client/repository/repo_delete_hook_parameters.go
new file mode 100644
index 0000000..3a64252
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_delete_hook_parameters.go
@@ -0,0 +1,198 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewRepoDeleteHookParams creates a new RepoDeleteHookParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoDeleteHookParams() *RepoDeleteHookParams {
+	return &RepoDeleteHookParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoDeleteHookParamsWithTimeout creates a new RepoDeleteHookParams object
+// with the ability to set a timeout on a request.
+func NewRepoDeleteHookParamsWithTimeout(timeout time.Duration) *RepoDeleteHookParams {
+	return &RepoDeleteHookParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoDeleteHookParamsWithContext creates a new RepoDeleteHookParams object
+// with the ability to set a context for a request.
+func NewRepoDeleteHookParamsWithContext(ctx context.Context) *RepoDeleteHookParams {
+	return &RepoDeleteHookParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoDeleteHookParamsWithHTTPClient creates a new RepoDeleteHookParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoDeleteHookParamsWithHTTPClient(client *http.Client) *RepoDeleteHookParams {
+	return &RepoDeleteHookParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoDeleteHookParams contains all the parameters to send to the API endpoint
+
+	for the repo delete hook operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoDeleteHookParams struct {
+
+	/* ID.
+
+	   id of the hook to delete
+
+	   Format: int64
+	*/
+	ID int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo delete hook params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoDeleteHookParams) WithDefaults() *RepoDeleteHookParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo delete hook params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoDeleteHookParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo delete hook params
+func (o *RepoDeleteHookParams) WithTimeout(timeout time.Duration) *RepoDeleteHookParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo delete hook params
+func (o *RepoDeleteHookParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo delete hook params
+func (o *RepoDeleteHookParams) WithContext(ctx context.Context) *RepoDeleteHookParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo delete hook params
+func (o *RepoDeleteHookParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo delete hook params
+func (o *RepoDeleteHookParams) WithHTTPClient(client *http.Client) *RepoDeleteHookParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo delete hook params
+func (o *RepoDeleteHookParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithID adds the id to the repo delete hook params
+func (o *RepoDeleteHookParams) WithID(id int64) *RepoDeleteHookParams {
+	o.SetID(id)
+	return o
+}
+
+// SetID adds the id to the repo delete hook params
+func (o *RepoDeleteHookParams) SetID(id int64) {
+	o.ID = id
+}
+
+// WithOwner adds the owner to the repo delete hook params
+func (o *RepoDeleteHookParams) WithOwner(owner string) *RepoDeleteHookParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo delete hook params
+func (o *RepoDeleteHookParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo delete hook params
+func (o *RepoDeleteHookParams) WithRepo(repo string) *RepoDeleteHookParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo delete hook params
+func (o *RepoDeleteHookParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoDeleteHookParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param id
+	if err := r.SetPathParam("id", swag.FormatInt64(o.ID)); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_delete_hook_responses.go b/bots-common/gitea-generated/client/repository/repo_delete_hook_responses.go
new file mode 100644
index 0000000..fff548d
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_delete_hook_responses.go
@@ -0,0 +1,150 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// RepoDeleteHookReader is a Reader for the RepoDeleteHook structure.
+type RepoDeleteHookReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoDeleteHookReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewRepoDeleteHookNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoDeleteHookNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[DELETE /repos/{owner}/{repo}/hooks/{id}] repoDeleteHook", response, response.Code())
+	}
+}
+
+// NewRepoDeleteHookNoContent creates a RepoDeleteHookNoContent with default headers values
+func NewRepoDeleteHookNoContent() *RepoDeleteHookNoContent {
+	return &RepoDeleteHookNoContent{}
+}
+
+/*
+RepoDeleteHookNoContent describes a response with status code 204, with default header values.
+
+APIEmpty is an empty response
+*/
+type RepoDeleteHookNoContent struct {
+}
+
+// IsSuccess returns true when this repo delete hook no content response has a 2xx status code
+func (o *RepoDeleteHookNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo delete hook no content response has a 3xx status code
+func (o *RepoDeleteHookNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo delete hook no content response has a 4xx status code
+func (o *RepoDeleteHookNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo delete hook no content response has a 5xx status code
+func (o *RepoDeleteHookNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo delete hook no content response a status code equal to that given
+func (o *RepoDeleteHookNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the repo delete hook no content response
+func (o *RepoDeleteHookNoContent) Code() int {
+	return 204
+}
+
+func (o *RepoDeleteHookNoContent) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/hooks/{id}][%d] repoDeleteHookNoContent", 204)
+}
+
+func (o *RepoDeleteHookNoContent) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/hooks/{id}][%d] repoDeleteHookNoContent", 204)
+}
+
+func (o *RepoDeleteHookNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewRepoDeleteHookNotFound creates a RepoDeleteHookNotFound with default headers values
+func NewRepoDeleteHookNotFound() *RepoDeleteHookNotFound {
+	return &RepoDeleteHookNotFound{}
+}
+
+/*
+RepoDeleteHookNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoDeleteHookNotFound struct {
+}
+
+// IsSuccess returns true when this repo delete hook not found response has a 2xx status code
+func (o *RepoDeleteHookNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo delete hook not found response has a 3xx status code
+func (o *RepoDeleteHookNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo delete hook not found response has a 4xx status code
+func (o *RepoDeleteHookNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo delete hook not found response has a 5xx status code
+func (o *RepoDeleteHookNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo delete hook not found response a status code equal to that given
+func (o *RepoDeleteHookNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo delete hook not found response
+func (o *RepoDeleteHookNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoDeleteHookNotFound) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/hooks/{id}][%d] repoDeleteHookNotFound", 404)
+}
+
+func (o *RepoDeleteHookNotFound) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/hooks/{id}][%d] repoDeleteHookNotFound", 404)
+}
+
+func (o *RepoDeleteHookNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_delete_key_parameters.go b/bots-common/gitea-generated/client/repository/repo_delete_key_parameters.go
new file mode 100644
index 0000000..e02c5de
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_delete_key_parameters.go
@@ -0,0 +1,198 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewRepoDeleteKeyParams creates a new RepoDeleteKeyParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoDeleteKeyParams() *RepoDeleteKeyParams {
+	return &RepoDeleteKeyParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoDeleteKeyParamsWithTimeout creates a new RepoDeleteKeyParams object
+// with the ability to set a timeout on a request.
+func NewRepoDeleteKeyParamsWithTimeout(timeout time.Duration) *RepoDeleteKeyParams {
+	return &RepoDeleteKeyParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoDeleteKeyParamsWithContext creates a new RepoDeleteKeyParams object
+// with the ability to set a context for a request.
+func NewRepoDeleteKeyParamsWithContext(ctx context.Context) *RepoDeleteKeyParams {
+	return &RepoDeleteKeyParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoDeleteKeyParamsWithHTTPClient creates a new RepoDeleteKeyParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoDeleteKeyParamsWithHTTPClient(client *http.Client) *RepoDeleteKeyParams {
+	return &RepoDeleteKeyParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoDeleteKeyParams contains all the parameters to send to the API endpoint
+
+	for the repo delete key operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoDeleteKeyParams struct {
+
+	/* ID.
+
+	   id of the key to delete
+
+	   Format: int64
+	*/
+	ID int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo delete key params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoDeleteKeyParams) WithDefaults() *RepoDeleteKeyParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo delete key params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoDeleteKeyParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo delete key params
+func (o *RepoDeleteKeyParams) WithTimeout(timeout time.Duration) *RepoDeleteKeyParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo delete key params
+func (o *RepoDeleteKeyParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo delete key params
+func (o *RepoDeleteKeyParams) WithContext(ctx context.Context) *RepoDeleteKeyParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo delete key params
+func (o *RepoDeleteKeyParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo delete key params
+func (o *RepoDeleteKeyParams) WithHTTPClient(client *http.Client) *RepoDeleteKeyParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo delete key params
+func (o *RepoDeleteKeyParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithID adds the id to the repo delete key params
+func (o *RepoDeleteKeyParams) WithID(id int64) *RepoDeleteKeyParams {
+	o.SetID(id)
+	return o
+}
+
+// SetID adds the id to the repo delete key params
+func (o *RepoDeleteKeyParams) SetID(id int64) {
+	o.ID = id
+}
+
+// WithOwner adds the owner to the repo delete key params
+func (o *RepoDeleteKeyParams) WithOwner(owner string) *RepoDeleteKeyParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo delete key params
+func (o *RepoDeleteKeyParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo delete key params
+func (o *RepoDeleteKeyParams) WithRepo(repo string) *RepoDeleteKeyParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo delete key params
+func (o *RepoDeleteKeyParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoDeleteKeyParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param id
+	if err := r.SetPathParam("id", swag.FormatInt64(o.ID)); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_delete_key_responses.go b/bots-common/gitea-generated/client/repository/repo_delete_key_responses.go
new file mode 100644
index 0000000..0fc9016
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_delete_key_responses.go
@@ -0,0 +1,228 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// RepoDeleteKeyReader is a Reader for the RepoDeleteKey structure.
+type RepoDeleteKeyReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoDeleteKeyReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewRepoDeleteKeyNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 403:
+		result := NewRepoDeleteKeyForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewRepoDeleteKeyNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[DELETE /repos/{owner}/{repo}/keys/{id}] repoDeleteKey", response, response.Code())
+	}
+}
+
+// NewRepoDeleteKeyNoContent creates a RepoDeleteKeyNoContent with default headers values
+func NewRepoDeleteKeyNoContent() *RepoDeleteKeyNoContent {
+	return &RepoDeleteKeyNoContent{}
+}
+
+/*
+RepoDeleteKeyNoContent describes a response with status code 204, with default header values.
+
+APIEmpty is an empty response
+*/
+type RepoDeleteKeyNoContent struct {
+}
+
+// IsSuccess returns true when this repo delete key no content response has a 2xx status code
+func (o *RepoDeleteKeyNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo delete key no content response has a 3xx status code
+func (o *RepoDeleteKeyNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo delete key no content response has a 4xx status code
+func (o *RepoDeleteKeyNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo delete key no content response has a 5xx status code
+func (o *RepoDeleteKeyNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo delete key no content response a status code equal to that given
+func (o *RepoDeleteKeyNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the repo delete key no content response
+func (o *RepoDeleteKeyNoContent) Code() int {
+	return 204
+}
+
+func (o *RepoDeleteKeyNoContent) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/keys/{id}][%d] repoDeleteKeyNoContent", 204)
+}
+
+func (o *RepoDeleteKeyNoContent) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/keys/{id}][%d] repoDeleteKeyNoContent", 204)
+}
+
+func (o *RepoDeleteKeyNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewRepoDeleteKeyForbidden creates a RepoDeleteKeyForbidden with default headers values
+func NewRepoDeleteKeyForbidden() *RepoDeleteKeyForbidden {
+	return &RepoDeleteKeyForbidden{}
+}
+
+/*
+RepoDeleteKeyForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type RepoDeleteKeyForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo delete key forbidden response has a 2xx status code
+func (o *RepoDeleteKeyForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo delete key forbidden response has a 3xx status code
+func (o *RepoDeleteKeyForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo delete key forbidden response has a 4xx status code
+func (o *RepoDeleteKeyForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo delete key forbidden response has a 5xx status code
+func (o *RepoDeleteKeyForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo delete key forbidden response a status code equal to that given
+func (o *RepoDeleteKeyForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the repo delete key forbidden response
+func (o *RepoDeleteKeyForbidden) Code() int {
+	return 403
+}
+
+func (o *RepoDeleteKeyForbidden) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/keys/{id}][%d] repoDeleteKeyForbidden", 403)
+}
+
+func (o *RepoDeleteKeyForbidden) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/keys/{id}][%d] repoDeleteKeyForbidden", 403)
+}
+
+func (o *RepoDeleteKeyForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewRepoDeleteKeyNotFound creates a RepoDeleteKeyNotFound with default headers values
+func NewRepoDeleteKeyNotFound() *RepoDeleteKeyNotFound {
+	return &RepoDeleteKeyNotFound{}
+}
+
+/*
+RepoDeleteKeyNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoDeleteKeyNotFound struct {
+}
+
+// IsSuccess returns true when this repo delete key not found response has a 2xx status code
+func (o *RepoDeleteKeyNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo delete key not found response has a 3xx status code
+func (o *RepoDeleteKeyNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo delete key not found response has a 4xx status code
+func (o *RepoDeleteKeyNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo delete key not found response has a 5xx status code
+func (o *RepoDeleteKeyNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo delete key not found response a status code equal to that given
+func (o *RepoDeleteKeyNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo delete key not found response
+func (o *RepoDeleteKeyNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoDeleteKeyNotFound) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/keys/{id}][%d] repoDeleteKeyNotFound", 404)
+}
+
+func (o *RepoDeleteKeyNotFound) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/keys/{id}][%d] repoDeleteKeyNotFound", 404)
+}
+
+func (o *RepoDeleteKeyNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_delete_parameters.go b/bots-common/gitea-generated/client/repository/repo_delete_parameters.go
new file mode 100644
index 0000000..fe5579c
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_delete_parameters.go
@@ -0,0 +1,173 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewRepoDeleteParams creates a new RepoDeleteParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoDeleteParams() *RepoDeleteParams {
+	return &RepoDeleteParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoDeleteParamsWithTimeout creates a new RepoDeleteParams object
+// with the ability to set a timeout on a request.
+func NewRepoDeleteParamsWithTimeout(timeout time.Duration) *RepoDeleteParams {
+	return &RepoDeleteParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoDeleteParamsWithContext creates a new RepoDeleteParams object
+// with the ability to set a context for a request.
+func NewRepoDeleteParamsWithContext(ctx context.Context) *RepoDeleteParams {
+	return &RepoDeleteParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoDeleteParamsWithHTTPClient creates a new RepoDeleteParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoDeleteParamsWithHTTPClient(client *http.Client) *RepoDeleteParams {
+	return &RepoDeleteParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoDeleteParams contains all the parameters to send to the API endpoint
+
+	for the repo delete operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoDeleteParams struct {
+
+	/* Owner.
+
+	   owner of the repo to delete
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo to delete
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo delete params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoDeleteParams) WithDefaults() *RepoDeleteParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo delete params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoDeleteParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo delete params
+func (o *RepoDeleteParams) WithTimeout(timeout time.Duration) *RepoDeleteParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo delete params
+func (o *RepoDeleteParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo delete params
+func (o *RepoDeleteParams) WithContext(ctx context.Context) *RepoDeleteParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo delete params
+func (o *RepoDeleteParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo delete params
+func (o *RepoDeleteParams) WithHTTPClient(client *http.Client) *RepoDeleteParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo delete params
+func (o *RepoDeleteParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithOwner adds the owner to the repo delete params
+func (o *RepoDeleteParams) WithOwner(owner string) *RepoDeleteParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo delete params
+func (o *RepoDeleteParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo delete params
+func (o *RepoDeleteParams) WithRepo(repo string) *RepoDeleteParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo delete params
+func (o *RepoDeleteParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoDeleteParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_delete_pull_review_parameters.go b/bots-common/gitea-generated/client/repository/repo_delete_pull_review_parameters.go
new file mode 100644
index 0000000..287c6a5
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_delete_pull_review_parameters.go
@@ -0,0 +1,222 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewRepoDeletePullReviewParams creates a new RepoDeletePullReviewParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoDeletePullReviewParams() *RepoDeletePullReviewParams {
+	return &RepoDeletePullReviewParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoDeletePullReviewParamsWithTimeout creates a new RepoDeletePullReviewParams object
+// with the ability to set a timeout on a request.
+func NewRepoDeletePullReviewParamsWithTimeout(timeout time.Duration) *RepoDeletePullReviewParams {
+	return &RepoDeletePullReviewParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoDeletePullReviewParamsWithContext creates a new RepoDeletePullReviewParams object
+// with the ability to set a context for a request.
+func NewRepoDeletePullReviewParamsWithContext(ctx context.Context) *RepoDeletePullReviewParams {
+	return &RepoDeletePullReviewParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoDeletePullReviewParamsWithHTTPClient creates a new RepoDeletePullReviewParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoDeletePullReviewParamsWithHTTPClient(client *http.Client) *RepoDeletePullReviewParams {
+	return &RepoDeletePullReviewParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoDeletePullReviewParams contains all the parameters to send to the API endpoint
+
+	for the repo delete pull review operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoDeletePullReviewParams struct {
+
+	/* ID.
+
+	   id of the review
+
+	   Format: int64
+	*/
+	ID int64
+
+	/* Index.
+
+	   index of the pull request
+
+	   Format: int64
+	*/
+	Index int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo delete pull review params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoDeletePullReviewParams) WithDefaults() *RepoDeletePullReviewParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo delete pull review params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoDeletePullReviewParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo delete pull review params
+func (o *RepoDeletePullReviewParams) WithTimeout(timeout time.Duration) *RepoDeletePullReviewParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo delete pull review params
+func (o *RepoDeletePullReviewParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo delete pull review params
+func (o *RepoDeletePullReviewParams) WithContext(ctx context.Context) *RepoDeletePullReviewParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo delete pull review params
+func (o *RepoDeletePullReviewParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo delete pull review params
+func (o *RepoDeletePullReviewParams) WithHTTPClient(client *http.Client) *RepoDeletePullReviewParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo delete pull review params
+func (o *RepoDeletePullReviewParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithID adds the id to the repo delete pull review params
+func (o *RepoDeletePullReviewParams) WithID(id int64) *RepoDeletePullReviewParams {
+	o.SetID(id)
+	return o
+}
+
+// SetID adds the id to the repo delete pull review params
+func (o *RepoDeletePullReviewParams) SetID(id int64) {
+	o.ID = id
+}
+
+// WithIndex adds the index to the repo delete pull review params
+func (o *RepoDeletePullReviewParams) WithIndex(index int64) *RepoDeletePullReviewParams {
+	o.SetIndex(index)
+	return o
+}
+
+// SetIndex adds the index to the repo delete pull review params
+func (o *RepoDeletePullReviewParams) SetIndex(index int64) {
+	o.Index = index
+}
+
+// WithOwner adds the owner to the repo delete pull review params
+func (o *RepoDeletePullReviewParams) WithOwner(owner string) *RepoDeletePullReviewParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo delete pull review params
+func (o *RepoDeletePullReviewParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo delete pull review params
+func (o *RepoDeletePullReviewParams) WithRepo(repo string) *RepoDeletePullReviewParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo delete pull review params
+func (o *RepoDeletePullReviewParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoDeletePullReviewParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param id
+	if err := r.SetPathParam("id", swag.FormatInt64(o.ID)); err != nil {
+		return err
+	}
+
+	// path param index
+	if err := r.SetPathParam("index", swag.FormatInt64(o.Index)); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_delete_pull_review_requests_parameters.go b/bots-common/gitea-generated/client/repository/repo_delete_pull_review_requests_parameters.go
new file mode 100644
index 0000000..c7c30d4
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_delete_pull_review_requests_parameters.go
@@ -0,0 +1,219 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewRepoDeletePullReviewRequestsParams creates a new RepoDeletePullReviewRequestsParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoDeletePullReviewRequestsParams() *RepoDeletePullReviewRequestsParams {
+	return &RepoDeletePullReviewRequestsParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoDeletePullReviewRequestsParamsWithTimeout creates a new RepoDeletePullReviewRequestsParams object
+// with the ability to set a timeout on a request.
+func NewRepoDeletePullReviewRequestsParamsWithTimeout(timeout time.Duration) *RepoDeletePullReviewRequestsParams {
+	return &RepoDeletePullReviewRequestsParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoDeletePullReviewRequestsParamsWithContext creates a new RepoDeletePullReviewRequestsParams object
+// with the ability to set a context for a request.
+func NewRepoDeletePullReviewRequestsParamsWithContext(ctx context.Context) *RepoDeletePullReviewRequestsParams {
+	return &RepoDeletePullReviewRequestsParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoDeletePullReviewRequestsParamsWithHTTPClient creates a new RepoDeletePullReviewRequestsParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoDeletePullReviewRequestsParamsWithHTTPClient(client *http.Client) *RepoDeletePullReviewRequestsParams {
+	return &RepoDeletePullReviewRequestsParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoDeletePullReviewRequestsParams contains all the parameters to send to the API endpoint
+
+	for the repo delete pull review requests operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoDeletePullReviewRequestsParams struct {
+
+	// Body.
+	Body *models.PullReviewRequestOptions
+
+	/* Index.
+
+	   index of the pull request
+
+	   Format: int64
+	*/
+	Index int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo delete pull review requests params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoDeletePullReviewRequestsParams) WithDefaults() *RepoDeletePullReviewRequestsParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo delete pull review requests params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoDeletePullReviewRequestsParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo delete pull review requests params
+func (o *RepoDeletePullReviewRequestsParams) WithTimeout(timeout time.Duration) *RepoDeletePullReviewRequestsParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo delete pull review requests params
+func (o *RepoDeletePullReviewRequestsParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo delete pull review requests params
+func (o *RepoDeletePullReviewRequestsParams) WithContext(ctx context.Context) *RepoDeletePullReviewRequestsParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo delete pull review requests params
+func (o *RepoDeletePullReviewRequestsParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo delete pull review requests params
+func (o *RepoDeletePullReviewRequestsParams) WithHTTPClient(client *http.Client) *RepoDeletePullReviewRequestsParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo delete pull review requests params
+func (o *RepoDeletePullReviewRequestsParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the repo delete pull review requests params
+func (o *RepoDeletePullReviewRequestsParams) WithBody(body *models.PullReviewRequestOptions) *RepoDeletePullReviewRequestsParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the repo delete pull review requests params
+func (o *RepoDeletePullReviewRequestsParams) SetBody(body *models.PullReviewRequestOptions) {
+	o.Body = body
+}
+
+// WithIndex adds the index to the repo delete pull review requests params
+func (o *RepoDeletePullReviewRequestsParams) WithIndex(index int64) *RepoDeletePullReviewRequestsParams {
+	o.SetIndex(index)
+	return o
+}
+
+// SetIndex adds the index to the repo delete pull review requests params
+func (o *RepoDeletePullReviewRequestsParams) SetIndex(index int64) {
+	o.Index = index
+}
+
+// WithOwner adds the owner to the repo delete pull review requests params
+func (o *RepoDeletePullReviewRequestsParams) WithOwner(owner string) *RepoDeletePullReviewRequestsParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo delete pull review requests params
+func (o *RepoDeletePullReviewRequestsParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo delete pull review requests params
+func (o *RepoDeletePullReviewRequestsParams) WithRepo(repo string) *RepoDeletePullReviewRequestsParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo delete pull review requests params
+func (o *RepoDeletePullReviewRequestsParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoDeletePullReviewRequestsParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	// path param index
+	if err := r.SetPathParam("index", swag.FormatInt64(o.Index)); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_delete_pull_review_requests_responses.go b/bots-common/gitea-generated/client/repository/repo_delete_pull_review_requests_responses.go
new file mode 100644
index 0000000..0294c9c
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_delete_pull_review_requests_responses.go
@@ -0,0 +1,306 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// RepoDeletePullReviewRequestsReader is a Reader for the RepoDeletePullReviewRequests structure.
+type RepoDeletePullReviewRequestsReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoDeletePullReviewRequestsReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewRepoDeletePullReviewRequestsNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 403:
+		result := NewRepoDeletePullReviewRequestsForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewRepoDeletePullReviewRequestsNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 422:
+		result := NewRepoDeletePullReviewRequestsUnprocessableEntity()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[DELETE /repos/{owner}/{repo}/pulls/{index}/requested_reviewers] repoDeletePullReviewRequests", response, response.Code())
+	}
+}
+
+// NewRepoDeletePullReviewRequestsNoContent creates a RepoDeletePullReviewRequestsNoContent with default headers values
+func NewRepoDeletePullReviewRequestsNoContent() *RepoDeletePullReviewRequestsNoContent {
+	return &RepoDeletePullReviewRequestsNoContent{}
+}
+
+/*
+RepoDeletePullReviewRequestsNoContent describes a response with status code 204, with default header values.
+
+APIEmpty is an empty response
+*/
+type RepoDeletePullReviewRequestsNoContent struct {
+}
+
+// IsSuccess returns true when this repo delete pull review requests no content response has a 2xx status code
+func (o *RepoDeletePullReviewRequestsNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo delete pull review requests no content response has a 3xx status code
+func (o *RepoDeletePullReviewRequestsNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo delete pull review requests no content response has a 4xx status code
+func (o *RepoDeletePullReviewRequestsNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo delete pull review requests no content response has a 5xx status code
+func (o *RepoDeletePullReviewRequestsNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo delete pull review requests no content response a status code equal to that given
+func (o *RepoDeletePullReviewRequestsNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the repo delete pull review requests no content response
+func (o *RepoDeletePullReviewRequestsNoContent) Code() int {
+	return 204
+}
+
+func (o *RepoDeletePullReviewRequestsNoContent) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/pulls/{index}/requested_reviewers][%d] repoDeletePullReviewRequestsNoContent", 204)
+}
+
+func (o *RepoDeletePullReviewRequestsNoContent) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/pulls/{index}/requested_reviewers][%d] repoDeletePullReviewRequestsNoContent", 204)
+}
+
+func (o *RepoDeletePullReviewRequestsNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewRepoDeletePullReviewRequestsForbidden creates a RepoDeletePullReviewRequestsForbidden with default headers values
+func NewRepoDeletePullReviewRequestsForbidden() *RepoDeletePullReviewRequestsForbidden {
+	return &RepoDeletePullReviewRequestsForbidden{}
+}
+
+/*
+RepoDeletePullReviewRequestsForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type RepoDeletePullReviewRequestsForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo delete pull review requests forbidden response has a 2xx status code
+func (o *RepoDeletePullReviewRequestsForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo delete pull review requests forbidden response has a 3xx status code
+func (o *RepoDeletePullReviewRequestsForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo delete pull review requests forbidden response has a 4xx status code
+func (o *RepoDeletePullReviewRequestsForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo delete pull review requests forbidden response has a 5xx status code
+func (o *RepoDeletePullReviewRequestsForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo delete pull review requests forbidden response a status code equal to that given
+func (o *RepoDeletePullReviewRequestsForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the repo delete pull review requests forbidden response
+func (o *RepoDeletePullReviewRequestsForbidden) Code() int {
+	return 403
+}
+
+func (o *RepoDeletePullReviewRequestsForbidden) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/pulls/{index}/requested_reviewers][%d] repoDeletePullReviewRequestsForbidden", 403)
+}
+
+func (o *RepoDeletePullReviewRequestsForbidden) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/pulls/{index}/requested_reviewers][%d] repoDeletePullReviewRequestsForbidden", 403)
+}
+
+func (o *RepoDeletePullReviewRequestsForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewRepoDeletePullReviewRequestsNotFound creates a RepoDeletePullReviewRequestsNotFound with default headers values
+func NewRepoDeletePullReviewRequestsNotFound() *RepoDeletePullReviewRequestsNotFound {
+	return &RepoDeletePullReviewRequestsNotFound{}
+}
+
+/*
+RepoDeletePullReviewRequestsNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoDeletePullReviewRequestsNotFound struct {
+}
+
+// IsSuccess returns true when this repo delete pull review requests not found response has a 2xx status code
+func (o *RepoDeletePullReviewRequestsNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo delete pull review requests not found response has a 3xx status code
+func (o *RepoDeletePullReviewRequestsNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo delete pull review requests not found response has a 4xx status code
+func (o *RepoDeletePullReviewRequestsNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo delete pull review requests not found response has a 5xx status code
+func (o *RepoDeletePullReviewRequestsNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo delete pull review requests not found response a status code equal to that given
+func (o *RepoDeletePullReviewRequestsNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo delete pull review requests not found response
+func (o *RepoDeletePullReviewRequestsNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoDeletePullReviewRequestsNotFound) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/pulls/{index}/requested_reviewers][%d] repoDeletePullReviewRequestsNotFound", 404)
+}
+
+func (o *RepoDeletePullReviewRequestsNotFound) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/pulls/{index}/requested_reviewers][%d] repoDeletePullReviewRequestsNotFound", 404)
+}
+
+func (o *RepoDeletePullReviewRequestsNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewRepoDeletePullReviewRequestsUnprocessableEntity creates a RepoDeletePullReviewRequestsUnprocessableEntity with default headers values
+func NewRepoDeletePullReviewRequestsUnprocessableEntity() *RepoDeletePullReviewRequestsUnprocessableEntity {
+	return &RepoDeletePullReviewRequestsUnprocessableEntity{}
+}
+
+/*
+RepoDeletePullReviewRequestsUnprocessableEntity describes a response with status code 422, with default header values.
+
+APIValidationError is error format response related to input validation
+*/
+type RepoDeletePullReviewRequestsUnprocessableEntity struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo delete pull review requests unprocessable entity response has a 2xx status code
+func (o *RepoDeletePullReviewRequestsUnprocessableEntity) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo delete pull review requests unprocessable entity response has a 3xx status code
+func (o *RepoDeletePullReviewRequestsUnprocessableEntity) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo delete pull review requests unprocessable entity response has a 4xx status code
+func (o *RepoDeletePullReviewRequestsUnprocessableEntity) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo delete pull review requests unprocessable entity response has a 5xx status code
+func (o *RepoDeletePullReviewRequestsUnprocessableEntity) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo delete pull review requests unprocessable entity response a status code equal to that given
+func (o *RepoDeletePullReviewRequestsUnprocessableEntity) IsCode(code int) bool {
+	return code == 422
+}
+
+// Code gets the status code for the repo delete pull review requests unprocessable entity response
+func (o *RepoDeletePullReviewRequestsUnprocessableEntity) Code() int {
+	return 422
+}
+
+func (o *RepoDeletePullReviewRequestsUnprocessableEntity) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/pulls/{index}/requested_reviewers][%d] repoDeletePullReviewRequestsUnprocessableEntity", 422)
+}
+
+func (o *RepoDeletePullReviewRequestsUnprocessableEntity) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/pulls/{index}/requested_reviewers][%d] repoDeletePullReviewRequestsUnprocessableEntity", 422)
+}
+
+func (o *RepoDeletePullReviewRequestsUnprocessableEntity) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_delete_pull_review_responses.go b/bots-common/gitea-generated/client/repository/repo_delete_pull_review_responses.go
new file mode 100644
index 0000000..ac8ddb7
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_delete_pull_review_responses.go
@@ -0,0 +1,228 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// RepoDeletePullReviewReader is a Reader for the RepoDeletePullReview structure.
+type RepoDeletePullReviewReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoDeletePullReviewReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewRepoDeletePullReviewNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 403:
+		result := NewRepoDeletePullReviewForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewRepoDeletePullReviewNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[DELETE /repos/{owner}/{repo}/pulls/{index}/reviews/{id}] repoDeletePullReview", response, response.Code())
+	}
+}
+
+// NewRepoDeletePullReviewNoContent creates a RepoDeletePullReviewNoContent with default headers values
+func NewRepoDeletePullReviewNoContent() *RepoDeletePullReviewNoContent {
+	return &RepoDeletePullReviewNoContent{}
+}
+
+/*
+RepoDeletePullReviewNoContent describes a response with status code 204, with default header values.
+
+APIEmpty is an empty response
+*/
+type RepoDeletePullReviewNoContent struct {
+}
+
+// IsSuccess returns true when this repo delete pull review no content response has a 2xx status code
+func (o *RepoDeletePullReviewNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo delete pull review no content response has a 3xx status code
+func (o *RepoDeletePullReviewNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo delete pull review no content response has a 4xx status code
+func (o *RepoDeletePullReviewNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo delete pull review no content response has a 5xx status code
+func (o *RepoDeletePullReviewNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo delete pull review no content response a status code equal to that given
+func (o *RepoDeletePullReviewNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the repo delete pull review no content response
+func (o *RepoDeletePullReviewNoContent) Code() int {
+	return 204
+}
+
+func (o *RepoDeletePullReviewNoContent) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/pulls/{index}/reviews/{id}][%d] repoDeletePullReviewNoContent", 204)
+}
+
+func (o *RepoDeletePullReviewNoContent) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/pulls/{index}/reviews/{id}][%d] repoDeletePullReviewNoContent", 204)
+}
+
+func (o *RepoDeletePullReviewNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewRepoDeletePullReviewForbidden creates a RepoDeletePullReviewForbidden with default headers values
+func NewRepoDeletePullReviewForbidden() *RepoDeletePullReviewForbidden {
+	return &RepoDeletePullReviewForbidden{}
+}
+
+/*
+RepoDeletePullReviewForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type RepoDeletePullReviewForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo delete pull review forbidden response has a 2xx status code
+func (o *RepoDeletePullReviewForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo delete pull review forbidden response has a 3xx status code
+func (o *RepoDeletePullReviewForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo delete pull review forbidden response has a 4xx status code
+func (o *RepoDeletePullReviewForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo delete pull review forbidden response has a 5xx status code
+func (o *RepoDeletePullReviewForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo delete pull review forbidden response a status code equal to that given
+func (o *RepoDeletePullReviewForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the repo delete pull review forbidden response
+func (o *RepoDeletePullReviewForbidden) Code() int {
+	return 403
+}
+
+func (o *RepoDeletePullReviewForbidden) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/pulls/{index}/reviews/{id}][%d] repoDeletePullReviewForbidden", 403)
+}
+
+func (o *RepoDeletePullReviewForbidden) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/pulls/{index}/reviews/{id}][%d] repoDeletePullReviewForbidden", 403)
+}
+
+func (o *RepoDeletePullReviewForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewRepoDeletePullReviewNotFound creates a RepoDeletePullReviewNotFound with default headers values
+func NewRepoDeletePullReviewNotFound() *RepoDeletePullReviewNotFound {
+	return &RepoDeletePullReviewNotFound{}
+}
+
+/*
+RepoDeletePullReviewNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoDeletePullReviewNotFound struct {
+}
+
+// IsSuccess returns true when this repo delete pull review not found response has a 2xx status code
+func (o *RepoDeletePullReviewNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo delete pull review not found response has a 3xx status code
+func (o *RepoDeletePullReviewNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo delete pull review not found response has a 4xx status code
+func (o *RepoDeletePullReviewNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo delete pull review not found response has a 5xx status code
+func (o *RepoDeletePullReviewNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo delete pull review not found response a status code equal to that given
+func (o *RepoDeletePullReviewNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo delete pull review not found response
+func (o *RepoDeletePullReviewNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoDeletePullReviewNotFound) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/pulls/{index}/reviews/{id}][%d] repoDeletePullReviewNotFound", 404)
+}
+
+func (o *RepoDeletePullReviewNotFound) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/pulls/{index}/reviews/{id}][%d] repoDeletePullReviewNotFound", 404)
+}
+
+func (o *RepoDeletePullReviewNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_delete_push_mirror_parameters.go b/bots-common/gitea-generated/client/repository/repo_delete_push_mirror_parameters.go
new file mode 100644
index 0000000..2e4cdab
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_delete_push_mirror_parameters.go
@@ -0,0 +1,195 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewRepoDeletePushMirrorParams creates a new RepoDeletePushMirrorParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoDeletePushMirrorParams() *RepoDeletePushMirrorParams {
+	return &RepoDeletePushMirrorParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoDeletePushMirrorParamsWithTimeout creates a new RepoDeletePushMirrorParams object
+// with the ability to set a timeout on a request.
+func NewRepoDeletePushMirrorParamsWithTimeout(timeout time.Duration) *RepoDeletePushMirrorParams {
+	return &RepoDeletePushMirrorParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoDeletePushMirrorParamsWithContext creates a new RepoDeletePushMirrorParams object
+// with the ability to set a context for a request.
+func NewRepoDeletePushMirrorParamsWithContext(ctx context.Context) *RepoDeletePushMirrorParams {
+	return &RepoDeletePushMirrorParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoDeletePushMirrorParamsWithHTTPClient creates a new RepoDeletePushMirrorParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoDeletePushMirrorParamsWithHTTPClient(client *http.Client) *RepoDeletePushMirrorParams {
+	return &RepoDeletePushMirrorParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoDeletePushMirrorParams contains all the parameters to send to the API endpoint
+
+	for the repo delete push mirror operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoDeletePushMirrorParams struct {
+
+	/* Name.
+
+	   remote name of the pushMirror
+	*/
+	Name string
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo delete push mirror params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoDeletePushMirrorParams) WithDefaults() *RepoDeletePushMirrorParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo delete push mirror params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoDeletePushMirrorParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo delete push mirror params
+func (o *RepoDeletePushMirrorParams) WithTimeout(timeout time.Duration) *RepoDeletePushMirrorParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo delete push mirror params
+func (o *RepoDeletePushMirrorParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo delete push mirror params
+func (o *RepoDeletePushMirrorParams) WithContext(ctx context.Context) *RepoDeletePushMirrorParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo delete push mirror params
+func (o *RepoDeletePushMirrorParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo delete push mirror params
+func (o *RepoDeletePushMirrorParams) WithHTTPClient(client *http.Client) *RepoDeletePushMirrorParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo delete push mirror params
+func (o *RepoDeletePushMirrorParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithName adds the name to the repo delete push mirror params
+func (o *RepoDeletePushMirrorParams) WithName(name string) *RepoDeletePushMirrorParams {
+	o.SetName(name)
+	return o
+}
+
+// SetName adds the name to the repo delete push mirror params
+func (o *RepoDeletePushMirrorParams) SetName(name string) {
+	o.Name = name
+}
+
+// WithOwner adds the owner to the repo delete push mirror params
+func (o *RepoDeletePushMirrorParams) WithOwner(owner string) *RepoDeletePushMirrorParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo delete push mirror params
+func (o *RepoDeletePushMirrorParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo delete push mirror params
+func (o *RepoDeletePushMirrorParams) WithRepo(repo string) *RepoDeletePushMirrorParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo delete push mirror params
+func (o *RepoDeletePushMirrorParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoDeletePushMirrorParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param name
+	if err := r.SetPathParam("name", o.Name); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_delete_push_mirror_responses.go b/bots-common/gitea-generated/client/repository/repo_delete_push_mirror_responses.go
new file mode 100644
index 0000000..77bd6a3
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_delete_push_mirror_responses.go
@@ -0,0 +1,228 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// RepoDeletePushMirrorReader is a Reader for the RepoDeletePushMirror structure.
+type RepoDeletePushMirrorReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoDeletePushMirrorReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewRepoDeletePushMirrorNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 400:
+		result := NewRepoDeletePushMirrorBadRequest()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewRepoDeletePushMirrorNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[DELETE /repos/{owner}/{repo}/push_mirrors/{name}] repoDeletePushMirror", response, response.Code())
+	}
+}
+
+// NewRepoDeletePushMirrorNoContent creates a RepoDeletePushMirrorNoContent with default headers values
+func NewRepoDeletePushMirrorNoContent() *RepoDeletePushMirrorNoContent {
+	return &RepoDeletePushMirrorNoContent{}
+}
+
+/*
+RepoDeletePushMirrorNoContent describes a response with status code 204, with default header values.
+
+APIEmpty is an empty response
+*/
+type RepoDeletePushMirrorNoContent struct {
+}
+
+// IsSuccess returns true when this repo delete push mirror no content response has a 2xx status code
+func (o *RepoDeletePushMirrorNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo delete push mirror no content response has a 3xx status code
+func (o *RepoDeletePushMirrorNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo delete push mirror no content response has a 4xx status code
+func (o *RepoDeletePushMirrorNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo delete push mirror no content response has a 5xx status code
+func (o *RepoDeletePushMirrorNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo delete push mirror no content response a status code equal to that given
+func (o *RepoDeletePushMirrorNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the repo delete push mirror no content response
+func (o *RepoDeletePushMirrorNoContent) Code() int {
+	return 204
+}
+
+func (o *RepoDeletePushMirrorNoContent) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/push_mirrors/{name}][%d] repoDeletePushMirrorNoContent", 204)
+}
+
+func (o *RepoDeletePushMirrorNoContent) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/push_mirrors/{name}][%d] repoDeletePushMirrorNoContent", 204)
+}
+
+func (o *RepoDeletePushMirrorNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewRepoDeletePushMirrorBadRequest creates a RepoDeletePushMirrorBadRequest with default headers values
+func NewRepoDeletePushMirrorBadRequest() *RepoDeletePushMirrorBadRequest {
+	return &RepoDeletePushMirrorBadRequest{}
+}
+
+/*
+RepoDeletePushMirrorBadRequest describes a response with status code 400, with default header values.
+
+APIError is error format response
+*/
+type RepoDeletePushMirrorBadRequest struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo delete push mirror bad request response has a 2xx status code
+func (o *RepoDeletePushMirrorBadRequest) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo delete push mirror bad request response has a 3xx status code
+func (o *RepoDeletePushMirrorBadRequest) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo delete push mirror bad request response has a 4xx status code
+func (o *RepoDeletePushMirrorBadRequest) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo delete push mirror bad request response has a 5xx status code
+func (o *RepoDeletePushMirrorBadRequest) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo delete push mirror bad request response a status code equal to that given
+func (o *RepoDeletePushMirrorBadRequest) IsCode(code int) bool {
+	return code == 400
+}
+
+// Code gets the status code for the repo delete push mirror bad request response
+func (o *RepoDeletePushMirrorBadRequest) Code() int {
+	return 400
+}
+
+func (o *RepoDeletePushMirrorBadRequest) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/push_mirrors/{name}][%d] repoDeletePushMirrorBadRequest", 400)
+}
+
+func (o *RepoDeletePushMirrorBadRequest) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/push_mirrors/{name}][%d] repoDeletePushMirrorBadRequest", 400)
+}
+
+func (o *RepoDeletePushMirrorBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewRepoDeletePushMirrorNotFound creates a RepoDeletePushMirrorNotFound with default headers values
+func NewRepoDeletePushMirrorNotFound() *RepoDeletePushMirrorNotFound {
+	return &RepoDeletePushMirrorNotFound{}
+}
+
+/*
+RepoDeletePushMirrorNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoDeletePushMirrorNotFound struct {
+}
+
+// IsSuccess returns true when this repo delete push mirror not found response has a 2xx status code
+func (o *RepoDeletePushMirrorNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo delete push mirror not found response has a 3xx status code
+func (o *RepoDeletePushMirrorNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo delete push mirror not found response has a 4xx status code
+func (o *RepoDeletePushMirrorNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo delete push mirror not found response has a 5xx status code
+func (o *RepoDeletePushMirrorNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo delete push mirror not found response a status code equal to that given
+func (o *RepoDeletePushMirrorNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo delete push mirror not found response
+func (o *RepoDeletePushMirrorNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoDeletePushMirrorNotFound) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/push_mirrors/{name}][%d] repoDeletePushMirrorNotFound", 404)
+}
+
+func (o *RepoDeletePushMirrorNotFound) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/push_mirrors/{name}][%d] repoDeletePushMirrorNotFound", 404)
+}
+
+func (o *RepoDeletePushMirrorNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_delete_release_attachment_parameters.go b/bots-common/gitea-generated/client/repository/repo_delete_release_attachment_parameters.go
new file mode 100644
index 0000000..999ba38
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_delete_release_attachment_parameters.go
@@ -0,0 +1,222 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewRepoDeleteReleaseAttachmentParams creates a new RepoDeleteReleaseAttachmentParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoDeleteReleaseAttachmentParams() *RepoDeleteReleaseAttachmentParams {
+	return &RepoDeleteReleaseAttachmentParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoDeleteReleaseAttachmentParamsWithTimeout creates a new RepoDeleteReleaseAttachmentParams object
+// with the ability to set a timeout on a request.
+func NewRepoDeleteReleaseAttachmentParamsWithTimeout(timeout time.Duration) *RepoDeleteReleaseAttachmentParams {
+	return &RepoDeleteReleaseAttachmentParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoDeleteReleaseAttachmentParamsWithContext creates a new RepoDeleteReleaseAttachmentParams object
+// with the ability to set a context for a request.
+func NewRepoDeleteReleaseAttachmentParamsWithContext(ctx context.Context) *RepoDeleteReleaseAttachmentParams {
+	return &RepoDeleteReleaseAttachmentParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoDeleteReleaseAttachmentParamsWithHTTPClient creates a new RepoDeleteReleaseAttachmentParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoDeleteReleaseAttachmentParamsWithHTTPClient(client *http.Client) *RepoDeleteReleaseAttachmentParams {
+	return &RepoDeleteReleaseAttachmentParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoDeleteReleaseAttachmentParams contains all the parameters to send to the API endpoint
+
+	for the repo delete release attachment operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoDeleteReleaseAttachmentParams struct {
+
+	/* AttachmentID.
+
+	   id of the attachment to delete
+
+	   Format: int64
+	*/
+	AttachmentID int64
+
+	/* ID.
+
+	   id of the release
+
+	   Format: int64
+	*/
+	ID int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo delete release attachment params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoDeleteReleaseAttachmentParams) WithDefaults() *RepoDeleteReleaseAttachmentParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo delete release attachment params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoDeleteReleaseAttachmentParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo delete release attachment params
+func (o *RepoDeleteReleaseAttachmentParams) WithTimeout(timeout time.Duration) *RepoDeleteReleaseAttachmentParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo delete release attachment params
+func (o *RepoDeleteReleaseAttachmentParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo delete release attachment params
+func (o *RepoDeleteReleaseAttachmentParams) WithContext(ctx context.Context) *RepoDeleteReleaseAttachmentParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo delete release attachment params
+func (o *RepoDeleteReleaseAttachmentParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo delete release attachment params
+func (o *RepoDeleteReleaseAttachmentParams) WithHTTPClient(client *http.Client) *RepoDeleteReleaseAttachmentParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo delete release attachment params
+func (o *RepoDeleteReleaseAttachmentParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithAttachmentID adds the attachmentID to the repo delete release attachment params
+func (o *RepoDeleteReleaseAttachmentParams) WithAttachmentID(attachmentID int64) *RepoDeleteReleaseAttachmentParams {
+	o.SetAttachmentID(attachmentID)
+	return o
+}
+
+// SetAttachmentID adds the attachmentId to the repo delete release attachment params
+func (o *RepoDeleteReleaseAttachmentParams) SetAttachmentID(attachmentID int64) {
+	o.AttachmentID = attachmentID
+}
+
+// WithID adds the id to the repo delete release attachment params
+func (o *RepoDeleteReleaseAttachmentParams) WithID(id int64) *RepoDeleteReleaseAttachmentParams {
+	o.SetID(id)
+	return o
+}
+
+// SetID adds the id to the repo delete release attachment params
+func (o *RepoDeleteReleaseAttachmentParams) SetID(id int64) {
+	o.ID = id
+}
+
+// WithOwner adds the owner to the repo delete release attachment params
+func (o *RepoDeleteReleaseAttachmentParams) WithOwner(owner string) *RepoDeleteReleaseAttachmentParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo delete release attachment params
+func (o *RepoDeleteReleaseAttachmentParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo delete release attachment params
+func (o *RepoDeleteReleaseAttachmentParams) WithRepo(repo string) *RepoDeleteReleaseAttachmentParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo delete release attachment params
+func (o *RepoDeleteReleaseAttachmentParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoDeleteReleaseAttachmentParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param attachment_id
+	if err := r.SetPathParam("attachment_id", swag.FormatInt64(o.AttachmentID)); err != nil {
+		return err
+	}
+
+	// path param id
+	if err := r.SetPathParam("id", swag.FormatInt64(o.ID)); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_delete_release_attachment_responses.go b/bots-common/gitea-generated/client/repository/repo_delete_release_attachment_responses.go
new file mode 100644
index 0000000..f2bce4d
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_delete_release_attachment_responses.go
@@ -0,0 +1,150 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// RepoDeleteReleaseAttachmentReader is a Reader for the RepoDeleteReleaseAttachment structure.
+type RepoDeleteReleaseAttachmentReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoDeleteReleaseAttachmentReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewRepoDeleteReleaseAttachmentNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoDeleteReleaseAttachmentNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[DELETE /repos/{owner}/{repo}/releases/{id}/assets/{attachment_id}] repoDeleteReleaseAttachment", response, response.Code())
+	}
+}
+
+// NewRepoDeleteReleaseAttachmentNoContent creates a RepoDeleteReleaseAttachmentNoContent with default headers values
+func NewRepoDeleteReleaseAttachmentNoContent() *RepoDeleteReleaseAttachmentNoContent {
+	return &RepoDeleteReleaseAttachmentNoContent{}
+}
+
+/*
+RepoDeleteReleaseAttachmentNoContent describes a response with status code 204, with default header values.
+
+APIEmpty is an empty response
+*/
+type RepoDeleteReleaseAttachmentNoContent struct {
+}
+
+// IsSuccess returns true when this repo delete release attachment no content response has a 2xx status code
+func (o *RepoDeleteReleaseAttachmentNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo delete release attachment no content response has a 3xx status code
+func (o *RepoDeleteReleaseAttachmentNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo delete release attachment no content response has a 4xx status code
+func (o *RepoDeleteReleaseAttachmentNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo delete release attachment no content response has a 5xx status code
+func (o *RepoDeleteReleaseAttachmentNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo delete release attachment no content response a status code equal to that given
+func (o *RepoDeleteReleaseAttachmentNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the repo delete release attachment no content response
+func (o *RepoDeleteReleaseAttachmentNoContent) Code() int {
+	return 204
+}
+
+func (o *RepoDeleteReleaseAttachmentNoContent) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/releases/{id}/assets/{attachment_id}][%d] repoDeleteReleaseAttachmentNoContent", 204)
+}
+
+func (o *RepoDeleteReleaseAttachmentNoContent) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/releases/{id}/assets/{attachment_id}][%d] repoDeleteReleaseAttachmentNoContent", 204)
+}
+
+func (o *RepoDeleteReleaseAttachmentNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewRepoDeleteReleaseAttachmentNotFound creates a RepoDeleteReleaseAttachmentNotFound with default headers values
+func NewRepoDeleteReleaseAttachmentNotFound() *RepoDeleteReleaseAttachmentNotFound {
+	return &RepoDeleteReleaseAttachmentNotFound{}
+}
+
+/*
+RepoDeleteReleaseAttachmentNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoDeleteReleaseAttachmentNotFound struct {
+}
+
+// IsSuccess returns true when this repo delete release attachment not found response has a 2xx status code
+func (o *RepoDeleteReleaseAttachmentNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo delete release attachment not found response has a 3xx status code
+func (o *RepoDeleteReleaseAttachmentNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo delete release attachment not found response has a 4xx status code
+func (o *RepoDeleteReleaseAttachmentNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo delete release attachment not found response has a 5xx status code
+func (o *RepoDeleteReleaseAttachmentNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo delete release attachment not found response a status code equal to that given
+func (o *RepoDeleteReleaseAttachmentNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo delete release attachment not found response
+func (o *RepoDeleteReleaseAttachmentNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoDeleteReleaseAttachmentNotFound) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/releases/{id}/assets/{attachment_id}][%d] repoDeleteReleaseAttachmentNotFound", 404)
+}
+
+func (o *RepoDeleteReleaseAttachmentNotFound) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/releases/{id}/assets/{attachment_id}][%d] repoDeleteReleaseAttachmentNotFound", 404)
+}
+
+func (o *RepoDeleteReleaseAttachmentNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_delete_release_by_tag_parameters.go b/bots-common/gitea-generated/client/repository/repo_delete_release_by_tag_parameters.go
new file mode 100644
index 0000000..d801994
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_delete_release_by_tag_parameters.go
@@ -0,0 +1,195 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewRepoDeleteReleaseByTagParams creates a new RepoDeleteReleaseByTagParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoDeleteReleaseByTagParams() *RepoDeleteReleaseByTagParams {
+	return &RepoDeleteReleaseByTagParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoDeleteReleaseByTagParamsWithTimeout creates a new RepoDeleteReleaseByTagParams object
+// with the ability to set a timeout on a request.
+func NewRepoDeleteReleaseByTagParamsWithTimeout(timeout time.Duration) *RepoDeleteReleaseByTagParams {
+	return &RepoDeleteReleaseByTagParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoDeleteReleaseByTagParamsWithContext creates a new RepoDeleteReleaseByTagParams object
+// with the ability to set a context for a request.
+func NewRepoDeleteReleaseByTagParamsWithContext(ctx context.Context) *RepoDeleteReleaseByTagParams {
+	return &RepoDeleteReleaseByTagParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoDeleteReleaseByTagParamsWithHTTPClient creates a new RepoDeleteReleaseByTagParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoDeleteReleaseByTagParamsWithHTTPClient(client *http.Client) *RepoDeleteReleaseByTagParams {
+	return &RepoDeleteReleaseByTagParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoDeleteReleaseByTagParams contains all the parameters to send to the API endpoint
+
+	for the repo delete release by tag operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoDeleteReleaseByTagParams struct {
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	/* Tag.
+
+	   tag name of the release to delete
+	*/
+	Tag string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo delete release by tag params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoDeleteReleaseByTagParams) WithDefaults() *RepoDeleteReleaseByTagParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo delete release by tag params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoDeleteReleaseByTagParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo delete release by tag params
+func (o *RepoDeleteReleaseByTagParams) WithTimeout(timeout time.Duration) *RepoDeleteReleaseByTagParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo delete release by tag params
+func (o *RepoDeleteReleaseByTagParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo delete release by tag params
+func (o *RepoDeleteReleaseByTagParams) WithContext(ctx context.Context) *RepoDeleteReleaseByTagParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo delete release by tag params
+func (o *RepoDeleteReleaseByTagParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo delete release by tag params
+func (o *RepoDeleteReleaseByTagParams) WithHTTPClient(client *http.Client) *RepoDeleteReleaseByTagParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo delete release by tag params
+func (o *RepoDeleteReleaseByTagParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithOwner adds the owner to the repo delete release by tag params
+func (o *RepoDeleteReleaseByTagParams) WithOwner(owner string) *RepoDeleteReleaseByTagParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo delete release by tag params
+func (o *RepoDeleteReleaseByTagParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo delete release by tag params
+func (o *RepoDeleteReleaseByTagParams) WithRepo(repo string) *RepoDeleteReleaseByTagParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo delete release by tag params
+func (o *RepoDeleteReleaseByTagParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WithTag adds the tag to the repo delete release by tag params
+func (o *RepoDeleteReleaseByTagParams) WithTag(tag string) *RepoDeleteReleaseByTagParams {
+	o.SetTag(tag)
+	return o
+}
+
+// SetTag adds the tag to the repo delete release by tag params
+func (o *RepoDeleteReleaseByTagParams) SetTag(tag string) {
+	o.Tag = tag
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoDeleteReleaseByTagParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	// path param tag
+	if err := r.SetPathParam("tag", o.Tag); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_delete_release_by_tag_responses.go b/bots-common/gitea-generated/client/repository/repo_delete_release_by_tag_responses.go
new file mode 100644
index 0000000..0dd9ccc
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_delete_release_by_tag_responses.go
@@ -0,0 +1,228 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// RepoDeleteReleaseByTagReader is a Reader for the RepoDeleteReleaseByTag structure.
+type RepoDeleteReleaseByTagReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoDeleteReleaseByTagReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewRepoDeleteReleaseByTagNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoDeleteReleaseByTagNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 422:
+		result := NewRepoDeleteReleaseByTagUnprocessableEntity()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[DELETE /repos/{owner}/{repo}/releases/tags/{tag}] repoDeleteReleaseByTag", response, response.Code())
+	}
+}
+
+// NewRepoDeleteReleaseByTagNoContent creates a RepoDeleteReleaseByTagNoContent with default headers values
+func NewRepoDeleteReleaseByTagNoContent() *RepoDeleteReleaseByTagNoContent {
+	return &RepoDeleteReleaseByTagNoContent{}
+}
+
+/*
+RepoDeleteReleaseByTagNoContent describes a response with status code 204, with default header values.
+
+APIEmpty is an empty response
+*/
+type RepoDeleteReleaseByTagNoContent struct {
+}
+
+// IsSuccess returns true when this repo delete release by tag no content response has a 2xx status code
+func (o *RepoDeleteReleaseByTagNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo delete release by tag no content response has a 3xx status code
+func (o *RepoDeleteReleaseByTagNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo delete release by tag no content response has a 4xx status code
+func (o *RepoDeleteReleaseByTagNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo delete release by tag no content response has a 5xx status code
+func (o *RepoDeleteReleaseByTagNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo delete release by tag no content response a status code equal to that given
+func (o *RepoDeleteReleaseByTagNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the repo delete release by tag no content response
+func (o *RepoDeleteReleaseByTagNoContent) Code() int {
+	return 204
+}
+
+func (o *RepoDeleteReleaseByTagNoContent) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/releases/tags/{tag}][%d] repoDeleteReleaseByTagNoContent", 204)
+}
+
+func (o *RepoDeleteReleaseByTagNoContent) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/releases/tags/{tag}][%d] repoDeleteReleaseByTagNoContent", 204)
+}
+
+func (o *RepoDeleteReleaseByTagNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewRepoDeleteReleaseByTagNotFound creates a RepoDeleteReleaseByTagNotFound with default headers values
+func NewRepoDeleteReleaseByTagNotFound() *RepoDeleteReleaseByTagNotFound {
+	return &RepoDeleteReleaseByTagNotFound{}
+}
+
+/*
+RepoDeleteReleaseByTagNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoDeleteReleaseByTagNotFound struct {
+}
+
+// IsSuccess returns true when this repo delete release by tag not found response has a 2xx status code
+func (o *RepoDeleteReleaseByTagNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo delete release by tag not found response has a 3xx status code
+func (o *RepoDeleteReleaseByTagNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo delete release by tag not found response has a 4xx status code
+func (o *RepoDeleteReleaseByTagNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo delete release by tag not found response has a 5xx status code
+func (o *RepoDeleteReleaseByTagNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo delete release by tag not found response a status code equal to that given
+func (o *RepoDeleteReleaseByTagNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo delete release by tag not found response
+func (o *RepoDeleteReleaseByTagNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoDeleteReleaseByTagNotFound) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/releases/tags/{tag}][%d] repoDeleteReleaseByTagNotFound", 404)
+}
+
+func (o *RepoDeleteReleaseByTagNotFound) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/releases/tags/{tag}][%d] repoDeleteReleaseByTagNotFound", 404)
+}
+
+func (o *RepoDeleteReleaseByTagNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewRepoDeleteReleaseByTagUnprocessableEntity creates a RepoDeleteReleaseByTagUnprocessableEntity with default headers values
+func NewRepoDeleteReleaseByTagUnprocessableEntity() *RepoDeleteReleaseByTagUnprocessableEntity {
+	return &RepoDeleteReleaseByTagUnprocessableEntity{}
+}
+
+/*
+RepoDeleteReleaseByTagUnprocessableEntity describes a response with status code 422, with default header values.
+
+APIValidationError is error format response related to input validation
+*/
+type RepoDeleteReleaseByTagUnprocessableEntity struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo delete release by tag unprocessable entity response has a 2xx status code
+func (o *RepoDeleteReleaseByTagUnprocessableEntity) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo delete release by tag unprocessable entity response has a 3xx status code
+func (o *RepoDeleteReleaseByTagUnprocessableEntity) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo delete release by tag unprocessable entity response has a 4xx status code
+func (o *RepoDeleteReleaseByTagUnprocessableEntity) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo delete release by tag unprocessable entity response has a 5xx status code
+func (o *RepoDeleteReleaseByTagUnprocessableEntity) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo delete release by tag unprocessable entity response a status code equal to that given
+func (o *RepoDeleteReleaseByTagUnprocessableEntity) IsCode(code int) bool {
+	return code == 422
+}
+
+// Code gets the status code for the repo delete release by tag unprocessable entity response
+func (o *RepoDeleteReleaseByTagUnprocessableEntity) Code() int {
+	return 422
+}
+
+func (o *RepoDeleteReleaseByTagUnprocessableEntity) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/releases/tags/{tag}][%d] repoDeleteReleaseByTagUnprocessableEntity", 422)
+}
+
+func (o *RepoDeleteReleaseByTagUnprocessableEntity) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/releases/tags/{tag}][%d] repoDeleteReleaseByTagUnprocessableEntity", 422)
+}
+
+func (o *RepoDeleteReleaseByTagUnprocessableEntity) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_delete_release_parameters.go b/bots-common/gitea-generated/client/repository/repo_delete_release_parameters.go
new file mode 100644
index 0000000..0a87141
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_delete_release_parameters.go
@@ -0,0 +1,198 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewRepoDeleteReleaseParams creates a new RepoDeleteReleaseParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoDeleteReleaseParams() *RepoDeleteReleaseParams {
+	return &RepoDeleteReleaseParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoDeleteReleaseParamsWithTimeout creates a new RepoDeleteReleaseParams object
+// with the ability to set a timeout on a request.
+func NewRepoDeleteReleaseParamsWithTimeout(timeout time.Duration) *RepoDeleteReleaseParams {
+	return &RepoDeleteReleaseParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoDeleteReleaseParamsWithContext creates a new RepoDeleteReleaseParams object
+// with the ability to set a context for a request.
+func NewRepoDeleteReleaseParamsWithContext(ctx context.Context) *RepoDeleteReleaseParams {
+	return &RepoDeleteReleaseParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoDeleteReleaseParamsWithHTTPClient creates a new RepoDeleteReleaseParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoDeleteReleaseParamsWithHTTPClient(client *http.Client) *RepoDeleteReleaseParams {
+	return &RepoDeleteReleaseParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoDeleteReleaseParams contains all the parameters to send to the API endpoint
+
+	for the repo delete release operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoDeleteReleaseParams struct {
+
+	/* ID.
+
+	   id of the release to delete
+
+	   Format: int64
+	*/
+	ID int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo delete release params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoDeleteReleaseParams) WithDefaults() *RepoDeleteReleaseParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo delete release params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoDeleteReleaseParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo delete release params
+func (o *RepoDeleteReleaseParams) WithTimeout(timeout time.Duration) *RepoDeleteReleaseParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo delete release params
+func (o *RepoDeleteReleaseParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo delete release params
+func (o *RepoDeleteReleaseParams) WithContext(ctx context.Context) *RepoDeleteReleaseParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo delete release params
+func (o *RepoDeleteReleaseParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo delete release params
+func (o *RepoDeleteReleaseParams) WithHTTPClient(client *http.Client) *RepoDeleteReleaseParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo delete release params
+func (o *RepoDeleteReleaseParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithID adds the id to the repo delete release params
+func (o *RepoDeleteReleaseParams) WithID(id int64) *RepoDeleteReleaseParams {
+	o.SetID(id)
+	return o
+}
+
+// SetID adds the id to the repo delete release params
+func (o *RepoDeleteReleaseParams) SetID(id int64) {
+	o.ID = id
+}
+
+// WithOwner adds the owner to the repo delete release params
+func (o *RepoDeleteReleaseParams) WithOwner(owner string) *RepoDeleteReleaseParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo delete release params
+func (o *RepoDeleteReleaseParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo delete release params
+func (o *RepoDeleteReleaseParams) WithRepo(repo string) *RepoDeleteReleaseParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo delete release params
+func (o *RepoDeleteReleaseParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoDeleteReleaseParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param id
+	if err := r.SetPathParam("id", swag.FormatInt64(o.ID)); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_delete_release_responses.go b/bots-common/gitea-generated/client/repository/repo_delete_release_responses.go
new file mode 100644
index 0000000..86965eb
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_delete_release_responses.go
@@ -0,0 +1,228 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// RepoDeleteReleaseReader is a Reader for the RepoDeleteRelease structure.
+type RepoDeleteReleaseReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoDeleteReleaseReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewRepoDeleteReleaseNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoDeleteReleaseNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 422:
+		result := NewRepoDeleteReleaseUnprocessableEntity()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[DELETE /repos/{owner}/{repo}/releases/{id}] repoDeleteRelease", response, response.Code())
+	}
+}
+
+// NewRepoDeleteReleaseNoContent creates a RepoDeleteReleaseNoContent with default headers values
+func NewRepoDeleteReleaseNoContent() *RepoDeleteReleaseNoContent {
+	return &RepoDeleteReleaseNoContent{}
+}
+
+/*
+RepoDeleteReleaseNoContent describes a response with status code 204, with default header values.
+
+APIEmpty is an empty response
+*/
+type RepoDeleteReleaseNoContent struct {
+}
+
+// IsSuccess returns true when this repo delete release no content response has a 2xx status code
+func (o *RepoDeleteReleaseNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo delete release no content response has a 3xx status code
+func (o *RepoDeleteReleaseNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo delete release no content response has a 4xx status code
+func (o *RepoDeleteReleaseNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo delete release no content response has a 5xx status code
+func (o *RepoDeleteReleaseNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo delete release no content response a status code equal to that given
+func (o *RepoDeleteReleaseNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the repo delete release no content response
+func (o *RepoDeleteReleaseNoContent) Code() int {
+	return 204
+}
+
+func (o *RepoDeleteReleaseNoContent) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/releases/{id}][%d] repoDeleteReleaseNoContent", 204)
+}
+
+func (o *RepoDeleteReleaseNoContent) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/releases/{id}][%d] repoDeleteReleaseNoContent", 204)
+}
+
+func (o *RepoDeleteReleaseNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewRepoDeleteReleaseNotFound creates a RepoDeleteReleaseNotFound with default headers values
+func NewRepoDeleteReleaseNotFound() *RepoDeleteReleaseNotFound {
+	return &RepoDeleteReleaseNotFound{}
+}
+
+/*
+RepoDeleteReleaseNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoDeleteReleaseNotFound struct {
+}
+
+// IsSuccess returns true when this repo delete release not found response has a 2xx status code
+func (o *RepoDeleteReleaseNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo delete release not found response has a 3xx status code
+func (o *RepoDeleteReleaseNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo delete release not found response has a 4xx status code
+func (o *RepoDeleteReleaseNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo delete release not found response has a 5xx status code
+func (o *RepoDeleteReleaseNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo delete release not found response a status code equal to that given
+func (o *RepoDeleteReleaseNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo delete release not found response
+func (o *RepoDeleteReleaseNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoDeleteReleaseNotFound) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/releases/{id}][%d] repoDeleteReleaseNotFound", 404)
+}
+
+func (o *RepoDeleteReleaseNotFound) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/releases/{id}][%d] repoDeleteReleaseNotFound", 404)
+}
+
+func (o *RepoDeleteReleaseNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewRepoDeleteReleaseUnprocessableEntity creates a RepoDeleteReleaseUnprocessableEntity with default headers values
+func NewRepoDeleteReleaseUnprocessableEntity() *RepoDeleteReleaseUnprocessableEntity {
+	return &RepoDeleteReleaseUnprocessableEntity{}
+}
+
+/*
+RepoDeleteReleaseUnprocessableEntity describes a response with status code 422, with default header values.
+
+APIValidationError is error format response related to input validation
+*/
+type RepoDeleteReleaseUnprocessableEntity struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo delete release unprocessable entity response has a 2xx status code
+func (o *RepoDeleteReleaseUnprocessableEntity) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo delete release unprocessable entity response has a 3xx status code
+func (o *RepoDeleteReleaseUnprocessableEntity) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo delete release unprocessable entity response has a 4xx status code
+func (o *RepoDeleteReleaseUnprocessableEntity) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo delete release unprocessable entity response has a 5xx status code
+func (o *RepoDeleteReleaseUnprocessableEntity) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo delete release unprocessable entity response a status code equal to that given
+func (o *RepoDeleteReleaseUnprocessableEntity) IsCode(code int) bool {
+	return code == 422
+}
+
+// Code gets the status code for the repo delete release unprocessable entity response
+func (o *RepoDeleteReleaseUnprocessableEntity) Code() int {
+	return 422
+}
+
+func (o *RepoDeleteReleaseUnprocessableEntity) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/releases/{id}][%d] repoDeleteReleaseUnprocessableEntity", 422)
+}
+
+func (o *RepoDeleteReleaseUnprocessableEntity) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/releases/{id}][%d] repoDeleteReleaseUnprocessableEntity", 422)
+}
+
+func (o *RepoDeleteReleaseUnprocessableEntity) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_delete_responses.go b/bots-common/gitea-generated/client/repository/repo_delete_responses.go
new file mode 100644
index 0000000..17e02ad
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_delete_responses.go
@@ -0,0 +1,228 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// RepoDeleteReader is a Reader for the RepoDelete structure.
+type RepoDeleteReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoDeleteReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewRepoDeleteNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 403:
+		result := NewRepoDeleteForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewRepoDeleteNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[DELETE /repos/{owner}/{repo}] repoDelete", response, response.Code())
+	}
+}
+
+// NewRepoDeleteNoContent creates a RepoDeleteNoContent with default headers values
+func NewRepoDeleteNoContent() *RepoDeleteNoContent {
+	return &RepoDeleteNoContent{}
+}
+
+/*
+RepoDeleteNoContent describes a response with status code 204, with default header values.
+
+APIEmpty is an empty response
+*/
+type RepoDeleteNoContent struct {
+}
+
+// IsSuccess returns true when this repo delete no content response has a 2xx status code
+func (o *RepoDeleteNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo delete no content response has a 3xx status code
+func (o *RepoDeleteNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo delete no content response has a 4xx status code
+func (o *RepoDeleteNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo delete no content response has a 5xx status code
+func (o *RepoDeleteNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo delete no content response a status code equal to that given
+func (o *RepoDeleteNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the repo delete no content response
+func (o *RepoDeleteNoContent) Code() int {
+	return 204
+}
+
+func (o *RepoDeleteNoContent) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}][%d] repoDeleteNoContent", 204)
+}
+
+func (o *RepoDeleteNoContent) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}][%d] repoDeleteNoContent", 204)
+}
+
+func (o *RepoDeleteNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewRepoDeleteForbidden creates a RepoDeleteForbidden with default headers values
+func NewRepoDeleteForbidden() *RepoDeleteForbidden {
+	return &RepoDeleteForbidden{}
+}
+
+/*
+RepoDeleteForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type RepoDeleteForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo delete forbidden response has a 2xx status code
+func (o *RepoDeleteForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo delete forbidden response has a 3xx status code
+func (o *RepoDeleteForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo delete forbidden response has a 4xx status code
+func (o *RepoDeleteForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo delete forbidden response has a 5xx status code
+func (o *RepoDeleteForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo delete forbidden response a status code equal to that given
+func (o *RepoDeleteForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the repo delete forbidden response
+func (o *RepoDeleteForbidden) Code() int {
+	return 403
+}
+
+func (o *RepoDeleteForbidden) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}][%d] repoDeleteForbidden", 403)
+}
+
+func (o *RepoDeleteForbidden) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}][%d] repoDeleteForbidden", 403)
+}
+
+func (o *RepoDeleteForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewRepoDeleteNotFound creates a RepoDeleteNotFound with default headers values
+func NewRepoDeleteNotFound() *RepoDeleteNotFound {
+	return &RepoDeleteNotFound{}
+}
+
+/*
+RepoDeleteNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoDeleteNotFound struct {
+}
+
+// IsSuccess returns true when this repo delete not found response has a 2xx status code
+func (o *RepoDeleteNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo delete not found response has a 3xx status code
+func (o *RepoDeleteNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo delete not found response has a 4xx status code
+func (o *RepoDeleteNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo delete not found response has a 5xx status code
+func (o *RepoDeleteNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo delete not found response a status code equal to that given
+func (o *RepoDeleteNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo delete not found response
+func (o *RepoDeleteNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoDeleteNotFound) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}][%d] repoDeleteNotFound", 404)
+}
+
+func (o *RepoDeleteNotFound) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}][%d] repoDeleteNotFound", 404)
+}
+
+func (o *RepoDeleteNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_delete_tag_parameters.go b/bots-common/gitea-generated/client/repository/repo_delete_tag_parameters.go
new file mode 100644
index 0000000..871303a
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_delete_tag_parameters.go
@@ -0,0 +1,195 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewRepoDeleteTagParams creates a new RepoDeleteTagParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoDeleteTagParams() *RepoDeleteTagParams {
+	return &RepoDeleteTagParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoDeleteTagParamsWithTimeout creates a new RepoDeleteTagParams object
+// with the ability to set a timeout on a request.
+func NewRepoDeleteTagParamsWithTimeout(timeout time.Duration) *RepoDeleteTagParams {
+	return &RepoDeleteTagParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoDeleteTagParamsWithContext creates a new RepoDeleteTagParams object
+// with the ability to set a context for a request.
+func NewRepoDeleteTagParamsWithContext(ctx context.Context) *RepoDeleteTagParams {
+	return &RepoDeleteTagParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoDeleteTagParamsWithHTTPClient creates a new RepoDeleteTagParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoDeleteTagParamsWithHTTPClient(client *http.Client) *RepoDeleteTagParams {
+	return &RepoDeleteTagParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoDeleteTagParams contains all the parameters to send to the API endpoint
+
+	for the repo delete tag operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoDeleteTagParams struct {
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	/* Tag.
+
+	   name of tag to delete
+	*/
+	Tag string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo delete tag params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoDeleteTagParams) WithDefaults() *RepoDeleteTagParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo delete tag params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoDeleteTagParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo delete tag params
+func (o *RepoDeleteTagParams) WithTimeout(timeout time.Duration) *RepoDeleteTagParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo delete tag params
+func (o *RepoDeleteTagParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo delete tag params
+func (o *RepoDeleteTagParams) WithContext(ctx context.Context) *RepoDeleteTagParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo delete tag params
+func (o *RepoDeleteTagParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo delete tag params
+func (o *RepoDeleteTagParams) WithHTTPClient(client *http.Client) *RepoDeleteTagParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo delete tag params
+func (o *RepoDeleteTagParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithOwner adds the owner to the repo delete tag params
+func (o *RepoDeleteTagParams) WithOwner(owner string) *RepoDeleteTagParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo delete tag params
+func (o *RepoDeleteTagParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo delete tag params
+func (o *RepoDeleteTagParams) WithRepo(repo string) *RepoDeleteTagParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo delete tag params
+func (o *RepoDeleteTagParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WithTag adds the tag to the repo delete tag params
+func (o *RepoDeleteTagParams) WithTag(tag string) *RepoDeleteTagParams {
+	o.SetTag(tag)
+	return o
+}
+
+// SetTag adds the tag to the repo delete tag params
+func (o *RepoDeleteTagParams) SetTag(tag string) {
+	o.Tag = tag
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoDeleteTagParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	// path param tag
+	if err := r.SetPathParam("tag", o.Tag); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_delete_tag_responses.go b/bots-common/gitea-generated/client/repository/repo_delete_tag_responses.go
new file mode 100644
index 0000000..1e16ce2
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_delete_tag_responses.go
@@ -0,0 +1,430 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// RepoDeleteTagReader is a Reader for the RepoDeleteTag structure.
+type RepoDeleteTagReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoDeleteTagReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewRepoDeleteTagNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoDeleteTagNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 405:
+		result := NewRepoDeleteTagMethodNotAllowed()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 409:
+		result := NewRepoDeleteTagConflict()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 422:
+		result := NewRepoDeleteTagUnprocessableEntity()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 423:
+		result := NewRepoDeleteTagLocked()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[DELETE /repos/{owner}/{repo}/tags/{tag}] repoDeleteTag", response, response.Code())
+	}
+}
+
+// NewRepoDeleteTagNoContent creates a RepoDeleteTagNoContent with default headers values
+func NewRepoDeleteTagNoContent() *RepoDeleteTagNoContent {
+	return &RepoDeleteTagNoContent{}
+}
+
+/*
+RepoDeleteTagNoContent describes a response with status code 204, with default header values.
+
+APIEmpty is an empty response
+*/
+type RepoDeleteTagNoContent struct {
+}
+
+// IsSuccess returns true when this repo delete tag no content response has a 2xx status code
+func (o *RepoDeleteTagNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo delete tag no content response has a 3xx status code
+func (o *RepoDeleteTagNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo delete tag no content response has a 4xx status code
+func (o *RepoDeleteTagNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo delete tag no content response has a 5xx status code
+func (o *RepoDeleteTagNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo delete tag no content response a status code equal to that given
+func (o *RepoDeleteTagNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the repo delete tag no content response
+func (o *RepoDeleteTagNoContent) Code() int {
+	return 204
+}
+
+func (o *RepoDeleteTagNoContent) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/tags/{tag}][%d] repoDeleteTagNoContent", 204)
+}
+
+func (o *RepoDeleteTagNoContent) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/tags/{tag}][%d] repoDeleteTagNoContent", 204)
+}
+
+func (o *RepoDeleteTagNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewRepoDeleteTagNotFound creates a RepoDeleteTagNotFound with default headers values
+func NewRepoDeleteTagNotFound() *RepoDeleteTagNotFound {
+	return &RepoDeleteTagNotFound{}
+}
+
+/*
+RepoDeleteTagNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoDeleteTagNotFound struct {
+}
+
+// IsSuccess returns true when this repo delete tag not found response has a 2xx status code
+func (o *RepoDeleteTagNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo delete tag not found response has a 3xx status code
+func (o *RepoDeleteTagNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo delete tag not found response has a 4xx status code
+func (o *RepoDeleteTagNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo delete tag not found response has a 5xx status code
+func (o *RepoDeleteTagNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo delete tag not found response a status code equal to that given
+func (o *RepoDeleteTagNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo delete tag not found response
+func (o *RepoDeleteTagNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoDeleteTagNotFound) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/tags/{tag}][%d] repoDeleteTagNotFound", 404)
+}
+
+func (o *RepoDeleteTagNotFound) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/tags/{tag}][%d] repoDeleteTagNotFound", 404)
+}
+
+func (o *RepoDeleteTagNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewRepoDeleteTagMethodNotAllowed creates a RepoDeleteTagMethodNotAllowed with default headers values
+func NewRepoDeleteTagMethodNotAllowed() *RepoDeleteTagMethodNotAllowed {
+	return &RepoDeleteTagMethodNotAllowed{}
+}
+
+/*
+RepoDeleteTagMethodNotAllowed describes a response with status code 405, with default header values.
+
+APIEmpty is an empty response
+*/
+type RepoDeleteTagMethodNotAllowed struct {
+}
+
+// IsSuccess returns true when this repo delete tag method not allowed response has a 2xx status code
+func (o *RepoDeleteTagMethodNotAllowed) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo delete tag method not allowed response has a 3xx status code
+func (o *RepoDeleteTagMethodNotAllowed) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo delete tag method not allowed response has a 4xx status code
+func (o *RepoDeleteTagMethodNotAllowed) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo delete tag method not allowed response has a 5xx status code
+func (o *RepoDeleteTagMethodNotAllowed) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo delete tag method not allowed response a status code equal to that given
+func (o *RepoDeleteTagMethodNotAllowed) IsCode(code int) bool {
+	return code == 405
+}
+
+// Code gets the status code for the repo delete tag method not allowed response
+func (o *RepoDeleteTagMethodNotAllowed) Code() int {
+	return 405
+}
+
+func (o *RepoDeleteTagMethodNotAllowed) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/tags/{tag}][%d] repoDeleteTagMethodNotAllowed", 405)
+}
+
+func (o *RepoDeleteTagMethodNotAllowed) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/tags/{tag}][%d] repoDeleteTagMethodNotAllowed", 405)
+}
+
+func (o *RepoDeleteTagMethodNotAllowed) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewRepoDeleteTagConflict creates a RepoDeleteTagConflict with default headers values
+func NewRepoDeleteTagConflict() *RepoDeleteTagConflict {
+	return &RepoDeleteTagConflict{}
+}
+
+/*
+RepoDeleteTagConflict describes a response with status code 409, with default header values.
+
+APIConflict is a conflict empty response
+*/
+type RepoDeleteTagConflict struct {
+}
+
+// IsSuccess returns true when this repo delete tag conflict response has a 2xx status code
+func (o *RepoDeleteTagConflict) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo delete tag conflict response has a 3xx status code
+func (o *RepoDeleteTagConflict) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo delete tag conflict response has a 4xx status code
+func (o *RepoDeleteTagConflict) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo delete tag conflict response has a 5xx status code
+func (o *RepoDeleteTagConflict) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo delete tag conflict response a status code equal to that given
+func (o *RepoDeleteTagConflict) IsCode(code int) bool {
+	return code == 409
+}
+
+// Code gets the status code for the repo delete tag conflict response
+func (o *RepoDeleteTagConflict) Code() int {
+	return 409
+}
+
+func (o *RepoDeleteTagConflict) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/tags/{tag}][%d] repoDeleteTagConflict", 409)
+}
+
+func (o *RepoDeleteTagConflict) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/tags/{tag}][%d] repoDeleteTagConflict", 409)
+}
+
+func (o *RepoDeleteTagConflict) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewRepoDeleteTagUnprocessableEntity creates a RepoDeleteTagUnprocessableEntity with default headers values
+func NewRepoDeleteTagUnprocessableEntity() *RepoDeleteTagUnprocessableEntity {
+	return &RepoDeleteTagUnprocessableEntity{}
+}
+
+/*
+RepoDeleteTagUnprocessableEntity describes a response with status code 422, with default header values.
+
+APIValidationError is error format response related to input validation
+*/
+type RepoDeleteTagUnprocessableEntity struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo delete tag unprocessable entity response has a 2xx status code
+func (o *RepoDeleteTagUnprocessableEntity) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo delete tag unprocessable entity response has a 3xx status code
+func (o *RepoDeleteTagUnprocessableEntity) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo delete tag unprocessable entity response has a 4xx status code
+func (o *RepoDeleteTagUnprocessableEntity) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo delete tag unprocessable entity response has a 5xx status code
+func (o *RepoDeleteTagUnprocessableEntity) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo delete tag unprocessable entity response a status code equal to that given
+func (o *RepoDeleteTagUnprocessableEntity) IsCode(code int) bool {
+	return code == 422
+}
+
+// Code gets the status code for the repo delete tag unprocessable entity response
+func (o *RepoDeleteTagUnprocessableEntity) Code() int {
+	return 422
+}
+
+func (o *RepoDeleteTagUnprocessableEntity) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/tags/{tag}][%d] repoDeleteTagUnprocessableEntity", 422)
+}
+
+func (o *RepoDeleteTagUnprocessableEntity) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/tags/{tag}][%d] repoDeleteTagUnprocessableEntity", 422)
+}
+
+func (o *RepoDeleteTagUnprocessableEntity) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewRepoDeleteTagLocked creates a RepoDeleteTagLocked with default headers values
+func NewRepoDeleteTagLocked() *RepoDeleteTagLocked {
+	return &RepoDeleteTagLocked{}
+}
+
+/*
+RepoDeleteTagLocked describes a response with status code 423, with default header values.
+
+APIRepoArchivedError is an error that is raised when an archived repo should be modified
+*/
+type RepoDeleteTagLocked struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo delete tag locked response has a 2xx status code
+func (o *RepoDeleteTagLocked) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo delete tag locked response has a 3xx status code
+func (o *RepoDeleteTagLocked) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo delete tag locked response has a 4xx status code
+func (o *RepoDeleteTagLocked) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo delete tag locked response has a 5xx status code
+func (o *RepoDeleteTagLocked) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo delete tag locked response a status code equal to that given
+func (o *RepoDeleteTagLocked) IsCode(code int) bool {
+	return code == 423
+}
+
+// Code gets the status code for the repo delete tag locked response
+func (o *RepoDeleteTagLocked) Code() int {
+	return 423
+}
+
+func (o *RepoDeleteTagLocked) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/tags/{tag}][%d] repoDeleteTagLocked", 423)
+}
+
+func (o *RepoDeleteTagLocked) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/tags/{tag}][%d] repoDeleteTagLocked", 423)
+}
+
+func (o *RepoDeleteTagLocked) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_delete_team_parameters.go b/bots-common/gitea-generated/client/repository/repo_delete_team_parameters.go
new file mode 100644
index 0000000..ee4016d
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_delete_team_parameters.go
@@ -0,0 +1,195 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewRepoDeleteTeamParams creates a new RepoDeleteTeamParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoDeleteTeamParams() *RepoDeleteTeamParams {
+	return &RepoDeleteTeamParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoDeleteTeamParamsWithTimeout creates a new RepoDeleteTeamParams object
+// with the ability to set a timeout on a request.
+func NewRepoDeleteTeamParamsWithTimeout(timeout time.Duration) *RepoDeleteTeamParams {
+	return &RepoDeleteTeamParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoDeleteTeamParamsWithContext creates a new RepoDeleteTeamParams object
+// with the ability to set a context for a request.
+func NewRepoDeleteTeamParamsWithContext(ctx context.Context) *RepoDeleteTeamParams {
+	return &RepoDeleteTeamParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoDeleteTeamParamsWithHTTPClient creates a new RepoDeleteTeamParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoDeleteTeamParamsWithHTTPClient(client *http.Client) *RepoDeleteTeamParams {
+	return &RepoDeleteTeamParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoDeleteTeamParams contains all the parameters to send to the API endpoint
+
+	for the repo delete team operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoDeleteTeamParams struct {
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	/* Team.
+
+	   team name
+	*/
+	Team string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo delete team params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoDeleteTeamParams) WithDefaults() *RepoDeleteTeamParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo delete team params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoDeleteTeamParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo delete team params
+func (o *RepoDeleteTeamParams) WithTimeout(timeout time.Duration) *RepoDeleteTeamParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo delete team params
+func (o *RepoDeleteTeamParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo delete team params
+func (o *RepoDeleteTeamParams) WithContext(ctx context.Context) *RepoDeleteTeamParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo delete team params
+func (o *RepoDeleteTeamParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo delete team params
+func (o *RepoDeleteTeamParams) WithHTTPClient(client *http.Client) *RepoDeleteTeamParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo delete team params
+func (o *RepoDeleteTeamParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithOwner adds the owner to the repo delete team params
+func (o *RepoDeleteTeamParams) WithOwner(owner string) *RepoDeleteTeamParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo delete team params
+func (o *RepoDeleteTeamParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo delete team params
+func (o *RepoDeleteTeamParams) WithRepo(repo string) *RepoDeleteTeamParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo delete team params
+func (o *RepoDeleteTeamParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WithTeam adds the team to the repo delete team params
+func (o *RepoDeleteTeamParams) WithTeam(team string) *RepoDeleteTeamParams {
+	o.SetTeam(team)
+	return o
+}
+
+// SetTeam adds the team to the repo delete team params
+func (o *RepoDeleteTeamParams) SetTeam(team string) {
+	o.Team = team
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoDeleteTeamParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	// path param team
+	if err := r.SetPathParam("team", o.Team); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_delete_team_responses.go b/bots-common/gitea-generated/client/repository/repo_delete_team_responses.go
new file mode 100644
index 0000000..4fb3ce0
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_delete_team_responses.go
@@ -0,0 +1,306 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// RepoDeleteTeamReader is a Reader for the RepoDeleteTeam structure.
+type RepoDeleteTeamReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoDeleteTeamReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewRepoDeleteTeamNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoDeleteTeamNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 405:
+		result := NewRepoDeleteTeamMethodNotAllowed()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 422:
+		result := NewRepoDeleteTeamUnprocessableEntity()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[DELETE /repos/{owner}/{repo}/teams/{team}] repoDeleteTeam", response, response.Code())
+	}
+}
+
+// NewRepoDeleteTeamNoContent creates a RepoDeleteTeamNoContent with default headers values
+func NewRepoDeleteTeamNoContent() *RepoDeleteTeamNoContent {
+	return &RepoDeleteTeamNoContent{}
+}
+
+/*
+RepoDeleteTeamNoContent describes a response with status code 204, with default header values.
+
+APIEmpty is an empty response
+*/
+type RepoDeleteTeamNoContent struct {
+}
+
+// IsSuccess returns true when this repo delete team no content response has a 2xx status code
+func (o *RepoDeleteTeamNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo delete team no content response has a 3xx status code
+func (o *RepoDeleteTeamNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo delete team no content response has a 4xx status code
+func (o *RepoDeleteTeamNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo delete team no content response has a 5xx status code
+func (o *RepoDeleteTeamNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo delete team no content response a status code equal to that given
+func (o *RepoDeleteTeamNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the repo delete team no content response
+func (o *RepoDeleteTeamNoContent) Code() int {
+	return 204
+}
+
+func (o *RepoDeleteTeamNoContent) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/teams/{team}][%d] repoDeleteTeamNoContent", 204)
+}
+
+func (o *RepoDeleteTeamNoContent) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/teams/{team}][%d] repoDeleteTeamNoContent", 204)
+}
+
+func (o *RepoDeleteTeamNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewRepoDeleteTeamNotFound creates a RepoDeleteTeamNotFound with default headers values
+func NewRepoDeleteTeamNotFound() *RepoDeleteTeamNotFound {
+	return &RepoDeleteTeamNotFound{}
+}
+
+/*
+RepoDeleteTeamNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoDeleteTeamNotFound struct {
+}
+
+// IsSuccess returns true when this repo delete team not found response has a 2xx status code
+func (o *RepoDeleteTeamNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo delete team not found response has a 3xx status code
+func (o *RepoDeleteTeamNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo delete team not found response has a 4xx status code
+func (o *RepoDeleteTeamNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo delete team not found response has a 5xx status code
+func (o *RepoDeleteTeamNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo delete team not found response a status code equal to that given
+func (o *RepoDeleteTeamNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo delete team not found response
+func (o *RepoDeleteTeamNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoDeleteTeamNotFound) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/teams/{team}][%d] repoDeleteTeamNotFound", 404)
+}
+
+func (o *RepoDeleteTeamNotFound) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/teams/{team}][%d] repoDeleteTeamNotFound", 404)
+}
+
+func (o *RepoDeleteTeamNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewRepoDeleteTeamMethodNotAllowed creates a RepoDeleteTeamMethodNotAllowed with default headers values
+func NewRepoDeleteTeamMethodNotAllowed() *RepoDeleteTeamMethodNotAllowed {
+	return &RepoDeleteTeamMethodNotAllowed{}
+}
+
+/*
+RepoDeleteTeamMethodNotAllowed describes a response with status code 405, with default header values.
+
+APIError is error format response
+*/
+type RepoDeleteTeamMethodNotAllowed struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo delete team method not allowed response has a 2xx status code
+func (o *RepoDeleteTeamMethodNotAllowed) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo delete team method not allowed response has a 3xx status code
+func (o *RepoDeleteTeamMethodNotAllowed) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo delete team method not allowed response has a 4xx status code
+func (o *RepoDeleteTeamMethodNotAllowed) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo delete team method not allowed response has a 5xx status code
+func (o *RepoDeleteTeamMethodNotAllowed) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo delete team method not allowed response a status code equal to that given
+func (o *RepoDeleteTeamMethodNotAllowed) IsCode(code int) bool {
+	return code == 405
+}
+
+// Code gets the status code for the repo delete team method not allowed response
+func (o *RepoDeleteTeamMethodNotAllowed) Code() int {
+	return 405
+}
+
+func (o *RepoDeleteTeamMethodNotAllowed) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/teams/{team}][%d] repoDeleteTeamMethodNotAllowed", 405)
+}
+
+func (o *RepoDeleteTeamMethodNotAllowed) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/teams/{team}][%d] repoDeleteTeamMethodNotAllowed", 405)
+}
+
+func (o *RepoDeleteTeamMethodNotAllowed) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewRepoDeleteTeamUnprocessableEntity creates a RepoDeleteTeamUnprocessableEntity with default headers values
+func NewRepoDeleteTeamUnprocessableEntity() *RepoDeleteTeamUnprocessableEntity {
+	return &RepoDeleteTeamUnprocessableEntity{}
+}
+
+/*
+RepoDeleteTeamUnprocessableEntity describes a response with status code 422, with default header values.
+
+APIValidationError is error format response related to input validation
+*/
+type RepoDeleteTeamUnprocessableEntity struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo delete team unprocessable entity response has a 2xx status code
+func (o *RepoDeleteTeamUnprocessableEntity) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo delete team unprocessable entity response has a 3xx status code
+func (o *RepoDeleteTeamUnprocessableEntity) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo delete team unprocessable entity response has a 4xx status code
+func (o *RepoDeleteTeamUnprocessableEntity) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo delete team unprocessable entity response has a 5xx status code
+func (o *RepoDeleteTeamUnprocessableEntity) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo delete team unprocessable entity response a status code equal to that given
+func (o *RepoDeleteTeamUnprocessableEntity) IsCode(code int) bool {
+	return code == 422
+}
+
+// Code gets the status code for the repo delete team unprocessable entity response
+func (o *RepoDeleteTeamUnprocessableEntity) Code() int {
+	return 422
+}
+
+func (o *RepoDeleteTeamUnprocessableEntity) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/teams/{team}][%d] repoDeleteTeamUnprocessableEntity", 422)
+}
+
+func (o *RepoDeleteTeamUnprocessableEntity) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/teams/{team}][%d] repoDeleteTeamUnprocessableEntity", 422)
+}
+
+func (o *RepoDeleteTeamUnprocessableEntity) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_delete_topic_parameters.go b/bots-common/gitea-generated/client/repository/repo_delete_topic_parameters.go
new file mode 100644
index 0000000..56b8e14
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_delete_topic_parameters.go
@@ -0,0 +1,195 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewRepoDeleteTopicParams creates a new RepoDeleteTopicParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoDeleteTopicParams() *RepoDeleteTopicParams {
+	return &RepoDeleteTopicParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoDeleteTopicParamsWithTimeout creates a new RepoDeleteTopicParams object
+// with the ability to set a timeout on a request.
+func NewRepoDeleteTopicParamsWithTimeout(timeout time.Duration) *RepoDeleteTopicParams {
+	return &RepoDeleteTopicParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoDeleteTopicParamsWithContext creates a new RepoDeleteTopicParams object
+// with the ability to set a context for a request.
+func NewRepoDeleteTopicParamsWithContext(ctx context.Context) *RepoDeleteTopicParams {
+	return &RepoDeleteTopicParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoDeleteTopicParamsWithHTTPClient creates a new RepoDeleteTopicParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoDeleteTopicParamsWithHTTPClient(client *http.Client) *RepoDeleteTopicParams {
+	return &RepoDeleteTopicParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoDeleteTopicParams contains all the parameters to send to the API endpoint
+
+	for the repo delete topic operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoDeleteTopicParams struct {
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	/* Topic.
+
+	   name of the topic to delete
+	*/
+	Topic string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo delete topic params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoDeleteTopicParams) WithDefaults() *RepoDeleteTopicParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo delete topic params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoDeleteTopicParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo delete topic params
+func (o *RepoDeleteTopicParams) WithTimeout(timeout time.Duration) *RepoDeleteTopicParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo delete topic params
+func (o *RepoDeleteTopicParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo delete topic params
+func (o *RepoDeleteTopicParams) WithContext(ctx context.Context) *RepoDeleteTopicParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo delete topic params
+func (o *RepoDeleteTopicParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo delete topic params
+func (o *RepoDeleteTopicParams) WithHTTPClient(client *http.Client) *RepoDeleteTopicParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo delete topic params
+func (o *RepoDeleteTopicParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithOwner adds the owner to the repo delete topic params
+func (o *RepoDeleteTopicParams) WithOwner(owner string) *RepoDeleteTopicParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo delete topic params
+func (o *RepoDeleteTopicParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo delete topic params
+func (o *RepoDeleteTopicParams) WithRepo(repo string) *RepoDeleteTopicParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo delete topic params
+func (o *RepoDeleteTopicParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WithTopic adds the topic to the repo delete topic params
+func (o *RepoDeleteTopicParams) WithTopic(topic string) *RepoDeleteTopicParams {
+	o.SetTopic(topic)
+	return o
+}
+
+// SetTopic adds the topic to the repo delete topic params
+func (o *RepoDeleteTopicParams) SetTopic(topic string) {
+	o.Topic = topic
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoDeleteTopicParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	// path param topic
+	if err := r.SetPathParam("topic", o.Topic); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_delete_topic_responses.go b/bots-common/gitea-generated/client/repository/repo_delete_topic_responses.go
new file mode 100644
index 0000000..a573f75
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_delete_topic_responses.go
@@ -0,0 +1,256 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// RepoDeleteTopicReader is a Reader for the RepoDeleteTopic structure.
+type RepoDeleteTopicReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoDeleteTopicReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewRepoDeleteTopicNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoDeleteTopicNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 422:
+		result := NewRepoDeleteTopicUnprocessableEntity()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[DELETE /repos/{owner}/{repo}/topics/{topic}] repoDeleteTopic", response, response.Code())
+	}
+}
+
+// NewRepoDeleteTopicNoContent creates a RepoDeleteTopicNoContent with default headers values
+func NewRepoDeleteTopicNoContent() *RepoDeleteTopicNoContent {
+	return &RepoDeleteTopicNoContent{}
+}
+
+/*
+RepoDeleteTopicNoContent describes a response with status code 204, with default header values.
+
+APIEmpty is an empty response
+*/
+type RepoDeleteTopicNoContent struct {
+}
+
+// IsSuccess returns true when this repo delete topic no content response has a 2xx status code
+func (o *RepoDeleteTopicNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo delete topic no content response has a 3xx status code
+func (o *RepoDeleteTopicNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo delete topic no content response has a 4xx status code
+func (o *RepoDeleteTopicNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo delete topic no content response has a 5xx status code
+func (o *RepoDeleteTopicNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo delete topic no content response a status code equal to that given
+func (o *RepoDeleteTopicNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the repo delete topic no content response
+func (o *RepoDeleteTopicNoContent) Code() int {
+	return 204
+}
+
+func (o *RepoDeleteTopicNoContent) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/topics/{topic}][%d] repoDeleteTopicNoContent", 204)
+}
+
+func (o *RepoDeleteTopicNoContent) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/topics/{topic}][%d] repoDeleteTopicNoContent", 204)
+}
+
+func (o *RepoDeleteTopicNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewRepoDeleteTopicNotFound creates a RepoDeleteTopicNotFound with default headers values
+func NewRepoDeleteTopicNotFound() *RepoDeleteTopicNotFound {
+	return &RepoDeleteTopicNotFound{}
+}
+
+/*
+RepoDeleteTopicNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoDeleteTopicNotFound struct {
+}
+
+// IsSuccess returns true when this repo delete topic not found response has a 2xx status code
+func (o *RepoDeleteTopicNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo delete topic not found response has a 3xx status code
+func (o *RepoDeleteTopicNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo delete topic not found response has a 4xx status code
+func (o *RepoDeleteTopicNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo delete topic not found response has a 5xx status code
+func (o *RepoDeleteTopicNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo delete topic not found response a status code equal to that given
+func (o *RepoDeleteTopicNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo delete topic not found response
+func (o *RepoDeleteTopicNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoDeleteTopicNotFound) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/topics/{topic}][%d] repoDeleteTopicNotFound", 404)
+}
+
+func (o *RepoDeleteTopicNotFound) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/topics/{topic}][%d] repoDeleteTopicNotFound", 404)
+}
+
+func (o *RepoDeleteTopicNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewRepoDeleteTopicUnprocessableEntity creates a RepoDeleteTopicUnprocessableEntity with default headers values
+func NewRepoDeleteTopicUnprocessableEntity() *RepoDeleteTopicUnprocessableEntity {
+	return &RepoDeleteTopicUnprocessableEntity{}
+}
+
+/*
+RepoDeleteTopicUnprocessableEntity describes a response with status code 422, with default header values.
+
+APIInvalidTopicsError is error format response to invalid topics
+*/
+type RepoDeleteTopicUnprocessableEntity struct {
+	InvalidTopics []string
+	Message       string
+}
+
+// IsSuccess returns true when this repo delete topic unprocessable entity response has a 2xx status code
+func (o *RepoDeleteTopicUnprocessableEntity) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo delete topic unprocessable entity response has a 3xx status code
+func (o *RepoDeleteTopicUnprocessableEntity) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo delete topic unprocessable entity response has a 4xx status code
+func (o *RepoDeleteTopicUnprocessableEntity) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo delete topic unprocessable entity response has a 5xx status code
+func (o *RepoDeleteTopicUnprocessableEntity) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo delete topic unprocessable entity response a status code equal to that given
+func (o *RepoDeleteTopicUnprocessableEntity) IsCode(code int) bool {
+	return code == 422
+}
+
+// Code gets the status code for the repo delete topic unprocessable entity response
+func (o *RepoDeleteTopicUnprocessableEntity) Code() int {
+	return 422
+}
+
+func (o *RepoDeleteTopicUnprocessableEntity) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/topics/{topic}][%d] repoDeleteTopicUnprocessableEntity", 422)
+}
+
+func (o *RepoDeleteTopicUnprocessableEntity) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/topics/{topic}][%d] repoDeleteTopicUnprocessableEntity", 422)
+}
+
+func (o *RepoDeleteTopicUnprocessableEntity) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header invalidTopics
+	hdrInvalidTopics := response.GetHeader("invalidTopics")
+
+	if hdrInvalidTopics != "" {
+
+		// binding header items for invalidTopics
+		valInvalidTopics, err := o.bindHeaderInvalidTopics(hdrInvalidTopics, formats)
+		if err != nil {
+			return err
+		}
+
+		o.InvalidTopics = valInvalidTopics
+	}
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	return nil
+}
+
+// bindHeaderRepoDeleteTopicUnprocessableEntity binds the response header invalidTopics
+func (o *RepoDeleteTopicUnprocessableEntity) bindHeaderInvalidTopics(hdr string, formats strfmt.Registry) ([]string, error) {
+	invalidTopicsIV := hdr
+
+	var (
+		invalidTopicsIC []string
+	)
+	// items.CollectionFormat: ""
+	invalidTopicsIR := swag.SplitByFormat(invalidTopicsIV, "")
+
+	for _, invalidTopicsIIV := range invalidTopicsIR {
+
+		// convert split string to string
+		invalidTopicsIIC := invalidTopicsIIV                        // string as string
+		invalidTopicsIC = append(invalidTopicsIC, invalidTopicsIIC) // roll-up string into []string
+	}
+
+	return invalidTopicsIC, nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_delete_wiki_page_parameters.go b/bots-common/gitea-generated/client/repository/repo_delete_wiki_page_parameters.go
new file mode 100644
index 0000000..8174d04
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_delete_wiki_page_parameters.go
@@ -0,0 +1,195 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewRepoDeleteWikiPageParams creates a new RepoDeleteWikiPageParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoDeleteWikiPageParams() *RepoDeleteWikiPageParams {
+	return &RepoDeleteWikiPageParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoDeleteWikiPageParamsWithTimeout creates a new RepoDeleteWikiPageParams object
+// with the ability to set a timeout on a request.
+func NewRepoDeleteWikiPageParamsWithTimeout(timeout time.Duration) *RepoDeleteWikiPageParams {
+	return &RepoDeleteWikiPageParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoDeleteWikiPageParamsWithContext creates a new RepoDeleteWikiPageParams object
+// with the ability to set a context for a request.
+func NewRepoDeleteWikiPageParamsWithContext(ctx context.Context) *RepoDeleteWikiPageParams {
+	return &RepoDeleteWikiPageParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoDeleteWikiPageParamsWithHTTPClient creates a new RepoDeleteWikiPageParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoDeleteWikiPageParamsWithHTTPClient(client *http.Client) *RepoDeleteWikiPageParams {
+	return &RepoDeleteWikiPageParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoDeleteWikiPageParams contains all the parameters to send to the API endpoint
+
+	for the repo delete wiki page operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoDeleteWikiPageParams struct {
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* PageName.
+
+	   name of the page
+	*/
+	PageName string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo delete wiki page params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoDeleteWikiPageParams) WithDefaults() *RepoDeleteWikiPageParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo delete wiki page params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoDeleteWikiPageParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo delete wiki page params
+func (o *RepoDeleteWikiPageParams) WithTimeout(timeout time.Duration) *RepoDeleteWikiPageParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo delete wiki page params
+func (o *RepoDeleteWikiPageParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo delete wiki page params
+func (o *RepoDeleteWikiPageParams) WithContext(ctx context.Context) *RepoDeleteWikiPageParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo delete wiki page params
+func (o *RepoDeleteWikiPageParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo delete wiki page params
+func (o *RepoDeleteWikiPageParams) WithHTTPClient(client *http.Client) *RepoDeleteWikiPageParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo delete wiki page params
+func (o *RepoDeleteWikiPageParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithOwner adds the owner to the repo delete wiki page params
+func (o *RepoDeleteWikiPageParams) WithOwner(owner string) *RepoDeleteWikiPageParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo delete wiki page params
+func (o *RepoDeleteWikiPageParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithPageName adds the pageName to the repo delete wiki page params
+func (o *RepoDeleteWikiPageParams) WithPageName(pageName string) *RepoDeleteWikiPageParams {
+	o.SetPageName(pageName)
+	return o
+}
+
+// SetPageName adds the pageName to the repo delete wiki page params
+func (o *RepoDeleteWikiPageParams) SetPageName(pageName string) {
+	o.PageName = pageName
+}
+
+// WithRepo adds the repo to the repo delete wiki page params
+func (o *RepoDeleteWikiPageParams) WithRepo(repo string) *RepoDeleteWikiPageParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo delete wiki page params
+func (o *RepoDeleteWikiPageParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoDeleteWikiPageParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param pageName
+	if err := r.SetPathParam("pageName", o.PageName); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_delete_wiki_page_responses.go b/bots-common/gitea-generated/client/repository/repo_delete_wiki_page_responses.go
new file mode 100644
index 0000000..c651357
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_delete_wiki_page_responses.go
@@ -0,0 +1,306 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// RepoDeleteWikiPageReader is a Reader for the RepoDeleteWikiPage structure.
+type RepoDeleteWikiPageReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoDeleteWikiPageReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewRepoDeleteWikiPageNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 403:
+		result := NewRepoDeleteWikiPageForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewRepoDeleteWikiPageNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 423:
+		result := NewRepoDeleteWikiPageLocked()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[DELETE /repos/{owner}/{repo}/wiki/page/{pageName}] repoDeleteWikiPage", response, response.Code())
+	}
+}
+
+// NewRepoDeleteWikiPageNoContent creates a RepoDeleteWikiPageNoContent with default headers values
+func NewRepoDeleteWikiPageNoContent() *RepoDeleteWikiPageNoContent {
+	return &RepoDeleteWikiPageNoContent{}
+}
+
+/*
+RepoDeleteWikiPageNoContent describes a response with status code 204, with default header values.
+
+APIEmpty is an empty response
+*/
+type RepoDeleteWikiPageNoContent struct {
+}
+
+// IsSuccess returns true when this repo delete wiki page no content response has a 2xx status code
+func (o *RepoDeleteWikiPageNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo delete wiki page no content response has a 3xx status code
+func (o *RepoDeleteWikiPageNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo delete wiki page no content response has a 4xx status code
+func (o *RepoDeleteWikiPageNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo delete wiki page no content response has a 5xx status code
+func (o *RepoDeleteWikiPageNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo delete wiki page no content response a status code equal to that given
+func (o *RepoDeleteWikiPageNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the repo delete wiki page no content response
+func (o *RepoDeleteWikiPageNoContent) Code() int {
+	return 204
+}
+
+func (o *RepoDeleteWikiPageNoContent) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/wiki/page/{pageName}][%d] repoDeleteWikiPageNoContent", 204)
+}
+
+func (o *RepoDeleteWikiPageNoContent) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/wiki/page/{pageName}][%d] repoDeleteWikiPageNoContent", 204)
+}
+
+func (o *RepoDeleteWikiPageNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewRepoDeleteWikiPageForbidden creates a RepoDeleteWikiPageForbidden with default headers values
+func NewRepoDeleteWikiPageForbidden() *RepoDeleteWikiPageForbidden {
+	return &RepoDeleteWikiPageForbidden{}
+}
+
+/*
+RepoDeleteWikiPageForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type RepoDeleteWikiPageForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo delete wiki page forbidden response has a 2xx status code
+func (o *RepoDeleteWikiPageForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo delete wiki page forbidden response has a 3xx status code
+func (o *RepoDeleteWikiPageForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo delete wiki page forbidden response has a 4xx status code
+func (o *RepoDeleteWikiPageForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo delete wiki page forbidden response has a 5xx status code
+func (o *RepoDeleteWikiPageForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo delete wiki page forbidden response a status code equal to that given
+func (o *RepoDeleteWikiPageForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the repo delete wiki page forbidden response
+func (o *RepoDeleteWikiPageForbidden) Code() int {
+	return 403
+}
+
+func (o *RepoDeleteWikiPageForbidden) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/wiki/page/{pageName}][%d] repoDeleteWikiPageForbidden", 403)
+}
+
+func (o *RepoDeleteWikiPageForbidden) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/wiki/page/{pageName}][%d] repoDeleteWikiPageForbidden", 403)
+}
+
+func (o *RepoDeleteWikiPageForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewRepoDeleteWikiPageNotFound creates a RepoDeleteWikiPageNotFound with default headers values
+func NewRepoDeleteWikiPageNotFound() *RepoDeleteWikiPageNotFound {
+	return &RepoDeleteWikiPageNotFound{}
+}
+
+/*
+RepoDeleteWikiPageNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoDeleteWikiPageNotFound struct {
+}
+
+// IsSuccess returns true when this repo delete wiki page not found response has a 2xx status code
+func (o *RepoDeleteWikiPageNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo delete wiki page not found response has a 3xx status code
+func (o *RepoDeleteWikiPageNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo delete wiki page not found response has a 4xx status code
+func (o *RepoDeleteWikiPageNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo delete wiki page not found response has a 5xx status code
+func (o *RepoDeleteWikiPageNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo delete wiki page not found response a status code equal to that given
+func (o *RepoDeleteWikiPageNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo delete wiki page not found response
+func (o *RepoDeleteWikiPageNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoDeleteWikiPageNotFound) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/wiki/page/{pageName}][%d] repoDeleteWikiPageNotFound", 404)
+}
+
+func (o *RepoDeleteWikiPageNotFound) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/wiki/page/{pageName}][%d] repoDeleteWikiPageNotFound", 404)
+}
+
+func (o *RepoDeleteWikiPageNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewRepoDeleteWikiPageLocked creates a RepoDeleteWikiPageLocked with default headers values
+func NewRepoDeleteWikiPageLocked() *RepoDeleteWikiPageLocked {
+	return &RepoDeleteWikiPageLocked{}
+}
+
+/*
+RepoDeleteWikiPageLocked describes a response with status code 423, with default header values.
+
+APIRepoArchivedError is an error that is raised when an archived repo should be modified
+*/
+type RepoDeleteWikiPageLocked struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo delete wiki page locked response has a 2xx status code
+func (o *RepoDeleteWikiPageLocked) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo delete wiki page locked response has a 3xx status code
+func (o *RepoDeleteWikiPageLocked) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo delete wiki page locked response has a 4xx status code
+func (o *RepoDeleteWikiPageLocked) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo delete wiki page locked response has a 5xx status code
+func (o *RepoDeleteWikiPageLocked) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo delete wiki page locked response a status code equal to that given
+func (o *RepoDeleteWikiPageLocked) IsCode(code int) bool {
+	return code == 423
+}
+
+// Code gets the status code for the repo delete wiki page locked response
+func (o *RepoDeleteWikiPageLocked) Code() int {
+	return 423
+}
+
+func (o *RepoDeleteWikiPageLocked) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/wiki/page/{pageName}][%d] repoDeleteWikiPageLocked", 423)
+}
+
+func (o *RepoDeleteWikiPageLocked) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/wiki/page/{pageName}][%d] repoDeleteWikiPageLocked", 423)
+}
+
+func (o *RepoDeleteWikiPageLocked) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_dismiss_pull_review_parameters.go b/bots-common/gitea-generated/client/repository/repo_dismiss_pull_review_parameters.go
new file mode 100644
index 0000000..35a7ad6
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_dismiss_pull_review_parameters.go
@@ -0,0 +1,243 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewRepoDismissPullReviewParams creates a new RepoDismissPullReviewParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoDismissPullReviewParams() *RepoDismissPullReviewParams {
+	return &RepoDismissPullReviewParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoDismissPullReviewParamsWithTimeout creates a new RepoDismissPullReviewParams object
+// with the ability to set a timeout on a request.
+func NewRepoDismissPullReviewParamsWithTimeout(timeout time.Duration) *RepoDismissPullReviewParams {
+	return &RepoDismissPullReviewParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoDismissPullReviewParamsWithContext creates a new RepoDismissPullReviewParams object
+// with the ability to set a context for a request.
+func NewRepoDismissPullReviewParamsWithContext(ctx context.Context) *RepoDismissPullReviewParams {
+	return &RepoDismissPullReviewParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoDismissPullReviewParamsWithHTTPClient creates a new RepoDismissPullReviewParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoDismissPullReviewParamsWithHTTPClient(client *http.Client) *RepoDismissPullReviewParams {
+	return &RepoDismissPullReviewParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoDismissPullReviewParams contains all the parameters to send to the API endpoint
+
+	for the repo dismiss pull review operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoDismissPullReviewParams struct {
+
+	// Body.
+	Body *models.DismissPullReviewOptions
+
+	/* ID.
+
+	   id of the review
+
+	   Format: int64
+	*/
+	ID int64
+
+	/* Index.
+
+	   index of the pull request
+
+	   Format: int64
+	*/
+	Index int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo dismiss pull review params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoDismissPullReviewParams) WithDefaults() *RepoDismissPullReviewParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo dismiss pull review params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoDismissPullReviewParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo dismiss pull review params
+func (o *RepoDismissPullReviewParams) WithTimeout(timeout time.Duration) *RepoDismissPullReviewParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo dismiss pull review params
+func (o *RepoDismissPullReviewParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo dismiss pull review params
+func (o *RepoDismissPullReviewParams) WithContext(ctx context.Context) *RepoDismissPullReviewParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo dismiss pull review params
+func (o *RepoDismissPullReviewParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo dismiss pull review params
+func (o *RepoDismissPullReviewParams) WithHTTPClient(client *http.Client) *RepoDismissPullReviewParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo dismiss pull review params
+func (o *RepoDismissPullReviewParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the repo dismiss pull review params
+func (o *RepoDismissPullReviewParams) WithBody(body *models.DismissPullReviewOptions) *RepoDismissPullReviewParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the repo dismiss pull review params
+func (o *RepoDismissPullReviewParams) SetBody(body *models.DismissPullReviewOptions) {
+	o.Body = body
+}
+
+// WithID adds the id to the repo dismiss pull review params
+func (o *RepoDismissPullReviewParams) WithID(id int64) *RepoDismissPullReviewParams {
+	o.SetID(id)
+	return o
+}
+
+// SetID adds the id to the repo dismiss pull review params
+func (o *RepoDismissPullReviewParams) SetID(id int64) {
+	o.ID = id
+}
+
+// WithIndex adds the index to the repo dismiss pull review params
+func (o *RepoDismissPullReviewParams) WithIndex(index int64) *RepoDismissPullReviewParams {
+	o.SetIndex(index)
+	return o
+}
+
+// SetIndex adds the index to the repo dismiss pull review params
+func (o *RepoDismissPullReviewParams) SetIndex(index int64) {
+	o.Index = index
+}
+
+// WithOwner adds the owner to the repo dismiss pull review params
+func (o *RepoDismissPullReviewParams) WithOwner(owner string) *RepoDismissPullReviewParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo dismiss pull review params
+func (o *RepoDismissPullReviewParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo dismiss pull review params
+func (o *RepoDismissPullReviewParams) WithRepo(repo string) *RepoDismissPullReviewParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo dismiss pull review params
+func (o *RepoDismissPullReviewParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoDismissPullReviewParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	// path param id
+	if err := r.SetPathParam("id", swag.FormatInt64(o.ID)); err != nil {
+		return err
+	}
+
+	// path param index
+	if err := r.SetPathParam("index", swag.FormatInt64(o.Index)); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_dismiss_pull_review_responses.go b/bots-common/gitea-generated/client/repository/repo_dismiss_pull_review_responses.go
new file mode 100644
index 0000000..842f765
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_dismiss_pull_review_responses.go
@@ -0,0 +1,324 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoDismissPullReviewReader is a Reader for the RepoDismissPullReview structure.
+type RepoDismissPullReviewReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoDismissPullReviewReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoDismissPullReviewOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 403:
+		result := NewRepoDismissPullReviewForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewRepoDismissPullReviewNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 422:
+		result := NewRepoDismissPullReviewUnprocessableEntity()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[POST /repos/{owner}/{repo}/pulls/{index}/reviews/{id}/dismissals] repoDismissPullReview", response, response.Code())
+	}
+}
+
+// NewRepoDismissPullReviewOK creates a RepoDismissPullReviewOK with default headers values
+func NewRepoDismissPullReviewOK() *RepoDismissPullReviewOK {
+	return &RepoDismissPullReviewOK{}
+}
+
+/*
+RepoDismissPullReviewOK describes a response with status code 200, with default header values.
+
+PullReview
+*/
+type RepoDismissPullReviewOK struct {
+	Payload *models.PullReview
+}
+
+// IsSuccess returns true when this repo dismiss pull review o k response has a 2xx status code
+func (o *RepoDismissPullReviewOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo dismiss pull review o k response has a 3xx status code
+func (o *RepoDismissPullReviewOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo dismiss pull review o k response has a 4xx status code
+func (o *RepoDismissPullReviewOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo dismiss pull review o k response has a 5xx status code
+func (o *RepoDismissPullReviewOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo dismiss pull review o k response a status code equal to that given
+func (o *RepoDismissPullReviewOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo dismiss pull review o k response
+func (o *RepoDismissPullReviewOK) Code() int {
+	return 200
+}
+
+func (o *RepoDismissPullReviewOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/pulls/{index}/reviews/{id}/dismissals][%d] repoDismissPullReviewOK %s", 200, payload)
+}
+
+func (o *RepoDismissPullReviewOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/pulls/{index}/reviews/{id}/dismissals][%d] repoDismissPullReviewOK %s", 200, payload)
+}
+
+func (o *RepoDismissPullReviewOK) GetPayload() *models.PullReview {
+	return o.Payload
+}
+
+func (o *RepoDismissPullReviewOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.PullReview)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoDismissPullReviewForbidden creates a RepoDismissPullReviewForbidden with default headers values
+func NewRepoDismissPullReviewForbidden() *RepoDismissPullReviewForbidden {
+	return &RepoDismissPullReviewForbidden{}
+}
+
+/*
+RepoDismissPullReviewForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type RepoDismissPullReviewForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo dismiss pull review forbidden response has a 2xx status code
+func (o *RepoDismissPullReviewForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo dismiss pull review forbidden response has a 3xx status code
+func (o *RepoDismissPullReviewForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo dismiss pull review forbidden response has a 4xx status code
+func (o *RepoDismissPullReviewForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo dismiss pull review forbidden response has a 5xx status code
+func (o *RepoDismissPullReviewForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo dismiss pull review forbidden response a status code equal to that given
+func (o *RepoDismissPullReviewForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the repo dismiss pull review forbidden response
+func (o *RepoDismissPullReviewForbidden) Code() int {
+	return 403
+}
+
+func (o *RepoDismissPullReviewForbidden) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/pulls/{index}/reviews/{id}/dismissals][%d] repoDismissPullReviewForbidden", 403)
+}
+
+func (o *RepoDismissPullReviewForbidden) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/pulls/{index}/reviews/{id}/dismissals][%d] repoDismissPullReviewForbidden", 403)
+}
+
+func (o *RepoDismissPullReviewForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewRepoDismissPullReviewNotFound creates a RepoDismissPullReviewNotFound with default headers values
+func NewRepoDismissPullReviewNotFound() *RepoDismissPullReviewNotFound {
+	return &RepoDismissPullReviewNotFound{}
+}
+
+/*
+RepoDismissPullReviewNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoDismissPullReviewNotFound struct {
+}
+
+// IsSuccess returns true when this repo dismiss pull review not found response has a 2xx status code
+func (o *RepoDismissPullReviewNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo dismiss pull review not found response has a 3xx status code
+func (o *RepoDismissPullReviewNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo dismiss pull review not found response has a 4xx status code
+func (o *RepoDismissPullReviewNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo dismiss pull review not found response has a 5xx status code
+func (o *RepoDismissPullReviewNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo dismiss pull review not found response a status code equal to that given
+func (o *RepoDismissPullReviewNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo dismiss pull review not found response
+func (o *RepoDismissPullReviewNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoDismissPullReviewNotFound) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/pulls/{index}/reviews/{id}/dismissals][%d] repoDismissPullReviewNotFound", 404)
+}
+
+func (o *RepoDismissPullReviewNotFound) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/pulls/{index}/reviews/{id}/dismissals][%d] repoDismissPullReviewNotFound", 404)
+}
+
+func (o *RepoDismissPullReviewNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewRepoDismissPullReviewUnprocessableEntity creates a RepoDismissPullReviewUnprocessableEntity with default headers values
+func NewRepoDismissPullReviewUnprocessableEntity() *RepoDismissPullReviewUnprocessableEntity {
+	return &RepoDismissPullReviewUnprocessableEntity{}
+}
+
+/*
+RepoDismissPullReviewUnprocessableEntity describes a response with status code 422, with default header values.
+
+APIValidationError is error format response related to input validation
+*/
+type RepoDismissPullReviewUnprocessableEntity struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo dismiss pull review unprocessable entity response has a 2xx status code
+func (o *RepoDismissPullReviewUnprocessableEntity) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo dismiss pull review unprocessable entity response has a 3xx status code
+func (o *RepoDismissPullReviewUnprocessableEntity) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo dismiss pull review unprocessable entity response has a 4xx status code
+func (o *RepoDismissPullReviewUnprocessableEntity) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo dismiss pull review unprocessable entity response has a 5xx status code
+func (o *RepoDismissPullReviewUnprocessableEntity) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo dismiss pull review unprocessable entity response a status code equal to that given
+func (o *RepoDismissPullReviewUnprocessableEntity) IsCode(code int) bool {
+	return code == 422
+}
+
+// Code gets the status code for the repo dismiss pull review unprocessable entity response
+func (o *RepoDismissPullReviewUnprocessableEntity) Code() int {
+	return 422
+}
+
+func (o *RepoDismissPullReviewUnprocessableEntity) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/pulls/{index}/reviews/{id}/dismissals][%d] repoDismissPullReviewUnprocessableEntity", 422)
+}
+
+func (o *RepoDismissPullReviewUnprocessableEntity) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/pulls/{index}/reviews/{id}/dismissals][%d] repoDismissPullReviewUnprocessableEntity", 422)
+}
+
+func (o *RepoDismissPullReviewUnprocessableEntity) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_download_commit_diff_or_patch_parameters.go b/bots-common/gitea-generated/client/repository/repo_download_commit_diff_or_patch_parameters.go
new file mode 100644
index 0000000..6df8925
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_download_commit_diff_or_patch_parameters.go
@@ -0,0 +1,217 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewRepoDownloadCommitDiffOrPatchParams creates a new RepoDownloadCommitDiffOrPatchParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoDownloadCommitDiffOrPatchParams() *RepoDownloadCommitDiffOrPatchParams {
+	return &RepoDownloadCommitDiffOrPatchParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoDownloadCommitDiffOrPatchParamsWithTimeout creates a new RepoDownloadCommitDiffOrPatchParams object
+// with the ability to set a timeout on a request.
+func NewRepoDownloadCommitDiffOrPatchParamsWithTimeout(timeout time.Duration) *RepoDownloadCommitDiffOrPatchParams {
+	return &RepoDownloadCommitDiffOrPatchParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoDownloadCommitDiffOrPatchParamsWithContext creates a new RepoDownloadCommitDiffOrPatchParams object
+// with the ability to set a context for a request.
+func NewRepoDownloadCommitDiffOrPatchParamsWithContext(ctx context.Context) *RepoDownloadCommitDiffOrPatchParams {
+	return &RepoDownloadCommitDiffOrPatchParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoDownloadCommitDiffOrPatchParamsWithHTTPClient creates a new RepoDownloadCommitDiffOrPatchParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoDownloadCommitDiffOrPatchParamsWithHTTPClient(client *http.Client) *RepoDownloadCommitDiffOrPatchParams {
+	return &RepoDownloadCommitDiffOrPatchParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoDownloadCommitDiffOrPatchParams contains all the parameters to send to the API endpoint
+
+	for the repo download commit diff or patch operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoDownloadCommitDiffOrPatchParams struct {
+
+	/* DiffType.
+
+	   whether the output is diff or patch
+	*/
+	DiffType string
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	/* Sha.
+
+	   SHA of the commit to get
+	*/
+	Sha string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo download commit diff or patch params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoDownloadCommitDiffOrPatchParams) WithDefaults() *RepoDownloadCommitDiffOrPatchParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo download commit diff or patch params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoDownloadCommitDiffOrPatchParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo download commit diff or patch params
+func (o *RepoDownloadCommitDiffOrPatchParams) WithTimeout(timeout time.Duration) *RepoDownloadCommitDiffOrPatchParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo download commit diff or patch params
+func (o *RepoDownloadCommitDiffOrPatchParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo download commit diff or patch params
+func (o *RepoDownloadCommitDiffOrPatchParams) WithContext(ctx context.Context) *RepoDownloadCommitDiffOrPatchParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo download commit diff or patch params
+func (o *RepoDownloadCommitDiffOrPatchParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo download commit diff or patch params
+func (o *RepoDownloadCommitDiffOrPatchParams) WithHTTPClient(client *http.Client) *RepoDownloadCommitDiffOrPatchParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo download commit diff or patch params
+func (o *RepoDownloadCommitDiffOrPatchParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithDiffType adds the diffType to the repo download commit diff or patch params
+func (o *RepoDownloadCommitDiffOrPatchParams) WithDiffType(diffType string) *RepoDownloadCommitDiffOrPatchParams {
+	o.SetDiffType(diffType)
+	return o
+}
+
+// SetDiffType adds the diffType to the repo download commit diff or patch params
+func (o *RepoDownloadCommitDiffOrPatchParams) SetDiffType(diffType string) {
+	o.DiffType = diffType
+}
+
+// WithOwner adds the owner to the repo download commit diff or patch params
+func (o *RepoDownloadCommitDiffOrPatchParams) WithOwner(owner string) *RepoDownloadCommitDiffOrPatchParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo download commit diff or patch params
+func (o *RepoDownloadCommitDiffOrPatchParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo download commit diff or patch params
+func (o *RepoDownloadCommitDiffOrPatchParams) WithRepo(repo string) *RepoDownloadCommitDiffOrPatchParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo download commit diff or patch params
+func (o *RepoDownloadCommitDiffOrPatchParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WithSha adds the sha to the repo download commit diff or patch params
+func (o *RepoDownloadCommitDiffOrPatchParams) WithSha(sha string) *RepoDownloadCommitDiffOrPatchParams {
+	o.SetSha(sha)
+	return o
+}
+
+// SetSha adds the sha to the repo download commit diff or patch params
+func (o *RepoDownloadCommitDiffOrPatchParams) SetSha(sha string) {
+	o.Sha = sha
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoDownloadCommitDiffOrPatchParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param diffType
+	if err := r.SetPathParam("diffType", o.DiffType); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	// path param sha
+	if err := r.SetPathParam("sha", o.Sha); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_download_commit_diff_or_patch_responses.go b/bots-common/gitea-generated/client/repository/repo_download_commit_diff_or_patch_responses.go
new file mode 100644
index 0000000..9dc25ae
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_download_commit_diff_or_patch_responses.go
@@ -0,0 +1,164 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// RepoDownloadCommitDiffOrPatchReader is a Reader for the RepoDownloadCommitDiffOrPatch structure.
+type RepoDownloadCommitDiffOrPatchReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoDownloadCommitDiffOrPatchReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoDownloadCommitDiffOrPatchOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoDownloadCommitDiffOrPatchNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/git/commits/{sha}.{diffType}] repoDownloadCommitDiffOrPatch", response, response.Code())
+	}
+}
+
+// NewRepoDownloadCommitDiffOrPatchOK creates a RepoDownloadCommitDiffOrPatchOK with default headers values
+func NewRepoDownloadCommitDiffOrPatchOK() *RepoDownloadCommitDiffOrPatchOK {
+	return &RepoDownloadCommitDiffOrPatchOK{}
+}
+
+/*
+RepoDownloadCommitDiffOrPatchOK describes a response with status code 200, with default header values.
+
+APIString is a string response
+*/
+type RepoDownloadCommitDiffOrPatchOK struct {
+	Payload string
+}
+
+// IsSuccess returns true when this repo download commit diff or patch o k response has a 2xx status code
+func (o *RepoDownloadCommitDiffOrPatchOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo download commit diff or patch o k response has a 3xx status code
+func (o *RepoDownloadCommitDiffOrPatchOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo download commit diff or patch o k response has a 4xx status code
+func (o *RepoDownloadCommitDiffOrPatchOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo download commit diff or patch o k response has a 5xx status code
+func (o *RepoDownloadCommitDiffOrPatchOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo download commit diff or patch o k response a status code equal to that given
+func (o *RepoDownloadCommitDiffOrPatchOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo download commit diff or patch o k response
+func (o *RepoDownloadCommitDiffOrPatchOK) Code() int {
+	return 200
+}
+
+func (o *RepoDownloadCommitDiffOrPatchOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/git/commits/{sha}.{diffType}][%d] repoDownloadCommitDiffOrPatchOK %s", 200, payload)
+}
+
+func (o *RepoDownloadCommitDiffOrPatchOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/git/commits/{sha}.{diffType}][%d] repoDownloadCommitDiffOrPatchOK %s", 200, payload)
+}
+
+func (o *RepoDownloadCommitDiffOrPatchOK) GetPayload() string {
+	return o.Payload
+}
+
+func (o *RepoDownloadCommitDiffOrPatchOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoDownloadCommitDiffOrPatchNotFound creates a RepoDownloadCommitDiffOrPatchNotFound with default headers values
+func NewRepoDownloadCommitDiffOrPatchNotFound() *RepoDownloadCommitDiffOrPatchNotFound {
+	return &RepoDownloadCommitDiffOrPatchNotFound{}
+}
+
+/*
+RepoDownloadCommitDiffOrPatchNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoDownloadCommitDiffOrPatchNotFound struct {
+}
+
+// IsSuccess returns true when this repo download commit diff or patch not found response has a 2xx status code
+func (o *RepoDownloadCommitDiffOrPatchNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo download commit diff or patch not found response has a 3xx status code
+func (o *RepoDownloadCommitDiffOrPatchNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo download commit diff or patch not found response has a 4xx status code
+func (o *RepoDownloadCommitDiffOrPatchNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo download commit diff or patch not found response has a 5xx status code
+func (o *RepoDownloadCommitDiffOrPatchNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo download commit diff or patch not found response a status code equal to that given
+func (o *RepoDownloadCommitDiffOrPatchNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo download commit diff or patch not found response
+func (o *RepoDownloadCommitDiffOrPatchNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoDownloadCommitDiffOrPatchNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/git/commits/{sha}.{diffType}][%d] repoDownloadCommitDiffOrPatchNotFound", 404)
+}
+
+func (o *RepoDownloadCommitDiffOrPatchNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/git/commits/{sha}.{diffType}][%d] repoDownloadCommitDiffOrPatchNotFound", 404)
+}
+
+func (o *RepoDownloadCommitDiffOrPatchNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_download_pull_diff_or_patch_parameters.go b/bots-common/gitea-generated/client/repository/repo_download_pull_diff_or_patch_parameters.go
new file mode 100644
index 0000000..1f3fcb5
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_download_pull_diff_or_patch_parameters.go
@@ -0,0 +1,254 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewRepoDownloadPullDiffOrPatchParams creates a new RepoDownloadPullDiffOrPatchParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoDownloadPullDiffOrPatchParams() *RepoDownloadPullDiffOrPatchParams {
+	return &RepoDownloadPullDiffOrPatchParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoDownloadPullDiffOrPatchParamsWithTimeout creates a new RepoDownloadPullDiffOrPatchParams object
+// with the ability to set a timeout on a request.
+func NewRepoDownloadPullDiffOrPatchParamsWithTimeout(timeout time.Duration) *RepoDownloadPullDiffOrPatchParams {
+	return &RepoDownloadPullDiffOrPatchParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoDownloadPullDiffOrPatchParamsWithContext creates a new RepoDownloadPullDiffOrPatchParams object
+// with the ability to set a context for a request.
+func NewRepoDownloadPullDiffOrPatchParamsWithContext(ctx context.Context) *RepoDownloadPullDiffOrPatchParams {
+	return &RepoDownloadPullDiffOrPatchParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoDownloadPullDiffOrPatchParamsWithHTTPClient creates a new RepoDownloadPullDiffOrPatchParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoDownloadPullDiffOrPatchParamsWithHTTPClient(client *http.Client) *RepoDownloadPullDiffOrPatchParams {
+	return &RepoDownloadPullDiffOrPatchParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoDownloadPullDiffOrPatchParams contains all the parameters to send to the API endpoint
+
+	for the repo download pull diff or patch operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoDownloadPullDiffOrPatchParams struct {
+
+	/* Binary.
+
+	   whether to include binary file changes. if true, the diff is applicable with `git apply`
+	*/
+	Binary *bool
+
+	/* DiffType.
+
+	   whether the output is diff or patch
+	*/
+	DiffType string
+
+	/* Index.
+
+	   index of the pull request to get
+
+	   Format: int64
+	*/
+	Index int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo download pull diff or patch params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoDownloadPullDiffOrPatchParams) WithDefaults() *RepoDownloadPullDiffOrPatchParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo download pull diff or patch params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoDownloadPullDiffOrPatchParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo download pull diff or patch params
+func (o *RepoDownloadPullDiffOrPatchParams) WithTimeout(timeout time.Duration) *RepoDownloadPullDiffOrPatchParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo download pull diff or patch params
+func (o *RepoDownloadPullDiffOrPatchParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo download pull diff or patch params
+func (o *RepoDownloadPullDiffOrPatchParams) WithContext(ctx context.Context) *RepoDownloadPullDiffOrPatchParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo download pull diff or patch params
+func (o *RepoDownloadPullDiffOrPatchParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo download pull diff or patch params
+func (o *RepoDownloadPullDiffOrPatchParams) WithHTTPClient(client *http.Client) *RepoDownloadPullDiffOrPatchParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo download pull diff or patch params
+func (o *RepoDownloadPullDiffOrPatchParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBinary adds the binary to the repo download pull diff or patch params
+func (o *RepoDownloadPullDiffOrPatchParams) WithBinary(binary *bool) *RepoDownloadPullDiffOrPatchParams {
+	o.SetBinary(binary)
+	return o
+}
+
+// SetBinary adds the binary to the repo download pull diff or patch params
+func (o *RepoDownloadPullDiffOrPatchParams) SetBinary(binary *bool) {
+	o.Binary = binary
+}
+
+// WithDiffType adds the diffType to the repo download pull diff or patch params
+func (o *RepoDownloadPullDiffOrPatchParams) WithDiffType(diffType string) *RepoDownloadPullDiffOrPatchParams {
+	o.SetDiffType(diffType)
+	return o
+}
+
+// SetDiffType adds the diffType to the repo download pull diff or patch params
+func (o *RepoDownloadPullDiffOrPatchParams) SetDiffType(diffType string) {
+	o.DiffType = diffType
+}
+
+// WithIndex adds the index to the repo download pull diff or patch params
+func (o *RepoDownloadPullDiffOrPatchParams) WithIndex(index int64) *RepoDownloadPullDiffOrPatchParams {
+	o.SetIndex(index)
+	return o
+}
+
+// SetIndex adds the index to the repo download pull diff or patch params
+func (o *RepoDownloadPullDiffOrPatchParams) SetIndex(index int64) {
+	o.Index = index
+}
+
+// WithOwner adds the owner to the repo download pull diff or patch params
+func (o *RepoDownloadPullDiffOrPatchParams) WithOwner(owner string) *RepoDownloadPullDiffOrPatchParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo download pull diff or patch params
+func (o *RepoDownloadPullDiffOrPatchParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo download pull diff or patch params
+func (o *RepoDownloadPullDiffOrPatchParams) WithRepo(repo string) *RepoDownloadPullDiffOrPatchParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo download pull diff or patch params
+func (o *RepoDownloadPullDiffOrPatchParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoDownloadPullDiffOrPatchParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.Binary != nil {
+
+		// query param binary
+		var qrBinary bool
+
+		if o.Binary != nil {
+			qrBinary = *o.Binary
+		}
+		qBinary := swag.FormatBool(qrBinary)
+		if qBinary != "" {
+
+			if err := r.SetQueryParam("binary", qBinary); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param diffType
+	if err := r.SetPathParam("diffType", o.DiffType); err != nil {
+		return err
+	}
+
+	// path param index
+	if err := r.SetPathParam("index", swag.FormatInt64(o.Index)); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_download_pull_diff_or_patch_responses.go b/bots-common/gitea-generated/client/repository/repo_download_pull_diff_or_patch_responses.go
new file mode 100644
index 0000000..ca432a3
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_download_pull_diff_or_patch_responses.go
@@ -0,0 +1,164 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// RepoDownloadPullDiffOrPatchReader is a Reader for the RepoDownloadPullDiffOrPatch structure.
+type RepoDownloadPullDiffOrPatchReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoDownloadPullDiffOrPatchReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoDownloadPullDiffOrPatchOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoDownloadPullDiffOrPatchNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/pulls/{index}.{diffType}] repoDownloadPullDiffOrPatch", response, response.Code())
+	}
+}
+
+// NewRepoDownloadPullDiffOrPatchOK creates a RepoDownloadPullDiffOrPatchOK with default headers values
+func NewRepoDownloadPullDiffOrPatchOK() *RepoDownloadPullDiffOrPatchOK {
+	return &RepoDownloadPullDiffOrPatchOK{}
+}
+
+/*
+RepoDownloadPullDiffOrPatchOK describes a response with status code 200, with default header values.
+
+APIString is a string response
+*/
+type RepoDownloadPullDiffOrPatchOK struct {
+	Payload string
+}
+
+// IsSuccess returns true when this repo download pull diff or patch o k response has a 2xx status code
+func (o *RepoDownloadPullDiffOrPatchOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo download pull diff or patch o k response has a 3xx status code
+func (o *RepoDownloadPullDiffOrPatchOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo download pull diff or patch o k response has a 4xx status code
+func (o *RepoDownloadPullDiffOrPatchOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo download pull diff or patch o k response has a 5xx status code
+func (o *RepoDownloadPullDiffOrPatchOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo download pull diff or patch o k response a status code equal to that given
+func (o *RepoDownloadPullDiffOrPatchOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo download pull diff or patch o k response
+func (o *RepoDownloadPullDiffOrPatchOK) Code() int {
+	return 200
+}
+
+func (o *RepoDownloadPullDiffOrPatchOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/pulls/{index}.{diffType}][%d] repoDownloadPullDiffOrPatchOK %s", 200, payload)
+}
+
+func (o *RepoDownloadPullDiffOrPatchOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/pulls/{index}.{diffType}][%d] repoDownloadPullDiffOrPatchOK %s", 200, payload)
+}
+
+func (o *RepoDownloadPullDiffOrPatchOK) GetPayload() string {
+	return o.Payload
+}
+
+func (o *RepoDownloadPullDiffOrPatchOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoDownloadPullDiffOrPatchNotFound creates a RepoDownloadPullDiffOrPatchNotFound with default headers values
+func NewRepoDownloadPullDiffOrPatchNotFound() *RepoDownloadPullDiffOrPatchNotFound {
+	return &RepoDownloadPullDiffOrPatchNotFound{}
+}
+
+/*
+RepoDownloadPullDiffOrPatchNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoDownloadPullDiffOrPatchNotFound struct {
+}
+
+// IsSuccess returns true when this repo download pull diff or patch not found response has a 2xx status code
+func (o *RepoDownloadPullDiffOrPatchNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo download pull diff or patch not found response has a 3xx status code
+func (o *RepoDownloadPullDiffOrPatchNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo download pull diff or patch not found response has a 4xx status code
+func (o *RepoDownloadPullDiffOrPatchNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo download pull diff or patch not found response has a 5xx status code
+func (o *RepoDownloadPullDiffOrPatchNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo download pull diff or patch not found response a status code equal to that given
+func (o *RepoDownloadPullDiffOrPatchNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo download pull diff or patch not found response
+func (o *RepoDownloadPullDiffOrPatchNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoDownloadPullDiffOrPatchNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/pulls/{index}.{diffType}][%d] repoDownloadPullDiffOrPatchNotFound", 404)
+}
+
+func (o *RepoDownloadPullDiffOrPatchNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/pulls/{index}.{diffType}][%d] repoDownloadPullDiffOrPatchNotFound", 404)
+}
+
+func (o *RepoDownloadPullDiffOrPatchNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_edit_branch_protection_parameters.go b/bots-common/gitea-generated/client/repository/repo_edit_branch_protection_parameters.go
new file mode 100644
index 0000000..928bb73
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_edit_branch_protection_parameters.go
@@ -0,0 +1,216 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewRepoEditBranchProtectionParams creates a new RepoEditBranchProtectionParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoEditBranchProtectionParams() *RepoEditBranchProtectionParams {
+	return &RepoEditBranchProtectionParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoEditBranchProtectionParamsWithTimeout creates a new RepoEditBranchProtectionParams object
+// with the ability to set a timeout on a request.
+func NewRepoEditBranchProtectionParamsWithTimeout(timeout time.Duration) *RepoEditBranchProtectionParams {
+	return &RepoEditBranchProtectionParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoEditBranchProtectionParamsWithContext creates a new RepoEditBranchProtectionParams object
+// with the ability to set a context for a request.
+func NewRepoEditBranchProtectionParamsWithContext(ctx context.Context) *RepoEditBranchProtectionParams {
+	return &RepoEditBranchProtectionParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoEditBranchProtectionParamsWithHTTPClient creates a new RepoEditBranchProtectionParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoEditBranchProtectionParamsWithHTTPClient(client *http.Client) *RepoEditBranchProtectionParams {
+	return &RepoEditBranchProtectionParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoEditBranchProtectionParams contains all the parameters to send to the API endpoint
+
+	for the repo edit branch protection operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoEditBranchProtectionParams struct {
+
+	// Body.
+	Body *models.EditBranchProtectionOption
+
+	/* Name.
+
+	   name of protected branch
+	*/
+	Name string
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo edit branch protection params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoEditBranchProtectionParams) WithDefaults() *RepoEditBranchProtectionParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo edit branch protection params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoEditBranchProtectionParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo edit branch protection params
+func (o *RepoEditBranchProtectionParams) WithTimeout(timeout time.Duration) *RepoEditBranchProtectionParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo edit branch protection params
+func (o *RepoEditBranchProtectionParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo edit branch protection params
+func (o *RepoEditBranchProtectionParams) WithContext(ctx context.Context) *RepoEditBranchProtectionParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo edit branch protection params
+func (o *RepoEditBranchProtectionParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo edit branch protection params
+func (o *RepoEditBranchProtectionParams) WithHTTPClient(client *http.Client) *RepoEditBranchProtectionParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo edit branch protection params
+func (o *RepoEditBranchProtectionParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the repo edit branch protection params
+func (o *RepoEditBranchProtectionParams) WithBody(body *models.EditBranchProtectionOption) *RepoEditBranchProtectionParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the repo edit branch protection params
+func (o *RepoEditBranchProtectionParams) SetBody(body *models.EditBranchProtectionOption) {
+	o.Body = body
+}
+
+// WithName adds the name to the repo edit branch protection params
+func (o *RepoEditBranchProtectionParams) WithName(name string) *RepoEditBranchProtectionParams {
+	o.SetName(name)
+	return o
+}
+
+// SetName adds the name to the repo edit branch protection params
+func (o *RepoEditBranchProtectionParams) SetName(name string) {
+	o.Name = name
+}
+
+// WithOwner adds the owner to the repo edit branch protection params
+func (o *RepoEditBranchProtectionParams) WithOwner(owner string) *RepoEditBranchProtectionParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo edit branch protection params
+func (o *RepoEditBranchProtectionParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo edit branch protection params
+func (o *RepoEditBranchProtectionParams) WithRepo(repo string) *RepoEditBranchProtectionParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo edit branch protection params
+func (o *RepoEditBranchProtectionParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoEditBranchProtectionParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	// path param name
+	if err := r.SetPathParam("name", o.Name); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_edit_branch_protection_responses.go b/bots-common/gitea-generated/client/repository/repo_edit_branch_protection_responses.go
new file mode 100644
index 0000000..71945a4
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_edit_branch_protection_responses.go
@@ -0,0 +1,324 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoEditBranchProtectionReader is a Reader for the RepoEditBranchProtection structure.
+type RepoEditBranchProtectionReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoEditBranchProtectionReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoEditBranchProtectionOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoEditBranchProtectionNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 422:
+		result := NewRepoEditBranchProtectionUnprocessableEntity()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 423:
+		result := NewRepoEditBranchProtectionLocked()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[PATCH /repos/{owner}/{repo}/branch_protections/{name}] repoEditBranchProtection", response, response.Code())
+	}
+}
+
+// NewRepoEditBranchProtectionOK creates a RepoEditBranchProtectionOK with default headers values
+func NewRepoEditBranchProtectionOK() *RepoEditBranchProtectionOK {
+	return &RepoEditBranchProtectionOK{}
+}
+
+/*
+RepoEditBranchProtectionOK describes a response with status code 200, with default header values.
+
+BranchProtection
+*/
+type RepoEditBranchProtectionOK struct {
+	Payload *models.BranchProtection
+}
+
+// IsSuccess returns true when this repo edit branch protection o k response has a 2xx status code
+func (o *RepoEditBranchProtectionOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo edit branch protection o k response has a 3xx status code
+func (o *RepoEditBranchProtectionOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo edit branch protection o k response has a 4xx status code
+func (o *RepoEditBranchProtectionOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo edit branch protection o k response has a 5xx status code
+func (o *RepoEditBranchProtectionOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo edit branch protection o k response a status code equal to that given
+func (o *RepoEditBranchProtectionOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo edit branch protection o k response
+func (o *RepoEditBranchProtectionOK) Code() int {
+	return 200
+}
+
+func (o *RepoEditBranchProtectionOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/branch_protections/{name}][%d] repoEditBranchProtectionOK %s", 200, payload)
+}
+
+func (o *RepoEditBranchProtectionOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/branch_protections/{name}][%d] repoEditBranchProtectionOK %s", 200, payload)
+}
+
+func (o *RepoEditBranchProtectionOK) GetPayload() *models.BranchProtection {
+	return o.Payload
+}
+
+func (o *RepoEditBranchProtectionOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.BranchProtection)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoEditBranchProtectionNotFound creates a RepoEditBranchProtectionNotFound with default headers values
+func NewRepoEditBranchProtectionNotFound() *RepoEditBranchProtectionNotFound {
+	return &RepoEditBranchProtectionNotFound{}
+}
+
+/*
+RepoEditBranchProtectionNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoEditBranchProtectionNotFound struct {
+}
+
+// IsSuccess returns true when this repo edit branch protection not found response has a 2xx status code
+func (o *RepoEditBranchProtectionNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo edit branch protection not found response has a 3xx status code
+func (o *RepoEditBranchProtectionNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo edit branch protection not found response has a 4xx status code
+func (o *RepoEditBranchProtectionNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo edit branch protection not found response has a 5xx status code
+func (o *RepoEditBranchProtectionNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo edit branch protection not found response a status code equal to that given
+func (o *RepoEditBranchProtectionNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo edit branch protection not found response
+func (o *RepoEditBranchProtectionNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoEditBranchProtectionNotFound) Error() string {
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/branch_protections/{name}][%d] repoEditBranchProtectionNotFound", 404)
+}
+
+func (o *RepoEditBranchProtectionNotFound) String() string {
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/branch_protections/{name}][%d] repoEditBranchProtectionNotFound", 404)
+}
+
+func (o *RepoEditBranchProtectionNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewRepoEditBranchProtectionUnprocessableEntity creates a RepoEditBranchProtectionUnprocessableEntity with default headers values
+func NewRepoEditBranchProtectionUnprocessableEntity() *RepoEditBranchProtectionUnprocessableEntity {
+	return &RepoEditBranchProtectionUnprocessableEntity{}
+}
+
+/*
+RepoEditBranchProtectionUnprocessableEntity describes a response with status code 422, with default header values.
+
+APIValidationError is error format response related to input validation
+*/
+type RepoEditBranchProtectionUnprocessableEntity struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo edit branch protection unprocessable entity response has a 2xx status code
+func (o *RepoEditBranchProtectionUnprocessableEntity) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo edit branch protection unprocessable entity response has a 3xx status code
+func (o *RepoEditBranchProtectionUnprocessableEntity) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo edit branch protection unprocessable entity response has a 4xx status code
+func (o *RepoEditBranchProtectionUnprocessableEntity) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo edit branch protection unprocessable entity response has a 5xx status code
+func (o *RepoEditBranchProtectionUnprocessableEntity) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo edit branch protection unprocessable entity response a status code equal to that given
+func (o *RepoEditBranchProtectionUnprocessableEntity) IsCode(code int) bool {
+	return code == 422
+}
+
+// Code gets the status code for the repo edit branch protection unprocessable entity response
+func (o *RepoEditBranchProtectionUnprocessableEntity) Code() int {
+	return 422
+}
+
+func (o *RepoEditBranchProtectionUnprocessableEntity) Error() string {
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/branch_protections/{name}][%d] repoEditBranchProtectionUnprocessableEntity", 422)
+}
+
+func (o *RepoEditBranchProtectionUnprocessableEntity) String() string {
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/branch_protections/{name}][%d] repoEditBranchProtectionUnprocessableEntity", 422)
+}
+
+func (o *RepoEditBranchProtectionUnprocessableEntity) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewRepoEditBranchProtectionLocked creates a RepoEditBranchProtectionLocked with default headers values
+func NewRepoEditBranchProtectionLocked() *RepoEditBranchProtectionLocked {
+	return &RepoEditBranchProtectionLocked{}
+}
+
+/*
+RepoEditBranchProtectionLocked describes a response with status code 423, with default header values.
+
+APIRepoArchivedError is an error that is raised when an archived repo should be modified
+*/
+type RepoEditBranchProtectionLocked struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo edit branch protection locked response has a 2xx status code
+func (o *RepoEditBranchProtectionLocked) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo edit branch protection locked response has a 3xx status code
+func (o *RepoEditBranchProtectionLocked) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo edit branch protection locked response has a 4xx status code
+func (o *RepoEditBranchProtectionLocked) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo edit branch protection locked response has a 5xx status code
+func (o *RepoEditBranchProtectionLocked) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo edit branch protection locked response a status code equal to that given
+func (o *RepoEditBranchProtectionLocked) IsCode(code int) bool {
+	return code == 423
+}
+
+// Code gets the status code for the repo edit branch protection locked response
+func (o *RepoEditBranchProtectionLocked) Code() int {
+	return 423
+}
+
+func (o *RepoEditBranchProtectionLocked) Error() string {
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/branch_protections/{name}][%d] repoEditBranchProtectionLocked", 423)
+}
+
+func (o *RepoEditBranchProtectionLocked) String() string {
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/branch_protections/{name}][%d] repoEditBranchProtectionLocked", 423)
+}
+
+func (o *RepoEditBranchProtectionLocked) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_edit_git_hook_parameters.go b/bots-common/gitea-generated/client/repository/repo_edit_git_hook_parameters.go
new file mode 100644
index 0000000..a2b22f0
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_edit_git_hook_parameters.go
@@ -0,0 +1,216 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewRepoEditGitHookParams creates a new RepoEditGitHookParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoEditGitHookParams() *RepoEditGitHookParams {
+	return &RepoEditGitHookParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoEditGitHookParamsWithTimeout creates a new RepoEditGitHookParams object
+// with the ability to set a timeout on a request.
+func NewRepoEditGitHookParamsWithTimeout(timeout time.Duration) *RepoEditGitHookParams {
+	return &RepoEditGitHookParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoEditGitHookParamsWithContext creates a new RepoEditGitHookParams object
+// with the ability to set a context for a request.
+func NewRepoEditGitHookParamsWithContext(ctx context.Context) *RepoEditGitHookParams {
+	return &RepoEditGitHookParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoEditGitHookParamsWithHTTPClient creates a new RepoEditGitHookParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoEditGitHookParamsWithHTTPClient(client *http.Client) *RepoEditGitHookParams {
+	return &RepoEditGitHookParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoEditGitHookParams contains all the parameters to send to the API endpoint
+
+	for the repo edit git hook operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoEditGitHookParams struct {
+
+	// Body.
+	Body *models.EditGitHookOption
+
+	/* ID.
+
+	   id of the hook to get
+	*/
+	ID string
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo edit git hook params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoEditGitHookParams) WithDefaults() *RepoEditGitHookParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo edit git hook params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoEditGitHookParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo edit git hook params
+func (o *RepoEditGitHookParams) WithTimeout(timeout time.Duration) *RepoEditGitHookParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo edit git hook params
+func (o *RepoEditGitHookParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo edit git hook params
+func (o *RepoEditGitHookParams) WithContext(ctx context.Context) *RepoEditGitHookParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo edit git hook params
+func (o *RepoEditGitHookParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo edit git hook params
+func (o *RepoEditGitHookParams) WithHTTPClient(client *http.Client) *RepoEditGitHookParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo edit git hook params
+func (o *RepoEditGitHookParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the repo edit git hook params
+func (o *RepoEditGitHookParams) WithBody(body *models.EditGitHookOption) *RepoEditGitHookParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the repo edit git hook params
+func (o *RepoEditGitHookParams) SetBody(body *models.EditGitHookOption) {
+	o.Body = body
+}
+
+// WithID adds the id to the repo edit git hook params
+func (o *RepoEditGitHookParams) WithID(id string) *RepoEditGitHookParams {
+	o.SetID(id)
+	return o
+}
+
+// SetID adds the id to the repo edit git hook params
+func (o *RepoEditGitHookParams) SetID(id string) {
+	o.ID = id
+}
+
+// WithOwner adds the owner to the repo edit git hook params
+func (o *RepoEditGitHookParams) WithOwner(owner string) *RepoEditGitHookParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo edit git hook params
+func (o *RepoEditGitHookParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo edit git hook params
+func (o *RepoEditGitHookParams) WithRepo(repo string) *RepoEditGitHookParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo edit git hook params
+func (o *RepoEditGitHookParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoEditGitHookParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	// path param id
+	if err := r.SetPathParam("id", o.ID); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_edit_git_hook_responses.go b/bots-common/gitea-generated/client/repository/repo_edit_git_hook_responses.go
new file mode 100644
index 0000000..8671594
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_edit_git_hook_responses.go
@@ -0,0 +1,168 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoEditGitHookReader is a Reader for the RepoEditGitHook structure.
+type RepoEditGitHookReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoEditGitHookReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoEditGitHookOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoEditGitHookNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[PATCH /repos/{owner}/{repo}/hooks/git/{id}] repoEditGitHook", response, response.Code())
+	}
+}
+
+// NewRepoEditGitHookOK creates a RepoEditGitHookOK with default headers values
+func NewRepoEditGitHookOK() *RepoEditGitHookOK {
+	return &RepoEditGitHookOK{}
+}
+
+/*
+RepoEditGitHookOK describes a response with status code 200, with default header values.
+
+GitHook
+*/
+type RepoEditGitHookOK struct {
+	Payload *models.GitHook
+}
+
+// IsSuccess returns true when this repo edit git hook o k response has a 2xx status code
+func (o *RepoEditGitHookOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo edit git hook o k response has a 3xx status code
+func (o *RepoEditGitHookOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo edit git hook o k response has a 4xx status code
+func (o *RepoEditGitHookOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo edit git hook o k response has a 5xx status code
+func (o *RepoEditGitHookOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo edit git hook o k response a status code equal to that given
+func (o *RepoEditGitHookOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo edit git hook o k response
+func (o *RepoEditGitHookOK) Code() int {
+	return 200
+}
+
+func (o *RepoEditGitHookOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/hooks/git/{id}][%d] repoEditGitHookOK %s", 200, payload)
+}
+
+func (o *RepoEditGitHookOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/hooks/git/{id}][%d] repoEditGitHookOK %s", 200, payload)
+}
+
+func (o *RepoEditGitHookOK) GetPayload() *models.GitHook {
+	return o.Payload
+}
+
+func (o *RepoEditGitHookOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.GitHook)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoEditGitHookNotFound creates a RepoEditGitHookNotFound with default headers values
+func NewRepoEditGitHookNotFound() *RepoEditGitHookNotFound {
+	return &RepoEditGitHookNotFound{}
+}
+
+/*
+RepoEditGitHookNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoEditGitHookNotFound struct {
+}
+
+// IsSuccess returns true when this repo edit git hook not found response has a 2xx status code
+func (o *RepoEditGitHookNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo edit git hook not found response has a 3xx status code
+func (o *RepoEditGitHookNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo edit git hook not found response has a 4xx status code
+func (o *RepoEditGitHookNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo edit git hook not found response has a 5xx status code
+func (o *RepoEditGitHookNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo edit git hook not found response a status code equal to that given
+func (o *RepoEditGitHookNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo edit git hook not found response
+func (o *RepoEditGitHookNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoEditGitHookNotFound) Error() string {
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/hooks/git/{id}][%d] repoEditGitHookNotFound", 404)
+}
+
+func (o *RepoEditGitHookNotFound) String() string {
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/hooks/git/{id}][%d] repoEditGitHookNotFound", 404)
+}
+
+func (o *RepoEditGitHookNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_edit_hook_parameters.go b/bots-common/gitea-generated/client/repository/repo_edit_hook_parameters.go
new file mode 100644
index 0000000..ac5c1ff
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_edit_hook_parameters.go
@@ -0,0 +1,219 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewRepoEditHookParams creates a new RepoEditHookParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoEditHookParams() *RepoEditHookParams {
+	return &RepoEditHookParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoEditHookParamsWithTimeout creates a new RepoEditHookParams object
+// with the ability to set a timeout on a request.
+func NewRepoEditHookParamsWithTimeout(timeout time.Duration) *RepoEditHookParams {
+	return &RepoEditHookParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoEditHookParamsWithContext creates a new RepoEditHookParams object
+// with the ability to set a context for a request.
+func NewRepoEditHookParamsWithContext(ctx context.Context) *RepoEditHookParams {
+	return &RepoEditHookParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoEditHookParamsWithHTTPClient creates a new RepoEditHookParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoEditHookParamsWithHTTPClient(client *http.Client) *RepoEditHookParams {
+	return &RepoEditHookParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoEditHookParams contains all the parameters to send to the API endpoint
+
+	for the repo edit hook operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoEditHookParams struct {
+
+	// Body.
+	Body *models.EditHookOption
+
+	/* ID.
+
+	   index of the hook
+
+	   Format: int64
+	*/
+	ID int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo edit hook params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoEditHookParams) WithDefaults() *RepoEditHookParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo edit hook params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoEditHookParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo edit hook params
+func (o *RepoEditHookParams) WithTimeout(timeout time.Duration) *RepoEditHookParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo edit hook params
+func (o *RepoEditHookParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo edit hook params
+func (o *RepoEditHookParams) WithContext(ctx context.Context) *RepoEditHookParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo edit hook params
+func (o *RepoEditHookParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo edit hook params
+func (o *RepoEditHookParams) WithHTTPClient(client *http.Client) *RepoEditHookParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo edit hook params
+func (o *RepoEditHookParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the repo edit hook params
+func (o *RepoEditHookParams) WithBody(body *models.EditHookOption) *RepoEditHookParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the repo edit hook params
+func (o *RepoEditHookParams) SetBody(body *models.EditHookOption) {
+	o.Body = body
+}
+
+// WithID adds the id to the repo edit hook params
+func (o *RepoEditHookParams) WithID(id int64) *RepoEditHookParams {
+	o.SetID(id)
+	return o
+}
+
+// SetID adds the id to the repo edit hook params
+func (o *RepoEditHookParams) SetID(id int64) {
+	o.ID = id
+}
+
+// WithOwner adds the owner to the repo edit hook params
+func (o *RepoEditHookParams) WithOwner(owner string) *RepoEditHookParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo edit hook params
+func (o *RepoEditHookParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo edit hook params
+func (o *RepoEditHookParams) WithRepo(repo string) *RepoEditHookParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo edit hook params
+func (o *RepoEditHookParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoEditHookParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	// path param id
+	if err := r.SetPathParam("id", swag.FormatInt64(o.ID)); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_edit_hook_responses.go b/bots-common/gitea-generated/client/repository/repo_edit_hook_responses.go
new file mode 100644
index 0000000..ac91868
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_edit_hook_responses.go
@@ -0,0 +1,168 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoEditHookReader is a Reader for the RepoEditHook structure.
+type RepoEditHookReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoEditHookReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoEditHookOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoEditHookNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[PATCH /repos/{owner}/{repo}/hooks/{id}] repoEditHook", response, response.Code())
+	}
+}
+
+// NewRepoEditHookOK creates a RepoEditHookOK with default headers values
+func NewRepoEditHookOK() *RepoEditHookOK {
+	return &RepoEditHookOK{}
+}
+
+/*
+RepoEditHookOK describes a response with status code 200, with default header values.
+
+Hook
+*/
+type RepoEditHookOK struct {
+	Payload *models.Hook
+}
+
+// IsSuccess returns true when this repo edit hook o k response has a 2xx status code
+func (o *RepoEditHookOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo edit hook o k response has a 3xx status code
+func (o *RepoEditHookOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo edit hook o k response has a 4xx status code
+func (o *RepoEditHookOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo edit hook o k response has a 5xx status code
+func (o *RepoEditHookOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo edit hook o k response a status code equal to that given
+func (o *RepoEditHookOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo edit hook o k response
+func (o *RepoEditHookOK) Code() int {
+	return 200
+}
+
+func (o *RepoEditHookOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/hooks/{id}][%d] repoEditHookOK %s", 200, payload)
+}
+
+func (o *RepoEditHookOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/hooks/{id}][%d] repoEditHookOK %s", 200, payload)
+}
+
+func (o *RepoEditHookOK) GetPayload() *models.Hook {
+	return o.Payload
+}
+
+func (o *RepoEditHookOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.Hook)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoEditHookNotFound creates a RepoEditHookNotFound with default headers values
+func NewRepoEditHookNotFound() *RepoEditHookNotFound {
+	return &RepoEditHookNotFound{}
+}
+
+/*
+RepoEditHookNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoEditHookNotFound struct {
+}
+
+// IsSuccess returns true when this repo edit hook not found response has a 2xx status code
+func (o *RepoEditHookNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo edit hook not found response has a 3xx status code
+func (o *RepoEditHookNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo edit hook not found response has a 4xx status code
+func (o *RepoEditHookNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo edit hook not found response has a 5xx status code
+func (o *RepoEditHookNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo edit hook not found response a status code equal to that given
+func (o *RepoEditHookNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo edit hook not found response
+func (o *RepoEditHookNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoEditHookNotFound) Error() string {
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/hooks/{id}][%d] repoEditHookNotFound", 404)
+}
+
+func (o *RepoEditHookNotFound) String() string {
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/hooks/{id}][%d] repoEditHookNotFound", 404)
+}
+
+func (o *RepoEditHookNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_edit_parameters.go b/bots-common/gitea-generated/client/repository/repo_edit_parameters.go
new file mode 100644
index 0000000..c06e2b9
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_edit_parameters.go
@@ -0,0 +1,197 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewRepoEditParams creates a new RepoEditParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoEditParams() *RepoEditParams {
+	return &RepoEditParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoEditParamsWithTimeout creates a new RepoEditParams object
+// with the ability to set a timeout on a request.
+func NewRepoEditParamsWithTimeout(timeout time.Duration) *RepoEditParams {
+	return &RepoEditParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoEditParamsWithContext creates a new RepoEditParams object
+// with the ability to set a context for a request.
+func NewRepoEditParamsWithContext(ctx context.Context) *RepoEditParams {
+	return &RepoEditParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoEditParamsWithHTTPClient creates a new RepoEditParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoEditParamsWithHTTPClient(client *http.Client) *RepoEditParams {
+	return &RepoEditParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoEditParams contains all the parameters to send to the API endpoint
+
+	for the repo edit operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoEditParams struct {
+
+	/* Body.
+
+	   Properties of a repo that you can edit
+	*/
+	Body *models.EditRepoOption
+
+	/* Owner.
+
+	   owner of the repo to edit
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo to edit
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo edit params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoEditParams) WithDefaults() *RepoEditParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo edit params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoEditParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo edit params
+func (o *RepoEditParams) WithTimeout(timeout time.Duration) *RepoEditParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo edit params
+func (o *RepoEditParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo edit params
+func (o *RepoEditParams) WithContext(ctx context.Context) *RepoEditParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo edit params
+func (o *RepoEditParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo edit params
+func (o *RepoEditParams) WithHTTPClient(client *http.Client) *RepoEditParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo edit params
+func (o *RepoEditParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the repo edit params
+func (o *RepoEditParams) WithBody(body *models.EditRepoOption) *RepoEditParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the repo edit params
+func (o *RepoEditParams) SetBody(body *models.EditRepoOption) {
+	o.Body = body
+}
+
+// WithOwner adds the owner to the repo edit params
+func (o *RepoEditParams) WithOwner(owner string) *RepoEditParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo edit params
+func (o *RepoEditParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo edit params
+func (o *RepoEditParams) WithRepo(repo string) *RepoEditParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo edit params
+func (o *RepoEditParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoEditParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_edit_pull_request_parameters.go b/bots-common/gitea-generated/client/repository/repo_edit_pull_request_parameters.go
new file mode 100644
index 0000000..b86d3a6
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_edit_pull_request_parameters.go
@@ -0,0 +1,219 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewRepoEditPullRequestParams creates a new RepoEditPullRequestParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoEditPullRequestParams() *RepoEditPullRequestParams {
+	return &RepoEditPullRequestParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoEditPullRequestParamsWithTimeout creates a new RepoEditPullRequestParams object
+// with the ability to set a timeout on a request.
+func NewRepoEditPullRequestParamsWithTimeout(timeout time.Duration) *RepoEditPullRequestParams {
+	return &RepoEditPullRequestParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoEditPullRequestParamsWithContext creates a new RepoEditPullRequestParams object
+// with the ability to set a context for a request.
+func NewRepoEditPullRequestParamsWithContext(ctx context.Context) *RepoEditPullRequestParams {
+	return &RepoEditPullRequestParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoEditPullRequestParamsWithHTTPClient creates a new RepoEditPullRequestParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoEditPullRequestParamsWithHTTPClient(client *http.Client) *RepoEditPullRequestParams {
+	return &RepoEditPullRequestParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoEditPullRequestParams contains all the parameters to send to the API endpoint
+
+	for the repo edit pull request operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoEditPullRequestParams struct {
+
+	// Body.
+	Body *models.EditPullRequestOption
+
+	/* Index.
+
+	   index of the pull request to edit
+
+	   Format: int64
+	*/
+	Index int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo edit pull request params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoEditPullRequestParams) WithDefaults() *RepoEditPullRequestParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo edit pull request params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoEditPullRequestParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo edit pull request params
+func (o *RepoEditPullRequestParams) WithTimeout(timeout time.Duration) *RepoEditPullRequestParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo edit pull request params
+func (o *RepoEditPullRequestParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo edit pull request params
+func (o *RepoEditPullRequestParams) WithContext(ctx context.Context) *RepoEditPullRequestParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo edit pull request params
+func (o *RepoEditPullRequestParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo edit pull request params
+func (o *RepoEditPullRequestParams) WithHTTPClient(client *http.Client) *RepoEditPullRequestParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo edit pull request params
+func (o *RepoEditPullRequestParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the repo edit pull request params
+func (o *RepoEditPullRequestParams) WithBody(body *models.EditPullRequestOption) *RepoEditPullRequestParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the repo edit pull request params
+func (o *RepoEditPullRequestParams) SetBody(body *models.EditPullRequestOption) {
+	o.Body = body
+}
+
+// WithIndex adds the index to the repo edit pull request params
+func (o *RepoEditPullRequestParams) WithIndex(index int64) *RepoEditPullRequestParams {
+	o.SetIndex(index)
+	return o
+}
+
+// SetIndex adds the index to the repo edit pull request params
+func (o *RepoEditPullRequestParams) SetIndex(index int64) {
+	o.Index = index
+}
+
+// WithOwner adds the owner to the repo edit pull request params
+func (o *RepoEditPullRequestParams) WithOwner(owner string) *RepoEditPullRequestParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo edit pull request params
+func (o *RepoEditPullRequestParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo edit pull request params
+func (o *RepoEditPullRequestParams) WithRepo(repo string) *RepoEditPullRequestParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo edit pull request params
+func (o *RepoEditPullRequestParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoEditPullRequestParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	// path param index
+	if err := r.SetPathParam("index", swag.FormatInt64(o.Index)); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_edit_pull_request_responses.go b/bots-common/gitea-generated/client/repository/repo_edit_pull_request_responses.go
new file mode 100644
index 0000000..ba66b7b
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_edit_pull_request_responses.go
@@ -0,0 +1,480 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoEditPullRequestReader is a Reader for the RepoEditPullRequest structure.
+type RepoEditPullRequestReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoEditPullRequestReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 201:
+		result := NewRepoEditPullRequestCreated()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 403:
+		result := NewRepoEditPullRequestForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewRepoEditPullRequestNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 409:
+		result := NewRepoEditPullRequestConflict()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 412:
+		result := NewRepoEditPullRequestPreconditionFailed()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 422:
+		result := NewRepoEditPullRequestUnprocessableEntity()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[PATCH /repos/{owner}/{repo}/pulls/{index}] repoEditPullRequest", response, response.Code())
+	}
+}
+
+// NewRepoEditPullRequestCreated creates a RepoEditPullRequestCreated with default headers values
+func NewRepoEditPullRequestCreated() *RepoEditPullRequestCreated {
+	return &RepoEditPullRequestCreated{}
+}
+
+/*
+RepoEditPullRequestCreated describes a response with status code 201, with default header values.
+
+PullRequest
+*/
+type RepoEditPullRequestCreated struct {
+	Payload *models.PullRequest
+}
+
+// IsSuccess returns true when this repo edit pull request created response has a 2xx status code
+func (o *RepoEditPullRequestCreated) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo edit pull request created response has a 3xx status code
+func (o *RepoEditPullRequestCreated) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo edit pull request created response has a 4xx status code
+func (o *RepoEditPullRequestCreated) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo edit pull request created response has a 5xx status code
+func (o *RepoEditPullRequestCreated) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo edit pull request created response a status code equal to that given
+func (o *RepoEditPullRequestCreated) IsCode(code int) bool {
+	return code == 201
+}
+
+// Code gets the status code for the repo edit pull request created response
+func (o *RepoEditPullRequestCreated) Code() int {
+	return 201
+}
+
+func (o *RepoEditPullRequestCreated) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/pulls/{index}][%d] repoEditPullRequestCreated %s", 201, payload)
+}
+
+func (o *RepoEditPullRequestCreated) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/pulls/{index}][%d] repoEditPullRequestCreated %s", 201, payload)
+}
+
+func (o *RepoEditPullRequestCreated) GetPayload() *models.PullRequest {
+	return o.Payload
+}
+
+func (o *RepoEditPullRequestCreated) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.PullRequest)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoEditPullRequestForbidden creates a RepoEditPullRequestForbidden with default headers values
+func NewRepoEditPullRequestForbidden() *RepoEditPullRequestForbidden {
+	return &RepoEditPullRequestForbidden{}
+}
+
+/*
+RepoEditPullRequestForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type RepoEditPullRequestForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo edit pull request forbidden response has a 2xx status code
+func (o *RepoEditPullRequestForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo edit pull request forbidden response has a 3xx status code
+func (o *RepoEditPullRequestForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo edit pull request forbidden response has a 4xx status code
+func (o *RepoEditPullRequestForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo edit pull request forbidden response has a 5xx status code
+func (o *RepoEditPullRequestForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo edit pull request forbidden response a status code equal to that given
+func (o *RepoEditPullRequestForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the repo edit pull request forbidden response
+func (o *RepoEditPullRequestForbidden) Code() int {
+	return 403
+}
+
+func (o *RepoEditPullRequestForbidden) Error() string {
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/pulls/{index}][%d] repoEditPullRequestForbidden", 403)
+}
+
+func (o *RepoEditPullRequestForbidden) String() string {
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/pulls/{index}][%d] repoEditPullRequestForbidden", 403)
+}
+
+func (o *RepoEditPullRequestForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewRepoEditPullRequestNotFound creates a RepoEditPullRequestNotFound with default headers values
+func NewRepoEditPullRequestNotFound() *RepoEditPullRequestNotFound {
+	return &RepoEditPullRequestNotFound{}
+}
+
+/*
+RepoEditPullRequestNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoEditPullRequestNotFound struct {
+}
+
+// IsSuccess returns true when this repo edit pull request not found response has a 2xx status code
+func (o *RepoEditPullRequestNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo edit pull request not found response has a 3xx status code
+func (o *RepoEditPullRequestNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo edit pull request not found response has a 4xx status code
+func (o *RepoEditPullRequestNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo edit pull request not found response has a 5xx status code
+func (o *RepoEditPullRequestNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo edit pull request not found response a status code equal to that given
+func (o *RepoEditPullRequestNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo edit pull request not found response
+func (o *RepoEditPullRequestNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoEditPullRequestNotFound) Error() string {
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/pulls/{index}][%d] repoEditPullRequestNotFound", 404)
+}
+
+func (o *RepoEditPullRequestNotFound) String() string {
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/pulls/{index}][%d] repoEditPullRequestNotFound", 404)
+}
+
+func (o *RepoEditPullRequestNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewRepoEditPullRequestConflict creates a RepoEditPullRequestConflict with default headers values
+func NewRepoEditPullRequestConflict() *RepoEditPullRequestConflict {
+	return &RepoEditPullRequestConflict{}
+}
+
+/*
+RepoEditPullRequestConflict describes a response with status code 409, with default header values.
+
+APIError is error format response
+*/
+type RepoEditPullRequestConflict struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo edit pull request conflict response has a 2xx status code
+func (o *RepoEditPullRequestConflict) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo edit pull request conflict response has a 3xx status code
+func (o *RepoEditPullRequestConflict) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo edit pull request conflict response has a 4xx status code
+func (o *RepoEditPullRequestConflict) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo edit pull request conflict response has a 5xx status code
+func (o *RepoEditPullRequestConflict) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo edit pull request conflict response a status code equal to that given
+func (o *RepoEditPullRequestConflict) IsCode(code int) bool {
+	return code == 409
+}
+
+// Code gets the status code for the repo edit pull request conflict response
+func (o *RepoEditPullRequestConflict) Code() int {
+	return 409
+}
+
+func (o *RepoEditPullRequestConflict) Error() string {
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/pulls/{index}][%d] repoEditPullRequestConflict", 409)
+}
+
+func (o *RepoEditPullRequestConflict) String() string {
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/pulls/{index}][%d] repoEditPullRequestConflict", 409)
+}
+
+func (o *RepoEditPullRequestConflict) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewRepoEditPullRequestPreconditionFailed creates a RepoEditPullRequestPreconditionFailed with default headers values
+func NewRepoEditPullRequestPreconditionFailed() *RepoEditPullRequestPreconditionFailed {
+	return &RepoEditPullRequestPreconditionFailed{}
+}
+
+/*
+RepoEditPullRequestPreconditionFailed describes a response with status code 412, with default header values.
+
+APIError is error format response
+*/
+type RepoEditPullRequestPreconditionFailed struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo edit pull request precondition failed response has a 2xx status code
+func (o *RepoEditPullRequestPreconditionFailed) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo edit pull request precondition failed response has a 3xx status code
+func (o *RepoEditPullRequestPreconditionFailed) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo edit pull request precondition failed response has a 4xx status code
+func (o *RepoEditPullRequestPreconditionFailed) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo edit pull request precondition failed response has a 5xx status code
+func (o *RepoEditPullRequestPreconditionFailed) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo edit pull request precondition failed response a status code equal to that given
+func (o *RepoEditPullRequestPreconditionFailed) IsCode(code int) bool {
+	return code == 412
+}
+
+// Code gets the status code for the repo edit pull request precondition failed response
+func (o *RepoEditPullRequestPreconditionFailed) Code() int {
+	return 412
+}
+
+func (o *RepoEditPullRequestPreconditionFailed) Error() string {
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/pulls/{index}][%d] repoEditPullRequestPreconditionFailed", 412)
+}
+
+func (o *RepoEditPullRequestPreconditionFailed) String() string {
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/pulls/{index}][%d] repoEditPullRequestPreconditionFailed", 412)
+}
+
+func (o *RepoEditPullRequestPreconditionFailed) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewRepoEditPullRequestUnprocessableEntity creates a RepoEditPullRequestUnprocessableEntity with default headers values
+func NewRepoEditPullRequestUnprocessableEntity() *RepoEditPullRequestUnprocessableEntity {
+	return &RepoEditPullRequestUnprocessableEntity{}
+}
+
+/*
+RepoEditPullRequestUnprocessableEntity describes a response with status code 422, with default header values.
+
+APIValidationError is error format response related to input validation
+*/
+type RepoEditPullRequestUnprocessableEntity struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo edit pull request unprocessable entity response has a 2xx status code
+func (o *RepoEditPullRequestUnprocessableEntity) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo edit pull request unprocessable entity response has a 3xx status code
+func (o *RepoEditPullRequestUnprocessableEntity) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo edit pull request unprocessable entity response has a 4xx status code
+func (o *RepoEditPullRequestUnprocessableEntity) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo edit pull request unprocessable entity response has a 5xx status code
+func (o *RepoEditPullRequestUnprocessableEntity) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo edit pull request unprocessable entity response a status code equal to that given
+func (o *RepoEditPullRequestUnprocessableEntity) IsCode(code int) bool {
+	return code == 422
+}
+
+// Code gets the status code for the repo edit pull request unprocessable entity response
+func (o *RepoEditPullRequestUnprocessableEntity) Code() int {
+	return 422
+}
+
+func (o *RepoEditPullRequestUnprocessableEntity) Error() string {
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/pulls/{index}][%d] repoEditPullRequestUnprocessableEntity", 422)
+}
+
+func (o *RepoEditPullRequestUnprocessableEntity) String() string {
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/pulls/{index}][%d] repoEditPullRequestUnprocessableEntity", 422)
+}
+
+func (o *RepoEditPullRequestUnprocessableEntity) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_edit_release_attachment_parameters.go b/bots-common/gitea-generated/client/repository/repo_edit_release_attachment_parameters.go
new file mode 100644
index 0000000..d358fd6
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_edit_release_attachment_parameters.go
@@ -0,0 +1,243 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewRepoEditReleaseAttachmentParams creates a new RepoEditReleaseAttachmentParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoEditReleaseAttachmentParams() *RepoEditReleaseAttachmentParams {
+	return &RepoEditReleaseAttachmentParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoEditReleaseAttachmentParamsWithTimeout creates a new RepoEditReleaseAttachmentParams object
+// with the ability to set a timeout on a request.
+func NewRepoEditReleaseAttachmentParamsWithTimeout(timeout time.Duration) *RepoEditReleaseAttachmentParams {
+	return &RepoEditReleaseAttachmentParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoEditReleaseAttachmentParamsWithContext creates a new RepoEditReleaseAttachmentParams object
+// with the ability to set a context for a request.
+func NewRepoEditReleaseAttachmentParamsWithContext(ctx context.Context) *RepoEditReleaseAttachmentParams {
+	return &RepoEditReleaseAttachmentParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoEditReleaseAttachmentParamsWithHTTPClient creates a new RepoEditReleaseAttachmentParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoEditReleaseAttachmentParamsWithHTTPClient(client *http.Client) *RepoEditReleaseAttachmentParams {
+	return &RepoEditReleaseAttachmentParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoEditReleaseAttachmentParams contains all the parameters to send to the API endpoint
+
+	for the repo edit release attachment operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoEditReleaseAttachmentParams struct {
+
+	/* AttachmentID.
+
+	   id of the attachment to edit
+
+	   Format: int64
+	*/
+	AttachmentID int64
+
+	// Body.
+	Body *models.EditAttachmentOptions
+
+	/* ID.
+
+	   id of the release
+
+	   Format: int64
+	*/
+	ID int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo edit release attachment params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoEditReleaseAttachmentParams) WithDefaults() *RepoEditReleaseAttachmentParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo edit release attachment params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoEditReleaseAttachmentParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo edit release attachment params
+func (o *RepoEditReleaseAttachmentParams) WithTimeout(timeout time.Duration) *RepoEditReleaseAttachmentParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo edit release attachment params
+func (o *RepoEditReleaseAttachmentParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo edit release attachment params
+func (o *RepoEditReleaseAttachmentParams) WithContext(ctx context.Context) *RepoEditReleaseAttachmentParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo edit release attachment params
+func (o *RepoEditReleaseAttachmentParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo edit release attachment params
+func (o *RepoEditReleaseAttachmentParams) WithHTTPClient(client *http.Client) *RepoEditReleaseAttachmentParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo edit release attachment params
+func (o *RepoEditReleaseAttachmentParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithAttachmentID adds the attachmentID to the repo edit release attachment params
+func (o *RepoEditReleaseAttachmentParams) WithAttachmentID(attachmentID int64) *RepoEditReleaseAttachmentParams {
+	o.SetAttachmentID(attachmentID)
+	return o
+}
+
+// SetAttachmentID adds the attachmentId to the repo edit release attachment params
+func (o *RepoEditReleaseAttachmentParams) SetAttachmentID(attachmentID int64) {
+	o.AttachmentID = attachmentID
+}
+
+// WithBody adds the body to the repo edit release attachment params
+func (o *RepoEditReleaseAttachmentParams) WithBody(body *models.EditAttachmentOptions) *RepoEditReleaseAttachmentParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the repo edit release attachment params
+func (o *RepoEditReleaseAttachmentParams) SetBody(body *models.EditAttachmentOptions) {
+	o.Body = body
+}
+
+// WithID adds the id to the repo edit release attachment params
+func (o *RepoEditReleaseAttachmentParams) WithID(id int64) *RepoEditReleaseAttachmentParams {
+	o.SetID(id)
+	return o
+}
+
+// SetID adds the id to the repo edit release attachment params
+func (o *RepoEditReleaseAttachmentParams) SetID(id int64) {
+	o.ID = id
+}
+
+// WithOwner adds the owner to the repo edit release attachment params
+func (o *RepoEditReleaseAttachmentParams) WithOwner(owner string) *RepoEditReleaseAttachmentParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo edit release attachment params
+func (o *RepoEditReleaseAttachmentParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo edit release attachment params
+func (o *RepoEditReleaseAttachmentParams) WithRepo(repo string) *RepoEditReleaseAttachmentParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo edit release attachment params
+func (o *RepoEditReleaseAttachmentParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoEditReleaseAttachmentParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param attachment_id
+	if err := r.SetPathParam("attachment_id", swag.FormatInt64(o.AttachmentID)); err != nil {
+		return err
+	}
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	// path param id
+	if err := r.SetPathParam("id", swag.FormatInt64(o.ID)); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_edit_release_attachment_responses.go b/bots-common/gitea-generated/client/repository/repo_edit_release_attachment_responses.go
new file mode 100644
index 0000000..d533774
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_edit_release_attachment_responses.go
@@ -0,0 +1,168 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoEditReleaseAttachmentReader is a Reader for the RepoEditReleaseAttachment structure.
+type RepoEditReleaseAttachmentReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoEditReleaseAttachmentReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 201:
+		result := NewRepoEditReleaseAttachmentCreated()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoEditReleaseAttachmentNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[PATCH /repos/{owner}/{repo}/releases/{id}/assets/{attachment_id}] repoEditReleaseAttachment", response, response.Code())
+	}
+}
+
+// NewRepoEditReleaseAttachmentCreated creates a RepoEditReleaseAttachmentCreated with default headers values
+func NewRepoEditReleaseAttachmentCreated() *RepoEditReleaseAttachmentCreated {
+	return &RepoEditReleaseAttachmentCreated{}
+}
+
+/*
+RepoEditReleaseAttachmentCreated describes a response with status code 201, with default header values.
+
+Attachment
+*/
+type RepoEditReleaseAttachmentCreated struct {
+	Payload *models.Attachment
+}
+
+// IsSuccess returns true when this repo edit release attachment created response has a 2xx status code
+func (o *RepoEditReleaseAttachmentCreated) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo edit release attachment created response has a 3xx status code
+func (o *RepoEditReleaseAttachmentCreated) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo edit release attachment created response has a 4xx status code
+func (o *RepoEditReleaseAttachmentCreated) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo edit release attachment created response has a 5xx status code
+func (o *RepoEditReleaseAttachmentCreated) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo edit release attachment created response a status code equal to that given
+func (o *RepoEditReleaseAttachmentCreated) IsCode(code int) bool {
+	return code == 201
+}
+
+// Code gets the status code for the repo edit release attachment created response
+func (o *RepoEditReleaseAttachmentCreated) Code() int {
+	return 201
+}
+
+func (o *RepoEditReleaseAttachmentCreated) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/releases/{id}/assets/{attachment_id}][%d] repoEditReleaseAttachmentCreated %s", 201, payload)
+}
+
+func (o *RepoEditReleaseAttachmentCreated) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/releases/{id}/assets/{attachment_id}][%d] repoEditReleaseAttachmentCreated %s", 201, payload)
+}
+
+func (o *RepoEditReleaseAttachmentCreated) GetPayload() *models.Attachment {
+	return o.Payload
+}
+
+func (o *RepoEditReleaseAttachmentCreated) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.Attachment)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoEditReleaseAttachmentNotFound creates a RepoEditReleaseAttachmentNotFound with default headers values
+func NewRepoEditReleaseAttachmentNotFound() *RepoEditReleaseAttachmentNotFound {
+	return &RepoEditReleaseAttachmentNotFound{}
+}
+
+/*
+RepoEditReleaseAttachmentNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoEditReleaseAttachmentNotFound struct {
+}
+
+// IsSuccess returns true when this repo edit release attachment not found response has a 2xx status code
+func (o *RepoEditReleaseAttachmentNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo edit release attachment not found response has a 3xx status code
+func (o *RepoEditReleaseAttachmentNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo edit release attachment not found response has a 4xx status code
+func (o *RepoEditReleaseAttachmentNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo edit release attachment not found response has a 5xx status code
+func (o *RepoEditReleaseAttachmentNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo edit release attachment not found response a status code equal to that given
+func (o *RepoEditReleaseAttachmentNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo edit release attachment not found response
+func (o *RepoEditReleaseAttachmentNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoEditReleaseAttachmentNotFound) Error() string {
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/releases/{id}/assets/{attachment_id}][%d] repoEditReleaseAttachmentNotFound", 404)
+}
+
+func (o *RepoEditReleaseAttachmentNotFound) String() string {
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/releases/{id}/assets/{attachment_id}][%d] repoEditReleaseAttachmentNotFound", 404)
+}
+
+func (o *RepoEditReleaseAttachmentNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_edit_release_parameters.go b/bots-common/gitea-generated/client/repository/repo_edit_release_parameters.go
new file mode 100644
index 0000000..8f2fd73
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_edit_release_parameters.go
@@ -0,0 +1,219 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewRepoEditReleaseParams creates a new RepoEditReleaseParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoEditReleaseParams() *RepoEditReleaseParams {
+	return &RepoEditReleaseParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoEditReleaseParamsWithTimeout creates a new RepoEditReleaseParams object
+// with the ability to set a timeout on a request.
+func NewRepoEditReleaseParamsWithTimeout(timeout time.Duration) *RepoEditReleaseParams {
+	return &RepoEditReleaseParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoEditReleaseParamsWithContext creates a new RepoEditReleaseParams object
+// with the ability to set a context for a request.
+func NewRepoEditReleaseParamsWithContext(ctx context.Context) *RepoEditReleaseParams {
+	return &RepoEditReleaseParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoEditReleaseParamsWithHTTPClient creates a new RepoEditReleaseParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoEditReleaseParamsWithHTTPClient(client *http.Client) *RepoEditReleaseParams {
+	return &RepoEditReleaseParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoEditReleaseParams contains all the parameters to send to the API endpoint
+
+	for the repo edit release operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoEditReleaseParams struct {
+
+	// Body.
+	Body *models.EditReleaseOption
+
+	/* ID.
+
+	   id of the release to edit
+
+	   Format: int64
+	*/
+	ID int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo edit release params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoEditReleaseParams) WithDefaults() *RepoEditReleaseParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo edit release params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoEditReleaseParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo edit release params
+func (o *RepoEditReleaseParams) WithTimeout(timeout time.Duration) *RepoEditReleaseParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo edit release params
+func (o *RepoEditReleaseParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo edit release params
+func (o *RepoEditReleaseParams) WithContext(ctx context.Context) *RepoEditReleaseParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo edit release params
+func (o *RepoEditReleaseParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo edit release params
+func (o *RepoEditReleaseParams) WithHTTPClient(client *http.Client) *RepoEditReleaseParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo edit release params
+func (o *RepoEditReleaseParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the repo edit release params
+func (o *RepoEditReleaseParams) WithBody(body *models.EditReleaseOption) *RepoEditReleaseParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the repo edit release params
+func (o *RepoEditReleaseParams) SetBody(body *models.EditReleaseOption) {
+	o.Body = body
+}
+
+// WithID adds the id to the repo edit release params
+func (o *RepoEditReleaseParams) WithID(id int64) *RepoEditReleaseParams {
+	o.SetID(id)
+	return o
+}
+
+// SetID adds the id to the repo edit release params
+func (o *RepoEditReleaseParams) SetID(id int64) {
+	o.ID = id
+}
+
+// WithOwner adds the owner to the repo edit release params
+func (o *RepoEditReleaseParams) WithOwner(owner string) *RepoEditReleaseParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo edit release params
+func (o *RepoEditReleaseParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo edit release params
+func (o *RepoEditReleaseParams) WithRepo(repo string) *RepoEditReleaseParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo edit release params
+func (o *RepoEditReleaseParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoEditReleaseParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	// path param id
+	if err := r.SetPathParam("id", swag.FormatInt64(o.ID)); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_edit_release_responses.go b/bots-common/gitea-generated/client/repository/repo_edit_release_responses.go
new file mode 100644
index 0000000..9e55b4f
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_edit_release_responses.go
@@ -0,0 +1,168 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoEditReleaseReader is a Reader for the RepoEditRelease structure.
+type RepoEditReleaseReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoEditReleaseReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoEditReleaseOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoEditReleaseNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[PATCH /repos/{owner}/{repo}/releases/{id}] repoEditRelease", response, response.Code())
+	}
+}
+
+// NewRepoEditReleaseOK creates a RepoEditReleaseOK with default headers values
+func NewRepoEditReleaseOK() *RepoEditReleaseOK {
+	return &RepoEditReleaseOK{}
+}
+
+/*
+RepoEditReleaseOK describes a response with status code 200, with default header values.
+
+Release
+*/
+type RepoEditReleaseOK struct {
+	Payload *models.Release
+}
+
+// IsSuccess returns true when this repo edit release o k response has a 2xx status code
+func (o *RepoEditReleaseOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo edit release o k response has a 3xx status code
+func (o *RepoEditReleaseOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo edit release o k response has a 4xx status code
+func (o *RepoEditReleaseOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo edit release o k response has a 5xx status code
+func (o *RepoEditReleaseOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo edit release o k response a status code equal to that given
+func (o *RepoEditReleaseOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo edit release o k response
+func (o *RepoEditReleaseOK) Code() int {
+	return 200
+}
+
+func (o *RepoEditReleaseOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/releases/{id}][%d] repoEditReleaseOK %s", 200, payload)
+}
+
+func (o *RepoEditReleaseOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/releases/{id}][%d] repoEditReleaseOK %s", 200, payload)
+}
+
+func (o *RepoEditReleaseOK) GetPayload() *models.Release {
+	return o.Payload
+}
+
+func (o *RepoEditReleaseOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.Release)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoEditReleaseNotFound creates a RepoEditReleaseNotFound with default headers values
+func NewRepoEditReleaseNotFound() *RepoEditReleaseNotFound {
+	return &RepoEditReleaseNotFound{}
+}
+
+/*
+RepoEditReleaseNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoEditReleaseNotFound struct {
+}
+
+// IsSuccess returns true when this repo edit release not found response has a 2xx status code
+func (o *RepoEditReleaseNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo edit release not found response has a 3xx status code
+func (o *RepoEditReleaseNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo edit release not found response has a 4xx status code
+func (o *RepoEditReleaseNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo edit release not found response has a 5xx status code
+func (o *RepoEditReleaseNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo edit release not found response a status code equal to that given
+func (o *RepoEditReleaseNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo edit release not found response
+func (o *RepoEditReleaseNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoEditReleaseNotFound) Error() string {
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/releases/{id}][%d] repoEditReleaseNotFound", 404)
+}
+
+func (o *RepoEditReleaseNotFound) String() string {
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/releases/{id}][%d] repoEditReleaseNotFound", 404)
+}
+
+func (o *RepoEditReleaseNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_edit_responses.go b/bots-common/gitea-generated/client/repository/repo_edit_responses.go
new file mode 100644
index 0000000..a245333
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_edit_responses.go
@@ -0,0 +1,324 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoEditReader is a Reader for the RepoEdit structure.
+type RepoEditReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoEditReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoEditOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 403:
+		result := NewRepoEditForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewRepoEditNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 422:
+		result := NewRepoEditUnprocessableEntity()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[PATCH /repos/{owner}/{repo}] repoEdit", response, response.Code())
+	}
+}
+
+// NewRepoEditOK creates a RepoEditOK with default headers values
+func NewRepoEditOK() *RepoEditOK {
+	return &RepoEditOK{}
+}
+
+/*
+RepoEditOK describes a response with status code 200, with default header values.
+
+Repository
+*/
+type RepoEditOK struct {
+	Payload *models.Repository
+}
+
+// IsSuccess returns true when this repo edit o k response has a 2xx status code
+func (o *RepoEditOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo edit o k response has a 3xx status code
+func (o *RepoEditOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo edit o k response has a 4xx status code
+func (o *RepoEditOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo edit o k response has a 5xx status code
+func (o *RepoEditOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo edit o k response a status code equal to that given
+func (o *RepoEditOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo edit o k response
+func (o *RepoEditOK) Code() int {
+	return 200
+}
+
+func (o *RepoEditOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}][%d] repoEditOK %s", 200, payload)
+}
+
+func (o *RepoEditOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}][%d] repoEditOK %s", 200, payload)
+}
+
+func (o *RepoEditOK) GetPayload() *models.Repository {
+	return o.Payload
+}
+
+func (o *RepoEditOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.Repository)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoEditForbidden creates a RepoEditForbidden with default headers values
+func NewRepoEditForbidden() *RepoEditForbidden {
+	return &RepoEditForbidden{}
+}
+
+/*
+RepoEditForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type RepoEditForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo edit forbidden response has a 2xx status code
+func (o *RepoEditForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo edit forbidden response has a 3xx status code
+func (o *RepoEditForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo edit forbidden response has a 4xx status code
+func (o *RepoEditForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo edit forbidden response has a 5xx status code
+func (o *RepoEditForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo edit forbidden response a status code equal to that given
+func (o *RepoEditForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the repo edit forbidden response
+func (o *RepoEditForbidden) Code() int {
+	return 403
+}
+
+func (o *RepoEditForbidden) Error() string {
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}][%d] repoEditForbidden", 403)
+}
+
+func (o *RepoEditForbidden) String() string {
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}][%d] repoEditForbidden", 403)
+}
+
+func (o *RepoEditForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewRepoEditNotFound creates a RepoEditNotFound with default headers values
+func NewRepoEditNotFound() *RepoEditNotFound {
+	return &RepoEditNotFound{}
+}
+
+/*
+RepoEditNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoEditNotFound struct {
+}
+
+// IsSuccess returns true when this repo edit not found response has a 2xx status code
+func (o *RepoEditNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo edit not found response has a 3xx status code
+func (o *RepoEditNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo edit not found response has a 4xx status code
+func (o *RepoEditNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo edit not found response has a 5xx status code
+func (o *RepoEditNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo edit not found response a status code equal to that given
+func (o *RepoEditNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo edit not found response
+func (o *RepoEditNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoEditNotFound) Error() string {
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}][%d] repoEditNotFound", 404)
+}
+
+func (o *RepoEditNotFound) String() string {
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}][%d] repoEditNotFound", 404)
+}
+
+func (o *RepoEditNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewRepoEditUnprocessableEntity creates a RepoEditUnprocessableEntity with default headers values
+func NewRepoEditUnprocessableEntity() *RepoEditUnprocessableEntity {
+	return &RepoEditUnprocessableEntity{}
+}
+
+/*
+RepoEditUnprocessableEntity describes a response with status code 422, with default header values.
+
+APIValidationError is error format response related to input validation
+*/
+type RepoEditUnprocessableEntity struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo edit unprocessable entity response has a 2xx status code
+func (o *RepoEditUnprocessableEntity) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo edit unprocessable entity response has a 3xx status code
+func (o *RepoEditUnprocessableEntity) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo edit unprocessable entity response has a 4xx status code
+func (o *RepoEditUnprocessableEntity) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo edit unprocessable entity response has a 5xx status code
+func (o *RepoEditUnprocessableEntity) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo edit unprocessable entity response a status code equal to that given
+func (o *RepoEditUnprocessableEntity) IsCode(code int) bool {
+	return code == 422
+}
+
+// Code gets the status code for the repo edit unprocessable entity response
+func (o *RepoEditUnprocessableEntity) Code() int {
+	return 422
+}
+
+func (o *RepoEditUnprocessableEntity) Error() string {
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}][%d] repoEditUnprocessableEntity", 422)
+}
+
+func (o *RepoEditUnprocessableEntity) String() string {
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}][%d] repoEditUnprocessableEntity", 422)
+}
+
+func (o *RepoEditUnprocessableEntity) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_edit_wiki_page_parameters.go b/bots-common/gitea-generated/client/repository/repo_edit_wiki_page_parameters.go
new file mode 100644
index 0000000..f91507a
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_edit_wiki_page_parameters.go
@@ -0,0 +1,216 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewRepoEditWikiPageParams creates a new RepoEditWikiPageParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoEditWikiPageParams() *RepoEditWikiPageParams {
+	return &RepoEditWikiPageParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoEditWikiPageParamsWithTimeout creates a new RepoEditWikiPageParams object
+// with the ability to set a timeout on a request.
+func NewRepoEditWikiPageParamsWithTimeout(timeout time.Duration) *RepoEditWikiPageParams {
+	return &RepoEditWikiPageParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoEditWikiPageParamsWithContext creates a new RepoEditWikiPageParams object
+// with the ability to set a context for a request.
+func NewRepoEditWikiPageParamsWithContext(ctx context.Context) *RepoEditWikiPageParams {
+	return &RepoEditWikiPageParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoEditWikiPageParamsWithHTTPClient creates a new RepoEditWikiPageParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoEditWikiPageParamsWithHTTPClient(client *http.Client) *RepoEditWikiPageParams {
+	return &RepoEditWikiPageParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoEditWikiPageParams contains all the parameters to send to the API endpoint
+
+	for the repo edit wiki page operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoEditWikiPageParams struct {
+
+	// Body.
+	Body *models.CreateWikiPageOptions
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* PageName.
+
+	   name of the page
+	*/
+	PageName string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo edit wiki page params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoEditWikiPageParams) WithDefaults() *RepoEditWikiPageParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo edit wiki page params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoEditWikiPageParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo edit wiki page params
+func (o *RepoEditWikiPageParams) WithTimeout(timeout time.Duration) *RepoEditWikiPageParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo edit wiki page params
+func (o *RepoEditWikiPageParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo edit wiki page params
+func (o *RepoEditWikiPageParams) WithContext(ctx context.Context) *RepoEditWikiPageParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo edit wiki page params
+func (o *RepoEditWikiPageParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo edit wiki page params
+func (o *RepoEditWikiPageParams) WithHTTPClient(client *http.Client) *RepoEditWikiPageParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo edit wiki page params
+func (o *RepoEditWikiPageParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the repo edit wiki page params
+func (o *RepoEditWikiPageParams) WithBody(body *models.CreateWikiPageOptions) *RepoEditWikiPageParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the repo edit wiki page params
+func (o *RepoEditWikiPageParams) SetBody(body *models.CreateWikiPageOptions) {
+	o.Body = body
+}
+
+// WithOwner adds the owner to the repo edit wiki page params
+func (o *RepoEditWikiPageParams) WithOwner(owner string) *RepoEditWikiPageParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo edit wiki page params
+func (o *RepoEditWikiPageParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithPageName adds the pageName to the repo edit wiki page params
+func (o *RepoEditWikiPageParams) WithPageName(pageName string) *RepoEditWikiPageParams {
+	o.SetPageName(pageName)
+	return o
+}
+
+// SetPageName adds the pageName to the repo edit wiki page params
+func (o *RepoEditWikiPageParams) SetPageName(pageName string) {
+	o.PageName = pageName
+}
+
+// WithRepo adds the repo to the repo edit wiki page params
+func (o *RepoEditWikiPageParams) WithRepo(repo string) *RepoEditWikiPageParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo edit wiki page params
+func (o *RepoEditWikiPageParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoEditWikiPageParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param pageName
+	if err := r.SetPathParam("pageName", o.PageName); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_edit_wiki_page_responses.go b/bots-common/gitea-generated/client/repository/repo_edit_wiki_page_responses.go
new file mode 100644
index 0000000..2eb913c
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_edit_wiki_page_responses.go
@@ -0,0 +1,402 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoEditWikiPageReader is a Reader for the RepoEditWikiPage structure.
+type RepoEditWikiPageReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoEditWikiPageReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoEditWikiPageOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 400:
+		result := NewRepoEditWikiPageBadRequest()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 403:
+		result := NewRepoEditWikiPageForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewRepoEditWikiPageNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 423:
+		result := NewRepoEditWikiPageLocked()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[PATCH /repos/{owner}/{repo}/wiki/page/{pageName}] repoEditWikiPage", response, response.Code())
+	}
+}
+
+// NewRepoEditWikiPageOK creates a RepoEditWikiPageOK with default headers values
+func NewRepoEditWikiPageOK() *RepoEditWikiPageOK {
+	return &RepoEditWikiPageOK{}
+}
+
+/*
+RepoEditWikiPageOK describes a response with status code 200, with default header values.
+
+WikiPage
+*/
+type RepoEditWikiPageOK struct {
+	Payload *models.WikiPage
+}
+
+// IsSuccess returns true when this repo edit wiki page o k response has a 2xx status code
+func (o *RepoEditWikiPageOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo edit wiki page o k response has a 3xx status code
+func (o *RepoEditWikiPageOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo edit wiki page o k response has a 4xx status code
+func (o *RepoEditWikiPageOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo edit wiki page o k response has a 5xx status code
+func (o *RepoEditWikiPageOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo edit wiki page o k response a status code equal to that given
+func (o *RepoEditWikiPageOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo edit wiki page o k response
+func (o *RepoEditWikiPageOK) Code() int {
+	return 200
+}
+
+func (o *RepoEditWikiPageOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/wiki/page/{pageName}][%d] repoEditWikiPageOK %s", 200, payload)
+}
+
+func (o *RepoEditWikiPageOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/wiki/page/{pageName}][%d] repoEditWikiPageOK %s", 200, payload)
+}
+
+func (o *RepoEditWikiPageOK) GetPayload() *models.WikiPage {
+	return o.Payload
+}
+
+func (o *RepoEditWikiPageOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.WikiPage)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoEditWikiPageBadRequest creates a RepoEditWikiPageBadRequest with default headers values
+func NewRepoEditWikiPageBadRequest() *RepoEditWikiPageBadRequest {
+	return &RepoEditWikiPageBadRequest{}
+}
+
+/*
+RepoEditWikiPageBadRequest describes a response with status code 400, with default header values.
+
+APIError is error format response
+*/
+type RepoEditWikiPageBadRequest struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo edit wiki page bad request response has a 2xx status code
+func (o *RepoEditWikiPageBadRequest) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo edit wiki page bad request response has a 3xx status code
+func (o *RepoEditWikiPageBadRequest) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo edit wiki page bad request response has a 4xx status code
+func (o *RepoEditWikiPageBadRequest) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo edit wiki page bad request response has a 5xx status code
+func (o *RepoEditWikiPageBadRequest) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo edit wiki page bad request response a status code equal to that given
+func (o *RepoEditWikiPageBadRequest) IsCode(code int) bool {
+	return code == 400
+}
+
+// Code gets the status code for the repo edit wiki page bad request response
+func (o *RepoEditWikiPageBadRequest) Code() int {
+	return 400
+}
+
+func (o *RepoEditWikiPageBadRequest) Error() string {
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/wiki/page/{pageName}][%d] repoEditWikiPageBadRequest", 400)
+}
+
+func (o *RepoEditWikiPageBadRequest) String() string {
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/wiki/page/{pageName}][%d] repoEditWikiPageBadRequest", 400)
+}
+
+func (o *RepoEditWikiPageBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewRepoEditWikiPageForbidden creates a RepoEditWikiPageForbidden with default headers values
+func NewRepoEditWikiPageForbidden() *RepoEditWikiPageForbidden {
+	return &RepoEditWikiPageForbidden{}
+}
+
+/*
+RepoEditWikiPageForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type RepoEditWikiPageForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo edit wiki page forbidden response has a 2xx status code
+func (o *RepoEditWikiPageForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo edit wiki page forbidden response has a 3xx status code
+func (o *RepoEditWikiPageForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo edit wiki page forbidden response has a 4xx status code
+func (o *RepoEditWikiPageForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo edit wiki page forbidden response has a 5xx status code
+func (o *RepoEditWikiPageForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo edit wiki page forbidden response a status code equal to that given
+func (o *RepoEditWikiPageForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the repo edit wiki page forbidden response
+func (o *RepoEditWikiPageForbidden) Code() int {
+	return 403
+}
+
+func (o *RepoEditWikiPageForbidden) Error() string {
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/wiki/page/{pageName}][%d] repoEditWikiPageForbidden", 403)
+}
+
+func (o *RepoEditWikiPageForbidden) String() string {
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/wiki/page/{pageName}][%d] repoEditWikiPageForbidden", 403)
+}
+
+func (o *RepoEditWikiPageForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewRepoEditWikiPageNotFound creates a RepoEditWikiPageNotFound with default headers values
+func NewRepoEditWikiPageNotFound() *RepoEditWikiPageNotFound {
+	return &RepoEditWikiPageNotFound{}
+}
+
+/*
+RepoEditWikiPageNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoEditWikiPageNotFound struct {
+}
+
+// IsSuccess returns true when this repo edit wiki page not found response has a 2xx status code
+func (o *RepoEditWikiPageNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo edit wiki page not found response has a 3xx status code
+func (o *RepoEditWikiPageNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo edit wiki page not found response has a 4xx status code
+func (o *RepoEditWikiPageNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo edit wiki page not found response has a 5xx status code
+func (o *RepoEditWikiPageNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo edit wiki page not found response a status code equal to that given
+func (o *RepoEditWikiPageNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo edit wiki page not found response
+func (o *RepoEditWikiPageNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoEditWikiPageNotFound) Error() string {
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/wiki/page/{pageName}][%d] repoEditWikiPageNotFound", 404)
+}
+
+func (o *RepoEditWikiPageNotFound) String() string {
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/wiki/page/{pageName}][%d] repoEditWikiPageNotFound", 404)
+}
+
+func (o *RepoEditWikiPageNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewRepoEditWikiPageLocked creates a RepoEditWikiPageLocked with default headers values
+func NewRepoEditWikiPageLocked() *RepoEditWikiPageLocked {
+	return &RepoEditWikiPageLocked{}
+}
+
+/*
+RepoEditWikiPageLocked describes a response with status code 423, with default header values.
+
+APIRepoArchivedError is an error that is raised when an archived repo should be modified
+*/
+type RepoEditWikiPageLocked struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo edit wiki page locked response has a 2xx status code
+func (o *RepoEditWikiPageLocked) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo edit wiki page locked response has a 3xx status code
+func (o *RepoEditWikiPageLocked) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo edit wiki page locked response has a 4xx status code
+func (o *RepoEditWikiPageLocked) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo edit wiki page locked response has a 5xx status code
+func (o *RepoEditWikiPageLocked) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo edit wiki page locked response a status code equal to that given
+func (o *RepoEditWikiPageLocked) IsCode(code int) bool {
+	return code == 423
+}
+
+// Code gets the status code for the repo edit wiki page locked response
+func (o *RepoEditWikiPageLocked) Code() int {
+	return 423
+}
+
+func (o *RepoEditWikiPageLocked) Error() string {
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/wiki/page/{pageName}][%d] repoEditWikiPageLocked", 423)
+}
+
+func (o *RepoEditWikiPageLocked) String() string {
+	return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/wiki/page/{pageName}][%d] repoEditWikiPageLocked", 423)
+}
+
+func (o *RepoEditWikiPageLocked) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_get_all_commits_parameters.go b/bots-common/gitea-generated/client/repository/repo_get_all_commits_parameters.go
new file mode 100644
index 0000000..d277878
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_get_all_commits_parameters.go
@@ -0,0 +1,446 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewRepoGetAllCommitsParams creates a new RepoGetAllCommitsParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoGetAllCommitsParams() *RepoGetAllCommitsParams {
+	return &RepoGetAllCommitsParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoGetAllCommitsParamsWithTimeout creates a new RepoGetAllCommitsParams object
+// with the ability to set a timeout on a request.
+func NewRepoGetAllCommitsParamsWithTimeout(timeout time.Duration) *RepoGetAllCommitsParams {
+	return &RepoGetAllCommitsParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoGetAllCommitsParamsWithContext creates a new RepoGetAllCommitsParams object
+// with the ability to set a context for a request.
+func NewRepoGetAllCommitsParamsWithContext(ctx context.Context) *RepoGetAllCommitsParams {
+	return &RepoGetAllCommitsParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoGetAllCommitsParamsWithHTTPClient creates a new RepoGetAllCommitsParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoGetAllCommitsParamsWithHTTPClient(client *http.Client) *RepoGetAllCommitsParams {
+	return &RepoGetAllCommitsParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoGetAllCommitsParams contains all the parameters to send to the API endpoint
+
+	for the repo get all commits operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoGetAllCommitsParams struct {
+
+	/* Files.
+
+	   include a list of affected files for every commit (disable for speedup, default 'true')
+	*/
+	Files *bool
+
+	/* Limit.
+
+	   page size of results (ignored if used with 'path')
+	*/
+	Limit *int64
+
+	/* Not.
+
+	   commits that match the given specifier will not be listed.
+	*/
+	Not *string
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Page.
+
+	   page number of results to return (1-based)
+	*/
+	Page *int64
+
+	/* Path.
+
+	   filepath of a file/dir
+	*/
+	Path *string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	/* Sha.
+
+	   SHA or branch to start listing commits from (usually 'master')
+	*/
+	Sha *string
+
+	/* Stat.
+
+	   include diff stats for every commit (disable for speedup, default 'true')
+	*/
+	Stat *bool
+
+	/* Verification.
+
+	   include verification for every commit (disable for speedup, default 'true')
+	*/
+	Verification *bool
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo get all commits params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoGetAllCommitsParams) WithDefaults() *RepoGetAllCommitsParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo get all commits params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoGetAllCommitsParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo get all commits params
+func (o *RepoGetAllCommitsParams) WithTimeout(timeout time.Duration) *RepoGetAllCommitsParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo get all commits params
+func (o *RepoGetAllCommitsParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo get all commits params
+func (o *RepoGetAllCommitsParams) WithContext(ctx context.Context) *RepoGetAllCommitsParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo get all commits params
+func (o *RepoGetAllCommitsParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo get all commits params
+func (o *RepoGetAllCommitsParams) WithHTTPClient(client *http.Client) *RepoGetAllCommitsParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo get all commits params
+func (o *RepoGetAllCommitsParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithFiles adds the files to the repo get all commits params
+func (o *RepoGetAllCommitsParams) WithFiles(files *bool) *RepoGetAllCommitsParams {
+	o.SetFiles(files)
+	return o
+}
+
+// SetFiles adds the files to the repo get all commits params
+func (o *RepoGetAllCommitsParams) SetFiles(files *bool) {
+	o.Files = files
+}
+
+// WithLimit adds the limit to the repo get all commits params
+func (o *RepoGetAllCommitsParams) WithLimit(limit *int64) *RepoGetAllCommitsParams {
+	o.SetLimit(limit)
+	return o
+}
+
+// SetLimit adds the limit to the repo get all commits params
+func (o *RepoGetAllCommitsParams) SetLimit(limit *int64) {
+	o.Limit = limit
+}
+
+// WithNot adds the not to the repo get all commits params
+func (o *RepoGetAllCommitsParams) WithNot(not *string) *RepoGetAllCommitsParams {
+	o.SetNot(not)
+	return o
+}
+
+// SetNot adds the not to the repo get all commits params
+func (o *RepoGetAllCommitsParams) SetNot(not *string) {
+	o.Not = not
+}
+
+// WithOwner adds the owner to the repo get all commits params
+func (o *RepoGetAllCommitsParams) WithOwner(owner string) *RepoGetAllCommitsParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo get all commits params
+func (o *RepoGetAllCommitsParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithPage adds the page to the repo get all commits params
+func (o *RepoGetAllCommitsParams) WithPage(page *int64) *RepoGetAllCommitsParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the repo get all commits params
+func (o *RepoGetAllCommitsParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WithPath adds the path to the repo get all commits params
+func (o *RepoGetAllCommitsParams) WithPath(path *string) *RepoGetAllCommitsParams {
+	o.SetPath(path)
+	return o
+}
+
+// SetPath adds the path to the repo get all commits params
+func (o *RepoGetAllCommitsParams) SetPath(path *string) {
+	o.Path = path
+}
+
+// WithRepo adds the repo to the repo get all commits params
+func (o *RepoGetAllCommitsParams) WithRepo(repo string) *RepoGetAllCommitsParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo get all commits params
+func (o *RepoGetAllCommitsParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WithSha adds the sha to the repo get all commits params
+func (o *RepoGetAllCommitsParams) WithSha(sha *string) *RepoGetAllCommitsParams {
+	o.SetSha(sha)
+	return o
+}
+
+// SetSha adds the sha to the repo get all commits params
+func (o *RepoGetAllCommitsParams) SetSha(sha *string) {
+	o.Sha = sha
+}
+
+// WithStat adds the stat to the repo get all commits params
+func (o *RepoGetAllCommitsParams) WithStat(stat *bool) *RepoGetAllCommitsParams {
+	o.SetStat(stat)
+	return o
+}
+
+// SetStat adds the stat to the repo get all commits params
+func (o *RepoGetAllCommitsParams) SetStat(stat *bool) {
+	o.Stat = stat
+}
+
+// WithVerification adds the verification to the repo get all commits params
+func (o *RepoGetAllCommitsParams) WithVerification(verification *bool) *RepoGetAllCommitsParams {
+	o.SetVerification(verification)
+	return o
+}
+
+// SetVerification adds the verification to the repo get all commits params
+func (o *RepoGetAllCommitsParams) SetVerification(verification *bool) {
+	o.Verification = verification
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoGetAllCommitsParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.Files != nil {
+
+		// query param files
+		var qrFiles bool
+
+		if o.Files != nil {
+			qrFiles = *o.Files
+		}
+		qFiles := swag.FormatBool(qrFiles)
+		if qFiles != "" {
+
+			if err := r.SetQueryParam("files", qFiles); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Limit != nil {
+
+		// query param limit
+		var qrLimit int64
+
+		if o.Limit != nil {
+			qrLimit = *o.Limit
+		}
+		qLimit := swag.FormatInt64(qrLimit)
+		if qLimit != "" {
+
+			if err := r.SetQueryParam("limit", qLimit); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Not != nil {
+
+		// query param not
+		var qrNot string
+
+		if o.Not != nil {
+			qrNot = *o.Not
+		}
+		qNot := qrNot
+		if qNot != "" {
+
+			if err := r.SetQueryParam("not", qNot); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Path != nil {
+
+		// query param path
+		var qrPath string
+
+		if o.Path != nil {
+			qrPath = *o.Path
+		}
+		qPath := qrPath
+		if qPath != "" {
+
+			if err := r.SetQueryParam("path", qPath); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if o.Sha != nil {
+
+		// query param sha
+		var qrSha string
+
+		if o.Sha != nil {
+			qrSha = *o.Sha
+		}
+		qSha := qrSha
+		if qSha != "" {
+
+			if err := r.SetQueryParam("sha", qSha); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Stat != nil {
+
+		// query param stat
+		var qrStat bool
+
+		if o.Stat != nil {
+			qrStat = *o.Stat
+		}
+		qStat := swag.FormatBool(qrStat)
+		if qStat != "" {
+
+			if err := r.SetQueryParam("stat", qStat); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Verification != nil {
+
+		// query param verification
+		var qrVerification bool
+
+		if o.Verification != nil {
+			qrVerification = *o.Verification
+		}
+		qVerification := swag.FormatBool(qrVerification)
+		if qVerification != "" {
+
+			if err := r.SetQueryParam("verification", qVerification); err != nil {
+				return err
+			}
+		}
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_get_all_commits_responses.go b/bots-common/gitea-generated/client/repository/repo_get_all_commits_responses.go
new file mode 100644
index 0000000..d9f0769
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_get_all_commits_responses.go
@@ -0,0 +1,328 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoGetAllCommitsReader is a Reader for the RepoGetAllCommits structure.
+type RepoGetAllCommitsReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoGetAllCommitsReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoGetAllCommitsOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoGetAllCommitsNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 409:
+		result := NewRepoGetAllCommitsConflict()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/commits] repoGetAllCommits", response, response.Code())
+	}
+}
+
+// NewRepoGetAllCommitsOK creates a RepoGetAllCommitsOK with default headers values
+func NewRepoGetAllCommitsOK() *RepoGetAllCommitsOK {
+	return &RepoGetAllCommitsOK{}
+}
+
+/*
+RepoGetAllCommitsOK describes a response with status code 200, with default header values.
+
+CommitList
+*/
+type RepoGetAllCommitsOK struct {
+
+	/* True if there is another page
+	 */
+	XHasMore bool
+
+	/* The current page
+
+	   Format: int64
+	*/
+	XPage int64
+
+	/* Total number of pages
+
+	   Format: int64
+	*/
+	XPageCount int64
+
+	/* Commits per page
+
+	   Format: int64
+	*/
+	XPerPage int64
+
+	/* Total commit count
+
+	   Format: int64
+	*/
+	XTotal int64
+
+	Payload []*models.Commit
+}
+
+// IsSuccess returns true when this repo get all commits o k response has a 2xx status code
+func (o *RepoGetAllCommitsOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo get all commits o k response has a 3xx status code
+func (o *RepoGetAllCommitsOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo get all commits o k response has a 4xx status code
+func (o *RepoGetAllCommitsOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo get all commits o k response has a 5xx status code
+func (o *RepoGetAllCommitsOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo get all commits o k response a status code equal to that given
+func (o *RepoGetAllCommitsOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo get all commits o k response
+func (o *RepoGetAllCommitsOK) Code() int {
+	return 200
+}
+
+func (o *RepoGetAllCommitsOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/commits][%d] repoGetAllCommitsOK %s", 200, payload)
+}
+
+func (o *RepoGetAllCommitsOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/commits][%d] repoGetAllCommitsOK %s", 200, payload)
+}
+
+func (o *RepoGetAllCommitsOK) GetPayload() []*models.Commit {
+	return o.Payload
+}
+
+func (o *RepoGetAllCommitsOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header X-HasMore
+	hdrXHasMore := response.GetHeader("X-HasMore")
+
+	if hdrXHasMore != "" {
+		valxHasMore, err := swag.ConvertBool(hdrXHasMore)
+		if err != nil {
+			return errors.InvalidType("X-HasMore", "header", "bool", hdrXHasMore)
+		}
+		o.XHasMore = valxHasMore
+	}
+
+	// hydrates response header X-Page
+	hdrXPage := response.GetHeader("X-Page")
+
+	if hdrXPage != "" {
+		valxPage, err := swag.ConvertInt64(hdrXPage)
+		if err != nil {
+			return errors.InvalidType("X-Page", "header", "int64", hdrXPage)
+		}
+		o.XPage = valxPage
+	}
+
+	// hydrates response header X-PageCount
+	hdrXPageCount := response.GetHeader("X-PageCount")
+
+	if hdrXPageCount != "" {
+		valxPageCount, err := swag.ConvertInt64(hdrXPageCount)
+		if err != nil {
+			return errors.InvalidType("X-PageCount", "header", "int64", hdrXPageCount)
+		}
+		o.XPageCount = valxPageCount
+	}
+
+	// hydrates response header X-PerPage
+	hdrXPerPage := response.GetHeader("X-PerPage")
+
+	if hdrXPerPage != "" {
+		valxPerPage, err := swag.ConvertInt64(hdrXPerPage)
+		if err != nil {
+			return errors.InvalidType("X-PerPage", "header", "int64", hdrXPerPage)
+		}
+		o.XPerPage = valxPerPage
+	}
+
+	// hydrates response header X-Total
+	hdrXTotal := response.GetHeader("X-Total")
+
+	if hdrXTotal != "" {
+		valxTotal, err := swag.ConvertInt64(hdrXTotal)
+		if err != nil {
+			return errors.InvalidType("X-Total", "header", "int64", hdrXTotal)
+		}
+		o.XTotal = valxTotal
+	}
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoGetAllCommitsNotFound creates a RepoGetAllCommitsNotFound with default headers values
+func NewRepoGetAllCommitsNotFound() *RepoGetAllCommitsNotFound {
+	return &RepoGetAllCommitsNotFound{}
+}
+
+/*
+RepoGetAllCommitsNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoGetAllCommitsNotFound struct {
+}
+
+// IsSuccess returns true when this repo get all commits not found response has a 2xx status code
+func (o *RepoGetAllCommitsNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo get all commits not found response has a 3xx status code
+func (o *RepoGetAllCommitsNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo get all commits not found response has a 4xx status code
+func (o *RepoGetAllCommitsNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo get all commits not found response has a 5xx status code
+func (o *RepoGetAllCommitsNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo get all commits not found response a status code equal to that given
+func (o *RepoGetAllCommitsNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo get all commits not found response
+func (o *RepoGetAllCommitsNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoGetAllCommitsNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/commits][%d] repoGetAllCommitsNotFound", 404)
+}
+
+func (o *RepoGetAllCommitsNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/commits][%d] repoGetAllCommitsNotFound", 404)
+}
+
+func (o *RepoGetAllCommitsNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewRepoGetAllCommitsConflict creates a RepoGetAllCommitsConflict with default headers values
+func NewRepoGetAllCommitsConflict() *RepoGetAllCommitsConflict {
+	return &RepoGetAllCommitsConflict{}
+}
+
+/*
+RepoGetAllCommitsConflict describes a response with status code 409, with default header values.
+
+EmptyRepository
+*/
+type RepoGetAllCommitsConflict struct {
+	Payload *models.APIError
+}
+
+// IsSuccess returns true when this repo get all commits conflict response has a 2xx status code
+func (o *RepoGetAllCommitsConflict) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo get all commits conflict response has a 3xx status code
+func (o *RepoGetAllCommitsConflict) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo get all commits conflict response has a 4xx status code
+func (o *RepoGetAllCommitsConflict) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo get all commits conflict response has a 5xx status code
+func (o *RepoGetAllCommitsConflict) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo get all commits conflict response a status code equal to that given
+func (o *RepoGetAllCommitsConflict) IsCode(code int) bool {
+	return code == 409
+}
+
+// Code gets the status code for the repo get all commits conflict response
+func (o *RepoGetAllCommitsConflict) Code() int {
+	return 409
+}
+
+func (o *RepoGetAllCommitsConflict) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/commits][%d] repoGetAllCommitsConflict %s", 409, payload)
+}
+
+func (o *RepoGetAllCommitsConflict) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/commits][%d] repoGetAllCommitsConflict %s", 409, payload)
+}
+
+func (o *RepoGetAllCommitsConflict) GetPayload() *models.APIError {
+	return o.Payload
+}
+
+func (o *RepoGetAllCommitsConflict) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.APIError)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_get_archive_parameters.go b/bots-common/gitea-generated/client/repository/repo_get_archive_parameters.go
new file mode 100644
index 0000000..8bb3eb9
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_get_archive_parameters.go
@@ -0,0 +1,195 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewRepoGetArchiveParams creates a new RepoGetArchiveParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoGetArchiveParams() *RepoGetArchiveParams {
+	return &RepoGetArchiveParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoGetArchiveParamsWithTimeout creates a new RepoGetArchiveParams object
+// with the ability to set a timeout on a request.
+func NewRepoGetArchiveParamsWithTimeout(timeout time.Duration) *RepoGetArchiveParams {
+	return &RepoGetArchiveParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoGetArchiveParamsWithContext creates a new RepoGetArchiveParams object
+// with the ability to set a context for a request.
+func NewRepoGetArchiveParamsWithContext(ctx context.Context) *RepoGetArchiveParams {
+	return &RepoGetArchiveParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoGetArchiveParamsWithHTTPClient creates a new RepoGetArchiveParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoGetArchiveParamsWithHTTPClient(client *http.Client) *RepoGetArchiveParams {
+	return &RepoGetArchiveParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoGetArchiveParams contains all the parameters to send to the API endpoint
+
+	for the repo get archive operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoGetArchiveParams struct {
+
+	/* Archive.
+
+	   the git reference for download with attached archive format (e.g. master.zip)
+	*/
+	Archive string
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo get archive params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoGetArchiveParams) WithDefaults() *RepoGetArchiveParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo get archive params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoGetArchiveParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo get archive params
+func (o *RepoGetArchiveParams) WithTimeout(timeout time.Duration) *RepoGetArchiveParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo get archive params
+func (o *RepoGetArchiveParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo get archive params
+func (o *RepoGetArchiveParams) WithContext(ctx context.Context) *RepoGetArchiveParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo get archive params
+func (o *RepoGetArchiveParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo get archive params
+func (o *RepoGetArchiveParams) WithHTTPClient(client *http.Client) *RepoGetArchiveParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo get archive params
+func (o *RepoGetArchiveParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithArchive adds the archive to the repo get archive params
+func (o *RepoGetArchiveParams) WithArchive(archive string) *RepoGetArchiveParams {
+	o.SetArchive(archive)
+	return o
+}
+
+// SetArchive adds the archive to the repo get archive params
+func (o *RepoGetArchiveParams) SetArchive(archive string) {
+	o.Archive = archive
+}
+
+// WithOwner adds the owner to the repo get archive params
+func (o *RepoGetArchiveParams) WithOwner(owner string) *RepoGetArchiveParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo get archive params
+func (o *RepoGetArchiveParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo get archive params
+func (o *RepoGetArchiveParams) WithRepo(repo string) *RepoGetArchiveParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo get archive params
+func (o *RepoGetArchiveParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoGetArchiveParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param archive
+	if err := r.SetPathParam("archive", o.Archive); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_get_archive_responses.go b/bots-common/gitea-generated/client/repository/repo_get_archive_responses.go
new file mode 100644
index 0000000..f9a3a3c
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_get_archive_responses.go
@@ -0,0 +1,150 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// RepoGetArchiveReader is a Reader for the RepoGetArchive structure.
+type RepoGetArchiveReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoGetArchiveReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoGetArchiveOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoGetArchiveNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/archive/{archive}] repoGetArchive", response, response.Code())
+	}
+}
+
+// NewRepoGetArchiveOK creates a RepoGetArchiveOK with default headers values
+func NewRepoGetArchiveOK() *RepoGetArchiveOK {
+	return &RepoGetArchiveOK{}
+}
+
+/*
+RepoGetArchiveOK describes a response with status code 200, with default header values.
+
+success
+*/
+type RepoGetArchiveOK struct {
+}
+
+// IsSuccess returns true when this repo get archive o k response has a 2xx status code
+func (o *RepoGetArchiveOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo get archive o k response has a 3xx status code
+func (o *RepoGetArchiveOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo get archive o k response has a 4xx status code
+func (o *RepoGetArchiveOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo get archive o k response has a 5xx status code
+func (o *RepoGetArchiveOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo get archive o k response a status code equal to that given
+func (o *RepoGetArchiveOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo get archive o k response
+func (o *RepoGetArchiveOK) Code() int {
+	return 200
+}
+
+func (o *RepoGetArchiveOK) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/archive/{archive}][%d] repoGetArchiveOK", 200)
+}
+
+func (o *RepoGetArchiveOK) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/archive/{archive}][%d] repoGetArchiveOK", 200)
+}
+
+func (o *RepoGetArchiveOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewRepoGetArchiveNotFound creates a RepoGetArchiveNotFound with default headers values
+func NewRepoGetArchiveNotFound() *RepoGetArchiveNotFound {
+	return &RepoGetArchiveNotFound{}
+}
+
+/*
+RepoGetArchiveNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoGetArchiveNotFound struct {
+}
+
+// IsSuccess returns true when this repo get archive not found response has a 2xx status code
+func (o *RepoGetArchiveNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo get archive not found response has a 3xx status code
+func (o *RepoGetArchiveNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo get archive not found response has a 4xx status code
+func (o *RepoGetArchiveNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo get archive not found response has a 5xx status code
+func (o *RepoGetArchiveNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo get archive not found response a status code equal to that given
+func (o *RepoGetArchiveNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo get archive not found response
+func (o *RepoGetArchiveNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoGetArchiveNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/archive/{archive}][%d] repoGetArchiveNotFound", 404)
+}
+
+func (o *RepoGetArchiveNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/archive/{archive}][%d] repoGetArchiveNotFound", 404)
+}
+
+func (o *RepoGetArchiveNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_get_assignees_parameters.go b/bots-common/gitea-generated/client/repository/repo_get_assignees_parameters.go
new file mode 100644
index 0000000..67a2710
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_get_assignees_parameters.go
@@ -0,0 +1,173 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewRepoGetAssigneesParams creates a new RepoGetAssigneesParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoGetAssigneesParams() *RepoGetAssigneesParams {
+	return &RepoGetAssigneesParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoGetAssigneesParamsWithTimeout creates a new RepoGetAssigneesParams object
+// with the ability to set a timeout on a request.
+func NewRepoGetAssigneesParamsWithTimeout(timeout time.Duration) *RepoGetAssigneesParams {
+	return &RepoGetAssigneesParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoGetAssigneesParamsWithContext creates a new RepoGetAssigneesParams object
+// with the ability to set a context for a request.
+func NewRepoGetAssigneesParamsWithContext(ctx context.Context) *RepoGetAssigneesParams {
+	return &RepoGetAssigneesParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoGetAssigneesParamsWithHTTPClient creates a new RepoGetAssigneesParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoGetAssigneesParamsWithHTTPClient(client *http.Client) *RepoGetAssigneesParams {
+	return &RepoGetAssigneesParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoGetAssigneesParams contains all the parameters to send to the API endpoint
+
+	for the repo get assignees operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoGetAssigneesParams struct {
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo get assignees params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoGetAssigneesParams) WithDefaults() *RepoGetAssigneesParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo get assignees params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoGetAssigneesParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo get assignees params
+func (o *RepoGetAssigneesParams) WithTimeout(timeout time.Duration) *RepoGetAssigneesParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo get assignees params
+func (o *RepoGetAssigneesParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo get assignees params
+func (o *RepoGetAssigneesParams) WithContext(ctx context.Context) *RepoGetAssigneesParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo get assignees params
+func (o *RepoGetAssigneesParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo get assignees params
+func (o *RepoGetAssigneesParams) WithHTTPClient(client *http.Client) *RepoGetAssigneesParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo get assignees params
+func (o *RepoGetAssigneesParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithOwner adds the owner to the repo get assignees params
+func (o *RepoGetAssigneesParams) WithOwner(owner string) *RepoGetAssigneesParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo get assignees params
+func (o *RepoGetAssigneesParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo get assignees params
+func (o *RepoGetAssigneesParams) WithRepo(repo string) *RepoGetAssigneesParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo get assignees params
+func (o *RepoGetAssigneesParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoGetAssigneesParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_get_assignees_responses.go b/bots-common/gitea-generated/client/repository/repo_get_assignees_responses.go
new file mode 100644
index 0000000..9b372cd
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_get_assignees_responses.go
@@ -0,0 +1,166 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoGetAssigneesReader is a Reader for the RepoGetAssignees structure.
+type RepoGetAssigneesReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoGetAssigneesReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoGetAssigneesOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoGetAssigneesNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/assignees] repoGetAssignees", response, response.Code())
+	}
+}
+
+// NewRepoGetAssigneesOK creates a RepoGetAssigneesOK with default headers values
+func NewRepoGetAssigneesOK() *RepoGetAssigneesOK {
+	return &RepoGetAssigneesOK{}
+}
+
+/*
+RepoGetAssigneesOK describes a response with status code 200, with default header values.
+
+UserList
+*/
+type RepoGetAssigneesOK struct {
+	Payload []*models.User
+}
+
+// IsSuccess returns true when this repo get assignees o k response has a 2xx status code
+func (o *RepoGetAssigneesOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo get assignees o k response has a 3xx status code
+func (o *RepoGetAssigneesOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo get assignees o k response has a 4xx status code
+func (o *RepoGetAssigneesOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo get assignees o k response has a 5xx status code
+func (o *RepoGetAssigneesOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo get assignees o k response a status code equal to that given
+func (o *RepoGetAssigneesOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo get assignees o k response
+func (o *RepoGetAssigneesOK) Code() int {
+	return 200
+}
+
+func (o *RepoGetAssigneesOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/assignees][%d] repoGetAssigneesOK %s", 200, payload)
+}
+
+func (o *RepoGetAssigneesOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/assignees][%d] repoGetAssigneesOK %s", 200, payload)
+}
+
+func (o *RepoGetAssigneesOK) GetPayload() []*models.User {
+	return o.Payload
+}
+
+func (o *RepoGetAssigneesOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoGetAssigneesNotFound creates a RepoGetAssigneesNotFound with default headers values
+func NewRepoGetAssigneesNotFound() *RepoGetAssigneesNotFound {
+	return &RepoGetAssigneesNotFound{}
+}
+
+/*
+RepoGetAssigneesNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoGetAssigneesNotFound struct {
+}
+
+// IsSuccess returns true when this repo get assignees not found response has a 2xx status code
+func (o *RepoGetAssigneesNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo get assignees not found response has a 3xx status code
+func (o *RepoGetAssigneesNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo get assignees not found response has a 4xx status code
+func (o *RepoGetAssigneesNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo get assignees not found response has a 5xx status code
+func (o *RepoGetAssigneesNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo get assignees not found response a status code equal to that given
+func (o *RepoGetAssigneesNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo get assignees not found response
+func (o *RepoGetAssigneesNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoGetAssigneesNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/assignees][%d] repoGetAssigneesNotFound", 404)
+}
+
+func (o *RepoGetAssigneesNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/assignees][%d] repoGetAssigneesNotFound", 404)
+}
+
+func (o *RepoGetAssigneesNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_get_branch_parameters.go b/bots-common/gitea-generated/client/repository/repo_get_branch_parameters.go
new file mode 100644
index 0000000..08ff34f
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_get_branch_parameters.go
@@ -0,0 +1,195 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewRepoGetBranchParams creates a new RepoGetBranchParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoGetBranchParams() *RepoGetBranchParams {
+	return &RepoGetBranchParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoGetBranchParamsWithTimeout creates a new RepoGetBranchParams object
+// with the ability to set a timeout on a request.
+func NewRepoGetBranchParamsWithTimeout(timeout time.Duration) *RepoGetBranchParams {
+	return &RepoGetBranchParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoGetBranchParamsWithContext creates a new RepoGetBranchParams object
+// with the ability to set a context for a request.
+func NewRepoGetBranchParamsWithContext(ctx context.Context) *RepoGetBranchParams {
+	return &RepoGetBranchParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoGetBranchParamsWithHTTPClient creates a new RepoGetBranchParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoGetBranchParamsWithHTTPClient(client *http.Client) *RepoGetBranchParams {
+	return &RepoGetBranchParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoGetBranchParams contains all the parameters to send to the API endpoint
+
+	for the repo get branch operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoGetBranchParams struct {
+
+	/* Branch.
+
+	   branch to get
+	*/
+	Branch string
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo get branch params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoGetBranchParams) WithDefaults() *RepoGetBranchParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo get branch params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoGetBranchParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo get branch params
+func (o *RepoGetBranchParams) WithTimeout(timeout time.Duration) *RepoGetBranchParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo get branch params
+func (o *RepoGetBranchParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo get branch params
+func (o *RepoGetBranchParams) WithContext(ctx context.Context) *RepoGetBranchParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo get branch params
+func (o *RepoGetBranchParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo get branch params
+func (o *RepoGetBranchParams) WithHTTPClient(client *http.Client) *RepoGetBranchParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo get branch params
+func (o *RepoGetBranchParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBranch adds the branch to the repo get branch params
+func (o *RepoGetBranchParams) WithBranch(branch string) *RepoGetBranchParams {
+	o.SetBranch(branch)
+	return o
+}
+
+// SetBranch adds the branch to the repo get branch params
+func (o *RepoGetBranchParams) SetBranch(branch string) {
+	o.Branch = branch
+}
+
+// WithOwner adds the owner to the repo get branch params
+func (o *RepoGetBranchParams) WithOwner(owner string) *RepoGetBranchParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo get branch params
+func (o *RepoGetBranchParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo get branch params
+func (o *RepoGetBranchParams) WithRepo(repo string) *RepoGetBranchParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo get branch params
+func (o *RepoGetBranchParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoGetBranchParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param branch
+	if err := r.SetPathParam("branch", o.Branch); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_get_branch_protection_parameters.go b/bots-common/gitea-generated/client/repository/repo_get_branch_protection_parameters.go
new file mode 100644
index 0000000..4d3e013
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_get_branch_protection_parameters.go
@@ -0,0 +1,195 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewRepoGetBranchProtectionParams creates a new RepoGetBranchProtectionParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoGetBranchProtectionParams() *RepoGetBranchProtectionParams {
+	return &RepoGetBranchProtectionParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoGetBranchProtectionParamsWithTimeout creates a new RepoGetBranchProtectionParams object
+// with the ability to set a timeout on a request.
+func NewRepoGetBranchProtectionParamsWithTimeout(timeout time.Duration) *RepoGetBranchProtectionParams {
+	return &RepoGetBranchProtectionParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoGetBranchProtectionParamsWithContext creates a new RepoGetBranchProtectionParams object
+// with the ability to set a context for a request.
+func NewRepoGetBranchProtectionParamsWithContext(ctx context.Context) *RepoGetBranchProtectionParams {
+	return &RepoGetBranchProtectionParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoGetBranchProtectionParamsWithHTTPClient creates a new RepoGetBranchProtectionParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoGetBranchProtectionParamsWithHTTPClient(client *http.Client) *RepoGetBranchProtectionParams {
+	return &RepoGetBranchProtectionParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoGetBranchProtectionParams contains all the parameters to send to the API endpoint
+
+	for the repo get branch protection operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoGetBranchProtectionParams struct {
+
+	/* Name.
+
+	   name of protected branch
+	*/
+	Name string
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo get branch protection params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoGetBranchProtectionParams) WithDefaults() *RepoGetBranchProtectionParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo get branch protection params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoGetBranchProtectionParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo get branch protection params
+func (o *RepoGetBranchProtectionParams) WithTimeout(timeout time.Duration) *RepoGetBranchProtectionParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo get branch protection params
+func (o *RepoGetBranchProtectionParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo get branch protection params
+func (o *RepoGetBranchProtectionParams) WithContext(ctx context.Context) *RepoGetBranchProtectionParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo get branch protection params
+func (o *RepoGetBranchProtectionParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo get branch protection params
+func (o *RepoGetBranchProtectionParams) WithHTTPClient(client *http.Client) *RepoGetBranchProtectionParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo get branch protection params
+func (o *RepoGetBranchProtectionParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithName adds the name to the repo get branch protection params
+func (o *RepoGetBranchProtectionParams) WithName(name string) *RepoGetBranchProtectionParams {
+	o.SetName(name)
+	return o
+}
+
+// SetName adds the name to the repo get branch protection params
+func (o *RepoGetBranchProtectionParams) SetName(name string) {
+	o.Name = name
+}
+
+// WithOwner adds the owner to the repo get branch protection params
+func (o *RepoGetBranchProtectionParams) WithOwner(owner string) *RepoGetBranchProtectionParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo get branch protection params
+func (o *RepoGetBranchProtectionParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo get branch protection params
+func (o *RepoGetBranchProtectionParams) WithRepo(repo string) *RepoGetBranchProtectionParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo get branch protection params
+func (o *RepoGetBranchProtectionParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoGetBranchProtectionParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param name
+	if err := r.SetPathParam("name", o.Name); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_get_branch_protection_responses.go b/bots-common/gitea-generated/client/repository/repo_get_branch_protection_responses.go
new file mode 100644
index 0000000..2d15608
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_get_branch_protection_responses.go
@@ -0,0 +1,168 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoGetBranchProtectionReader is a Reader for the RepoGetBranchProtection structure.
+type RepoGetBranchProtectionReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoGetBranchProtectionReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoGetBranchProtectionOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoGetBranchProtectionNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/branch_protections/{name}] repoGetBranchProtection", response, response.Code())
+	}
+}
+
+// NewRepoGetBranchProtectionOK creates a RepoGetBranchProtectionOK with default headers values
+func NewRepoGetBranchProtectionOK() *RepoGetBranchProtectionOK {
+	return &RepoGetBranchProtectionOK{}
+}
+
+/*
+RepoGetBranchProtectionOK describes a response with status code 200, with default header values.
+
+BranchProtection
+*/
+type RepoGetBranchProtectionOK struct {
+	Payload *models.BranchProtection
+}
+
+// IsSuccess returns true when this repo get branch protection o k response has a 2xx status code
+func (o *RepoGetBranchProtectionOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo get branch protection o k response has a 3xx status code
+func (o *RepoGetBranchProtectionOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo get branch protection o k response has a 4xx status code
+func (o *RepoGetBranchProtectionOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo get branch protection o k response has a 5xx status code
+func (o *RepoGetBranchProtectionOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo get branch protection o k response a status code equal to that given
+func (o *RepoGetBranchProtectionOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo get branch protection o k response
+func (o *RepoGetBranchProtectionOK) Code() int {
+	return 200
+}
+
+func (o *RepoGetBranchProtectionOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/branch_protections/{name}][%d] repoGetBranchProtectionOK %s", 200, payload)
+}
+
+func (o *RepoGetBranchProtectionOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/branch_protections/{name}][%d] repoGetBranchProtectionOK %s", 200, payload)
+}
+
+func (o *RepoGetBranchProtectionOK) GetPayload() *models.BranchProtection {
+	return o.Payload
+}
+
+func (o *RepoGetBranchProtectionOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.BranchProtection)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoGetBranchProtectionNotFound creates a RepoGetBranchProtectionNotFound with default headers values
+func NewRepoGetBranchProtectionNotFound() *RepoGetBranchProtectionNotFound {
+	return &RepoGetBranchProtectionNotFound{}
+}
+
+/*
+RepoGetBranchProtectionNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoGetBranchProtectionNotFound struct {
+}
+
+// IsSuccess returns true when this repo get branch protection not found response has a 2xx status code
+func (o *RepoGetBranchProtectionNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo get branch protection not found response has a 3xx status code
+func (o *RepoGetBranchProtectionNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo get branch protection not found response has a 4xx status code
+func (o *RepoGetBranchProtectionNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo get branch protection not found response has a 5xx status code
+func (o *RepoGetBranchProtectionNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo get branch protection not found response a status code equal to that given
+func (o *RepoGetBranchProtectionNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo get branch protection not found response
+func (o *RepoGetBranchProtectionNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoGetBranchProtectionNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/branch_protections/{name}][%d] repoGetBranchProtectionNotFound", 404)
+}
+
+func (o *RepoGetBranchProtectionNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/branch_protections/{name}][%d] repoGetBranchProtectionNotFound", 404)
+}
+
+func (o *RepoGetBranchProtectionNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_get_branch_responses.go b/bots-common/gitea-generated/client/repository/repo_get_branch_responses.go
new file mode 100644
index 0000000..da241cc
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_get_branch_responses.go
@@ -0,0 +1,168 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoGetBranchReader is a Reader for the RepoGetBranch structure.
+type RepoGetBranchReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoGetBranchReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoGetBranchOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoGetBranchNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/branches/{branch}] repoGetBranch", response, response.Code())
+	}
+}
+
+// NewRepoGetBranchOK creates a RepoGetBranchOK with default headers values
+func NewRepoGetBranchOK() *RepoGetBranchOK {
+	return &RepoGetBranchOK{}
+}
+
+/*
+RepoGetBranchOK describes a response with status code 200, with default header values.
+
+Branch
+*/
+type RepoGetBranchOK struct {
+	Payload *models.Branch
+}
+
+// IsSuccess returns true when this repo get branch o k response has a 2xx status code
+func (o *RepoGetBranchOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo get branch o k response has a 3xx status code
+func (o *RepoGetBranchOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo get branch o k response has a 4xx status code
+func (o *RepoGetBranchOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo get branch o k response has a 5xx status code
+func (o *RepoGetBranchOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo get branch o k response a status code equal to that given
+func (o *RepoGetBranchOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo get branch o k response
+func (o *RepoGetBranchOK) Code() int {
+	return 200
+}
+
+func (o *RepoGetBranchOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/branches/{branch}][%d] repoGetBranchOK %s", 200, payload)
+}
+
+func (o *RepoGetBranchOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/branches/{branch}][%d] repoGetBranchOK %s", 200, payload)
+}
+
+func (o *RepoGetBranchOK) GetPayload() *models.Branch {
+	return o.Payload
+}
+
+func (o *RepoGetBranchOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.Branch)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoGetBranchNotFound creates a RepoGetBranchNotFound with default headers values
+func NewRepoGetBranchNotFound() *RepoGetBranchNotFound {
+	return &RepoGetBranchNotFound{}
+}
+
+/*
+RepoGetBranchNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoGetBranchNotFound struct {
+}
+
+// IsSuccess returns true when this repo get branch not found response has a 2xx status code
+func (o *RepoGetBranchNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo get branch not found response has a 3xx status code
+func (o *RepoGetBranchNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo get branch not found response has a 4xx status code
+func (o *RepoGetBranchNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo get branch not found response has a 5xx status code
+func (o *RepoGetBranchNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo get branch not found response a status code equal to that given
+func (o *RepoGetBranchNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo get branch not found response
+func (o *RepoGetBranchNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoGetBranchNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/branches/{branch}][%d] repoGetBranchNotFound", 404)
+}
+
+func (o *RepoGetBranchNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/branches/{branch}][%d] repoGetBranchNotFound", 404)
+}
+
+func (o *RepoGetBranchNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_get_by_id_parameters.go b/bots-common/gitea-generated/client/repository/repo_get_by_id_parameters.go
new file mode 100644
index 0000000..3f00a30
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_get_by_id_parameters.go
@@ -0,0 +1,154 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewRepoGetByIDParams creates a new RepoGetByIDParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoGetByIDParams() *RepoGetByIDParams {
+	return &RepoGetByIDParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoGetByIDParamsWithTimeout creates a new RepoGetByIDParams object
+// with the ability to set a timeout on a request.
+func NewRepoGetByIDParamsWithTimeout(timeout time.Duration) *RepoGetByIDParams {
+	return &RepoGetByIDParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoGetByIDParamsWithContext creates a new RepoGetByIDParams object
+// with the ability to set a context for a request.
+func NewRepoGetByIDParamsWithContext(ctx context.Context) *RepoGetByIDParams {
+	return &RepoGetByIDParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoGetByIDParamsWithHTTPClient creates a new RepoGetByIDParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoGetByIDParamsWithHTTPClient(client *http.Client) *RepoGetByIDParams {
+	return &RepoGetByIDParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoGetByIDParams contains all the parameters to send to the API endpoint
+
+	for the repo get by ID operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoGetByIDParams struct {
+
+	/* ID.
+
+	   id of the repo to get
+
+	   Format: int64
+	*/
+	ID int64
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo get by ID params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoGetByIDParams) WithDefaults() *RepoGetByIDParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo get by ID params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoGetByIDParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo get by ID params
+func (o *RepoGetByIDParams) WithTimeout(timeout time.Duration) *RepoGetByIDParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo get by ID params
+func (o *RepoGetByIDParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo get by ID params
+func (o *RepoGetByIDParams) WithContext(ctx context.Context) *RepoGetByIDParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo get by ID params
+func (o *RepoGetByIDParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo get by ID params
+func (o *RepoGetByIDParams) WithHTTPClient(client *http.Client) *RepoGetByIDParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo get by ID params
+func (o *RepoGetByIDParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithID adds the id to the repo get by ID params
+func (o *RepoGetByIDParams) WithID(id int64) *RepoGetByIDParams {
+	o.SetID(id)
+	return o
+}
+
+// SetID adds the id to the repo get by ID params
+func (o *RepoGetByIDParams) SetID(id int64) {
+	o.ID = id
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoGetByIDParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param id
+	if err := r.SetPathParam("id", swag.FormatInt64(o.ID)); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_get_by_id_responses.go b/bots-common/gitea-generated/client/repository/repo_get_by_id_responses.go
new file mode 100644
index 0000000..b62fcf1
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_get_by_id_responses.go
@@ -0,0 +1,168 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoGetByIDReader is a Reader for the RepoGetByID structure.
+type RepoGetByIDReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoGetByIDReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoGetByIDOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoGetByIDNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repositories/{id}] repoGetByID", response, response.Code())
+	}
+}
+
+// NewRepoGetByIDOK creates a RepoGetByIDOK with default headers values
+func NewRepoGetByIDOK() *RepoGetByIDOK {
+	return &RepoGetByIDOK{}
+}
+
+/*
+RepoGetByIDOK describes a response with status code 200, with default header values.
+
+Repository
+*/
+type RepoGetByIDOK struct {
+	Payload *models.Repository
+}
+
+// IsSuccess returns true when this repo get by Id o k response has a 2xx status code
+func (o *RepoGetByIDOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo get by Id o k response has a 3xx status code
+func (o *RepoGetByIDOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo get by Id o k response has a 4xx status code
+func (o *RepoGetByIDOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo get by Id o k response has a 5xx status code
+func (o *RepoGetByIDOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo get by Id o k response a status code equal to that given
+func (o *RepoGetByIDOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo get by Id o k response
+func (o *RepoGetByIDOK) Code() int {
+	return 200
+}
+
+func (o *RepoGetByIDOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repositories/{id}][%d] repoGetByIdOK %s", 200, payload)
+}
+
+func (o *RepoGetByIDOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repositories/{id}][%d] repoGetByIdOK %s", 200, payload)
+}
+
+func (o *RepoGetByIDOK) GetPayload() *models.Repository {
+	return o.Payload
+}
+
+func (o *RepoGetByIDOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.Repository)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoGetByIDNotFound creates a RepoGetByIDNotFound with default headers values
+func NewRepoGetByIDNotFound() *RepoGetByIDNotFound {
+	return &RepoGetByIDNotFound{}
+}
+
+/*
+RepoGetByIDNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoGetByIDNotFound struct {
+}
+
+// IsSuccess returns true when this repo get by Id not found response has a 2xx status code
+func (o *RepoGetByIDNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo get by Id not found response has a 3xx status code
+func (o *RepoGetByIDNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo get by Id not found response has a 4xx status code
+func (o *RepoGetByIDNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo get by Id not found response has a 5xx status code
+func (o *RepoGetByIDNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo get by Id not found response a status code equal to that given
+func (o *RepoGetByIDNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo get by Id not found response
+func (o *RepoGetByIDNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoGetByIDNotFound) Error() string {
+	return fmt.Sprintf("[GET /repositories/{id}][%d] repoGetByIdNotFound", 404)
+}
+
+func (o *RepoGetByIDNotFound) String() string {
+	return fmt.Sprintf("[GET /repositories/{id}][%d] repoGetByIdNotFound", 404)
+}
+
+func (o *RepoGetByIDNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_get_combined_status_by_ref_parameters.go b/bots-common/gitea-generated/client/repository/repo_get_combined_status_by_ref_parameters.go
new file mode 100644
index 0000000..3889bd3
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_get_combined_status_by_ref_parameters.go
@@ -0,0 +1,264 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewRepoGetCombinedStatusByRefParams creates a new RepoGetCombinedStatusByRefParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoGetCombinedStatusByRefParams() *RepoGetCombinedStatusByRefParams {
+	return &RepoGetCombinedStatusByRefParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoGetCombinedStatusByRefParamsWithTimeout creates a new RepoGetCombinedStatusByRefParams object
+// with the ability to set a timeout on a request.
+func NewRepoGetCombinedStatusByRefParamsWithTimeout(timeout time.Duration) *RepoGetCombinedStatusByRefParams {
+	return &RepoGetCombinedStatusByRefParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoGetCombinedStatusByRefParamsWithContext creates a new RepoGetCombinedStatusByRefParams object
+// with the ability to set a context for a request.
+func NewRepoGetCombinedStatusByRefParamsWithContext(ctx context.Context) *RepoGetCombinedStatusByRefParams {
+	return &RepoGetCombinedStatusByRefParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoGetCombinedStatusByRefParamsWithHTTPClient creates a new RepoGetCombinedStatusByRefParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoGetCombinedStatusByRefParamsWithHTTPClient(client *http.Client) *RepoGetCombinedStatusByRefParams {
+	return &RepoGetCombinedStatusByRefParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoGetCombinedStatusByRefParams contains all the parameters to send to the API endpoint
+
+	for the repo get combined status by ref operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoGetCombinedStatusByRefParams struct {
+
+	/* Limit.
+
+	   page size of results
+	*/
+	Limit *int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Page.
+
+	   page number of results to return (1-based)
+	*/
+	Page *int64
+
+	/* Ref.
+
+	   name of branch/tag/commit
+	*/
+	Ref string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo get combined status by ref params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoGetCombinedStatusByRefParams) WithDefaults() *RepoGetCombinedStatusByRefParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo get combined status by ref params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoGetCombinedStatusByRefParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo get combined status by ref params
+func (o *RepoGetCombinedStatusByRefParams) WithTimeout(timeout time.Duration) *RepoGetCombinedStatusByRefParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo get combined status by ref params
+func (o *RepoGetCombinedStatusByRefParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo get combined status by ref params
+func (o *RepoGetCombinedStatusByRefParams) WithContext(ctx context.Context) *RepoGetCombinedStatusByRefParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo get combined status by ref params
+func (o *RepoGetCombinedStatusByRefParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo get combined status by ref params
+func (o *RepoGetCombinedStatusByRefParams) WithHTTPClient(client *http.Client) *RepoGetCombinedStatusByRefParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo get combined status by ref params
+func (o *RepoGetCombinedStatusByRefParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithLimit adds the limit to the repo get combined status by ref params
+func (o *RepoGetCombinedStatusByRefParams) WithLimit(limit *int64) *RepoGetCombinedStatusByRefParams {
+	o.SetLimit(limit)
+	return o
+}
+
+// SetLimit adds the limit to the repo get combined status by ref params
+func (o *RepoGetCombinedStatusByRefParams) SetLimit(limit *int64) {
+	o.Limit = limit
+}
+
+// WithOwner adds the owner to the repo get combined status by ref params
+func (o *RepoGetCombinedStatusByRefParams) WithOwner(owner string) *RepoGetCombinedStatusByRefParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo get combined status by ref params
+func (o *RepoGetCombinedStatusByRefParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithPage adds the page to the repo get combined status by ref params
+func (o *RepoGetCombinedStatusByRefParams) WithPage(page *int64) *RepoGetCombinedStatusByRefParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the repo get combined status by ref params
+func (o *RepoGetCombinedStatusByRefParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WithRef adds the ref to the repo get combined status by ref params
+func (o *RepoGetCombinedStatusByRefParams) WithRef(ref string) *RepoGetCombinedStatusByRefParams {
+	o.SetRef(ref)
+	return o
+}
+
+// SetRef adds the ref to the repo get combined status by ref params
+func (o *RepoGetCombinedStatusByRefParams) SetRef(ref string) {
+	o.Ref = ref
+}
+
+// WithRepo adds the repo to the repo get combined status by ref params
+func (o *RepoGetCombinedStatusByRefParams) WithRepo(repo string) *RepoGetCombinedStatusByRefParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo get combined status by ref params
+func (o *RepoGetCombinedStatusByRefParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoGetCombinedStatusByRefParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.Limit != nil {
+
+		// query param limit
+		var qrLimit int64
+
+		if o.Limit != nil {
+			qrLimit = *o.Limit
+		}
+		qLimit := swag.FormatInt64(qrLimit)
+		if qLimit != "" {
+
+			if err := r.SetQueryParam("limit", qLimit); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param ref
+	if err := r.SetPathParam("ref", o.Ref); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_get_combined_status_by_ref_responses.go b/bots-common/gitea-generated/client/repository/repo_get_combined_status_by_ref_responses.go
new file mode 100644
index 0000000..a2c9f6e
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_get_combined_status_by_ref_responses.go
@@ -0,0 +1,246 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoGetCombinedStatusByRefReader is a Reader for the RepoGetCombinedStatusByRef structure.
+type RepoGetCombinedStatusByRefReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoGetCombinedStatusByRefReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoGetCombinedStatusByRefOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 400:
+		result := NewRepoGetCombinedStatusByRefBadRequest()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewRepoGetCombinedStatusByRefNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/commits/{ref}/status] repoGetCombinedStatusByRef", response, response.Code())
+	}
+}
+
+// NewRepoGetCombinedStatusByRefOK creates a RepoGetCombinedStatusByRefOK with default headers values
+func NewRepoGetCombinedStatusByRefOK() *RepoGetCombinedStatusByRefOK {
+	return &RepoGetCombinedStatusByRefOK{}
+}
+
+/*
+RepoGetCombinedStatusByRefOK describes a response with status code 200, with default header values.
+
+CombinedStatus
+*/
+type RepoGetCombinedStatusByRefOK struct {
+	Payload *models.CombinedStatus
+}
+
+// IsSuccess returns true when this repo get combined status by ref o k response has a 2xx status code
+func (o *RepoGetCombinedStatusByRefOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo get combined status by ref o k response has a 3xx status code
+func (o *RepoGetCombinedStatusByRefOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo get combined status by ref o k response has a 4xx status code
+func (o *RepoGetCombinedStatusByRefOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo get combined status by ref o k response has a 5xx status code
+func (o *RepoGetCombinedStatusByRefOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo get combined status by ref o k response a status code equal to that given
+func (o *RepoGetCombinedStatusByRefOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo get combined status by ref o k response
+func (o *RepoGetCombinedStatusByRefOK) Code() int {
+	return 200
+}
+
+func (o *RepoGetCombinedStatusByRefOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/commits/{ref}/status][%d] repoGetCombinedStatusByRefOK %s", 200, payload)
+}
+
+func (o *RepoGetCombinedStatusByRefOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/commits/{ref}/status][%d] repoGetCombinedStatusByRefOK %s", 200, payload)
+}
+
+func (o *RepoGetCombinedStatusByRefOK) GetPayload() *models.CombinedStatus {
+	return o.Payload
+}
+
+func (o *RepoGetCombinedStatusByRefOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.CombinedStatus)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoGetCombinedStatusByRefBadRequest creates a RepoGetCombinedStatusByRefBadRequest with default headers values
+func NewRepoGetCombinedStatusByRefBadRequest() *RepoGetCombinedStatusByRefBadRequest {
+	return &RepoGetCombinedStatusByRefBadRequest{}
+}
+
+/*
+RepoGetCombinedStatusByRefBadRequest describes a response with status code 400, with default header values.
+
+APIError is error format response
+*/
+type RepoGetCombinedStatusByRefBadRequest struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo get combined status by ref bad request response has a 2xx status code
+func (o *RepoGetCombinedStatusByRefBadRequest) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo get combined status by ref bad request response has a 3xx status code
+func (o *RepoGetCombinedStatusByRefBadRequest) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo get combined status by ref bad request response has a 4xx status code
+func (o *RepoGetCombinedStatusByRefBadRequest) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo get combined status by ref bad request response has a 5xx status code
+func (o *RepoGetCombinedStatusByRefBadRequest) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo get combined status by ref bad request response a status code equal to that given
+func (o *RepoGetCombinedStatusByRefBadRequest) IsCode(code int) bool {
+	return code == 400
+}
+
+// Code gets the status code for the repo get combined status by ref bad request response
+func (o *RepoGetCombinedStatusByRefBadRequest) Code() int {
+	return 400
+}
+
+func (o *RepoGetCombinedStatusByRefBadRequest) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/commits/{ref}/status][%d] repoGetCombinedStatusByRefBadRequest", 400)
+}
+
+func (o *RepoGetCombinedStatusByRefBadRequest) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/commits/{ref}/status][%d] repoGetCombinedStatusByRefBadRequest", 400)
+}
+
+func (o *RepoGetCombinedStatusByRefBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewRepoGetCombinedStatusByRefNotFound creates a RepoGetCombinedStatusByRefNotFound with default headers values
+func NewRepoGetCombinedStatusByRefNotFound() *RepoGetCombinedStatusByRefNotFound {
+	return &RepoGetCombinedStatusByRefNotFound{}
+}
+
+/*
+RepoGetCombinedStatusByRefNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoGetCombinedStatusByRefNotFound struct {
+}
+
+// IsSuccess returns true when this repo get combined status by ref not found response has a 2xx status code
+func (o *RepoGetCombinedStatusByRefNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo get combined status by ref not found response has a 3xx status code
+func (o *RepoGetCombinedStatusByRefNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo get combined status by ref not found response has a 4xx status code
+func (o *RepoGetCombinedStatusByRefNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo get combined status by ref not found response has a 5xx status code
+func (o *RepoGetCombinedStatusByRefNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo get combined status by ref not found response a status code equal to that given
+func (o *RepoGetCombinedStatusByRefNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo get combined status by ref not found response
+func (o *RepoGetCombinedStatusByRefNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoGetCombinedStatusByRefNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/commits/{ref}/status][%d] repoGetCombinedStatusByRefNotFound", 404)
+}
+
+func (o *RepoGetCombinedStatusByRefNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/commits/{ref}/status][%d] repoGetCombinedStatusByRefNotFound", 404)
+}
+
+func (o *RepoGetCombinedStatusByRefNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_get_commit_pull_request_parameters.go b/bots-common/gitea-generated/client/repository/repo_get_commit_pull_request_parameters.go
new file mode 100644
index 0000000..7d6cfca
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_get_commit_pull_request_parameters.go
@@ -0,0 +1,195 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewRepoGetCommitPullRequestParams creates a new RepoGetCommitPullRequestParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoGetCommitPullRequestParams() *RepoGetCommitPullRequestParams {
+	return &RepoGetCommitPullRequestParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoGetCommitPullRequestParamsWithTimeout creates a new RepoGetCommitPullRequestParams object
+// with the ability to set a timeout on a request.
+func NewRepoGetCommitPullRequestParamsWithTimeout(timeout time.Duration) *RepoGetCommitPullRequestParams {
+	return &RepoGetCommitPullRequestParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoGetCommitPullRequestParamsWithContext creates a new RepoGetCommitPullRequestParams object
+// with the ability to set a context for a request.
+func NewRepoGetCommitPullRequestParamsWithContext(ctx context.Context) *RepoGetCommitPullRequestParams {
+	return &RepoGetCommitPullRequestParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoGetCommitPullRequestParamsWithHTTPClient creates a new RepoGetCommitPullRequestParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoGetCommitPullRequestParamsWithHTTPClient(client *http.Client) *RepoGetCommitPullRequestParams {
+	return &RepoGetCommitPullRequestParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoGetCommitPullRequestParams contains all the parameters to send to the API endpoint
+
+	for the repo get commit pull request operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoGetCommitPullRequestParams struct {
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	/* Sha.
+
+	   SHA of the commit to get
+	*/
+	Sha string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo get commit pull request params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoGetCommitPullRequestParams) WithDefaults() *RepoGetCommitPullRequestParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo get commit pull request params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoGetCommitPullRequestParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo get commit pull request params
+func (o *RepoGetCommitPullRequestParams) WithTimeout(timeout time.Duration) *RepoGetCommitPullRequestParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo get commit pull request params
+func (o *RepoGetCommitPullRequestParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo get commit pull request params
+func (o *RepoGetCommitPullRequestParams) WithContext(ctx context.Context) *RepoGetCommitPullRequestParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo get commit pull request params
+func (o *RepoGetCommitPullRequestParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo get commit pull request params
+func (o *RepoGetCommitPullRequestParams) WithHTTPClient(client *http.Client) *RepoGetCommitPullRequestParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo get commit pull request params
+func (o *RepoGetCommitPullRequestParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithOwner adds the owner to the repo get commit pull request params
+func (o *RepoGetCommitPullRequestParams) WithOwner(owner string) *RepoGetCommitPullRequestParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo get commit pull request params
+func (o *RepoGetCommitPullRequestParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo get commit pull request params
+func (o *RepoGetCommitPullRequestParams) WithRepo(repo string) *RepoGetCommitPullRequestParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo get commit pull request params
+func (o *RepoGetCommitPullRequestParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WithSha adds the sha to the repo get commit pull request params
+func (o *RepoGetCommitPullRequestParams) WithSha(sha string) *RepoGetCommitPullRequestParams {
+	o.SetSha(sha)
+	return o
+}
+
+// SetSha adds the sha to the repo get commit pull request params
+func (o *RepoGetCommitPullRequestParams) SetSha(sha string) {
+	o.Sha = sha
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoGetCommitPullRequestParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	// path param sha
+	if err := r.SetPathParam("sha", o.Sha); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_get_commit_pull_request_responses.go b/bots-common/gitea-generated/client/repository/repo_get_commit_pull_request_responses.go
new file mode 100644
index 0000000..2299e4d
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_get_commit_pull_request_responses.go
@@ -0,0 +1,168 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoGetCommitPullRequestReader is a Reader for the RepoGetCommitPullRequest structure.
+type RepoGetCommitPullRequestReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoGetCommitPullRequestReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoGetCommitPullRequestOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoGetCommitPullRequestNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/commits/{sha}/pull] repoGetCommitPullRequest", response, response.Code())
+	}
+}
+
+// NewRepoGetCommitPullRequestOK creates a RepoGetCommitPullRequestOK with default headers values
+func NewRepoGetCommitPullRequestOK() *RepoGetCommitPullRequestOK {
+	return &RepoGetCommitPullRequestOK{}
+}
+
+/*
+RepoGetCommitPullRequestOK describes a response with status code 200, with default header values.
+
+PullRequest
+*/
+type RepoGetCommitPullRequestOK struct {
+	Payload *models.PullRequest
+}
+
+// IsSuccess returns true when this repo get commit pull request o k response has a 2xx status code
+func (o *RepoGetCommitPullRequestOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo get commit pull request o k response has a 3xx status code
+func (o *RepoGetCommitPullRequestOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo get commit pull request o k response has a 4xx status code
+func (o *RepoGetCommitPullRequestOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo get commit pull request o k response has a 5xx status code
+func (o *RepoGetCommitPullRequestOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo get commit pull request o k response a status code equal to that given
+func (o *RepoGetCommitPullRequestOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo get commit pull request o k response
+func (o *RepoGetCommitPullRequestOK) Code() int {
+	return 200
+}
+
+func (o *RepoGetCommitPullRequestOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/commits/{sha}/pull][%d] repoGetCommitPullRequestOK %s", 200, payload)
+}
+
+func (o *RepoGetCommitPullRequestOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/commits/{sha}/pull][%d] repoGetCommitPullRequestOK %s", 200, payload)
+}
+
+func (o *RepoGetCommitPullRequestOK) GetPayload() *models.PullRequest {
+	return o.Payload
+}
+
+func (o *RepoGetCommitPullRequestOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.PullRequest)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoGetCommitPullRequestNotFound creates a RepoGetCommitPullRequestNotFound with default headers values
+func NewRepoGetCommitPullRequestNotFound() *RepoGetCommitPullRequestNotFound {
+	return &RepoGetCommitPullRequestNotFound{}
+}
+
+/*
+RepoGetCommitPullRequestNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoGetCommitPullRequestNotFound struct {
+}
+
+// IsSuccess returns true when this repo get commit pull request not found response has a 2xx status code
+func (o *RepoGetCommitPullRequestNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo get commit pull request not found response has a 3xx status code
+func (o *RepoGetCommitPullRequestNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo get commit pull request not found response has a 4xx status code
+func (o *RepoGetCommitPullRequestNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo get commit pull request not found response has a 5xx status code
+func (o *RepoGetCommitPullRequestNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo get commit pull request not found response a status code equal to that given
+func (o *RepoGetCommitPullRequestNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo get commit pull request not found response
+func (o *RepoGetCommitPullRequestNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoGetCommitPullRequestNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/commits/{sha}/pull][%d] repoGetCommitPullRequestNotFound", 404)
+}
+
+func (o *RepoGetCommitPullRequestNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/commits/{sha}/pull][%d] repoGetCommitPullRequestNotFound", 404)
+}
+
+func (o *RepoGetCommitPullRequestNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_get_contents_list_parameters.go b/bots-common/gitea-generated/client/repository/repo_get_contents_list_parameters.go
new file mode 100644
index 0000000..a117549
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_get_contents_list_parameters.go
@@ -0,0 +1,207 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewRepoGetContentsListParams creates a new RepoGetContentsListParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoGetContentsListParams() *RepoGetContentsListParams {
+	return &RepoGetContentsListParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoGetContentsListParamsWithTimeout creates a new RepoGetContentsListParams object
+// with the ability to set a timeout on a request.
+func NewRepoGetContentsListParamsWithTimeout(timeout time.Duration) *RepoGetContentsListParams {
+	return &RepoGetContentsListParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoGetContentsListParamsWithContext creates a new RepoGetContentsListParams object
+// with the ability to set a context for a request.
+func NewRepoGetContentsListParamsWithContext(ctx context.Context) *RepoGetContentsListParams {
+	return &RepoGetContentsListParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoGetContentsListParamsWithHTTPClient creates a new RepoGetContentsListParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoGetContentsListParamsWithHTTPClient(client *http.Client) *RepoGetContentsListParams {
+	return &RepoGetContentsListParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoGetContentsListParams contains all the parameters to send to the API endpoint
+
+	for the repo get contents list operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoGetContentsListParams struct {
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Ref.
+
+	   The name of the commit/branch/tag. Default the repository’s default branch (usually master)
+	*/
+	Ref *string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo get contents list params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoGetContentsListParams) WithDefaults() *RepoGetContentsListParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo get contents list params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoGetContentsListParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo get contents list params
+func (o *RepoGetContentsListParams) WithTimeout(timeout time.Duration) *RepoGetContentsListParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo get contents list params
+func (o *RepoGetContentsListParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo get contents list params
+func (o *RepoGetContentsListParams) WithContext(ctx context.Context) *RepoGetContentsListParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo get contents list params
+func (o *RepoGetContentsListParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo get contents list params
+func (o *RepoGetContentsListParams) WithHTTPClient(client *http.Client) *RepoGetContentsListParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo get contents list params
+func (o *RepoGetContentsListParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithOwner adds the owner to the repo get contents list params
+func (o *RepoGetContentsListParams) WithOwner(owner string) *RepoGetContentsListParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo get contents list params
+func (o *RepoGetContentsListParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRef adds the ref to the repo get contents list params
+func (o *RepoGetContentsListParams) WithRef(ref *string) *RepoGetContentsListParams {
+	o.SetRef(ref)
+	return o
+}
+
+// SetRef adds the ref to the repo get contents list params
+func (o *RepoGetContentsListParams) SetRef(ref *string) {
+	o.Ref = ref
+}
+
+// WithRepo adds the repo to the repo get contents list params
+func (o *RepoGetContentsListParams) WithRepo(repo string) *RepoGetContentsListParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo get contents list params
+func (o *RepoGetContentsListParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoGetContentsListParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	if o.Ref != nil {
+
+		// query param ref
+		var qrRef string
+
+		if o.Ref != nil {
+			qrRef = *o.Ref
+		}
+		qRef := qrRef
+		if qRef != "" {
+
+			if err := r.SetQueryParam("ref", qRef); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_get_contents_list_responses.go b/bots-common/gitea-generated/client/repository/repo_get_contents_list_responses.go
new file mode 100644
index 0000000..8f5c936
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_get_contents_list_responses.go
@@ -0,0 +1,166 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoGetContentsListReader is a Reader for the RepoGetContentsList structure.
+type RepoGetContentsListReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoGetContentsListReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoGetContentsListOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoGetContentsListNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/contents] repoGetContentsList", response, response.Code())
+	}
+}
+
+// NewRepoGetContentsListOK creates a RepoGetContentsListOK with default headers values
+func NewRepoGetContentsListOK() *RepoGetContentsListOK {
+	return &RepoGetContentsListOK{}
+}
+
+/*
+RepoGetContentsListOK describes a response with status code 200, with default header values.
+
+ContentsListResponse
+*/
+type RepoGetContentsListOK struct {
+	Payload []*models.ContentsResponse
+}
+
+// IsSuccess returns true when this repo get contents list o k response has a 2xx status code
+func (o *RepoGetContentsListOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo get contents list o k response has a 3xx status code
+func (o *RepoGetContentsListOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo get contents list o k response has a 4xx status code
+func (o *RepoGetContentsListOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo get contents list o k response has a 5xx status code
+func (o *RepoGetContentsListOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo get contents list o k response a status code equal to that given
+func (o *RepoGetContentsListOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo get contents list o k response
+func (o *RepoGetContentsListOK) Code() int {
+	return 200
+}
+
+func (o *RepoGetContentsListOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/contents][%d] repoGetContentsListOK %s", 200, payload)
+}
+
+func (o *RepoGetContentsListOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/contents][%d] repoGetContentsListOK %s", 200, payload)
+}
+
+func (o *RepoGetContentsListOK) GetPayload() []*models.ContentsResponse {
+	return o.Payload
+}
+
+func (o *RepoGetContentsListOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoGetContentsListNotFound creates a RepoGetContentsListNotFound with default headers values
+func NewRepoGetContentsListNotFound() *RepoGetContentsListNotFound {
+	return &RepoGetContentsListNotFound{}
+}
+
+/*
+RepoGetContentsListNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoGetContentsListNotFound struct {
+}
+
+// IsSuccess returns true when this repo get contents list not found response has a 2xx status code
+func (o *RepoGetContentsListNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo get contents list not found response has a 3xx status code
+func (o *RepoGetContentsListNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo get contents list not found response has a 4xx status code
+func (o *RepoGetContentsListNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo get contents list not found response has a 5xx status code
+func (o *RepoGetContentsListNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo get contents list not found response a status code equal to that given
+func (o *RepoGetContentsListNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo get contents list not found response
+func (o *RepoGetContentsListNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoGetContentsListNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/contents][%d] repoGetContentsListNotFound", 404)
+}
+
+func (o *RepoGetContentsListNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/contents][%d] repoGetContentsListNotFound", 404)
+}
+
+func (o *RepoGetContentsListNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_get_contents_parameters.go b/bots-common/gitea-generated/client/repository/repo_get_contents_parameters.go
new file mode 100644
index 0000000..71acdba
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_get_contents_parameters.go
@@ -0,0 +1,229 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewRepoGetContentsParams creates a new RepoGetContentsParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoGetContentsParams() *RepoGetContentsParams {
+	return &RepoGetContentsParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoGetContentsParamsWithTimeout creates a new RepoGetContentsParams object
+// with the ability to set a timeout on a request.
+func NewRepoGetContentsParamsWithTimeout(timeout time.Duration) *RepoGetContentsParams {
+	return &RepoGetContentsParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoGetContentsParamsWithContext creates a new RepoGetContentsParams object
+// with the ability to set a context for a request.
+func NewRepoGetContentsParamsWithContext(ctx context.Context) *RepoGetContentsParams {
+	return &RepoGetContentsParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoGetContentsParamsWithHTTPClient creates a new RepoGetContentsParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoGetContentsParamsWithHTTPClient(client *http.Client) *RepoGetContentsParams {
+	return &RepoGetContentsParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoGetContentsParams contains all the parameters to send to the API endpoint
+
+	for the repo get contents operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoGetContentsParams struct {
+
+	/* Filepath.
+
+	   path of the dir, file, symlink or submodule in the repo
+	*/
+	Filepath string
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Ref.
+
+	   The name of the commit/branch/tag. Default the repository’s default branch (usually master)
+	*/
+	Ref *string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo get contents params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoGetContentsParams) WithDefaults() *RepoGetContentsParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo get contents params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoGetContentsParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo get contents params
+func (o *RepoGetContentsParams) WithTimeout(timeout time.Duration) *RepoGetContentsParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo get contents params
+func (o *RepoGetContentsParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo get contents params
+func (o *RepoGetContentsParams) WithContext(ctx context.Context) *RepoGetContentsParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo get contents params
+func (o *RepoGetContentsParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo get contents params
+func (o *RepoGetContentsParams) WithHTTPClient(client *http.Client) *RepoGetContentsParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo get contents params
+func (o *RepoGetContentsParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithFilepath adds the filepath to the repo get contents params
+func (o *RepoGetContentsParams) WithFilepath(filepath string) *RepoGetContentsParams {
+	o.SetFilepath(filepath)
+	return o
+}
+
+// SetFilepath adds the filepath to the repo get contents params
+func (o *RepoGetContentsParams) SetFilepath(filepath string) {
+	o.Filepath = filepath
+}
+
+// WithOwner adds the owner to the repo get contents params
+func (o *RepoGetContentsParams) WithOwner(owner string) *RepoGetContentsParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo get contents params
+func (o *RepoGetContentsParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRef adds the ref to the repo get contents params
+func (o *RepoGetContentsParams) WithRef(ref *string) *RepoGetContentsParams {
+	o.SetRef(ref)
+	return o
+}
+
+// SetRef adds the ref to the repo get contents params
+func (o *RepoGetContentsParams) SetRef(ref *string) {
+	o.Ref = ref
+}
+
+// WithRepo adds the repo to the repo get contents params
+func (o *RepoGetContentsParams) WithRepo(repo string) *RepoGetContentsParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo get contents params
+func (o *RepoGetContentsParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoGetContentsParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param filepath
+	if err := r.SetPathParam("filepath", o.Filepath); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	if o.Ref != nil {
+
+		// query param ref
+		var qrRef string
+
+		if o.Ref != nil {
+			qrRef = *o.Ref
+		}
+		qRef := qrRef
+		if qRef != "" {
+
+			if err := r.SetQueryParam("ref", qRef); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_get_contents_responses.go b/bots-common/gitea-generated/client/repository/repo_get_contents_responses.go
new file mode 100644
index 0000000..da73f06
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_get_contents_responses.go
@@ -0,0 +1,168 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoGetContentsReader is a Reader for the RepoGetContents structure.
+type RepoGetContentsReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoGetContentsReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoGetContentsOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoGetContentsNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/contents/{filepath}] repoGetContents", response, response.Code())
+	}
+}
+
+// NewRepoGetContentsOK creates a RepoGetContentsOK with default headers values
+func NewRepoGetContentsOK() *RepoGetContentsOK {
+	return &RepoGetContentsOK{}
+}
+
+/*
+RepoGetContentsOK describes a response with status code 200, with default header values.
+
+ContentsResponse
+*/
+type RepoGetContentsOK struct {
+	Payload *models.ContentsResponse
+}
+
+// IsSuccess returns true when this repo get contents o k response has a 2xx status code
+func (o *RepoGetContentsOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo get contents o k response has a 3xx status code
+func (o *RepoGetContentsOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo get contents o k response has a 4xx status code
+func (o *RepoGetContentsOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo get contents o k response has a 5xx status code
+func (o *RepoGetContentsOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo get contents o k response a status code equal to that given
+func (o *RepoGetContentsOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo get contents o k response
+func (o *RepoGetContentsOK) Code() int {
+	return 200
+}
+
+func (o *RepoGetContentsOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/contents/{filepath}][%d] repoGetContentsOK %s", 200, payload)
+}
+
+func (o *RepoGetContentsOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/contents/{filepath}][%d] repoGetContentsOK %s", 200, payload)
+}
+
+func (o *RepoGetContentsOK) GetPayload() *models.ContentsResponse {
+	return o.Payload
+}
+
+func (o *RepoGetContentsOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.ContentsResponse)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoGetContentsNotFound creates a RepoGetContentsNotFound with default headers values
+func NewRepoGetContentsNotFound() *RepoGetContentsNotFound {
+	return &RepoGetContentsNotFound{}
+}
+
+/*
+RepoGetContentsNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoGetContentsNotFound struct {
+}
+
+// IsSuccess returns true when this repo get contents not found response has a 2xx status code
+func (o *RepoGetContentsNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo get contents not found response has a 3xx status code
+func (o *RepoGetContentsNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo get contents not found response has a 4xx status code
+func (o *RepoGetContentsNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo get contents not found response has a 5xx status code
+func (o *RepoGetContentsNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo get contents not found response a status code equal to that given
+func (o *RepoGetContentsNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo get contents not found response
+func (o *RepoGetContentsNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoGetContentsNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/contents/{filepath}][%d] repoGetContentsNotFound", 404)
+}
+
+func (o *RepoGetContentsNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/contents/{filepath}][%d] repoGetContentsNotFound", 404)
+}
+
+func (o *RepoGetContentsNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_get_editor_config_parameters.go b/bots-common/gitea-generated/client/repository/repo_get_editor_config_parameters.go
new file mode 100644
index 0000000..792c9ce
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_get_editor_config_parameters.go
@@ -0,0 +1,229 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewRepoGetEditorConfigParams creates a new RepoGetEditorConfigParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoGetEditorConfigParams() *RepoGetEditorConfigParams {
+	return &RepoGetEditorConfigParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoGetEditorConfigParamsWithTimeout creates a new RepoGetEditorConfigParams object
+// with the ability to set a timeout on a request.
+func NewRepoGetEditorConfigParamsWithTimeout(timeout time.Duration) *RepoGetEditorConfigParams {
+	return &RepoGetEditorConfigParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoGetEditorConfigParamsWithContext creates a new RepoGetEditorConfigParams object
+// with the ability to set a context for a request.
+func NewRepoGetEditorConfigParamsWithContext(ctx context.Context) *RepoGetEditorConfigParams {
+	return &RepoGetEditorConfigParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoGetEditorConfigParamsWithHTTPClient creates a new RepoGetEditorConfigParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoGetEditorConfigParamsWithHTTPClient(client *http.Client) *RepoGetEditorConfigParams {
+	return &RepoGetEditorConfigParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoGetEditorConfigParams contains all the parameters to send to the API endpoint
+
+	for the repo get editor config operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoGetEditorConfigParams struct {
+
+	/* Filepath.
+
+	   filepath of file to get
+	*/
+	Filepath string
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Ref.
+
+	   The name of the commit/branch/tag. Default the repository’s default branch (usually master)
+	*/
+	Ref *string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo get editor config params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoGetEditorConfigParams) WithDefaults() *RepoGetEditorConfigParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo get editor config params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoGetEditorConfigParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo get editor config params
+func (o *RepoGetEditorConfigParams) WithTimeout(timeout time.Duration) *RepoGetEditorConfigParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo get editor config params
+func (o *RepoGetEditorConfigParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo get editor config params
+func (o *RepoGetEditorConfigParams) WithContext(ctx context.Context) *RepoGetEditorConfigParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo get editor config params
+func (o *RepoGetEditorConfigParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo get editor config params
+func (o *RepoGetEditorConfigParams) WithHTTPClient(client *http.Client) *RepoGetEditorConfigParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo get editor config params
+func (o *RepoGetEditorConfigParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithFilepath adds the filepath to the repo get editor config params
+func (o *RepoGetEditorConfigParams) WithFilepath(filepath string) *RepoGetEditorConfigParams {
+	o.SetFilepath(filepath)
+	return o
+}
+
+// SetFilepath adds the filepath to the repo get editor config params
+func (o *RepoGetEditorConfigParams) SetFilepath(filepath string) {
+	o.Filepath = filepath
+}
+
+// WithOwner adds the owner to the repo get editor config params
+func (o *RepoGetEditorConfigParams) WithOwner(owner string) *RepoGetEditorConfigParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo get editor config params
+func (o *RepoGetEditorConfigParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRef adds the ref to the repo get editor config params
+func (o *RepoGetEditorConfigParams) WithRef(ref *string) *RepoGetEditorConfigParams {
+	o.SetRef(ref)
+	return o
+}
+
+// SetRef adds the ref to the repo get editor config params
+func (o *RepoGetEditorConfigParams) SetRef(ref *string) {
+	o.Ref = ref
+}
+
+// WithRepo adds the repo to the repo get editor config params
+func (o *RepoGetEditorConfigParams) WithRepo(repo string) *RepoGetEditorConfigParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo get editor config params
+func (o *RepoGetEditorConfigParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoGetEditorConfigParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param filepath
+	if err := r.SetPathParam("filepath", o.Filepath); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	if o.Ref != nil {
+
+		// query param ref
+		var qrRef string
+
+		if o.Ref != nil {
+			qrRef = *o.Ref
+		}
+		qRef := qrRef
+		if qRef != "" {
+
+			if err := r.SetQueryParam("ref", qRef); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_get_editor_config_responses.go b/bots-common/gitea-generated/client/repository/repo_get_editor_config_responses.go
new file mode 100644
index 0000000..c1694fd
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_get_editor_config_responses.go
@@ -0,0 +1,150 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// RepoGetEditorConfigReader is a Reader for the RepoGetEditorConfig structure.
+type RepoGetEditorConfigReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoGetEditorConfigReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoGetEditorConfigOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoGetEditorConfigNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/editorconfig/{filepath}] repoGetEditorConfig", response, response.Code())
+	}
+}
+
+// NewRepoGetEditorConfigOK creates a RepoGetEditorConfigOK with default headers values
+func NewRepoGetEditorConfigOK() *RepoGetEditorConfigOK {
+	return &RepoGetEditorConfigOK{}
+}
+
+/*
+RepoGetEditorConfigOK describes a response with status code 200, with default header values.
+
+success
+*/
+type RepoGetEditorConfigOK struct {
+}
+
+// IsSuccess returns true when this repo get editor config o k response has a 2xx status code
+func (o *RepoGetEditorConfigOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo get editor config o k response has a 3xx status code
+func (o *RepoGetEditorConfigOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo get editor config o k response has a 4xx status code
+func (o *RepoGetEditorConfigOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo get editor config o k response has a 5xx status code
+func (o *RepoGetEditorConfigOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo get editor config o k response a status code equal to that given
+func (o *RepoGetEditorConfigOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo get editor config o k response
+func (o *RepoGetEditorConfigOK) Code() int {
+	return 200
+}
+
+func (o *RepoGetEditorConfigOK) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/editorconfig/{filepath}][%d] repoGetEditorConfigOK", 200)
+}
+
+func (o *RepoGetEditorConfigOK) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/editorconfig/{filepath}][%d] repoGetEditorConfigOK", 200)
+}
+
+func (o *RepoGetEditorConfigOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewRepoGetEditorConfigNotFound creates a RepoGetEditorConfigNotFound with default headers values
+func NewRepoGetEditorConfigNotFound() *RepoGetEditorConfigNotFound {
+	return &RepoGetEditorConfigNotFound{}
+}
+
+/*
+RepoGetEditorConfigNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoGetEditorConfigNotFound struct {
+}
+
+// IsSuccess returns true when this repo get editor config not found response has a 2xx status code
+func (o *RepoGetEditorConfigNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo get editor config not found response has a 3xx status code
+func (o *RepoGetEditorConfigNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo get editor config not found response has a 4xx status code
+func (o *RepoGetEditorConfigNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo get editor config not found response has a 5xx status code
+func (o *RepoGetEditorConfigNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo get editor config not found response a status code equal to that given
+func (o *RepoGetEditorConfigNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo get editor config not found response
+func (o *RepoGetEditorConfigNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoGetEditorConfigNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/editorconfig/{filepath}][%d] repoGetEditorConfigNotFound", 404)
+}
+
+func (o *RepoGetEditorConfigNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/editorconfig/{filepath}][%d] repoGetEditorConfigNotFound", 404)
+}
+
+func (o *RepoGetEditorConfigNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_get_git_hook_parameters.go b/bots-common/gitea-generated/client/repository/repo_get_git_hook_parameters.go
new file mode 100644
index 0000000..18d4567
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_get_git_hook_parameters.go
@@ -0,0 +1,195 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewRepoGetGitHookParams creates a new RepoGetGitHookParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoGetGitHookParams() *RepoGetGitHookParams {
+	return &RepoGetGitHookParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoGetGitHookParamsWithTimeout creates a new RepoGetGitHookParams object
+// with the ability to set a timeout on a request.
+func NewRepoGetGitHookParamsWithTimeout(timeout time.Duration) *RepoGetGitHookParams {
+	return &RepoGetGitHookParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoGetGitHookParamsWithContext creates a new RepoGetGitHookParams object
+// with the ability to set a context for a request.
+func NewRepoGetGitHookParamsWithContext(ctx context.Context) *RepoGetGitHookParams {
+	return &RepoGetGitHookParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoGetGitHookParamsWithHTTPClient creates a new RepoGetGitHookParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoGetGitHookParamsWithHTTPClient(client *http.Client) *RepoGetGitHookParams {
+	return &RepoGetGitHookParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoGetGitHookParams contains all the parameters to send to the API endpoint
+
+	for the repo get git hook operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoGetGitHookParams struct {
+
+	/* ID.
+
+	   id of the hook to get
+	*/
+	ID string
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo get git hook params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoGetGitHookParams) WithDefaults() *RepoGetGitHookParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo get git hook params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoGetGitHookParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo get git hook params
+func (o *RepoGetGitHookParams) WithTimeout(timeout time.Duration) *RepoGetGitHookParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo get git hook params
+func (o *RepoGetGitHookParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo get git hook params
+func (o *RepoGetGitHookParams) WithContext(ctx context.Context) *RepoGetGitHookParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo get git hook params
+func (o *RepoGetGitHookParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo get git hook params
+func (o *RepoGetGitHookParams) WithHTTPClient(client *http.Client) *RepoGetGitHookParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo get git hook params
+func (o *RepoGetGitHookParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithID adds the id to the repo get git hook params
+func (o *RepoGetGitHookParams) WithID(id string) *RepoGetGitHookParams {
+	o.SetID(id)
+	return o
+}
+
+// SetID adds the id to the repo get git hook params
+func (o *RepoGetGitHookParams) SetID(id string) {
+	o.ID = id
+}
+
+// WithOwner adds the owner to the repo get git hook params
+func (o *RepoGetGitHookParams) WithOwner(owner string) *RepoGetGitHookParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo get git hook params
+func (o *RepoGetGitHookParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo get git hook params
+func (o *RepoGetGitHookParams) WithRepo(repo string) *RepoGetGitHookParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo get git hook params
+func (o *RepoGetGitHookParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoGetGitHookParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param id
+	if err := r.SetPathParam("id", o.ID); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_get_git_hook_responses.go b/bots-common/gitea-generated/client/repository/repo_get_git_hook_responses.go
new file mode 100644
index 0000000..6827135
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_get_git_hook_responses.go
@@ -0,0 +1,168 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoGetGitHookReader is a Reader for the RepoGetGitHook structure.
+type RepoGetGitHookReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoGetGitHookReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoGetGitHookOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoGetGitHookNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/hooks/git/{id}] repoGetGitHook", response, response.Code())
+	}
+}
+
+// NewRepoGetGitHookOK creates a RepoGetGitHookOK with default headers values
+func NewRepoGetGitHookOK() *RepoGetGitHookOK {
+	return &RepoGetGitHookOK{}
+}
+
+/*
+RepoGetGitHookOK describes a response with status code 200, with default header values.
+
+GitHook
+*/
+type RepoGetGitHookOK struct {
+	Payload *models.GitHook
+}
+
+// IsSuccess returns true when this repo get git hook o k response has a 2xx status code
+func (o *RepoGetGitHookOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo get git hook o k response has a 3xx status code
+func (o *RepoGetGitHookOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo get git hook o k response has a 4xx status code
+func (o *RepoGetGitHookOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo get git hook o k response has a 5xx status code
+func (o *RepoGetGitHookOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo get git hook o k response a status code equal to that given
+func (o *RepoGetGitHookOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo get git hook o k response
+func (o *RepoGetGitHookOK) Code() int {
+	return 200
+}
+
+func (o *RepoGetGitHookOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/hooks/git/{id}][%d] repoGetGitHookOK %s", 200, payload)
+}
+
+func (o *RepoGetGitHookOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/hooks/git/{id}][%d] repoGetGitHookOK %s", 200, payload)
+}
+
+func (o *RepoGetGitHookOK) GetPayload() *models.GitHook {
+	return o.Payload
+}
+
+func (o *RepoGetGitHookOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.GitHook)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoGetGitHookNotFound creates a RepoGetGitHookNotFound with default headers values
+func NewRepoGetGitHookNotFound() *RepoGetGitHookNotFound {
+	return &RepoGetGitHookNotFound{}
+}
+
+/*
+RepoGetGitHookNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoGetGitHookNotFound struct {
+}
+
+// IsSuccess returns true when this repo get git hook not found response has a 2xx status code
+func (o *RepoGetGitHookNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo get git hook not found response has a 3xx status code
+func (o *RepoGetGitHookNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo get git hook not found response has a 4xx status code
+func (o *RepoGetGitHookNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo get git hook not found response has a 5xx status code
+func (o *RepoGetGitHookNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo get git hook not found response a status code equal to that given
+func (o *RepoGetGitHookNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo get git hook not found response
+func (o *RepoGetGitHookNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoGetGitHookNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/hooks/git/{id}][%d] repoGetGitHookNotFound", 404)
+}
+
+func (o *RepoGetGitHookNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/hooks/git/{id}][%d] repoGetGitHookNotFound", 404)
+}
+
+func (o *RepoGetGitHookNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_get_hook_parameters.go b/bots-common/gitea-generated/client/repository/repo_get_hook_parameters.go
new file mode 100644
index 0000000..ab21c99
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_get_hook_parameters.go
@@ -0,0 +1,198 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewRepoGetHookParams creates a new RepoGetHookParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoGetHookParams() *RepoGetHookParams {
+	return &RepoGetHookParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoGetHookParamsWithTimeout creates a new RepoGetHookParams object
+// with the ability to set a timeout on a request.
+func NewRepoGetHookParamsWithTimeout(timeout time.Duration) *RepoGetHookParams {
+	return &RepoGetHookParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoGetHookParamsWithContext creates a new RepoGetHookParams object
+// with the ability to set a context for a request.
+func NewRepoGetHookParamsWithContext(ctx context.Context) *RepoGetHookParams {
+	return &RepoGetHookParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoGetHookParamsWithHTTPClient creates a new RepoGetHookParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoGetHookParamsWithHTTPClient(client *http.Client) *RepoGetHookParams {
+	return &RepoGetHookParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoGetHookParams contains all the parameters to send to the API endpoint
+
+	for the repo get hook operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoGetHookParams struct {
+
+	/* ID.
+
+	   id of the hook to get
+
+	   Format: int64
+	*/
+	ID int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo get hook params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoGetHookParams) WithDefaults() *RepoGetHookParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo get hook params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoGetHookParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo get hook params
+func (o *RepoGetHookParams) WithTimeout(timeout time.Duration) *RepoGetHookParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo get hook params
+func (o *RepoGetHookParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo get hook params
+func (o *RepoGetHookParams) WithContext(ctx context.Context) *RepoGetHookParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo get hook params
+func (o *RepoGetHookParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo get hook params
+func (o *RepoGetHookParams) WithHTTPClient(client *http.Client) *RepoGetHookParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo get hook params
+func (o *RepoGetHookParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithID adds the id to the repo get hook params
+func (o *RepoGetHookParams) WithID(id int64) *RepoGetHookParams {
+	o.SetID(id)
+	return o
+}
+
+// SetID adds the id to the repo get hook params
+func (o *RepoGetHookParams) SetID(id int64) {
+	o.ID = id
+}
+
+// WithOwner adds the owner to the repo get hook params
+func (o *RepoGetHookParams) WithOwner(owner string) *RepoGetHookParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo get hook params
+func (o *RepoGetHookParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo get hook params
+func (o *RepoGetHookParams) WithRepo(repo string) *RepoGetHookParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo get hook params
+func (o *RepoGetHookParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoGetHookParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param id
+	if err := r.SetPathParam("id", swag.FormatInt64(o.ID)); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_get_hook_responses.go b/bots-common/gitea-generated/client/repository/repo_get_hook_responses.go
new file mode 100644
index 0000000..e0ecfdd
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_get_hook_responses.go
@@ -0,0 +1,168 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoGetHookReader is a Reader for the RepoGetHook structure.
+type RepoGetHookReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoGetHookReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoGetHookOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoGetHookNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/hooks/{id}] repoGetHook", response, response.Code())
+	}
+}
+
+// NewRepoGetHookOK creates a RepoGetHookOK with default headers values
+func NewRepoGetHookOK() *RepoGetHookOK {
+	return &RepoGetHookOK{}
+}
+
+/*
+RepoGetHookOK describes a response with status code 200, with default header values.
+
+Hook
+*/
+type RepoGetHookOK struct {
+	Payload *models.Hook
+}
+
+// IsSuccess returns true when this repo get hook o k response has a 2xx status code
+func (o *RepoGetHookOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo get hook o k response has a 3xx status code
+func (o *RepoGetHookOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo get hook o k response has a 4xx status code
+func (o *RepoGetHookOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo get hook o k response has a 5xx status code
+func (o *RepoGetHookOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo get hook o k response a status code equal to that given
+func (o *RepoGetHookOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo get hook o k response
+func (o *RepoGetHookOK) Code() int {
+	return 200
+}
+
+func (o *RepoGetHookOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/hooks/{id}][%d] repoGetHookOK %s", 200, payload)
+}
+
+func (o *RepoGetHookOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/hooks/{id}][%d] repoGetHookOK %s", 200, payload)
+}
+
+func (o *RepoGetHookOK) GetPayload() *models.Hook {
+	return o.Payload
+}
+
+func (o *RepoGetHookOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.Hook)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoGetHookNotFound creates a RepoGetHookNotFound with default headers values
+func NewRepoGetHookNotFound() *RepoGetHookNotFound {
+	return &RepoGetHookNotFound{}
+}
+
+/*
+RepoGetHookNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoGetHookNotFound struct {
+}
+
+// IsSuccess returns true when this repo get hook not found response has a 2xx status code
+func (o *RepoGetHookNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo get hook not found response has a 3xx status code
+func (o *RepoGetHookNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo get hook not found response has a 4xx status code
+func (o *RepoGetHookNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo get hook not found response has a 5xx status code
+func (o *RepoGetHookNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo get hook not found response a status code equal to that given
+func (o *RepoGetHookNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo get hook not found response
+func (o *RepoGetHookNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoGetHookNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/hooks/{id}][%d] repoGetHookNotFound", 404)
+}
+
+func (o *RepoGetHookNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/hooks/{id}][%d] repoGetHookNotFound", 404)
+}
+
+func (o *RepoGetHookNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_get_issue_config_parameters.go b/bots-common/gitea-generated/client/repository/repo_get_issue_config_parameters.go
new file mode 100644
index 0000000..85eac26
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_get_issue_config_parameters.go
@@ -0,0 +1,173 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewRepoGetIssueConfigParams creates a new RepoGetIssueConfigParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoGetIssueConfigParams() *RepoGetIssueConfigParams {
+	return &RepoGetIssueConfigParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoGetIssueConfigParamsWithTimeout creates a new RepoGetIssueConfigParams object
+// with the ability to set a timeout on a request.
+func NewRepoGetIssueConfigParamsWithTimeout(timeout time.Duration) *RepoGetIssueConfigParams {
+	return &RepoGetIssueConfigParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoGetIssueConfigParamsWithContext creates a new RepoGetIssueConfigParams object
+// with the ability to set a context for a request.
+func NewRepoGetIssueConfigParamsWithContext(ctx context.Context) *RepoGetIssueConfigParams {
+	return &RepoGetIssueConfigParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoGetIssueConfigParamsWithHTTPClient creates a new RepoGetIssueConfigParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoGetIssueConfigParamsWithHTTPClient(client *http.Client) *RepoGetIssueConfigParams {
+	return &RepoGetIssueConfigParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoGetIssueConfigParams contains all the parameters to send to the API endpoint
+
+	for the repo get issue config operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoGetIssueConfigParams struct {
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo get issue config params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoGetIssueConfigParams) WithDefaults() *RepoGetIssueConfigParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo get issue config params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoGetIssueConfigParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo get issue config params
+func (o *RepoGetIssueConfigParams) WithTimeout(timeout time.Duration) *RepoGetIssueConfigParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo get issue config params
+func (o *RepoGetIssueConfigParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo get issue config params
+func (o *RepoGetIssueConfigParams) WithContext(ctx context.Context) *RepoGetIssueConfigParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo get issue config params
+func (o *RepoGetIssueConfigParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo get issue config params
+func (o *RepoGetIssueConfigParams) WithHTTPClient(client *http.Client) *RepoGetIssueConfigParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo get issue config params
+func (o *RepoGetIssueConfigParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithOwner adds the owner to the repo get issue config params
+func (o *RepoGetIssueConfigParams) WithOwner(owner string) *RepoGetIssueConfigParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo get issue config params
+func (o *RepoGetIssueConfigParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo get issue config params
+func (o *RepoGetIssueConfigParams) WithRepo(repo string) *RepoGetIssueConfigParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo get issue config params
+func (o *RepoGetIssueConfigParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoGetIssueConfigParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_get_issue_config_responses.go b/bots-common/gitea-generated/client/repository/repo_get_issue_config_responses.go
new file mode 100644
index 0000000..b273d94
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_get_issue_config_responses.go
@@ -0,0 +1,168 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoGetIssueConfigReader is a Reader for the RepoGetIssueConfig structure.
+type RepoGetIssueConfigReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoGetIssueConfigReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoGetIssueConfigOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoGetIssueConfigNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/issue_config] repoGetIssueConfig", response, response.Code())
+	}
+}
+
+// NewRepoGetIssueConfigOK creates a RepoGetIssueConfigOK with default headers values
+func NewRepoGetIssueConfigOK() *RepoGetIssueConfigOK {
+	return &RepoGetIssueConfigOK{}
+}
+
+/*
+RepoGetIssueConfigOK describes a response with status code 200, with default header values.
+
+RepoIssueConfig
+*/
+type RepoGetIssueConfigOK struct {
+	Payload *models.IssueConfig
+}
+
+// IsSuccess returns true when this repo get issue config o k response has a 2xx status code
+func (o *RepoGetIssueConfigOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo get issue config o k response has a 3xx status code
+func (o *RepoGetIssueConfigOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo get issue config o k response has a 4xx status code
+func (o *RepoGetIssueConfigOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo get issue config o k response has a 5xx status code
+func (o *RepoGetIssueConfigOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo get issue config o k response a status code equal to that given
+func (o *RepoGetIssueConfigOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo get issue config o k response
+func (o *RepoGetIssueConfigOK) Code() int {
+	return 200
+}
+
+func (o *RepoGetIssueConfigOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issue_config][%d] repoGetIssueConfigOK %s", 200, payload)
+}
+
+func (o *RepoGetIssueConfigOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issue_config][%d] repoGetIssueConfigOK %s", 200, payload)
+}
+
+func (o *RepoGetIssueConfigOK) GetPayload() *models.IssueConfig {
+	return o.Payload
+}
+
+func (o *RepoGetIssueConfigOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.IssueConfig)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoGetIssueConfigNotFound creates a RepoGetIssueConfigNotFound with default headers values
+func NewRepoGetIssueConfigNotFound() *RepoGetIssueConfigNotFound {
+	return &RepoGetIssueConfigNotFound{}
+}
+
+/*
+RepoGetIssueConfigNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoGetIssueConfigNotFound struct {
+}
+
+// IsSuccess returns true when this repo get issue config not found response has a 2xx status code
+func (o *RepoGetIssueConfigNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo get issue config not found response has a 3xx status code
+func (o *RepoGetIssueConfigNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo get issue config not found response has a 4xx status code
+func (o *RepoGetIssueConfigNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo get issue config not found response has a 5xx status code
+func (o *RepoGetIssueConfigNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo get issue config not found response a status code equal to that given
+func (o *RepoGetIssueConfigNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo get issue config not found response
+func (o *RepoGetIssueConfigNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoGetIssueConfigNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issue_config][%d] repoGetIssueConfigNotFound", 404)
+}
+
+func (o *RepoGetIssueConfigNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issue_config][%d] repoGetIssueConfigNotFound", 404)
+}
+
+func (o *RepoGetIssueConfigNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_get_issue_templates_parameters.go b/bots-common/gitea-generated/client/repository/repo_get_issue_templates_parameters.go
new file mode 100644
index 0000000..ef47067
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_get_issue_templates_parameters.go
@@ -0,0 +1,173 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewRepoGetIssueTemplatesParams creates a new RepoGetIssueTemplatesParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoGetIssueTemplatesParams() *RepoGetIssueTemplatesParams {
+	return &RepoGetIssueTemplatesParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoGetIssueTemplatesParamsWithTimeout creates a new RepoGetIssueTemplatesParams object
+// with the ability to set a timeout on a request.
+func NewRepoGetIssueTemplatesParamsWithTimeout(timeout time.Duration) *RepoGetIssueTemplatesParams {
+	return &RepoGetIssueTemplatesParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoGetIssueTemplatesParamsWithContext creates a new RepoGetIssueTemplatesParams object
+// with the ability to set a context for a request.
+func NewRepoGetIssueTemplatesParamsWithContext(ctx context.Context) *RepoGetIssueTemplatesParams {
+	return &RepoGetIssueTemplatesParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoGetIssueTemplatesParamsWithHTTPClient creates a new RepoGetIssueTemplatesParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoGetIssueTemplatesParamsWithHTTPClient(client *http.Client) *RepoGetIssueTemplatesParams {
+	return &RepoGetIssueTemplatesParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoGetIssueTemplatesParams contains all the parameters to send to the API endpoint
+
+	for the repo get issue templates operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoGetIssueTemplatesParams struct {
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo get issue templates params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoGetIssueTemplatesParams) WithDefaults() *RepoGetIssueTemplatesParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo get issue templates params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoGetIssueTemplatesParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo get issue templates params
+func (o *RepoGetIssueTemplatesParams) WithTimeout(timeout time.Duration) *RepoGetIssueTemplatesParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo get issue templates params
+func (o *RepoGetIssueTemplatesParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo get issue templates params
+func (o *RepoGetIssueTemplatesParams) WithContext(ctx context.Context) *RepoGetIssueTemplatesParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo get issue templates params
+func (o *RepoGetIssueTemplatesParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo get issue templates params
+func (o *RepoGetIssueTemplatesParams) WithHTTPClient(client *http.Client) *RepoGetIssueTemplatesParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo get issue templates params
+func (o *RepoGetIssueTemplatesParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithOwner adds the owner to the repo get issue templates params
+func (o *RepoGetIssueTemplatesParams) WithOwner(owner string) *RepoGetIssueTemplatesParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo get issue templates params
+func (o *RepoGetIssueTemplatesParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo get issue templates params
+func (o *RepoGetIssueTemplatesParams) WithRepo(repo string) *RepoGetIssueTemplatesParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo get issue templates params
+func (o *RepoGetIssueTemplatesParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoGetIssueTemplatesParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_get_issue_templates_responses.go b/bots-common/gitea-generated/client/repository/repo_get_issue_templates_responses.go
new file mode 100644
index 0000000..2fc716d
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_get_issue_templates_responses.go
@@ -0,0 +1,166 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoGetIssueTemplatesReader is a Reader for the RepoGetIssueTemplates structure.
+type RepoGetIssueTemplatesReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoGetIssueTemplatesReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoGetIssueTemplatesOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoGetIssueTemplatesNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/issue_templates] repoGetIssueTemplates", response, response.Code())
+	}
+}
+
+// NewRepoGetIssueTemplatesOK creates a RepoGetIssueTemplatesOK with default headers values
+func NewRepoGetIssueTemplatesOK() *RepoGetIssueTemplatesOK {
+	return &RepoGetIssueTemplatesOK{}
+}
+
+/*
+RepoGetIssueTemplatesOK describes a response with status code 200, with default header values.
+
+IssueTemplates
+*/
+type RepoGetIssueTemplatesOK struct {
+	Payload []*models.IssueTemplate
+}
+
+// IsSuccess returns true when this repo get issue templates o k response has a 2xx status code
+func (o *RepoGetIssueTemplatesOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo get issue templates o k response has a 3xx status code
+func (o *RepoGetIssueTemplatesOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo get issue templates o k response has a 4xx status code
+func (o *RepoGetIssueTemplatesOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo get issue templates o k response has a 5xx status code
+func (o *RepoGetIssueTemplatesOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo get issue templates o k response a status code equal to that given
+func (o *RepoGetIssueTemplatesOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo get issue templates o k response
+func (o *RepoGetIssueTemplatesOK) Code() int {
+	return 200
+}
+
+func (o *RepoGetIssueTemplatesOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issue_templates][%d] repoGetIssueTemplatesOK %s", 200, payload)
+}
+
+func (o *RepoGetIssueTemplatesOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issue_templates][%d] repoGetIssueTemplatesOK %s", 200, payload)
+}
+
+func (o *RepoGetIssueTemplatesOK) GetPayload() []*models.IssueTemplate {
+	return o.Payload
+}
+
+func (o *RepoGetIssueTemplatesOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoGetIssueTemplatesNotFound creates a RepoGetIssueTemplatesNotFound with default headers values
+func NewRepoGetIssueTemplatesNotFound() *RepoGetIssueTemplatesNotFound {
+	return &RepoGetIssueTemplatesNotFound{}
+}
+
+/*
+RepoGetIssueTemplatesNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoGetIssueTemplatesNotFound struct {
+}
+
+// IsSuccess returns true when this repo get issue templates not found response has a 2xx status code
+func (o *RepoGetIssueTemplatesNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo get issue templates not found response has a 3xx status code
+func (o *RepoGetIssueTemplatesNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo get issue templates not found response has a 4xx status code
+func (o *RepoGetIssueTemplatesNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo get issue templates not found response has a 5xx status code
+func (o *RepoGetIssueTemplatesNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo get issue templates not found response a status code equal to that given
+func (o *RepoGetIssueTemplatesNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo get issue templates not found response
+func (o *RepoGetIssueTemplatesNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoGetIssueTemplatesNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issue_templates][%d] repoGetIssueTemplatesNotFound", 404)
+}
+
+func (o *RepoGetIssueTemplatesNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issue_templates][%d] repoGetIssueTemplatesNotFound", 404)
+}
+
+func (o *RepoGetIssueTemplatesNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_get_key_parameters.go b/bots-common/gitea-generated/client/repository/repo_get_key_parameters.go
new file mode 100644
index 0000000..fe3e671
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_get_key_parameters.go
@@ -0,0 +1,198 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewRepoGetKeyParams creates a new RepoGetKeyParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoGetKeyParams() *RepoGetKeyParams {
+	return &RepoGetKeyParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoGetKeyParamsWithTimeout creates a new RepoGetKeyParams object
+// with the ability to set a timeout on a request.
+func NewRepoGetKeyParamsWithTimeout(timeout time.Duration) *RepoGetKeyParams {
+	return &RepoGetKeyParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoGetKeyParamsWithContext creates a new RepoGetKeyParams object
+// with the ability to set a context for a request.
+func NewRepoGetKeyParamsWithContext(ctx context.Context) *RepoGetKeyParams {
+	return &RepoGetKeyParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoGetKeyParamsWithHTTPClient creates a new RepoGetKeyParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoGetKeyParamsWithHTTPClient(client *http.Client) *RepoGetKeyParams {
+	return &RepoGetKeyParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoGetKeyParams contains all the parameters to send to the API endpoint
+
+	for the repo get key operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoGetKeyParams struct {
+
+	/* ID.
+
+	   id of the key to get
+
+	   Format: int64
+	*/
+	ID int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo get key params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoGetKeyParams) WithDefaults() *RepoGetKeyParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo get key params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoGetKeyParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo get key params
+func (o *RepoGetKeyParams) WithTimeout(timeout time.Duration) *RepoGetKeyParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo get key params
+func (o *RepoGetKeyParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo get key params
+func (o *RepoGetKeyParams) WithContext(ctx context.Context) *RepoGetKeyParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo get key params
+func (o *RepoGetKeyParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo get key params
+func (o *RepoGetKeyParams) WithHTTPClient(client *http.Client) *RepoGetKeyParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo get key params
+func (o *RepoGetKeyParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithID adds the id to the repo get key params
+func (o *RepoGetKeyParams) WithID(id int64) *RepoGetKeyParams {
+	o.SetID(id)
+	return o
+}
+
+// SetID adds the id to the repo get key params
+func (o *RepoGetKeyParams) SetID(id int64) {
+	o.ID = id
+}
+
+// WithOwner adds the owner to the repo get key params
+func (o *RepoGetKeyParams) WithOwner(owner string) *RepoGetKeyParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo get key params
+func (o *RepoGetKeyParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo get key params
+func (o *RepoGetKeyParams) WithRepo(repo string) *RepoGetKeyParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo get key params
+func (o *RepoGetKeyParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoGetKeyParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param id
+	if err := r.SetPathParam("id", swag.FormatInt64(o.ID)); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_get_key_responses.go b/bots-common/gitea-generated/client/repository/repo_get_key_responses.go
new file mode 100644
index 0000000..8849426
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_get_key_responses.go
@@ -0,0 +1,168 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoGetKeyReader is a Reader for the RepoGetKey structure.
+type RepoGetKeyReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoGetKeyReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoGetKeyOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoGetKeyNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/keys/{id}] repoGetKey", response, response.Code())
+	}
+}
+
+// NewRepoGetKeyOK creates a RepoGetKeyOK with default headers values
+func NewRepoGetKeyOK() *RepoGetKeyOK {
+	return &RepoGetKeyOK{}
+}
+
+/*
+RepoGetKeyOK describes a response with status code 200, with default header values.
+
+DeployKey
+*/
+type RepoGetKeyOK struct {
+	Payload *models.DeployKey
+}
+
+// IsSuccess returns true when this repo get key o k response has a 2xx status code
+func (o *RepoGetKeyOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo get key o k response has a 3xx status code
+func (o *RepoGetKeyOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo get key o k response has a 4xx status code
+func (o *RepoGetKeyOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo get key o k response has a 5xx status code
+func (o *RepoGetKeyOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo get key o k response a status code equal to that given
+func (o *RepoGetKeyOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo get key o k response
+func (o *RepoGetKeyOK) Code() int {
+	return 200
+}
+
+func (o *RepoGetKeyOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/keys/{id}][%d] repoGetKeyOK %s", 200, payload)
+}
+
+func (o *RepoGetKeyOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/keys/{id}][%d] repoGetKeyOK %s", 200, payload)
+}
+
+func (o *RepoGetKeyOK) GetPayload() *models.DeployKey {
+	return o.Payload
+}
+
+func (o *RepoGetKeyOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.DeployKey)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoGetKeyNotFound creates a RepoGetKeyNotFound with default headers values
+func NewRepoGetKeyNotFound() *RepoGetKeyNotFound {
+	return &RepoGetKeyNotFound{}
+}
+
+/*
+RepoGetKeyNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoGetKeyNotFound struct {
+}
+
+// IsSuccess returns true when this repo get key not found response has a 2xx status code
+func (o *RepoGetKeyNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo get key not found response has a 3xx status code
+func (o *RepoGetKeyNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo get key not found response has a 4xx status code
+func (o *RepoGetKeyNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo get key not found response has a 5xx status code
+func (o *RepoGetKeyNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo get key not found response a status code equal to that given
+func (o *RepoGetKeyNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo get key not found response
+func (o *RepoGetKeyNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoGetKeyNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/keys/{id}][%d] repoGetKeyNotFound", 404)
+}
+
+func (o *RepoGetKeyNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/keys/{id}][%d] repoGetKeyNotFound", 404)
+}
+
+func (o *RepoGetKeyNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_get_languages_parameters.go b/bots-common/gitea-generated/client/repository/repo_get_languages_parameters.go
new file mode 100644
index 0000000..62e9edc
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_get_languages_parameters.go
@@ -0,0 +1,173 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewRepoGetLanguagesParams creates a new RepoGetLanguagesParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoGetLanguagesParams() *RepoGetLanguagesParams {
+	return &RepoGetLanguagesParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoGetLanguagesParamsWithTimeout creates a new RepoGetLanguagesParams object
+// with the ability to set a timeout on a request.
+func NewRepoGetLanguagesParamsWithTimeout(timeout time.Duration) *RepoGetLanguagesParams {
+	return &RepoGetLanguagesParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoGetLanguagesParamsWithContext creates a new RepoGetLanguagesParams object
+// with the ability to set a context for a request.
+func NewRepoGetLanguagesParamsWithContext(ctx context.Context) *RepoGetLanguagesParams {
+	return &RepoGetLanguagesParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoGetLanguagesParamsWithHTTPClient creates a new RepoGetLanguagesParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoGetLanguagesParamsWithHTTPClient(client *http.Client) *RepoGetLanguagesParams {
+	return &RepoGetLanguagesParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoGetLanguagesParams contains all the parameters to send to the API endpoint
+
+	for the repo get languages operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoGetLanguagesParams struct {
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo get languages params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoGetLanguagesParams) WithDefaults() *RepoGetLanguagesParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo get languages params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoGetLanguagesParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo get languages params
+func (o *RepoGetLanguagesParams) WithTimeout(timeout time.Duration) *RepoGetLanguagesParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo get languages params
+func (o *RepoGetLanguagesParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo get languages params
+func (o *RepoGetLanguagesParams) WithContext(ctx context.Context) *RepoGetLanguagesParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo get languages params
+func (o *RepoGetLanguagesParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo get languages params
+func (o *RepoGetLanguagesParams) WithHTTPClient(client *http.Client) *RepoGetLanguagesParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo get languages params
+func (o *RepoGetLanguagesParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithOwner adds the owner to the repo get languages params
+func (o *RepoGetLanguagesParams) WithOwner(owner string) *RepoGetLanguagesParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo get languages params
+func (o *RepoGetLanguagesParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo get languages params
+func (o *RepoGetLanguagesParams) WithRepo(repo string) *RepoGetLanguagesParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo get languages params
+func (o *RepoGetLanguagesParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoGetLanguagesParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_get_languages_responses.go b/bots-common/gitea-generated/client/repository/repo_get_languages_responses.go
new file mode 100644
index 0000000..03e76fd
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_get_languages_responses.go
@@ -0,0 +1,164 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// RepoGetLanguagesReader is a Reader for the RepoGetLanguages structure.
+type RepoGetLanguagesReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoGetLanguagesReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoGetLanguagesOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoGetLanguagesNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/languages] repoGetLanguages", response, response.Code())
+	}
+}
+
+// NewRepoGetLanguagesOK creates a RepoGetLanguagesOK with default headers values
+func NewRepoGetLanguagesOK() *RepoGetLanguagesOK {
+	return &RepoGetLanguagesOK{}
+}
+
+/*
+RepoGetLanguagesOK describes a response with status code 200, with default header values.
+
+LanguageStatistics
+*/
+type RepoGetLanguagesOK struct {
+	Payload map[string]int64
+}
+
+// IsSuccess returns true when this repo get languages o k response has a 2xx status code
+func (o *RepoGetLanguagesOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo get languages o k response has a 3xx status code
+func (o *RepoGetLanguagesOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo get languages o k response has a 4xx status code
+func (o *RepoGetLanguagesOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo get languages o k response has a 5xx status code
+func (o *RepoGetLanguagesOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo get languages o k response a status code equal to that given
+func (o *RepoGetLanguagesOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo get languages o k response
+func (o *RepoGetLanguagesOK) Code() int {
+	return 200
+}
+
+func (o *RepoGetLanguagesOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/languages][%d] repoGetLanguagesOK %s", 200, payload)
+}
+
+func (o *RepoGetLanguagesOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/languages][%d] repoGetLanguagesOK %s", 200, payload)
+}
+
+func (o *RepoGetLanguagesOK) GetPayload() map[string]int64 {
+	return o.Payload
+}
+
+func (o *RepoGetLanguagesOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoGetLanguagesNotFound creates a RepoGetLanguagesNotFound with default headers values
+func NewRepoGetLanguagesNotFound() *RepoGetLanguagesNotFound {
+	return &RepoGetLanguagesNotFound{}
+}
+
+/*
+RepoGetLanguagesNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoGetLanguagesNotFound struct {
+}
+
+// IsSuccess returns true when this repo get languages not found response has a 2xx status code
+func (o *RepoGetLanguagesNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo get languages not found response has a 3xx status code
+func (o *RepoGetLanguagesNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo get languages not found response has a 4xx status code
+func (o *RepoGetLanguagesNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo get languages not found response has a 5xx status code
+func (o *RepoGetLanguagesNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo get languages not found response a status code equal to that given
+func (o *RepoGetLanguagesNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo get languages not found response
+func (o *RepoGetLanguagesNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoGetLanguagesNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/languages][%d] repoGetLanguagesNotFound", 404)
+}
+
+func (o *RepoGetLanguagesNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/languages][%d] repoGetLanguagesNotFound", 404)
+}
+
+func (o *RepoGetLanguagesNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_get_latest_release_parameters.go b/bots-common/gitea-generated/client/repository/repo_get_latest_release_parameters.go
new file mode 100644
index 0000000..c2cd4fc
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_get_latest_release_parameters.go
@@ -0,0 +1,173 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewRepoGetLatestReleaseParams creates a new RepoGetLatestReleaseParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoGetLatestReleaseParams() *RepoGetLatestReleaseParams {
+	return &RepoGetLatestReleaseParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoGetLatestReleaseParamsWithTimeout creates a new RepoGetLatestReleaseParams object
+// with the ability to set a timeout on a request.
+func NewRepoGetLatestReleaseParamsWithTimeout(timeout time.Duration) *RepoGetLatestReleaseParams {
+	return &RepoGetLatestReleaseParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoGetLatestReleaseParamsWithContext creates a new RepoGetLatestReleaseParams object
+// with the ability to set a context for a request.
+func NewRepoGetLatestReleaseParamsWithContext(ctx context.Context) *RepoGetLatestReleaseParams {
+	return &RepoGetLatestReleaseParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoGetLatestReleaseParamsWithHTTPClient creates a new RepoGetLatestReleaseParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoGetLatestReleaseParamsWithHTTPClient(client *http.Client) *RepoGetLatestReleaseParams {
+	return &RepoGetLatestReleaseParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoGetLatestReleaseParams contains all the parameters to send to the API endpoint
+
+	for the repo get latest release operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoGetLatestReleaseParams struct {
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo get latest release params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoGetLatestReleaseParams) WithDefaults() *RepoGetLatestReleaseParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo get latest release params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoGetLatestReleaseParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo get latest release params
+func (o *RepoGetLatestReleaseParams) WithTimeout(timeout time.Duration) *RepoGetLatestReleaseParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo get latest release params
+func (o *RepoGetLatestReleaseParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo get latest release params
+func (o *RepoGetLatestReleaseParams) WithContext(ctx context.Context) *RepoGetLatestReleaseParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo get latest release params
+func (o *RepoGetLatestReleaseParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo get latest release params
+func (o *RepoGetLatestReleaseParams) WithHTTPClient(client *http.Client) *RepoGetLatestReleaseParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo get latest release params
+func (o *RepoGetLatestReleaseParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithOwner adds the owner to the repo get latest release params
+func (o *RepoGetLatestReleaseParams) WithOwner(owner string) *RepoGetLatestReleaseParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo get latest release params
+func (o *RepoGetLatestReleaseParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo get latest release params
+func (o *RepoGetLatestReleaseParams) WithRepo(repo string) *RepoGetLatestReleaseParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo get latest release params
+func (o *RepoGetLatestReleaseParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoGetLatestReleaseParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_get_latest_release_responses.go b/bots-common/gitea-generated/client/repository/repo_get_latest_release_responses.go
new file mode 100644
index 0000000..0e228bf
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_get_latest_release_responses.go
@@ -0,0 +1,168 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoGetLatestReleaseReader is a Reader for the RepoGetLatestRelease structure.
+type RepoGetLatestReleaseReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoGetLatestReleaseReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoGetLatestReleaseOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoGetLatestReleaseNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/releases/latest] repoGetLatestRelease", response, response.Code())
+	}
+}
+
+// NewRepoGetLatestReleaseOK creates a RepoGetLatestReleaseOK with default headers values
+func NewRepoGetLatestReleaseOK() *RepoGetLatestReleaseOK {
+	return &RepoGetLatestReleaseOK{}
+}
+
+/*
+RepoGetLatestReleaseOK describes a response with status code 200, with default header values.
+
+Release
+*/
+type RepoGetLatestReleaseOK struct {
+	Payload *models.Release
+}
+
+// IsSuccess returns true when this repo get latest release o k response has a 2xx status code
+func (o *RepoGetLatestReleaseOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo get latest release o k response has a 3xx status code
+func (o *RepoGetLatestReleaseOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo get latest release o k response has a 4xx status code
+func (o *RepoGetLatestReleaseOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo get latest release o k response has a 5xx status code
+func (o *RepoGetLatestReleaseOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo get latest release o k response a status code equal to that given
+func (o *RepoGetLatestReleaseOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo get latest release o k response
+func (o *RepoGetLatestReleaseOK) Code() int {
+	return 200
+}
+
+func (o *RepoGetLatestReleaseOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/releases/latest][%d] repoGetLatestReleaseOK %s", 200, payload)
+}
+
+func (o *RepoGetLatestReleaseOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/releases/latest][%d] repoGetLatestReleaseOK %s", 200, payload)
+}
+
+func (o *RepoGetLatestReleaseOK) GetPayload() *models.Release {
+	return o.Payload
+}
+
+func (o *RepoGetLatestReleaseOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.Release)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoGetLatestReleaseNotFound creates a RepoGetLatestReleaseNotFound with default headers values
+func NewRepoGetLatestReleaseNotFound() *RepoGetLatestReleaseNotFound {
+	return &RepoGetLatestReleaseNotFound{}
+}
+
+/*
+RepoGetLatestReleaseNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoGetLatestReleaseNotFound struct {
+}
+
+// IsSuccess returns true when this repo get latest release not found response has a 2xx status code
+func (o *RepoGetLatestReleaseNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo get latest release not found response has a 3xx status code
+func (o *RepoGetLatestReleaseNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo get latest release not found response has a 4xx status code
+func (o *RepoGetLatestReleaseNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo get latest release not found response has a 5xx status code
+func (o *RepoGetLatestReleaseNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo get latest release not found response a status code equal to that given
+func (o *RepoGetLatestReleaseNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo get latest release not found response
+func (o *RepoGetLatestReleaseNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoGetLatestReleaseNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/releases/latest][%d] repoGetLatestReleaseNotFound", 404)
+}
+
+func (o *RepoGetLatestReleaseNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/releases/latest][%d] repoGetLatestReleaseNotFound", 404)
+}
+
+func (o *RepoGetLatestReleaseNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_get_note_parameters.go b/bots-common/gitea-generated/client/repository/repo_get_note_parameters.go
new file mode 100644
index 0000000..4ce7e26
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_get_note_parameters.go
@@ -0,0 +1,264 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewRepoGetNoteParams creates a new RepoGetNoteParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoGetNoteParams() *RepoGetNoteParams {
+	return &RepoGetNoteParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoGetNoteParamsWithTimeout creates a new RepoGetNoteParams object
+// with the ability to set a timeout on a request.
+func NewRepoGetNoteParamsWithTimeout(timeout time.Duration) *RepoGetNoteParams {
+	return &RepoGetNoteParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoGetNoteParamsWithContext creates a new RepoGetNoteParams object
+// with the ability to set a context for a request.
+func NewRepoGetNoteParamsWithContext(ctx context.Context) *RepoGetNoteParams {
+	return &RepoGetNoteParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoGetNoteParamsWithHTTPClient creates a new RepoGetNoteParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoGetNoteParamsWithHTTPClient(client *http.Client) *RepoGetNoteParams {
+	return &RepoGetNoteParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoGetNoteParams contains all the parameters to send to the API endpoint
+
+	for the repo get note operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoGetNoteParams struct {
+
+	/* Files.
+
+	   include a list of affected files for every commit (disable for speedup, default 'true')
+	*/
+	Files *bool
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	/* Sha.
+
+	   a git ref or commit sha
+	*/
+	Sha string
+
+	/* Verification.
+
+	   include verification for every commit (disable for speedup, default 'true')
+	*/
+	Verification *bool
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo get note params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoGetNoteParams) WithDefaults() *RepoGetNoteParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo get note params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoGetNoteParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo get note params
+func (o *RepoGetNoteParams) WithTimeout(timeout time.Duration) *RepoGetNoteParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo get note params
+func (o *RepoGetNoteParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo get note params
+func (o *RepoGetNoteParams) WithContext(ctx context.Context) *RepoGetNoteParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo get note params
+func (o *RepoGetNoteParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo get note params
+func (o *RepoGetNoteParams) WithHTTPClient(client *http.Client) *RepoGetNoteParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo get note params
+func (o *RepoGetNoteParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithFiles adds the files to the repo get note params
+func (o *RepoGetNoteParams) WithFiles(files *bool) *RepoGetNoteParams {
+	o.SetFiles(files)
+	return o
+}
+
+// SetFiles adds the files to the repo get note params
+func (o *RepoGetNoteParams) SetFiles(files *bool) {
+	o.Files = files
+}
+
+// WithOwner adds the owner to the repo get note params
+func (o *RepoGetNoteParams) WithOwner(owner string) *RepoGetNoteParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo get note params
+func (o *RepoGetNoteParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo get note params
+func (o *RepoGetNoteParams) WithRepo(repo string) *RepoGetNoteParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo get note params
+func (o *RepoGetNoteParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WithSha adds the sha to the repo get note params
+func (o *RepoGetNoteParams) WithSha(sha string) *RepoGetNoteParams {
+	o.SetSha(sha)
+	return o
+}
+
+// SetSha adds the sha to the repo get note params
+func (o *RepoGetNoteParams) SetSha(sha string) {
+	o.Sha = sha
+}
+
+// WithVerification adds the verification to the repo get note params
+func (o *RepoGetNoteParams) WithVerification(verification *bool) *RepoGetNoteParams {
+	o.SetVerification(verification)
+	return o
+}
+
+// SetVerification adds the verification to the repo get note params
+func (o *RepoGetNoteParams) SetVerification(verification *bool) {
+	o.Verification = verification
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoGetNoteParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.Files != nil {
+
+		// query param files
+		var qrFiles bool
+
+		if o.Files != nil {
+			qrFiles = *o.Files
+		}
+		qFiles := swag.FormatBool(qrFiles)
+		if qFiles != "" {
+
+			if err := r.SetQueryParam("files", qFiles); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	// path param sha
+	if err := r.SetPathParam("sha", o.Sha); err != nil {
+		return err
+	}
+
+	if o.Verification != nil {
+
+		// query param verification
+		var qrVerification bool
+
+		if o.Verification != nil {
+			qrVerification = *o.Verification
+		}
+		qVerification := swag.FormatBool(qrVerification)
+		if qVerification != "" {
+
+			if err := r.SetQueryParam("verification", qVerification); err != nil {
+				return err
+			}
+		}
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_get_note_responses.go b/bots-common/gitea-generated/client/repository/repo_get_note_responses.go
new file mode 100644
index 0000000..fd92e80
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_get_note_responses.go
@@ -0,0 +1,246 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoGetNoteReader is a Reader for the RepoGetNote structure.
+type RepoGetNoteReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoGetNoteReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoGetNoteOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoGetNoteNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 422:
+		result := NewRepoGetNoteUnprocessableEntity()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/git/notes/{sha}] repoGetNote", response, response.Code())
+	}
+}
+
+// NewRepoGetNoteOK creates a RepoGetNoteOK with default headers values
+func NewRepoGetNoteOK() *RepoGetNoteOK {
+	return &RepoGetNoteOK{}
+}
+
+/*
+RepoGetNoteOK describes a response with status code 200, with default header values.
+
+Note
+*/
+type RepoGetNoteOK struct {
+	Payload *models.Note
+}
+
+// IsSuccess returns true when this repo get note o k response has a 2xx status code
+func (o *RepoGetNoteOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo get note o k response has a 3xx status code
+func (o *RepoGetNoteOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo get note o k response has a 4xx status code
+func (o *RepoGetNoteOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo get note o k response has a 5xx status code
+func (o *RepoGetNoteOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo get note o k response a status code equal to that given
+func (o *RepoGetNoteOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo get note o k response
+func (o *RepoGetNoteOK) Code() int {
+	return 200
+}
+
+func (o *RepoGetNoteOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/git/notes/{sha}][%d] repoGetNoteOK %s", 200, payload)
+}
+
+func (o *RepoGetNoteOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/git/notes/{sha}][%d] repoGetNoteOK %s", 200, payload)
+}
+
+func (o *RepoGetNoteOK) GetPayload() *models.Note {
+	return o.Payload
+}
+
+func (o *RepoGetNoteOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.Note)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoGetNoteNotFound creates a RepoGetNoteNotFound with default headers values
+func NewRepoGetNoteNotFound() *RepoGetNoteNotFound {
+	return &RepoGetNoteNotFound{}
+}
+
+/*
+RepoGetNoteNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoGetNoteNotFound struct {
+}
+
+// IsSuccess returns true when this repo get note not found response has a 2xx status code
+func (o *RepoGetNoteNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo get note not found response has a 3xx status code
+func (o *RepoGetNoteNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo get note not found response has a 4xx status code
+func (o *RepoGetNoteNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo get note not found response has a 5xx status code
+func (o *RepoGetNoteNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo get note not found response a status code equal to that given
+func (o *RepoGetNoteNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo get note not found response
+func (o *RepoGetNoteNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoGetNoteNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/git/notes/{sha}][%d] repoGetNoteNotFound", 404)
+}
+
+func (o *RepoGetNoteNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/git/notes/{sha}][%d] repoGetNoteNotFound", 404)
+}
+
+func (o *RepoGetNoteNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewRepoGetNoteUnprocessableEntity creates a RepoGetNoteUnprocessableEntity with default headers values
+func NewRepoGetNoteUnprocessableEntity() *RepoGetNoteUnprocessableEntity {
+	return &RepoGetNoteUnprocessableEntity{}
+}
+
+/*
+RepoGetNoteUnprocessableEntity describes a response with status code 422, with default header values.
+
+APIValidationError is error format response related to input validation
+*/
+type RepoGetNoteUnprocessableEntity struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo get note unprocessable entity response has a 2xx status code
+func (o *RepoGetNoteUnprocessableEntity) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo get note unprocessable entity response has a 3xx status code
+func (o *RepoGetNoteUnprocessableEntity) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo get note unprocessable entity response has a 4xx status code
+func (o *RepoGetNoteUnprocessableEntity) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo get note unprocessable entity response has a 5xx status code
+func (o *RepoGetNoteUnprocessableEntity) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo get note unprocessable entity response a status code equal to that given
+func (o *RepoGetNoteUnprocessableEntity) IsCode(code int) bool {
+	return code == 422
+}
+
+// Code gets the status code for the repo get note unprocessable entity response
+func (o *RepoGetNoteUnprocessableEntity) Code() int {
+	return 422
+}
+
+func (o *RepoGetNoteUnprocessableEntity) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/git/notes/{sha}][%d] repoGetNoteUnprocessableEntity", 422)
+}
+
+func (o *RepoGetNoteUnprocessableEntity) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/git/notes/{sha}][%d] repoGetNoteUnprocessableEntity", 422)
+}
+
+func (o *RepoGetNoteUnprocessableEntity) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_get_parameters.go b/bots-common/gitea-generated/client/repository/repo_get_parameters.go
new file mode 100644
index 0000000..e56bc31
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_get_parameters.go
@@ -0,0 +1,173 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewRepoGetParams creates a new RepoGetParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoGetParams() *RepoGetParams {
+	return &RepoGetParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoGetParamsWithTimeout creates a new RepoGetParams object
+// with the ability to set a timeout on a request.
+func NewRepoGetParamsWithTimeout(timeout time.Duration) *RepoGetParams {
+	return &RepoGetParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoGetParamsWithContext creates a new RepoGetParams object
+// with the ability to set a context for a request.
+func NewRepoGetParamsWithContext(ctx context.Context) *RepoGetParams {
+	return &RepoGetParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoGetParamsWithHTTPClient creates a new RepoGetParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoGetParamsWithHTTPClient(client *http.Client) *RepoGetParams {
+	return &RepoGetParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoGetParams contains all the parameters to send to the API endpoint
+
+	for the repo get operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoGetParams struct {
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo get params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoGetParams) WithDefaults() *RepoGetParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo get params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoGetParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo get params
+func (o *RepoGetParams) WithTimeout(timeout time.Duration) *RepoGetParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo get params
+func (o *RepoGetParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo get params
+func (o *RepoGetParams) WithContext(ctx context.Context) *RepoGetParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo get params
+func (o *RepoGetParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo get params
+func (o *RepoGetParams) WithHTTPClient(client *http.Client) *RepoGetParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo get params
+func (o *RepoGetParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithOwner adds the owner to the repo get params
+func (o *RepoGetParams) WithOwner(owner string) *RepoGetParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo get params
+func (o *RepoGetParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo get params
+func (o *RepoGetParams) WithRepo(repo string) *RepoGetParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo get params
+func (o *RepoGetParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoGetParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_get_pull_request_by_base_head_parameters.go b/bots-common/gitea-generated/client/repository/repo_get_pull_request_by_base_head_parameters.go
new file mode 100644
index 0000000..2657f70
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_get_pull_request_by_base_head_parameters.go
@@ -0,0 +1,217 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewRepoGetPullRequestByBaseHeadParams creates a new RepoGetPullRequestByBaseHeadParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoGetPullRequestByBaseHeadParams() *RepoGetPullRequestByBaseHeadParams {
+	return &RepoGetPullRequestByBaseHeadParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoGetPullRequestByBaseHeadParamsWithTimeout creates a new RepoGetPullRequestByBaseHeadParams object
+// with the ability to set a timeout on a request.
+func NewRepoGetPullRequestByBaseHeadParamsWithTimeout(timeout time.Duration) *RepoGetPullRequestByBaseHeadParams {
+	return &RepoGetPullRequestByBaseHeadParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoGetPullRequestByBaseHeadParamsWithContext creates a new RepoGetPullRequestByBaseHeadParams object
+// with the ability to set a context for a request.
+func NewRepoGetPullRequestByBaseHeadParamsWithContext(ctx context.Context) *RepoGetPullRequestByBaseHeadParams {
+	return &RepoGetPullRequestByBaseHeadParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoGetPullRequestByBaseHeadParamsWithHTTPClient creates a new RepoGetPullRequestByBaseHeadParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoGetPullRequestByBaseHeadParamsWithHTTPClient(client *http.Client) *RepoGetPullRequestByBaseHeadParams {
+	return &RepoGetPullRequestByBaseHeadParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoGetPullRequestByBaseHeadParams contains all the parameters to send to the API endpoint
+
+	for the repo get pull request by base head operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoGetPullRequestByBaseHeadParams struct {
+
+	/* Base.
+
+	   base of the pull request to get
+	*/
+	Base string
+
+	/* Head.
+
+	   head of the pull request to get
+	*/
+	Head string
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo get pull request by base head params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoGetPullRequestByBaseHeadParams) WithDefaults() *RepoGetPullRequestByBaseHeadParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo get pull request by base head params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoGetPullRequestByBaseHeadParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo get pull request by base head params
+func (o *RepoGetPullRequestByBaseHeadParams) WithTimeout(timeout time.Duration) *RepoGetPullRequestByBaseHeadParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo get pull request by base head params
+func (o *RepoGetPullRequestByBaseHeadParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo get pull request by base head params
+func (o *RepoGetPullRequestByBaseHeadParams) WithContext(ctx context.Context) *RepoGetPullRequestByBaseHeadParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo get pull request by base head params
+func (o *RepoGetPullRequestByBaseHeadParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo get pull request by base head params
+func (o *RepoGetPullRequestByBaseHeadParams) WithHTTPClient(client *http.Client) *RepoGetPullRequestByBaseHeadParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo get pull request by base head params
+func (o *RepoGetPullRequestByBaseHeadParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBase adds the base to the repo get pull request by base head params
+func (o *RepoGetPullRequestByBaseHeadParams) WithBase(base string) *RepoGetPullRequestByBaseHeadParams {
+	o.SetBase(base)
+	return o
+}
+
+// SetBase adds the base to the repo get pull request by base head params
+func (o *RepoGetPullRequestByBaseHeadParams) SetBase(base string) {
+	o.Base = base
+}
+
+// WithHead adds the head to the repo get pull request by base head params
+func (o *RepoGetPullRequestByBaseHeadParams) WithHead(head string) *RepoGetPullRequestByBaseHeadParams {
+	o.SetHead(head)
+	return o
+}
+
+// SetHead adds the head to the repo get pull request by base head params
+func (o *RepoGetPullRequestByBaseHeadParams) SetHead(head string) {
+	o.Head = head
+}
+
+// WithOwner adds the owner to the repo get pull request by base head params
+func (o *RepoGetPullRequestByBaseHeadParams) WithOwner(owner string) *RepoGetPullRequestByBaseHeadParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo get pull request by base head params
+func (o *RepoGetPullRequestByBaseHeadParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo get pull request by base head params
+func (o *RepoGetPullRequestByBaseHeadParams) WithRepo(repo string) *RepoGetPullRequestByBaseHeadParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo get pull request by base head params
+func (o *RepoGetPullRequestByBaseHeadParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoGetPullRequestByBaseHeadParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param base
+	if err := r.SetPathParam("base", o.Base); err != nil {
+		return err
+	}
+
+	// path param head
+	if err := r.SetPathParam("head", o.Head); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_get_pull_request_by_base_head_responses.go b/bots-common/gitea-generated/client/repository/repo_get_pull_request_by_base_head_responses.go
new file mode 100644
index 0000000..fa92069
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_get_pull_request_by_base_head_responses.go
@@ -0,0 +1,168 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoGetPullRequestByBaseHeadReader is a Reader for the RepoGetPullRequestByBaseHead structure.
+type RepoGetPullRequestByBaseHeadReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoGetPullRequestByBaseHeadReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoGetPullRequestByBaseHeadOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoGetPullRequestByBaseHeadNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/pulls/{base}/{head}] repoGetPullRequestByBaseHead", response, response.Code())
+	}
+}
+
+// NewRepoGetPullRequestByBaseHeadOK creates a RepoGetPullRequestByBaseHeadOK with default headers values
+func NewRepoGetPullRequestByBaseHeadOK() *RepoGetPullRequestByBaseHeadOK {
+	return &RepoGetPullRequestByBaseHeadOK{}
+}
+
+/*
+RepoGetPullRequestByBaseHeadOK describes a response with status code 200, with default header values.
+
+PullRequest
+*/
+type RepoGetPullRequestByBaseHeadOK struct {
+	Payload *models.PullRequest
+}
+
+// IsSuccess returns true when this repo get pull request by base head o k response has a 2xx status code
+func (o *RepoGetPullRequestByBaseHeadOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo get pull request by base head o k response has a 3xx status code
+func (o *RepoGetPullRequestByBaseHeadOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo get pull request by base head o k response has a 4xx status code
+func (o *RepoGetPullRequestByBaseHeadOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo get pull request by base head o k response has a 5xx status code
+func (o *RepoGetPullRequestByBaseHeadOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo get pull request by base head o k response a status code equal to that given
+func (o *RepoGetPullRequestByBaseHeadOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo get pull request by base head o k response
+func (o *RepoGetPullRequestByBaseHeadOK) Code() int {
+	return 200
+}
+
+func (o *RepoGetPullRequestByBaseHeadOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/pulls/{base}/{head}][%d] repoGetPullRequestByBaseHeadOK %s", 200, payload)
+}
+
+func (o *RepoGetPullRequestByBaseHeadOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/pulls/{base}/{head}][%d] repoGetPullRequestByBaseHeadOK %s", 200, payload)
+}
+
+func (o *RepoGetPullRequestByBaseHeadOK) GetPayload() *models.PullRequest {
+	return o.Payload
+}
+
+func (o *RepoGetPullRequestByBaseHeadOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.PullRequest)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoGetPullRequestByBaseHeadNotFound creates a RepoGetPullRequestByBaseHeadNotFound with default headers values
+func NewRepoGetPullRequestByBaseHeadNotFound() *RepoGetPullRequestByBaseHeadNotFound {
+	return &RepoGetPullRequestByBaseHeadNotFound{}
+}
+
+/*
+RepoGetPullRequestByBaseHeadNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoGetPullRequestByBaseHeadNotFound struct {
+}
+
+// IsSuccess returns true when this repo get pull request by base head not found response has a 2xx status code
+func (o *RepoGetPullRequestByBaseHeadNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo get pull request by base head not found response has a 3xx status code
+func (o *RepoGetPullRequestByBaseHeadNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo get pull request by base head not found response has a 4xx status code
+func (o *RepoGetPullRequestByBaseHeadNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo get pull request by base head not found response has a 5xx status code
+func (o *RepoGetPullRequestByBaseHeadNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo get pull request by base head not found response a status code equal to that given
+func (o *RepoGetPullRequestByBaseHeadNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo get pull request by base head not found response
+func (o *RepoGetPullRequestByBaseHeadNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoGetPullRequestByBaseHeadNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/pulls/{base}/{head}][%d] repoGetPullRequestByBaseHeadNotFound", 404)
+}
+
+func (o *RepoGetPullRequestByBaseHeadNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/pulls/{base}/{head}][%d] repoGetPullRequestByBaseHeadNotFound", 404)
+}
+
+func (o *RepoGetPullRequestByBaseHeadNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_get_pull_request_commits_parameters.go b/bots-common/gitea-generated/client/repository/repo_get_pull_request_commits_parameters.go
new file mode 100644
index 0000000..3632b81
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_get_pull_request_commits_parameters.go
@@ -0,0 +1,334 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewRepoGetPullRequestCommitsParams creates a new RepoGetPullRequestCommitsParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoGetPullRequestCommitsParams() *RepoGetPullRequestCommitsParams {
+	return &RepoGetPullRequestCommitsParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoGetPullRequestCommitsParamsWithTimeout creates a new RepoGetPullRequestCommitsParams object
+// with the ability to set a timeout on a request.
+func NewRepoGetPullRequestCommitsParamsWithTimeout(timeout time.Duration) *RepoGetPullRequestCommitsParams {
+	return &RepoGetPullRequestCommitsParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoGetPullRequestCommitsParamsWithContext creates a new RepoGetPullRequestCommitsParams object
+// with the ability to set a context for a request.
+func NewRepoGetPullRequestCommitsParamsWithContext(ctx context.Context) *RepoGetPullRequestCommitsParams {
+	return &RepoGetPullRequestCommitsParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoGetPullRequestCommitsParamsWithHTTPClient creates a new RepoGetPullRequestCommitsParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoGetPullRequestCommitsParamsWithHTTPClient(client *http.Client) *RepoGetPullRequestCommitsParams {
+	return &RepoGetPullRequestCommitsParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoGetPullRequestCommitsParams contains all the parameters to send to the API endpoint
+
+	for the repo get pull request commits operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoGetPullRequestCommitsParams struct {
+
+	/* Files.
+
+	   include a list of affected files for every commit (disable for speedup, default 'true')
+	*/
+	Files *bool
+
+	/* Index.
+
+	   index of the pull request to get
+
+	   Format: int64
+	*/
+	Index int64
+
+	/* Limit.
+
+	   page size of results
+	*/
+	Limit *int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Page.
+
+	   page number of results to return (1-based)
+	*/
+	Page *int64
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	/* Verification.
+
+	   include verification for every commit (disable for speedup, default 'true')
+	*/
+	Verification *bool
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo get pull request commits params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoGetPullRequestCommitsParams) WithDefaults() *RepoGetPullRequestCommitsParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo get pull request commits params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoGetPullRequestCommitsParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo get pull request commits params
+func (o *RepoGetPullRequestCommitsParams) WithTimeout(timeout time.Duration) *RepoGetPullRequestCommitsParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo get pull request commits params
+func (o *RepoGetPullRequestCommitsParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo get pull request commits params
+func (o *RepoGetPullRequestCommitsParams) WithContext(ctx context.Context) *RepoGetPullRequestCommitsParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo get pull request commits params
+func (o *RepoGetPullRequestCommitsParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo get pull request commits params
+func (o *RepoGetPullRequestCommitsParams) WithHTTPClient(client *http.Client) *RepoGetPullRequestCommitsParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo get pull request commits params
+func (o *RepoGetPullRequestCommitsParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithFiles adds the files to the repo get pull request commits params
+func (o *RepoGetPullRequestCommitsParams) WithFiles(files *bool) *RepoGetPullRequestCommitsParams {
+	o.SetFiles(files)
+	return o
+}
+
+// SetFiles adds the files to the repo get pull request commits params
+func (o *RepoGetPullRequestCommitsParams) SetFiles(files *bool) {
+	o.Files = files
+}
+
+// WithIndex adds the index to the repo get pull request commits params
+func (o *RepoGetPullRequestCommitsParams) WithIndex(index int64) *RepoGetPullRequestCommitsParams {
+	o.SetIndex(index)
+	return o
+}
+
+// SetIndex adds the index to the repo get pull request commits params
+func (o *RepoGetPullRequestCommitsParams) SetIndex(index int64) {
+	o.Index = index
+}
+
+// WithLimit adds the limit to the repo get pull request commits params
+func (o *RepoGetPullRequestCommitsParams) WithLimit(limit *int64) *RepoGetPullRequestCommitsParams {
+	o.SetLimit(limit)
+	return o
+}
+
+// SetLimit adds the limit to the repo get pull request commits params
+func (o *RepoGetPullRequestCommitsParams) SetLimit(limit *int64) {
+	o.Limit = limit
+}
+
+// WithOwner adds the owner to the repo get pull request commits params
+func (o *RepoGetPullRequestCommitsParams) WithOwner(owner string) *RepoGetPullRequestCommitsParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo get pull request commits params
+func (o *RepoGetPullRequestCommitsParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithPage adds the page to the repo get pull request commits params
+func (o *RepoGetPullRequestCommitsParams) WithPage(page *int64) *RepoGetPullRequestCommitsParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the repo get pull request commits params
+func (o *RepoGetPullRequestCommitsParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WithRepo adds the repo to the repo get pull request commits params
+func (o *RepoGetPullRequestCommitsParams) WithRepo(repo string) *RepoGetPullRequestCommitsParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo get pull request commits params
+func (o *RepoGetPullRequestCommitsParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WithVerification adds the verification to the repo get pull request commits params
+func (o *RepoGetPullRequestCommitsParams) WithVerification(verification *bool) *RepoGetPullRequestCommitsParams {
+	o.SetVerification(verification)
+	return o
+}
+
+// SetVerification adds the verification to the repo get pull request commits params
+func (o *RepoGetPullRequestCommitsParams) SetVerification(verification *bool) {
+	o.Verification = verification
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoGetPullRequestCommitsParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.Files != nil {
+
+		// query param files
+		var qrFiles bool
+
+		if o.Files != nil {
+			qrFiles = *o.Files
+		}
+		qFiles := swag.FormatBool(qrFiles)
+		if qFiles != "" {
+
+			if err := r.SetQueryParam("files", qFiles); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param index
+	if err := r.SetPathParam("index", swag.FormatInt64(o.Index)); err != nil {
+		return err
+	}
+
+	if o.Limit != nil {
+
+		// query param limit
+		var qrLimit int64
+
+		if o.Limit != nil {
+			qrLimit = *o.Limit
+		}
+		qLimit := swag.FormatInt64(qrLimit)
+		if qLimit != "" {
+
+			if err := r.SetQueryParam("limit", qLimit); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if o.Verification != nil {
+
+		// query param verification
+		var qrVerification bool
+
+		if o.Verification != nil {
+			qrVerification = *o.Verification
+		}
+		qVerification := swag.FormatBool(qrVerification)
+		if qVerification != "" {
+
+			if err := r.SetQueryParam("verification", qVerification); err != nil {
+				return err
+			}
+		}
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_get_pull_request_commits_responses.go b/bots-common/gitea-generated/client/repository/repo_get_pull_request_commits_responses.go
new file mode 100644
index 0000000..1336a1e
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_get_pull_request_commits_responses.go
@@ -0,0 +1,252 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoGetPullRequestCommitsReader is a Reader for the RepoGetPullRequestCommits structure.
+type RepoGetPullRequestCommitsReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoGetPullRequestCommitsReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoGetPullRequestCommitsOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoGetPullRequestCommitsNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/pulls/{index}/commits] repoGetPullRequestCommits", response, response.Code())
+	}
+}
+
+// NewRepoGetPullRequestCommitsOK creates a RepoGetPullRequestCommitsOK with default headers values
+func NewRepoGetPullRequestCommitsOK() *RepoGetPullRequestCommitsOK {
+	return &RepoGetPullRequestCommitsOK{}
+}
+
+/*
+RepoGetPullRequestCommitsOK describes a response with status code 200, with default header values.
+
+CommitList
+*/
+type RepoGetPullRequestCommitsOK struct {
+
+	/* True if there is another page
+	 */
+	XHasMore bool
+
+	/* The current page
+
+	   Format: int64
+	*/
+	XPage int64
+
+	/* Total number of pages
+
+	   Format: int64
+	*/
+	XPageCount int64
+
+	/* Commits per page
+
+	   Format: int64
+	*/
+	XPerPage int64
+
+	/* Total commit count
+
+	   Format: int64
+	*/
+	XTotal int64
+
+	Payload []*models.Commit
+}
+
+// IsSuccess returns true when this repo get pull request commits o k response has a 2xx status code
+func (o *RepoGetPullRequestCommitsOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo get pull request commits o k response has a 3xx status code
+func (o *RepoGetPullRequestCommitsOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo get pull request commits o k response has a 4xx status code
+func (o *RepoGetPullRequestCommitsOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo get pull request commits o k response has a 5xx status code
+func (o *RepoGetPullRequestCommitsOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo get pull request commits o k response a status code equal to that given
+func (o *RepoGetPullRequestCommitsOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo get pull request commits o k response
+func (o *RepoGetPullRequestCommitsOK) Code() int {
+	return 200
+}
+
+func (o *RepoGetPullRequestCommitsOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/pulls/{index}/commits][%d] repoGetPullRequestCommitsOK %s", 200, payload)
+}
+
+func (o *RepoGetPullRequestCommitsOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/pulls/{index}/commits][%d] repoGetPullRequestCommitsOK %s", 200, payload)
+}
+
+func (o *RepoGetPullRequestCommitsOK) GetPayload() []*models.Commit {
+	return o.Payload
+}
+
+func (o *RepoGetPullRequestCommitsOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header X-HasMore
+	hdrXHasMore := response.GetHeader("X-HasMore")
+
+	if hdrXHasMore != "" {
+		valxHasMore, err := swag.ConvertBool(hdrXHasMore)
+		if err != nil {
+			return errors.InvalidType("X-HasMore", "header", "bool", hdrXHasMore)
+		}
+		o.XHasMore = valxHasMore
+	}
+
+	// hydrates response header X-Page
+	hdrXPage := response.GetHeader("X-Page")
+
+	if hdrXPage != "" {
+		valxPage, err := swag.ConvertInt64(hdrXPage)
+		if err != nil {
+			return errors.InvalidType("X-Page", "header", "int64", hdrXPage)
+		}
+		o.XPage = valxPage
+	}
+
+	// hydrates response header X-PageCount
+	hdrXPageCount := response.GetHeader("X-PageCount")
+
+	if hdrXPageCount != "" {
+		valxPageCount, err := swag.ConvertInt64(hdrXPageCount)
+		if err != nil {
+			return errors.InvalidType("X-PageCount", "header", "int64", hdrXPageCount)
+		}
+		o.XPageCount = valxPageCount
+	}
+
+	// hydrates response header X-PerPage
+	hdrXPerPage := response.GetHeader("X-PerPage")
+
+	if hdrXPerPage != "" {
+		valxPerPage, err := swag.ConvertInt64(hdrXPerPage)
+		if err != nil {
+			return errors.InvalidType("X-PerPage", "header", "int64", hdrXPerPage)
+		}
+		o.XPerPage = valxPerPage
+	}
+
+	// hydrates response header X-Total
+	hdrXTotal := response.GetHeader("X-Total")
+
+	if hdrXTotal != "" {
+		valxTotal, err := swag.ConvertInt64(hdrXTotal)
+		if err != nil {
+			return errors.InvalidType("X-Total", "header", "int64", hdrXTotal)
+		}
+		o.XTotal = valxTotal
+	}
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoGetPullRequestCommitsNotFound creates a RepoGetPullRequestCommitsNotFound with default headers values
+func NewRepoGetPullRequestCommitsNotFound() *RepoGetPullRequestCommitsNotFound {
+	return &RepoGetPullRequestCommitsNotFound{}
+}
+
+/*
+RepoGetPullRequestCommitsNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoGetPullRequestCommitsNotFound struct {
+}
+
+// IsSuccess returns true when this repo get pull request commits not found response has a 2xx status code
+func (o *RepoGetPullRequestCommitsNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo get pull request commits not found response has a 3xx status code
+func (o *RepoGetPullRequestCommitsNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo get pull request commits not found response has a 4xx status code
+func (o *RepoGetPullRequestCommitsNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo get pull request commits not found response has a 5xx status code
+func (o *RepoGetPullRequestCommitsNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo get pull request commits not found response a status code equal to that given
+func (o *RepoGetPullRequestCommitsNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo get pull request commits not found response
+func (o *RepoGetPullRequestCommitsNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoGetPullRequestCommitsNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/pulls/{index}/commits][%d] repoGetPullRequestCommitsNotFound", 404)
+}
+
+func (o *RepoGetPullRequestCommitsNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/pulls/{index}/commits][%d] repoGetPullRequestCommitsNotFound", 404)
+}
+
+func (o *RepoGetPullRequestCommitsNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_get_pull_request_files_parameters.go b/bots-common/gitea-generated/client/repository/repo_get_pull_request_files_parameters.go
new file mode 100644
index 0000000..da33496
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_get_pull_request_files_parameters.go
@@ -0,0 +1,334 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewRepoGetPullRequestFilesParams creates a new RepoGetPullRequestFilesParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoGetPullRequestFilesParams() *RepoGetPullRequestFilesParams {
+	return &RepoGetPullRequestFilesParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoGetPullRequestFilesParamsWithTimeout creates a new RepoGetPullRequestFilesParams object
+// with the ability to set a timeout on a request.
+func NewRepoGetPullRequestFilesParamsWithTimeout(timeout time.Duration) *RepoGetPullRequestFilesParams {
+	return &RepoGetPullRequestFilesParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoGetPullRequestFilesParamsWithContext creates a new RepoGetPullRequestFilesParams object
+// with the ability to set a context for a request.
+func NewRepoGetPullRequestFilesParamsWithContext(ctx context.Context) *RepoGetPullRequestFilesParams {
+	return &RepoGetPullRequestFilesParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoGetPullRequestFilesParamsWithHTTPClient creates a new RepoGetPullRequestFilesParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoGetPullRequestFilesParamsWithHTTPClient(client *http.Client) *RepoGetPullRequestFilesParams {
+	return &RepoGetPullRequestFilesParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoGetPullRequestFilesParams contains all the parameters to send to the API endpoint
+
+	for the repo get pull request files operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoGetPullRequestFilesParams struct {
+
+	/* Index.
+
+	   index of the pull request to get
+
+	   Format: int64
+	*/
+	Index int64
+
+	/* Limit.
+
+	   page size of results
+	*/
+	Limit *int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Page.
+
+	   page number of results to return (1-based)
+	*/
+	Page *int64
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	/* SkipTo.
+
+	   skip to given file
+	*/
+	SkipTo *string
+
+	/* Whitespace.
+
+	   whitespace behavior
+	*/
+	Whitespace *string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo get pull request files params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoGetPullRequestFilesParams) WithDefaults() *RepoGetPullRequestFilesParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo get pull request files params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoGetPullRequestFilesParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo get pull request files params
+func (o *RepoGetPullRequestFilesParams) WithTimeout(timeout time.Duration) *RepoGetPullRequestFilesParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo get pull request files params
+func (o *RepoGetPullRequestFilesParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo get pull request files params
+func (o *RepoGetPullRequestFilesParams) WithContext(ctx context.Context) *RepoGetPullRequestFilesParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo get pull request files params
+func (o *RepoGetPullRequestFilesParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo get pull request files params
+func (o *RepoGetPullRequestFilesParams) WithHTTPClient(client *http.Client) *RepoGetPullRequestFilesParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo get pull request files params
+func (o *RepoGetPullRequestFilesParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithIndex adds the index to the repo get pull request files params
+func (o *RepoGetPullRequestFilesParams) WithIndex(index int64) *RepoGetPullRequestFilesParams {
+	o.SetIndex(index)
+	return o
+}
+
+// SetIndex adds the index to the repo get pull request files params
+func (o *RepoGetPullRequestFilesParams) SetIndex(index int64) {
+	o.Index = index
+}
+
+// WithLimit adds the limit to the repo get pull request files params
+func (o *RepoGetPullRequestFilesParams) WithLimit(limit *int64) *RepoGetPullRequestFilesParams {
+	o.SetLimit(limit)
+	return o
+}
+
+// SetLimit adds the limit to the repo get pull request files params
+func (o *RepoGetPullRequestFilesParams) SetLimit(limit *int64) {
+	o.Limit = limit
+}
+
+// WithOwner adds the owner to the repo get pull request files params
+func (o *RepoGetPullRequestFilesParams) WithOwner(owner string) *RepoGetPullRequestFilesParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo get pull request files params
+func (o *RepoGetPullRequestFilesParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithPage adds the page to the repo get pull request files params
+func (o *RepoGetPullRequestFilesParams) WithPage(page *int64) *RepoGetPullRequestFilesParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the repo get pull request files params
+func (o *RepoGetPullRequestFilesParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WithRepo adds the repo to the repo get pull request files params
+func (o *RepoGetPullRequestFilesParams) WithRepo(repo string) *RepoGetPullRequestFilesParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo get pull request files params
+func (o *RepoGetPullRequestFilesParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WithSkipTo adds the skipTo to the repo get pull request files params
+func (o *RepoGetPullRequestFilesParams) WithSkipTo(skipTo *string) *RepoGetPullRequestFilesParams {
+	o.SetSkipTo(skipTo)
+	return o
+}
+
+// SetSkipTo adds the skipTo to the repo get pull request files params
+func (o *RepoGetPullRequestFilesParams) SetSkipTo(skipTo *string) {
+	o.SkipTo = skipTo
+}
+
+// WithWhitespace adds the whitespace to the repo get pull request files params
+func (o *RepoGetPullRequestFilesParams) WithWhitespace(whitespace *string) *RepoGetPullRequestFilesParams {
+	o.SetWhitespace(whitespace)
+	return o
+}
+
+// SetWhitespace adds the whitespace to the repo get pull request files params
+func (o *RepoGetPullRequestFilesParams) SetWhitespace(whitespace *string) {
+	o.Whitespace = whitespace
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoGetPullRequestFilesParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param index
+	if err := r.SetPathParam("index", swag.FormatInt64(o.Index)); err != nil {
+		return err
+	}
+
+	if o.Limit != nil {
+
+		// query param limit
+		var qrLimit int64
+
+		if o.Limit != nil {
+			qrLimit = *o.Limit
+		}
+		qLimit := swag.FormatInt64(qrLimit)
+		if qLimit != "" {
+
+			if err := r.SetQueryParam("limit", qLimit); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if o.SkipTo != nil {
+
+		// query param skip-to
+		var qrSkipTo string
+
+		if o.SkipTo != nil {
+			qrSkipTo = *o.SkipTo
+		}
+		qSkipTo := qrSkipTo
+		if qSkipTo != "" {
+
+			if err := r.SetQueryParam("skip-to", qSkipTo); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Whitespace != nil {
+
+		// query param whitespace
+		var qrWhitespace string
+
+		if o.Whitespace != nil {
+			qrWhitespace = *o.Whitespace
+		}
+		qWhitespace := qrWhitespace
+		if qWhitespace != "" {
+
+			if err := r.SetQueryParam("whitespace", qWhitespace); err != nil {
+				return err
+			}
+		}
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_get_pull_request_files_responses.go b/bots-common/gitea-generated/client/repository/repo_get_pull_request_files_responses.go
new file mode 100644
index 0000000..e5b4c12
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_get_pull_request_files_responses.go
@@ -0,0 +1,252 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoGetPullRequestFilesReader is a Reader for the RepoGetPullRequestFiles structure.
+type RepoGetPullRequestFilesReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoGetPullRequestFilesReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoGetPullRequestFilesOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoGetPullRequestFilesNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/pulls/{index}/files] repoGetPullRequestFiles", response, response.Code())
+	}
+}
+
+// NewRepoGetPullRequestFilesOK creates a RepoGetPullRequestFilesOK with default headers values
+func NewRepoGetPullRequestFilesOK() *RepoGetPullRequestFilesOK {
+	return &RepoGetPullRequestFilesOK{}
+}
+
+/*
+RepoGetPullRequestFilesOK describes a response with status code 200, with default header values.
+
+ChangedFileList
+*/
+type RepoGetPullRequestFilesOK struct {
+
+	/* True if there is another page
+	 */
+	XHasMore bool
+
+	/* The current page
+
+	   Format: int64
+	*/
+	XPage int64
+
+	/* Total number of pages
+
+	   Format: int64
+	*/
+	XPageCount int64
+
+	/* Commits per page
+
+	   Format: int64
+	*/
+	XPerPage int64
+
+	/* Total commit count
+
+	   Format: int64
+	*/
+	XTotal int64
+
+	Payload []*models.ChangedFile
+}
+
+// IsSuccess returns true when this repo get pull request files o k response has a 2xx status code
+func (o *RepoGetPullRequestFilesOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo get pull request files o k response has a 3xx status code
+func (o *RepoGetPullRequestFilesOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo get pull request files o k response has a 4xx status code
+func (o *RepoGetPullRequestFilesOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo get pull request files o k response has a 5xx status code
+func (o *RepoGetPullRequestFilesOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo get pull request files o k response a status code equal to that given
+func (o *RepoGetPullRequestFilesOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo get pull request files o k response
+func (o *RepoGetPullRequestFilesOK) Code() int {
+	return 200
+}
+
+func (o *RepoGetPullRequestFilesOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/pulls/{index}/files][%d] repoGetPullRequestFilesOK %s", 200, payload)
+}
+
+func (o *RepoGetPullRequestFilesOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/pulls/{index}/files][%d] repoGetPullRequestFilesOK %s", 200, payload)
+}
+
+func (o *RepoGetPullRequestFilesOK) GetPayload() []*models.ChangedFile {
+	return o.Payload
+}
+
+func (o *RepoGetPullRequestFilesOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header X-HasMore
+	hdrXHasMore := response.GetHeader("X-HasMore")
+
+	if hdrXHasMore != "" {
+		valxHasMore, err := swag.ConvertBool(hdrXHasMore)
+		if err != nil {
+			return errors.InvalidType("X-HasMore", "header", "bool", hdrXHasMore)
+		}
+		o.XHasMore = valxHasMore
+	}
+
+	// hydrates response header X-Page
+	hdrXPage := response.GetHeader("X-Page")
+
+	if hdrXPage != "" {
+		valxPage, err := swag.ConvertInt64(hdrXPage)
+		if err != nil {
+			return errors.InvalidType("X-Page", "header", "int64", hdrXPage)
+		}
+		o.XPage = valxPage
+	}
+
+	// hydrates response header X-PageCount
+	hdrXPageCount := response.GetHeader("X-PageCount")
+
+	if hdrXPageCount != "" {
+		valxPageCount, err := swag.ConvertInt64(hdrXPageCount)
+		if err != nil {
+			return errors.InvalidType("X-PageCount", "header", "int64", hdrXPageCount)
+		}
+		o.XPageCount = valxPageCount
+	}
+
+	// hydrates response header X-PerPage
+	hdrXPerPage := response.GetHeader("X-PerPage")
+
+	if hdrXPerPage != "" {
+		valxPerPage, err := swag.ConvertInt64(hdrXPerPage)
+		if err != nil {
+			return errors.InvalidType("X-PerPage", "header", "int64", hdrXPerPage)
+		}
+		o.XPerPage = valxPerPage
+	}
+
+	// hydrates response header X-Total
+	hdrXTotal := response.GetHeader("X-Total")
+
+	if hdrXTotal != "" {
+		valxTotal, err := swag.ConvertInt64(hdrXTotal)
+		if err != nil {
+			return errors.InvalidType("X-Total", "header", "int64", hdrXTotal)
+		}
+		o.XTotal = valxTotal
+	}
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoGetPullRequestFilesNotFound creates a RepoGetPullRequestFilesNotFound with default headers values
+func NewRepoGetPullRequestFilesNotFound() *RepoGetPullRequestFilesNotFound {
+	return &RepoGetPullRequestFilesNotFound{}
+}
+
+/*
+RepoGetPullRequestFilesNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoGetPullRequestFilesNotFound struct {
+}
+
+// IsSuccess returns true when this repo get pull request files not found response has a 2xx status code
+func (o *RepoGetPullRequestFilesNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo get pull request files not found response has a 3xx status code
+func (o *RepoGetPullRequestFilesNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo get pull request files not found response has a 4xx status code
+func (o *RepoGetPullRequestFilesNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo get pull request files not found response has a 5xx status code
+func (o *RepoGetPullRequestFilesNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo get pull request files not found response a status code equal to that given
+func (o *RepoGetPullRequestFilesNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo get pull request files not found response
+func (o *RepoGetPullRequestFilesNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoGetPullRequestFilesNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/pulls/{index}/files][%d] repoGetPullRequestFilesNotFound", 404)
+}
+
+func (o *RepoGetPullRequestFilesNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/pulls/{index}/files][%d] repoGetPullRequestFilesNotFound", 404)
+}
+
+func (o *RepoGetPullRequestFilesNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_get_pull_request_parameters.go b/bots-common/gitea-generated/client/repository/repo_get_pull_request_parameters.go
new file mode 100644
index 0000000..4d3cebe
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_get_pull_request_parameters.go
@@ -0,0 +1,198 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewRepoGetPullRequestParams creates a new RepoGetPullRequestParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoGetPullRequestParams() *RepoGetPullRequestParams {
+	return &RepoGetPullRequestParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoGetPullRequestParamsWithTimeout creates a new RepoGetPullRequestParams object
+// with the ability to set a timeout on a request.
+func NewRepoGetPullRequestParamsWithTimeout(timeout time.Duration) *RepoGetPullRequestParams {
+	return &RepoGetPullRequestParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoGetPullRequestParamsWithContext creates a new RepoGetPullRequestParams object
+// with the ability to set a context for a request.
+func NewRepoGetPullRequestParamsWithContext(ctx context.Context) *RepoGetPullRequestParams {
+	return &RepoGetPullRequestParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoGetPullRequestParamsWithHTTPClient creates a new RepoGetPullRequestParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoGetPullRequestParamsWithHTTPClient(client *http.Client) *RepoGetPullRequestParams {
+	return &RepoGetPullRequestParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoGetPullRequestParams contains all the parameters to send to the API endpoint
+
+	for the repo get pull request operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoGetPullRequestParams struct {
+
+	/* Index.
+
+	   index of the pull request to get
+
+	   Format: int64
+	*/
+	Index int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo get pull request params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoGetPullRequestParams) WithDefaults() *RepoGetPullRequestParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo get pull request params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoGetPullRequestParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo get pull request params
+func (o *RepoGetPullRequestParams) WithTimeout(timeout time.Duration) *RepoGetPullRequestParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo get pull request params
+func (o *RepoGetPullRequestParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo get pull request params
+func (o *RepoGetPullRequestParams) WithContext(ctx context.Context) *RepoGetPullRequestParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo get pull request params
+func (o *RepoGetPullRequestParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo get pull request params
+func (o *RepoGetPullRequestParams) WithHTTPClient(client *http.Client) *RepoGetPullRequestParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo get pull request params
+func (o *RepoGetPullRequestParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithIndex adds the index to the repo get pull request params
+func (o *RepoGetPullRequestParams) WithIndex(index int64) *RepoGetPullRequestParams {
+	o.SetIndex(index)
+	return o
+}
+
+// SetIndex adds the index to the repo get pull request params
+func (o *RepoGetPullRequestParams) SetIndex(index int64) {
+	o.Index = index
+}
+
+// WithOwner adds the owner to the repo get pull request params
+func (o *RepoGetPullRequestParams) WithOwner(owner string) *RepoGetPullRequestParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo get pull request params
+func (o *RepoGetPullRequestParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo get pull request params
+func (o *RepoGetPullRequestParams) WithRepo(repo string) *RepoGetPullRequestParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo get pull request params
+func (o *RepoGetPullRequestParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoGetPullRequestParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param index
+	if err := r.SetPathParam("index", swag.FormatInt64(o.Index)); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_get_pull_request_responses.go b/bots-common/gitea-generated/client/repository/repo_get_pull_request_responses.go
new file mode 100644
index 0000000..be31a13
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_get_pull_request_responses.go
@@ -0,0 +1,168 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoGetPullRequestReader is a Reader for the RepoGetPullRequest structure.
+type RepoGetPullRequestReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoGetPullRequestReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoGetPullRequestOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoGetPullRequestNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/pulls/{index}] repoGetPullRequest", response, response.Code())
+	}
+}
+
+// NewRepoGetPullRequestOK creates a RepoGetPullRequestOK with default headers values
+func NewRepoGetPullRequestOK() *RepoGetPullRequestOK {
+	return &RepoGetPullRequestOK{}
+}
+
+/*
+RepoGetPullRequestOK describes a response with status code 200, with default header values.
+
+PullRequest
+*/
+type RepoGetPullRequestOK struct {
+	Payload *models.PullRequest
+}
+
+// IsSuccess returns true when this repo get pull request o k response has a 2xx status code
+func (o *RepoGetPullRequestOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo get pull request o k response has a 3xx status code
+func (o *RepoGetPullRequestOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo get pull request o k response has a 4xx status code
+func (o *RepoGetPullRequestOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo get pull request o k response has a 5xx status code
+func (o *RepoGetPullRequestOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo get pull request o k response a status code equal to that given
+func (o *RepoGetPullRequestOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo get pull request o k response
+func (o *RepoGetPullRequestOK) Code() int {
+	return 200
+}
+
+func (o *RepoGetPullRequestOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/pulls/{index}][%d] repoGetPullRequestOK %s", 200, payload)
+}
+
+func (o *RepoGetPullRequestOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/pulls/{index}][%d] repoGetPullRequestOK %s", 200, payload)
+}
+
+func (o *RepoGetPullRequestOK) GetPayload() *models.PullRequest {
+	return o.Payload
+}
+
+func (o *RepoGetPullRequestOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.PullRequest)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoGetPullRequestNotFound creates a RepoGetPullRequestNotFound with default headers values
+func NewRepoGetPullRequestNotFound() *RepoGetPullRequestNotFound {
+	return &RepoGetPullRequestNotFound{}
+}
+
+/*
+RepoGetPullRequestNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoGetPullRequestNotFound struct {
+}
+
+// IsSuccess returns true when this repo get pull request not found response has a 2xx status code
+func (o *RepoGetPullRequestNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo get pull request not found response has a 3xx status code
+func (o *RepoGetPullRequestNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo get pull request not found response has a 4xx status code
+func (o *RepoGetPullRequestNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo get pull request not found response has a 5xx status code
+func (o *RepoGetPullRequestNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo get pull request not found response a status code equal to that given
+func (o *RepoGetPullRequestNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo get pull request not found response
+func (o *RepoGetPullRequestNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoGetPullRequestNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/pulls/{index}][%d] repoGetPullRequestNotFound", 404)
+}
+
+func (o *RepoGetPullRequestNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/pulls/{index}][%d] repoGetPullRequestNotFound", 404)
+}
+
+func (o *RepoGetPullRequestNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_get_pull_review_comments_parameters.go b/bots-common/gitea-generated/client/repository/repo_get_pull_review_comments_parameters.go
new file mode 100644
index 0000000..4d90de5
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_get_pull_review_comments_parameters.go
@@ -0,0 +1,222 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewRepoGetPullReviewCommentsParams creates a new RepoGetPullReviewCommentsParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoGetPullReviewCommentsParams() *RepoGetPullReviewCommentsParams {
+	return &RepoGetPullReviewCommentsParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoGetPullReviewCommentsParamsWithTimeout creates a new RepoGetPullReviewCommentsParams object
+// with the ability to set a timeout on a request.
+func NewRepoGetPullReviewCommentsParamsWithTimeout(timeout time.Duration) *RepoGetPullReviewCommentsParams {
+	return &RepoGetPullReviewCommentsParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoGetPullReviewCommentsParamsWithContext creates a new RepoGetPullReviewCommentsParams object
+// with the ability to set a context for a request.
+func NewRepoGetPullReviewCommentsParamsWithContext(ctx context.Context) *RepoGetPullReviewCommentsParams {
+	return &RepoGetPullReviewCommentsParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoGetPullReviewCommentsParamsWithHTTPClient creates a new RepoGetPullReviewCommentsParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoGetPullReviewCommentsParamsWithHTTPClient(client *http.Client) *RepoGetPullReviewCommentsParams {
+	return &RepoGetPullReviewCommentsParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoGetPullReviewCommentsParams contains all the parameters to send to the API endpoint
+
+	for the repo get pull review comments operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoGetPullReviewCommentsParams struct {
+
+	/* ID.
+
+	   id of the review
+
+	   Format: int64
+	*/
+	ID int64
+
+	/* Index.
+
+	   index of the pull request
+
+	   Format: int64
+	*/
+	Index int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo get pull review comments params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoGetPullReviewCommentsParams) WithDefaults() *RepoGetPullReviewCommentsParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo get pull review comments params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoGetPullReviewCommentsParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo get pull review comments params
+func (o *RepoGetPullReviewCommentsParams) WithTimeout(timeout time.Duration) *RepoGetPullReviewCommentsParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo get pull review comments params
+func (o *RepoGetPullReviewCommentsParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo get pull review comments params
+func (o *RepoGetPullReviewCommentsParams) WithContext(ctx context.Context) *RepoGetPullReviewCommentsParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo get pull review comments params
+func (o *RepoGetPullReviewCommentsParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo get pull review comments params
+func (o *RepoGetPullReviewCommentsParams) WithHTTPClient(client *http.Client) *RepoGetPullReviewCommentsParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo get pull review comments params
+func (o *RepoGetPullReviewCommentsParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithID adds the id to the repo get pull review comments params
+func (o *RepoGetPullReviewCommentsParams) WithID(id int64) *RepoGetPullReviewCommentsParams {
+	o.SetID(id)
+	return o
+}
+
+// SetID adds the id to the repo get pull review comments params
+func (o *RepoGetPullReviewCommentsParams) SetID(id int64) {
+	o.ID = id
+}
+
+// WithIndex adds the index to the repo get pull review comments params
+func (o *RepoGetPullReviewCommentsParams) WithIndex(index int64) *RepoGetPullReviewCommentsParams {
+	o.SetIndex(index)
+	return o
+}
+
+// SetIndex adds the index to the repo get pull review comments params
+func (o *RepoGetPullReviewCommentsParams) SetIndex(index int64) {
+	o.Index = index
+}
+
+// WithOwner adds the owner to the repo get pull review comments params
+func (o *RepoGetPullReviewCommentsParams) WithOwner(owner string) *RepoGetPullReviewCommentsParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo get pull review comments params
+func (o *RepoGetPullReviewCommentsParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo get pull review comments params
+func (o *RepoGetPullReviewCommentsParams) WithRepo(repo string) *RepoGetPullReviewCommentsParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo get pull review comments params
+func (o *RepoGetPullReviewCommentsParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoGetPullReviewCommentsParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param id
+	if err := r.SetPathParam("id", swag.FormatInt64(o.ID)); err != nil {
+		return err
+	}
+
+	// path param index
+	if err := r.SetPathParam("index", swag.FormatInt64(o.Index)); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_get_pull_review_comments_responses.go b/bots-common/gitea-generated/client/repository/repo_get_pull_review_comments_responses.go
new file mode 100644
index 0000000..fa892de
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_get_pull_review_comments_responses.go
@@ -0,0 +1,166 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoGetPullReviewCommentsReader is a Reader for the RepoGetPullReviewComments structure.
+type RepoGetPullReviewCommentsReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoGetPullReviewCommentsReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoGetPullReviewCommentsOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoGetPullReviewCommentsNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/pulls/{index}/reviews/{id}/comments] repoGetPullReviewComments", response, response.Code())
+	}
+}
+
+// NewRepoGetPullReviewCommentsOK creates a RepoGetPullReviewCommentsOK with default headers values
+func NewRepoGetPullReviewCommentsOK() *RepoGetPullReviewCommentsOK {
+	return &RepoGetPullReviewCommentsOK{}
+}
+
+/*
+RepoGetPullReviewCommentsOK describes a response with status code 200, with default header values.
+
+PullCommentList
+*/
+type RepoGetPullReviewCommentsOK struct {
+	Payload []*models.PullReviewComment
+}
+
+// IsSuccess returns true when this repo get pull review comments o k response has a 2xx status code
+func (o *RepoGetPullReviewCommentsOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo get pull review comments o k response has a 3xx status code
+func (o *RepoGetPullReviewCommentsOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo get pull review comments o k response has a 4xx status code
+func (o *RepoGetPullReviewCommentsOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo get pull review comments o k response has a 5xx status code
+func (o *RepoGetPullReviewCommentsOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo get pull review comments o k response a status code equal to that given
+func (o *RepoGetPullReviewCommentsOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo get pull review comments o k response
+func (o *RepoGetPullReviewCommentsOK) Code() int {
+	return 200
+}
+
+func (o *RepoGetPullReviewCommentsOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/pulls/{index}/reviews/{id}/comments][%d] repoGetPullReviewCommentsOK %s", 200, payload)
+}
+
+func (o *RepoGetPullReviewCommentsOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/pulls/{index}/reviews/{id}/comments][%d] repoGetPullReviewCommentsOK %s", 200, payload)
+}
+
+func (o *RepoGetPullReviewCommentsOK) GetPayload() []*models.PullReviewComment {
+	return o.Payload
+}
+
+func (o *RepoGetPullReviewCommentsOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoGetPullReviewCommentsNotFound creates a RepoGetPullReviewCommentsNotFound with default headers values
+func NewRepoGetPullReviewCommentsNotFound() *RepoGetPullReviewCommentsNotFound {
+	return &RepoGetPullReviewCommentsNotFound{}
+}
+
+/*
+RepoGetPullReviewCommentsNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoGetPullReviewCommentsNotFound struct {
+}
+
+// IsSuccess returns true when this repo get pull review comments not found response has a 2xx status code
+func (o *RepoGetPullReviewCommentsNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo get pull review comments not found response has a 3xx status code
+func (o *RepoGetPullReviewCommentsNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo get pull review comments not found response has a 4xx status code
+func (o *RepoGetPullReviewCommentsNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo get pull review comments not found response has a 5xx status code
+func (o *RepoGetPullReviewCommentsNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo get pull review comments not found response a status code equal to that given
+func (o *RepoGetPullReviewCommentsNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo get pull review comments not found response
+func (o *RepoGetPullReviewCommentsNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoGetPullReviewCommentsNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/pulls/{index}/reviews/{id}/comments][%d] repoGetPullReviewCommentsNotFound", 404)
+}
+
+func (o *RepoGetPullReviewCommentsNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/pulls/{index}/reviews/{id}/comments][%d] repoGetPullReviewCommentsNotFound", 404)
+}
+
+func (o *RepoGetPullReviewCommentsNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_get_pull_review_parameters.go b/bots-common/gitea-generated/client/repository/repo_get_pull_review_parameters.go
new file mode 100644
index 0000000..22a43ab
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_get_pull_review_parameters.go
@@ -0,0 +1,222 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewRepoGetPullReviewParams creates a new RepoGetPullReviewParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoGetPullReviewParams() *RepoGetPullReviewParams {
+	return &RepoGetPullReviewParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoGetPullReviewParamsWithTimeout creates a new RepoGetPullReviewParams object
+// with the ability to set a timeout on a request.
+func NewRepoGetPullReviewParamsWithTimeout(timeout time.Duration) *RepoGetPullReviewParams {
+	return &RepoGetPullReviewParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoGetPullReviewParamsWithContext creates a new RepoGetPullReviewParams object
+// with the ability to set a context for a request.
+func NewRepoGetPullReviewParamsWithContext(ctx context.Context) *RepoGetPullReviewParams {
+	return &RepoGetPullReviewParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoGetPullReviewParamsWithHTTPClient creates a new RepoGetPullReviewParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoGetPullReviewParamsWithHTTPClient(client *http.Client) *RepoGetPullReviewParams {
+	return &RepoGetPullReviewParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoGetPullReviewParams contains all the parameters to send to the API endpoint
+
+	for the repo get pull review operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoGetPullReviewParams struct {
+
+	/* ID.
+
+	   id of the review
+
+	   Format: int64
+	*/
+	ID int64
+
+	/* Index.
+
+	   index of the pull request
+
+	   Format: int64
+	*/
+	Index int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo get pull review params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoGetPullReviewParams) WithDefaults() *RepoGetPullReviewParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo get pull review params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoGetPullReviewParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo get pull review params
+func (o *RepoGetPullReviewParams) WithTimeout(timeout time.Duration) *RepoGetPullReviewParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo get pull review params
+func (o *RepoGetPullReviewParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo get pull review params
+func (o *RepoGetPullReviewParams) WithContext(ctx context.Context) *RepoGetPullReviewParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo get pull review params
+func (o *RepoGetPullReviewParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo get pull review params
+func (o *RepoGetPullReviewParams) WithHTTPClient(client *http.Client) *RepoGetPullReviewParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo get pull review params
+func (o *RepoGetPullReviewParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithID adds the id to the repo get pull review params
+func (o *RepoGetPullReviewParams) WithID(id int64) *RepoGetPullReviewParams {
+	o.SetID(id)
+	return o
+}
+
+// SetID adds the id to the repo get pull review params
+func (o *RepoGetPullReviewParams) SetID(id int64) {
+	o.ID = id
+}
+
+// WithIndex adds the index to the repo get pull review params
+func (o *RepoGetPullReviewParams) WithIndex(index int64) *RepoGetPullReviewParams {
+	o.SetIndex(index)
+	return o
+}
+
+// SetIndex adds the index to the repo get pull review params
+func (o *RepoGetPullReviewParams) SetIndex(index int64) {
+	o.Index = index
+}
+
+// WithOwner adds the owner to the repo get pull review params
+func (o *RepoGetPullReviewParams) WithOwner(owner string) *RepoGetPullReviewParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo get pull review params
+func (o *RepoGetPullReviewParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo get pull review params
+func (o *RepoGetPullReviewParams) WithRepo(repo string) *RepoGetPullReviewParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo get pull review params
+func (o *RepoGetPullReviewParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoGetPullReviewParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param id
+	if err := r.SetPathParam("id", swag.FormatInt64(o.ID)); err != nil {
+		return err
+	}
+
+	// path param index
+	if err := r.SetPathParam("index", swag.FormatInt64(o.Index)); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_get_pull_review_responses.go b/bots-common/gitea-generated/client/repository/repo_get_pull_review_responses.go
new file mode 100644
index 0000000..f3b62f5
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_get_pull_review_responses.go
@@ -0,0 +1,168 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoGetPullReviewReader is a Reader for the RepoGetPullReview structure.
+type RepoGetPullReviewReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoGetPullReviewReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoGetPullReviewOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoGetPullReviewNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/pulls/{index}/reviews/{id}] repoGetPullReview", response, response.Code())
+	}
+}
+
+// NewRepoGetPullReviewOK creates a RepoGetPullReviewOK with default headers values
+func NewRepoGetPullReviewOK() *RepoGetPullReviewOK {
+	return &RepoGetPullReviewOK{}
+}
+
+/*
+RepoGetPullReviewOK describes a response with status code 200, with default header values.
+
+PullReview
+*/
+type RepoGetPullReviewOK struct {
+	Payload *models.PullReview
+}
+
+// IsSuccess returns true when this repo get pull review o k response has a 2xx status code
+func (o *RepoGetPullReviewOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo get pull review o k response has a 3xx status code
+func (o *RepoGetPullReviewOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo get pull review o k response has a 4xx status code
+func (o *RepoGetPullReviewOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo get pull review o k response has a 5xx status code
+func (o *RepoGetPullReviewOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo get pull review o k response a status code equal to that given
+func (o *RepoGetPullReviewOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo get pull review o k response
+func (o *RepoGetPullReviewOK) Code() int {
+	return 200
+}
+
+func (o *RepoGetPullReviewOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/pulls/{index}/reviews/{id}][%d] repoGetPullReviewOK %s", 200, payload)
+}
+
+func (o *RepoGetPullReviewOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/pulls/{index}/reviews/{id}][%d] repoGetPullReviewOK %s", 200, payload)
+}
+
+func (o *RepoGetPullReviewOK) GetPayload() *models.PullReview {
+	return o.Payload
+}
+
+func (o *RepoGetPullReviewOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.PullReview)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoGetPullReviewNotFound creates a RepoGetPullReviewNotFound with default headers values
+func NewRepoGetPullReviewNotFound() *RepoGetPullReviewNotFound {
+	return &RepoGetPullReviewNotFound{}
+}
+
+/*
+RepoGetPullReviewNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoGetPullReviewNotFound struct {
+}
+
+// IsSuccess returns true when this repo get pull review not found response has a 2xx status code
+func (o *RepoGetPullReviewNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo get pull review not found response has a 3xx status code
+func (o *RepoGetPullReviewNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo get pull review not found response has a 4xx status code
+func (o *RepoGetPullReviewNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo get pull review not found response has a 5xx status code
+func (o *RepoGetPullReviewNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo get pull review not found response a status code equal to that given
+func (o *RepoGetPullReviewNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo get pull review not found response
+func (o *RepoGetPullReviewNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoGetPullReviewNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/pulls/{index}/reviews/{id}][%d] repoGetPullReviewNotFound", 404)
+}
+
+func (o *RepoGetPullReviewNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/pulls/{index}/reviews/{id}][%d] repoGetPullReviewNotFound", 404)
+}
+
+func (o *RepoGetPullReviewNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_get_push_mirror_by_remote_name_parameters.go b/bots-common/gitea-generated/client/repository/repo_get_push_mirror_by_remote_name_parameters.go
new file mode 100644
index 0000000..dbeb0d0
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_get_push_mirror_by_remote_name_parameters.go
@@ -0,0 +1,195 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewRepoGetPushMirrorByRemoteNameParams creates a new RepoGetPushMirrorByRemoteNameParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoGetPushMirrorByRemoteNameParams() *RepoGetPushMirrorByRemoteNameParams {
+	return &RepoGetPushMirrorByRemoteNameParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoGetPushMirrorByRemoteNameParamsWithTimeout creates a new RepoGetPushMirrorByRemoteNameParams object
+// with the ability to set a timeout on a request.
+func NewRepoGetPushMirrorByRemoteNameParamsWithTimeout(timeout time.Duration) *RepoGetPushMirrorByRemoteNameParams {
+	return &RepoGetPushMirrorByRemoteNameParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoGetPushMirrorByRemoteNameParamsWithContext creates a new RepoGetPushMirrorByRemoteNameParams object
+// with the ability to set a context for a request.
+func NewRepoGetPushMirrorByRemoteNameParamsWithContext(ctx context.Context) *RepoGetPushMirrorByRemoteNameParams {
+	return &RepoGetPushMirrorByRemoteNameParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoGetPushMirrorByRemoteNameParamsWithHTTPClient creates a new RepoGetPushMirrorByRemoteNameParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoGetPushMirrorByRemoteNameParamsWithHTTPClient(client *http.Client) *RepoGetPushMirrorByRemoteNameParams {
+	return &RepoGetPushMirrorByRemoteNameParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoGetPushMirrorByRemoteNameParams contains all the parameters to send to the API endpoint
+
+	for the repo get push mirror by remote name operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoGetPushMirrorByRemoteNameParams struct {
+
+	/* Name.
+
+	   remote name of push mirror
+	*/
+	Name string
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo get push mirror by remote name params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoGetPushMirrorByRemoteNameParams) WithDefaults() *RepoGetPushMirrorByRemoteNameParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo get push mirror by remote name params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoGetPushMirrorByRemoteNameParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo get push mirror by remote name params
+func (o *RepoGetPushMirrorByRemoteNameParams) WithTimeout(timeout time.Duration) *RepoGetPushMirrorByRemoteNameParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo get push mirror by remote name params
+func (o *RepoGetPushMirrorByRemoteNameParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo get push mirror by remote name params
+func (o *RepoGetPushMirrorByRemoteNameParams) WithContext(ctx context.Context) *RepoGetPushMirrorByRemoteNameParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo get push mirror by remote name params
+func (o *RepoGetPushMirrorByRemoteNameParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo get push mirror by remote name params
+func (o *RepoGetPushMirrorByRemoteNameParams) WithHTTPClient(client *http.Client) *RepoGetPushMirrorByRemoteNameParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo get push mirror by remote name params
+func (o *RepoGetPushMirrorByRemoteNameParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithName adds the name to the repo get push mirror by remote name params
+func (o *RepoGetPushMirrorByRemoteNameParams) WithName(name string) *RepoGetPushMirrorByRemoteNameParams {
+	o.SetName(name)
+	return o
+}
+
+// SetName adds the name to the repo get push mirror by remote name params
+func (o *RepoGetPushMirrorByRemoteNameParams) SetName(name string) {
+	o.Name = name
+}
+
+// WithOwner adds the owner to the repo get push mirror by remote name params
+func (o *RepoGetPushMirrorByRemoteNameParams) WithOwner(owner string) *RepoGetPushMirrorByRemoteNameParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo get push mirror by remote name params
+func (o *RepoGetPushMirrorByRemoteNameParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo get push mirror by remote name params
+func (o *RepoGetPushMirrorByRemoteNameParams) WithRepo(repo string) *RepoGetPushMirrorByRemoteNameParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo get push mirror by remote name params
+func (o *RepoGetPushMirrorByRemoteNameParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoGetPushMirrorByRemoteNameParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param name
+	if err := r.SetPathParam("name", o.Name); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_get_push_mirror_by_remote_name_responses.go b/bots-common/gitea-generated/client/repository/repo_get_push_mirror_by_remote_name_responses.go
new file mode 100644
index 0000000..5f73fd7
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_get_push_mirror_by_remote_name_responses.go
@@ -0,0 +1,324 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoGetPushMirrorByRemoteNameReader is a Reader for the RepoGetPushMirrorByRemoteName structure.
+type RepoGetPushMirrorByRemoteNameReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoGetPushMirrorByRemoteNameReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoGetPushMirrorByRemoteNameOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 400:
+		result := NewRepoGetPushMirrorByRemoteNameBadRequest()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 403:
+		result := NewRepoGetPushMirrorByRemoteNameForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewRepoGetPushMirrorByRemoteNameNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/push_mirrors/{name}] repoGetPushMirrorByRemoteName", response, response.Code())
+	}
+}
+
+// NewRepoGetPushMirrorByRemoteNameOK creates a RepoGetPushMirrorByRemoteNameOK with default headers values
+func NewRepoGetPushMirrorByRemoteNameOK() *RepoGetPushMirrorByRemoteNameOK {
+	return &RepoGetPushMirrorByRemoteNameOK{}
+}
+
+/*
+RepoGetPushMirrorByRemoteNameOK describes a response with status code 200, with default header values.
+
+PushMirror
+*/
+type RepoGetPushMirrorByRemoteNameOK struct {
+	Payload *models.PushMirror
+}
+
+// IsSuccess returns true when this repo get push mirror by remote name o k response has a 2xx status code
+func (o *RepoGetPushMirrorByRemoteNameOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo get push mirror by remote name o k response has a 3xx status code
+func (o *RepoGetPushMirrorByRemoteNameOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo get push mirror by remote name o k response has a 4xx status code
+func (o *RepoGetPushMirrorByRemoteNameOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo get push mirror by remote name o k response has a 5xx status code
+func (o *RepoGetPushMirrorByRemoteNameOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo get push mirror by remote name o k response a status code equal to that given
+func (o *RepoGetPushMirrorByRemoteNameOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo get push mirror by remote name o k response
+func (o *RepoGetPushMirrorByRemoteNameOK) Code() int {
+	return 200
+}
+
+func (o *RepoGetPushMirrorByRemoteNameOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/push_mirrors/{name}][%d] repoGetPushMirrorByRemoteNameOK %s", 200, payload)
+}
+
+func (o *RepoGetPushMirrorByRemoteNameOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/push_mirrors/{name}][%d] repoGetPushMirrorByRemoteNameOK %s", 200, payload)
+}
+
+func (o *RepoGetPushMirrorByRemoteNameOK) GetPayload() *models.PushMirror {
+	return o.Payload
+}
+
+func (o *RepoGetPushMirrorByRemoteNameOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.PushMirror)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoGetPushMirrorByRemoteNameBadRequest creates a RepoGetPushMirrorByRemoteNameBadRequest with default headers values
+func NewRepoGetPushMirrorByRemoteNameBadRequest() *RepoGetPushMirrorByRemoteNameBadRequest {
+	return &RepoGetPushMirrorByRemoteNameBadRequest{}
+}
+
+/*
+RepoGetPushMirrorByRemoteNameBadRequest describes a response with status code 400, with default header values.
+
+APIError is error format response
+*/
+type RepoGetPushMirrorByRemoteNameBadRequest struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo get push mirror by remote name bad request response has a 2xx status code
+func (o *RepoGetPushMirrorByRemoteNameBadRequest) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo get push mirror by remote name bad request response has a 3xx status code
+func (o *RepoGetPushMirrorByRemoteNameBadRequest) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo get push mirror by remote name bad request response has a 4xx status code
+func (o *RepoGetPushMirrorByRemoteNameBadRequest) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo get push mirror by remote name bad request response has a 5xx status code
+func (o *RepoGetPushMirrorByRemoteNameBadRequest) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo get push mirror by remote name bad request response a status code equal to that given
+func (o *RepoGetPushMirrorByRemoteNameBadRequest) IsCode(code int) bool {
+	return code == 400
+}
+
+// Code gets the status code for the repo get push mirror by remote name bad request response
+func (o *RepoGetPushMirrorByRemoteNameBadRequest) Code() int {
+	return 400
+}
+
+func (o *RepoGetPushMirrorByRemoteNameBadRequest) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/push_mirrors/{name}][%d] repoGetPushMirrorByRemoteNameBadRequest", 400)
+}
+
+func (o *RepoGetPushMirrorByRemoteNameBadRequest) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/push_mirrors/{name}][%d] repoGetPushMirrorByRemoteNameBadRequest", 400)
+}
+
+func (o *RepoGetPushMirrorByRemoteNameBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewRepoGetPushMirrorByRemoteNameForbidden creates a RepoGetPushMirrorByRemoteNameForbidden with default headers values
+func NewRepoGetPushMirrorByRemoteNameForbidden() *RepoGetPushMirrorByRemoteNameForbidden {
+	return &RepoGetPushMirrorByRemoteNameForbidden{}
+}
+
+/*
+RepoGetPushMirrorByRemoteNameForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type RepoGetPushMirrorByRemoteNameForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo get push mirror by remote name forbidden response has a 2xx status code
+func (o *RepoGetPushMirrorByRemoteNameForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo get push mirror by remote name forbidden response has a 3xx status code
+func (o *RepoGetPushMirrorByRemoteNameForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo get push mirror by remote name forbidden response has a 4xx status code
+func (o *RepoGetPushMirrorByRemoteNameForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo get push mirror by remote name forbidden response has a 5xx status code
+func (o *RepoGetPushMirrorByRemoteNameForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo get push mirror by remote name forbidden response a status code equal to that given
+func (o *RepoGetPushMirrorByRemoteNameForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the repo get push mirror by remote name forbidden response
+func (o *RepoGetPushMirrorByRemoteNameForbidden) Code() int {
+	return 403
+}
+
+func (o *RepoGetPushMirrorByRemoteNameForbidden) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/push_mirrors/{name}][%d] repoGetPushMirrorByRemoteNameForbidden", 403)
+}
+
+func (o *RepoGetPushMirrorByRemoteNameForbidden) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/push_mirrors/{name}][%d] repoGetPushMirrorByRemoteNameForbidden", 403)
+}
+
+func (o *RepoGetPushMirrorByRemoteNameForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewRepoGetPushMirrorByRemoteNameNotFound creates a RepoGetPushMirrorByRemoteNameNotFound with default headers values
+func NewRepoGetPushMirrorByRemoteNameNotFound() *RepoGetPushMirrorByRemoteNameNotFound {
+	return &RepoGetPushMirrorByRemoteNameNotFound{}
+}
+
+/*
+RepoGetPushMirrorByRemoteNameNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoGetPushMirrorByRemoteNameNotFound struct {
+}
+
+// IsSuccess returns true when this repo get push mirror by remote name not found response has a 2xx status code
+func (o *RepoGetPushMirrorByRemoteNameNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo get push mirror by remote name not found response has a 3xx status code
+func (o *RepoGetPushMirrorByRemoteNameNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo get push mirror by remote name not found response has a 4xx status code
+func (o *RepoGetPushMirrorByRemoteNameNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo get push mirror by remote name not found response has a 5xx status code
+func (o *RepoGetPushMirrorByRemoteNameNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo get push mirror by remote name not found response a status code equal to that given
+func (o *RepoGetPushMirrorByRemoteNameNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo get push mirror by remote name not found response
+func (o *RepoGetPushMirrorByRemoteNameNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoGetPushMirrorByRemoteNameNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/push_mirrors/{name}][%d] repoGetPushMirrorByRemoteNameNotFound", 404)
+}
+
+func (o *RepoGetPushMirrorByRemoteNameNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/push_mirrors/{name}][%d] repoGetPushMirrorByRemoteNameNotFound", 404)
+}
+
+func (o *RepoGetPushMirrorByRemoteNameNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_get_raw_file_or_l_f_s_parameters.go b/bots-common/gitea-generated/client/repository/repo_get_raw_file_or_l_f_s_parameters.go
new file mode 100644
index 0000000..4607ebe
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_get_raw_file_or_l_f_s_parameters.go
@@ -0,0 +1,229 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewRepoGetRawFileOrLFSParams creates a new RepoGetRawFileOrLFSParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoGetRawFileOrLFSParams() *RepoGetRawFileOrLFSParams {
+	return &RepoGetRawFileOrLFSParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoGetRawFileOrLFSParamsWithTimeout creates a new RepoGetRawFileOrLFSParams object
+// with the ability to set a timeout on a request.
+func NewRepoGetRawFileOrLFSParamsWithTimeout(timeout time.Duration) *RepoGetRawFileOrLFSParams {
+	return &RepoGetRawFileOrLFSParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoGetRawFileOrLFSParamsWithContext creates a new RepoGetRawFileOrLFSParams object
+// with the ability to set a context for a request.
+func NewRepoGetRawFileOrLFSParamsWithContext(ctx context.Context) *RepoGetRawFileOrLFSParams {
+	return &RepoGetRawFileOrLFSParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoGetRawFileOrLFSParamsWithHTTPClient creates a new RepoGetRawFileOrLFSParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoGetRawFileOrLFSParamsWithHTTPClient(client *http.Client) *RepoGetRawFileOrLFSParams {
+	return &RepoGetRawFileOrLFSParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoGetRawFileOrLFSParams contains all the parameters to send to the API endpoint
+
+	for the repo get raw file or l f s operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoGetRawFileOrLFSParams struct {
+
+	/* Filepath.
+
+	   filepath of the file to get
+	*/
+	Filepath string
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Ref.
+
+	   The name of the commit/branch/tag. Default the repository’s default branch (usually master)
+	*/
+	Ref *string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo get raw file or l f s params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoGetRawFileOrLFSParams) WithDefaults() *RepoGetRawFileOrLFSParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo get raw file or l f s params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoGetRawFileOrLFSParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo get raw file or l f s params
+func (o *RepoGetRawFileOrLFSParams) WithTimeout(timeout time.Duration) *RepoGetRawFileOrLFSParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo get raw file or l f s params
+func (o *RepoGetRawFileOrLFSParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo get raw file or l f s params
+func (o *RepoGetRawFileOrLFSParams) WithContext(ctx context.Context) *RepoGetRawFileOrLFSParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo get raw file or l f s params
+func (o *RepoGetRawFileOrLFSParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo get raw file or l f s params
+func (o *RepoGetRawFileOrLFSParams) WithHTTPClient(client *http.Client) *RepoGetRawFileOrLFSParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo get raw file or l f s params
+func (o *RepoGetRawFileOrLFSParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithFilepath adds the filepath to the repo get raw file or l f s params
+func (o *RepoGetRawFileOrLFSParams) WithFilepath(filepath string) *RepoGetRawFileOrLFSParams {
+	o.SetFilepath(filepath)
+	return o
+}
+
+// SetFilepath adds the filepath to the repo get raw file or l f s params
+func (o *RepoGetRawFileOrLFSParams) SetFilepath(filepath string) {
+	o.Filepath = filepath
+}
+
+// WithOwner adds the owner to the repo get raw file or l f s params
+func (o *RepoGetRawFileOrLFSParams) WithOwner(owner string) *RepoGetRawFileOrLFSParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo get raw file or l f s params
+func (o *RepoGetRawFileOrLFSParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRef adds the ref to the repo get raw file or l f s params
+func (o *RepoGetRawFileOrLFSParams) WithRef(ref *string) *RepoGetRawFileOrLFSParams {
+	o.SetRef(ref)
+	return o
+}
+
+// SetRef adds the ref to the repo get raw file or l f s params
+func (o *RepoGetRawFileOrLFSParams) SetRef(ref *string) {
+	o.Ref = ref
+}
+
+// WithRepo adds the repo to the repo get raw file or l f s params
+func (o *RepoGetRawFileOrLFSParams) WithRepo(repo string) *RepoGetRawFileOrLFSParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo get raw file or l f s params
+func (o *RepoGetRawFileOrLFSParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoGetRawFileOrLFSParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param filepath
+	if err := r.SetPathParam("filepath", o.Filepath); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	if o.Ref != nil {
+
+		// query param ref
+		var qrRef string
+
+		if o.Ref != nil {
+			qrRef = *o.Ref
+		}
+		qRef := qrRef
+		if qRef != "" {
+
+			if err := r.SetQueryParam("ref", qRef); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_get_raw_file_or_l_f_s_responses.go b/bots-common/gitea-generated/client/repository/repo_get_raw_file_or_l_f_s_responses.go
new file mode 100644
index 0000000..1082c77
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_get_raw_file_or_l_f_s_responses.go
@@ -0,0 +1,150 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// RepoGetRawFileOrLFSReader is a Reader for the RepoGetRawFileOrLFS structure.
+type RepoGetRawFileOrLFSReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoGetRawFileOrLFSReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoGetRawFileOrLFSOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoGetRawFileOrLFSNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/media/{filepath}] repoGetRawFileOrLFS", response, response.Code())
+	}
+}
+
+// NewRepoGetRawFileOrLFSOK creates a RepoGetRawFileOrLFSOK with default headers values
+func NewRepoGetRawFileOrLFSOK() *RepoGetRawFileOrLFSOK {
+	return &RepoGetRawFileOrLFSOK{}
+}
+
+/*
+RepoGetRawFileOrLFSOK describes a response with status code 200, with default header values.
+
+Returns raw file content.
+*/
+type RepoGetRawFileOrLFSOK struct {
+}
+
+// IsSuccess returns true when this repo get raw file or l f s o k response has a 2xx status code
+func (o *RepoGetRawFileOrLFSOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo get raw file or l f s o k response has a 3xx status code
+func (o *RepoGetRawFileOrLFSOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo get raw file or l f s o k response has a 4xx status code
+func (o *RepoGetRawFileOrLFSOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo get raw file or l f s o k response has a 5xx status code
+func (o *RepoGetRawFileOrLFSOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo get raw file or l f s o k response a status code equal to that given
+func (o *RepoGetRawFileOrLFSOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo get raw file or l f s o k response
+func (o *RepoGetRawFileOrLFSOK) Code() int {
+	return 200
+}
+
+func (o *RepoGetRawFileOrLFSOK) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/media/{filepath}][%d] repoGetRawFileOrLFSOK", 200)
+}
+
+func (o *RepoGetRawFileOrLFSOK) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/media/{filepath}][%d] repoGetRawFileOrLFSOK", 200)
+}
+
+func (o *RepoGetRawFileOrLFSOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewRepoGetRawFileOrLFSNotFound creates a RepoGetRawFileOrLFSNotFound with default headers values
+func NewRepoGetRawFileOrLFSNotFound() *RepoGetRawFileOrLFSNotFound {
+	return &RepoGetRawFileOrLFSNotFound{}
+}
+
+/*
+RepoGetRawFileOrLFSNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoGetRawFileOrLFSNotFound struct {
+}
+
+// IsSuccess returns true when this repo get raw file or l f s not found response has a 2xx status code
+func (o *RepoGetRawFileOrLFSNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo get raw file or l f s not found response has a 3xx status code
+func (o *RepoGetRawFileOrLFSNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo get raw file or l f s not found response has a 4xx status code
+func (o *RepoGetRawFileOrLFSNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo get raw file or l f s not found response has a 5xx status code
+func (o *RepoGetRawFileOrLFSNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo get raw file or l f s not found response a status code equal to that given
+func (o *RepoGetRawFileOrLFSNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo get raw file or l f s not found response
+func (o *RepoGetRawFileOrLFSNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoGetRawFileOrLFSNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/media/{filepath}][%d] repoGetRawFileOrLFSNotFound", 404)
+}
+
+func (o *RepoGetRawFileOrLFSNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/media/{filepath}][%d] repoGetRawFileOrLFSNotFound", 404)
+}
+
+func (o *RepoGetRawFileOrLFSNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_get_raw_file_parameters.go b/bots-common/gitea-generated/client/repository/repo_get_raw_file_parameters.go
new file mode 100644
index 0000000..ba48e19
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_get_raw_file_parameters.go
@@ -0,0 +1,229 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewRepoGetRawFileParams creates a new RepoGetRawFileParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoGetRawFileParams() *RepoGetRawFileParams {
+	return &RepoGetRawFileParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoGetRawFileParamsWithTimeout creates a new RepoGetRawFileParams object
+// with the ability to set a timeout on a request.
+func NewRepoGetRawFileParamsWithTimeout(timeout time.Duration) *RepoGetRawFileParams {
+	return &RepoGetRawFileParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoGetRawFileParamsWithContext creates a new RepoGetRawFileParams object
+// with the ability to set a context for a request.
+func NewRepoGetRawFileParamsWithContext(ctx context.Context) *RepoGetRawFileParams {
+	return &RepoGetRawFileParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoGetRawFileParamsWithHTTPClient creates a new RepoGetRawFileParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoGetRawFileParamsWithHTTPClient(client *http.Client) *RepoGetRawFileParams {
+	return &RepoGetRawFileParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoGetRawFileParams contains all the parameters to send to the API endpoint
+
+	for the repo get raw file operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoGetRawFileParams struct {
+
+	/* Filepath.
+
+	   filepath of the file to get
+	*/
+	Filepath string
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Ref.
+
+	   The name of the commit/branch/tag. Default the repository’s default branch (usually master)
+	*/
+	Ref *string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo get raw file params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoGetRawFileParams) WithDefaults() *RepoGetRawFileParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo get raw file params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoGetRawFileParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo get raw file params
+func (o *RepoGetRawFileParams) WithTimeout(timeout time.Duration) *RepoGetRawFileParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo get raw file params
+func (o *RepoGetRawFileParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo get raw file params
+func (o *RepoGetRawFileParams) WithContext(ctx context.Context) *RepoGetRawFileParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo get raw file params
+func (o *RepoGetRawFileParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo get raw file params
+func (o *RepoGetRawFileParams) WithHTTPClient(client *http.Client) *RepoGetRawFileParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo get raw file params
+func (o *RepoGetRawFileParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithFilepath adds the filepath to the repo get raw file params
+func (o *RepoGetRawFileParams) WithFilepath(filepath string) *RepoGetRawFileParams {
+	o.SetFilepath(filepath)
+	return o
+}
+
+// SetFilepath adds the filepath to the repo get raw file params
+func (o *RepoGetRawFileParams) SetFilepath(filepath string) {
+	o.Filepath = filepath
+}
+
+// WithOwner adds the owner to the repo get raw file params
+func (o *RepoGetRawFileParams) WithOwner(owner string) *RepoGetRawFileParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo get raw file params
+func (o *RepoGetRawFileParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRef adds the ref to the repo get raw file params
+func (o *RepoGetRawFileParams) WithRef(ref *string) *RepoGetRawFileParams {
+	o.SetRef(ref)
+	return o
+}
+
+// SetRef adds the ref to the repo get raw file params
+func (o *RepoGetRawFileParams) SetRef(ref *string) {
+	o.Ref = ref
+}
+
+// WithRepo adds the repo to the repo get raw file params
+func (o *RepoGetRawFileParams) WithRepo(repo string) *RepoGetRawFileParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo get raw file params
+func (o *RepoGetRawFileParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoGetRawFileParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param filepath
+	if err := r.SetPathParam("filepath", o.Filepath); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	if o.Ref != nil {
+
+		// query param ref
+		var qrRef string
+
+		if o.Ref != nil {
+			qrRef = *o.Ref
+		}
+		qRef := qrRef
+		if qRef != "" {
+
+			if err := r.SetQueryParam("ref", qRef); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_get_raw_file_responses.go b/bots-common/gitea-generated/client/repository/repo_get_raw_file_responses.go
new file mode 100644
index 0000000..d266e62
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_get_raw_file_responses.go
@@ -0,0 +1,150 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// RepoGetRawFileReader is a Reader for the RepoGetRawFile structure.
+type RepoGetRawFileReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoGetRawFileReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoGetRawFileOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoGetRawFileNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/raw/{filepath}] repoGetRawFile", response, response.Code())
+	}
+}
+
+// NewRepoGetRawFileOK creates a RepoGetRawFileOK with default headers values
+func NewRepoGetRawFileOK() *RepoGetRawFileOK {
+	return &RepoGetRawFileOK{}
+}
+
+/*
+RepoGetRawFileOK describes a response with status code 200, with default header values.
+
+Returns raw file content.
+*/
+type RepoGetRawFileOK struct {
+}
+
+// IsSuccess returns true when this repo get raw file o k response has a 2xx status code
+func (o *RepoGetRawFileOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo get raw file o k response has a 3xx status code
+func (o *RepoGetRawFileOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo get raw file o k response has a 4xx status code
+func (o *RepoGetRawFileOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo get raw file o k response has a 5xx status code
+func (o *RepoGetRawFileOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo get raw file o k response a status code equal to that given
+func (o *RepoGetRawFileOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo get raw file o k response
+func (o *RepoGetRawFileOK) Code() int {
+	return 200
+}
+
+func (o *RepoGetRawFileOK) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/raw/{filepath}][%d] repoGetRawFileOK", 200)
+}
+
+func (o *RepoGetRawFileOK) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/raw/{filepath}][%d] repoGetRawFileOK", 200)
+}
+
+func (o *RepoGetRawFileOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewRepoGetRawFileNotFound creates a RepoGetRawFileNotFound with default headers values
+func NewRepoGetRawFileNotFound() *RepoGetRawFileNotFound {
+	return &RepoGetRawFileNotFound{}
+}
+
+/*
+RepoGetRawFileNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoGetRawFileNotFound struct {
+}
+
+// IsSuccess returns true when this repo get raw file not found response has a 2xx status code
+func (o *RepoGetRawFileNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo get raw file not found response has a 3xx status code
+func (o *RepoGetRawFileNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo get raw file not found response has a 4xx status code
+func (o *RepoGetRawFileNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo get raw file not found response has a 5xx status code
+func (o *RepoGetRawFileNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo get raw file not found response a status code equal to that given
+func (o *RepoGetRawFileNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo get raw file not found response
+func (o *RepoGetRawFileNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoGetRawFileNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/raw/{filepath}][%d] repoGetRawFileNotFound", 404)
+}
+
+func (o *RepoGetRawFileNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/raw/{filepath}][%d] repoGetRawFileNotFound", 404)
+}
+
+func (o *RepoGetRawFileNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_get_release_attachment_parameters.go b/bots-common/gitea-generated/client/repository/repo_get_release_attachment_parameters.go
new file mode 100644
index 0000000..1984610
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_get_release_attachment_parameters.go
@@ -0,0 +1,222 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewRepoGetReleaseAttachmentParams creates a new RepoGetReleaseAttachmentParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoGetReleaseAttachmentParams() *RepoGetReleaseAttachmentParams {
+	return &RepoGetReleaseAttachmentParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoGetReleaseAttachmentParamsWithTimeout creates a new RepoGetReleaseAttachmentParams object
+// with the ability to set a timeout on a request.
+func NewRepoGetReleaseAttachmentParamsWithTimeout(timeout time.Duration) *RepoGetReleaseAttachmentParams {
+	return &RepoGetReleaseAttachmentParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoGetReleaseAttachmentParamsWithContext creates a new RepoGetReleaseAttachmentParams object
+// with the ability to set a context for a request.
+func NewRepoGetReleaseAttachmentParamsWithContext(ctx context.Context) *RepoGetReleaseAttachmentParams {
+	return &RepoGetReleaseAttachmentParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoGetReleaseAttachmentParamsWithHTTPClient creates a new RepoGetReleaseAttachmentParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoGetReleaseAttachmentParamsWithHTTPClient(client *http.Client) *RepoGetReleaseAttachmentParams {
+	return &RepoGetReleaseAttachmentParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoGetReleaseAttachmentParams contains all the parameters to send to the API endpoint
+
+	for the repo get release attachment operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoGetReleaseAttachmentParams struct {
+
+	/* AttachmentID.
+
+	   id of the attachment to get
+
+	   Format: int64
+	*/
+	AttachmentID int64
+
+	/* ID.
+
+	   id of the release
+
+	   Format: int64
+	*/
+	ID int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo get release attachment params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoGetReleaseAttachmentParams) WithDefaults() *RepoGetReleaseAttachmentParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo get release attachment params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoGetReleaseAttachmentParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo get release attachment params
+func (o *RepoGetReleaseAttachmentParams) WithTimeout(timeout time.Duration) *RepoGetReleaseAttachmentParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo get release attachment params
+func (o *RepoGetReleaseAttachmentParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo get release attachment params
+func (o *RepoGetReleaseAttachmentParams) WithContext(ctx context.Context) *RepoGetReleaseAttachmentParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo get release attachment params
+func (o *RepoGetReleaseAttachmentParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo get release attachment params
+func (o *RepoGetReleaseAttachmentParams) WithHTTPClient(client *http.Client) *RepoGetReleaseAttachmentParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo get release attachment params
+func (o *RepoGetReleaseAttachmentParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithAttachmentID adds the attachmentID to the repo get release attachment params
+func (o *RepoGetReleaseAttachmentParams) WithAttachmentID(attachmentID int64) *RepoGetReleaseAttachmentParams {
+	o.SetAttachmentID(attachmentID)
+	return o
+}
+
+// SetAttachmentID adds the attachmentId to the repo get release attachment params
+func (o *RepoGetReleaseAttachmentParams) SetAttachmentID(attachmentID int64) {
+	o.AttachmentID = attachmentID
+}
+
+// WithID adds the id to the repo get release attachment params
+func (o *RepoGetReleaseAttachmentParams) WithID(id int64) *RepoGetReleaseAttachmentParams {
+	o.SetID(id)
+	return o
+}
+
+// SetID adds the id to the repo get release attachment params
+func (o *RepoGetReleaseAttachmentParams) SetID(id int64) {
+	o.ID = id
+}
+
+// WithOwner adds the owner to the repo get release attachment params
+func (o *RepoGetReleaseAttachmentParams) WithOwner(owner string) *RepoGetReleaseAttachmentParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo get release attachment params
+func (o *RepoGetReleaseAttachmentParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo get release attachment params
+func (o *RepoGetReleaseAttachmentParams) WithRepo(repo string) *RepoGetReleaseAttachmentParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo get release attachment params
+func (o *RepoGetReleaseAttachmentParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoGetReleaseAttachmentParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param attachment_id
+	if err := r.SetPathParam("attachment_id", swag.FormatInt64(o.AttachmentID)); err != nil {
+		return err
+	}
+
+	// path param id
+	if err := r.SetPathParam("id", swag.FormatInt64(o.ID)); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_get_release_attachment_responses.go b/bots-common/gitea-generated/client/repository/repo_get_release_attachment_responses.go
new file mode 100644
index 0000000..b35375a
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_get_release_attachment_responses.go
@@ -0,0 +1,168 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoGetReleaseAttachmentReader is a Reader for the RepoGetReleaseAttachment structure.
+type RepoGetReleaseAttachmentReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoGetReleaseAttachmentReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoGetReleaseAttachmentOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoGetReleaseAttachmentNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/releases/{id}/assets/{attachment_id}] repoGetReleaseAttachment", response, response.Code())
+	}
+}
+
+// NewRepoGetReleaseAttachmentOK creates a RepoGetReleaseAttachmentOK with default headers values
+func NewRepoGetReleaseAttachmentOK() *RepoGetReleaseAttachmentOK {
+	return &RepoGetReleaseAttachmentOK{}
+}
+
+/*
+RepoGetReleaseAttachmentOK describes a response with status code 200, with default header values.
+
+Attachment
+*/
+type RepoGetReleaseAttachmentOK struct {
+	Payload *models.Attachment
+}
+
+// IsSuccess returns true when this repo get release attachment o k response has a 2xx status code
+func (o *RepoGetReleaseAttachmentOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo get release attachment o k response has a 3xx status code
+func (o *RepoGetReleaseAttachmentOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo get release attachment o k response has a 4xx status code
+func (o *RepoGetReleaseAttachmentOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo get release attachment o k response has a 5xx status code
+func (o *RepoGetReleaseAttachmentOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo get release attachment o k response a status code equal to that given
+func (o *RepoGetReleaseAttachmentOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo get release attachment o k response
+func (o *RepoGetReleaseAttachmentOK) Code() int {
+	return 200
+}
+
+func (o *RepoGetReleaseAttachmentOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/releases/{id}/assets/{attachment_id}][%d] repoGetReleaseAttachmentOK %s", 200, payload)
+}
+
+func (o *RepoGetReleaseAttachmentOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/releases/{id}/assets/{attachment_id}][%d] repoGetReleaseAttachmentOK %s", 200, payload)
+}
+
+func (o *RepoGetReleaseAttachmentOK) GetPayload() *models.Attachment {
+	return o.Payload
+}
+
+func (o *RepoGetReleaseAttachmentOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.Attachment)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoGetReleaseAttachmentNotFound creates a RepoGetReleaseAttachmentNotFound with default headers values
+func NewRepoGetReleaseAttachmentNotFound() *RepoGetReleaseAttachmentNotFound {
+	return &RepoGetReleaseAttachmentNotFound{}
+}
+
+/*
+RepoGetReleaseAttachmentNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoGetReleaseAttachmentNotFound struct {
+}
+
+// IsSuccess returns true when this repo get release attachment not found response has a 2xx status code
+func (o *RepoGetReleaseAttachmentNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo get release attachment not found response has a 3xx status code
+func (o *RepoGetReleaseAttachmentNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo get release attachment not found response has a 4xx status code
+func (o *RepoGetReleaseAttachmentNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo get release attachment not found response has a 5xx status code
+func (o *RepoGetReleaseAttachmentNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo get release attachment not found response a status code equal to that given
+func (o *RepoGetReleaseAttachmentNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo get release attachment not found response
+func (o *RepoGetReleaseAttachmentNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoGetReleaseAttachmentNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/releases/{id}/assets/{attachment_id}][%d] repoGetReleaseAttachmentNotFound", 404)
+}
+
+func (o *RepoGetReleaseAttachmentNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/releases/{id}/assets/{attachment_id}][%d] repoGetReleaseAttachmentNotFound", 404)
+}
+
+func (o *RepoGetReleaseAttachmentNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_get_release_by_tag_parameters.go b/bots-common/gitea-generated/client/repository/repo_get_release_by_tag_parameters.go
new file mode 100644
index 0000000..d0eaaf5
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_get_release_by_tag_parameters.go
@@ -0,0 +1,195 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewRepoGetReleaseByTagParams creates a new RepoGetReleaseByTagParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoGetReleaseByTagParams() *RepoGetReleaseByTagParams {
+	return &RepoGetReleaseByTagParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoGetReleaseByTagParamsWithTimeout creates a new RepoGetReleaseByTagParams object
+// with the ability to set a timeout on a request.
+func NewRepoGetReleaseByTagParamsWithTimeout(timeout time.Duration) *RepoGetReleaseByTagParams {
+	return &RepoGetReleaseByTagParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoGetReleaseByTagParamsWithContext creates a new RepoGetReleaseByTagParams object
+// with the ability to set a context for a request.
+func NewRepoGetReleaseByTagParamsWithContext(ctx context.Context) *RepoGetReleaseByTagParams {
+	return &RepoGetReleaseByTagParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoGetReleaseByTagParamsWithHTTPClient creates a new RepoGetReleaseByTagParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoGetReleaseByTagParamsWithHTTPClient(client *http.Client) *RepoGetReleaseByTagParams {
+	return &RepoGetReleaseByTagParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoGetReleaseByTagParams contains all the parameters to send to the API endpoint
+
+	for the repo get release by tag operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoGetReleaseByTagParams struct {
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	/* Tag.
+
+	   tag name of the release to get
+	*/
+	Tag string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo get release by tag params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoGetReleaseByTagParams) WithDefaults() *RepoGetReleaseByTagParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo get release by tag params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoGetReleaseByTagParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo get release by tag params
+func (o *RepoGetReleaseByTagParams) WithTimeout(timeout time.Duration) *RepoGetReleaseByTagParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo get release by tag params
+func (o *RepoGetReleaseByTagParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo get release by tag params
+func (o *RepoGetReleaseByTagParams) WithContext(ctx context.Context) *RepoGetReleaseByTagParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo get release by tag params
+func (o *RepoGetReleaseByTagParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo get release by tag params
+func (o *RepoGetReleaseByTagParams) WithHTTPClient(client *http.Client) *RepoGetReleaseByTagParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo get release by tag params
+func (o *RepoGetReleaseByTagParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithOwner adds the owner to the repo get release by tag params
+func (o *RepoGetReleaseByTagParams) WithOwner(owner string) *RepoGetReleaseByTagParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo get release by tag params
+func (o *RepoGetReleaseByTagParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo get release by tag params
+func (o *RepoGetReleaseByTagParams) WithRepo(repo string) *RepoGetReleaseByTagParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo get release by tag params
+func (o *RepoGetReleaseByTagParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WithTag adds the tag to the repo get release by tag params
+func (o *RepoGetReleaseByTagParams) WithTag(tag string) *RepoGetReleaseByTagParams {
+	o.SetTag(tag)
+	return o
+}
+
+// SetTag adds the tag to the repo get release by tag params
+func (o *RepoGetReleaseByTagParams) SetTag(tag string) {
+	o.Tag = tag
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoGetReleaseByTagParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	// path param tag
+	if err := r.SetPathParam("tag", o.Tag); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_get_release_by_tag_responses.go b/bots-common/gitea-generated/client/repository/repo_get_release_by_tag_responses.go
new file mode 100644
index 0000000..6cfee28
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_get_release_by_tag_responses.go
@@ -0,0 +1,168 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoGetReleaseByTagReader is a Reader for the RepoGetReleaseByTag structure.
+type RepoGetReleaseByTagReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoGetReleaseByTagReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoGetReleaseByTagOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoGetReleaseByTagNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/releases/tags/{tag}] repoGetReleaseByTag", response, response.Code())
+	}
+}
+
+// NewRepoGetReleaseByTagOK creates a RepoGetReleaseByTagOK with default headers values
+func NewRepoGetReleaseByTagOK() *RepoGetReleaseByTagOK {
+	return &RepoGetReleaseByTagOK{}
+}
+
+/*
+RepoGetReleaseByTagOK describes a response with status code 200, with default header values.
+
+Release
+*/
+type RepoGetReleaseByTagOK struct {
+	Payload *models.Release
+}
+
+// IsSuccess returns true when this repo get release by tag o k response has a 2xx status code
+func (o *RepoGetReleaseByTagOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo get release by tag o k response has a 3xx status code
+func (o *RepoGetReleaseByTagOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo get release by tag o k response has a 4xx status code
+func (o *RepoGetReleaseByTagOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo get release by tag o k response has a 5xx status code
+func (o *RepoGetReleaseByTagOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo get release by tag o k response a status code equal to that given
+func (o *RepoGetReleaseByTagOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo get release by tag o k response
+func (o *RepoGetReleaseByTagOK) Code() int {
+	return 200
+}
+
+func (o *RepoGetReleaseByTagOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/releases/tags/{tag}][%d] repoGetReleaseByTagOK %s", 200, payload)
+}
+
+func (o *RepoGetReleaseByTagOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/releases/tags/{tag}][%d] repoGetReleaseByTagOK %s", 200, payload)
+}
+
+func (o *RepoGetReleaseByTagOK) GetPayload() *models.Release {
+	return o.Payload
+}
+
+func (o *RepoGetReleaseByTagOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.Release)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoGetReleaseByTagNotFound creates a RepoGetReleaseByTagNotFound with default headers values
+func NewRepoGetReleaseByTagNotFound() *RepoGetReleaseByTagNotFound {
+	return &RepoGetReleaseByTagNotFound{}
+}
+
+/*
+RepoGetReleaseByTagNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoGetReleaseByTagNotFound struct {
+}
+
+// IsSuccess returns true when this repo get release by tag not found response has a 2xx status code
+func (o *RepoGetReleaseByTagNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo get release by tag not found response has a 3xx status code
+func (o *RepoGetReleaseByTagNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo get release by tag not found response has a 4xx status code
+func (o *RepoGetReleaseByTagNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo get release by tag not found response has a 5xx status code
+func (o *RepoGetReleaseByTagNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo get release by tag not found response a status code equal to that given
+func (o *RepoGetReleaseByTagNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo get release by tag not found response
+func (o *RepoGetReleaseByTagNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoGetReleaseByTagNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/releases/tags/{tag}][%d] repoGetReleaseByTagNotFound", 404)
+}
+
+func (o *RepoGetReleaseByTagNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/releases/tags/{tag}][%d] repoGetReleaseByTagNotFound", 404)
+}
+
+func (o *RepoGetReleaseByTagNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_get_release_parameters.go b/bots-common/gitea-generated/client/repository/repo_get_release_parameters.go
new file mode 100644
index 0000000..9c7163a
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_get_release_parameters.go
@@ -0,0 +1,198 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewRepoGetReleaseParams creates a new RepoGetReleaseParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoGetReleaseParams() *RepoGetReleaseParams {
+	return &RepoGetReleaseParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoGetReleaseParamsWithTimeout creates a new RepoGetReleaseParams object
+// with the ability to set a timeout on a request.
+func NewRepoGetReleaseParamsWithTimeout(timeout time.Duration) *RepoGetReleaseParams {
+	return &RepoGetReleaseParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoGetReleaseParamsWithContext creates a new RepoGetReleaseParams object
+// with the ability to set a context for a request.
+func NewRepoGetReleaseParamsWithContext(ctx context.Context) *RepoGetReleaseParams {
+	return &RepoGetReleaseParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoGetReleaseParamsWithHTTPClient creates a new RepoGetReleaseParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoGetReleaseParamsWithHTTPClient(client *http.Client) *RepoGetReleaseParams {
+	return &RepoGetReleaseParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoGetReleaseParams contains all the parameters to send to the API endpoint
+
+	for the repo get release operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoGetReleaseParams struct {
+
+	/* ID.
+
+	   id of the release to get
+
+	   Format: int64
+	*/
+	ID int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo get release params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoGetReleaseParams) WithDefaults() *RepoGetReleaseParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo get release params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoGetReleaseParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo get release params
+func (o *RepoGetReleaseParams) WithTimeout(timeout time.Duration) *RepoGetReleaseParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo get release params
+func (o *RepoGetReleaseParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo get release params
+func (o *RepoGetReleaseParams) WithContext(ctx context.Context) *RepoGetReleaseParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo get release params
+func (o *RepoGetReleaseParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo get release params
+func (o *RepoGetReleaseParams) WithHTTPClient(client *http.Client) *RepoGetReleaseParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo get release params
+func (o *RepoGetReleaseParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithID adds the id to the repo get release params
+func (o *RepoGetReleaseParams) WithID(id int64) *RepoGetReleaseParams {
+	o.SetID(id)
+	return o
+}
+
+// SetID adds the id to the repo get release params
+func (o *RepoGetReleaseParams) SetID(id int64) {
+	o.ID = id
+}
+
+// WithOwner adds the owner to the repo get release params
+func (o *RepoGetReleaseParams) WithOwner(owner string) *RepoGetReleaseParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo get release params
+func (o *RepoGetReleaseParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo get release params
+func (o *RepoGetReleaseParams) WithRepo(repo string) *RepoGetReleaseParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo get release params
+func (o *RepoGetReleaseParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoGetReleaseParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param id
+	if err := r.SetPathParam("id", swag.FormatInt64(o.ID)); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_get_release_responses.go b/bots-common/gitea-generated/client/repository/repo_get_release_responses.go
new file mode 100644
index 0000000..46e2b07
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_get_release_responses.go
@@ -0,0 +1,168 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoGetReleaseReader is a Reader for the RepoGetRelease structure.
+type RepoGetReleaseReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoGetReleaseReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoGetReleaseOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoGetReleaseNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/releases/{id}] repoGetRelease", response, response.Code())
+	}
+}
+
+// NewRepoGetReleaseOK creates a RepoGetReleaseOK with default headers values
+func NewRepoGetReleaseOK() *RepoGetReleaseOK {
+	return &RepoGetReleaseOK{}
+}
+
+/*
+RepoGetReleaseOK describes a response with status code 200, with default header values.
+
+Release
+*/
+type RepoGetReleaseOK struct {
+	Payload *models.Release
+}
+
+// IsSuccess returns true when this repo get release o k response has a 2xx status code
+func (o *RepoGetReleaseOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo get release o k response has a 3xx status code
+func (o *RepoGetReleaseOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo get release o k response has a 4xx status code
+func (o *RepoGetReleaseOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo get release o k response has a 5xx status code
+func (o *RepoGetReleaseOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo get release o k response a status code equal to that given
+func (o *RepoGetReleaseOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo get release o k response
+func (o *RepoGetReleaseOK) Code() int {
+	return 200
+}
+
+func (o *RepoGetReleaseOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/releases/{id}][%d] repoGetReleaseOK %s", 200, payload)
+}
+
+func (o *RepoGetReleaseOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/releases/{id}][%d] repoGetReleaseOK %s", 200, payload)
+}
+
+func (o *RepoGetReleaseOK) GetPayload() *models.Release {
+	return o.Payload
+}
+
+func (o *RepoGetReleaseOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.Release)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoGetReleaseNotFound creates a RepoGetReleaseNotFound with default headers values
+func NewRepoGetReleaseNotFound() *RepoGetReleaseNotFound {
+	return &RepoGetReleaseNotFound{}
+}
+
+/*
+RepoGetReleaseNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoGetReleaseNotFound struct {
+}
+
+// IsSuccess returns true when this repo get release not found response has a 2xx status code
+func (o *RepoGetReleaseNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo get release not found response has a 3xx status code
+func (o *RepoGetReleaseNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo get release not found response has a 4xx status code
+func (o *RepoGetReleaseNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo get release not found response has a 5xx status code
+func (o *RepoGetReleaseNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo get release not found response a status code equal to that given
+func (o *RepoGetReleaseNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo get release not found response
+func (o *RepoGetReleaseNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoGetReleaseNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/releases/{id}][%d] repoGetReleaseNotFound", 404)
+}
+
+func (o *RepoGetReleaseNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/releases/{id}][%d] repoGetReleaseNotFound", 404)
+}
+
+func (o *RepoGetReleaseNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_get_repo_permissions_parameters.go b/bots-common/gitea-generated/client/repository/repo_get_repo_permissions_parameters.go
new file mode 100644
index 0000000..d411a64
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_get_repo_permissions_parameters.go
@@ -0,0 +1,195 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewRepoGetRepoPermissionsParams creates a new RepoGetRepoPermissionsParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoGetRepoPermissionsParams() *RepoGetRepoPermissionsParams {
+	return &RepoGetRepoPermissionsParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoGetRepoPermissionsParamsWithTimeout creates a new RepoGetRepoPermissionsParams object
+// with the ability to set a timeout on a request.
+func NewRepoGetRepoPermissionsParamsWithTimeout(timeout time.Duration) *RepoGetRepoPermissionsParams {
+	return &RepoGetRepoPermissionsParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoGetRepoPermissionsParamsWithContext creates a new RepoGetRepoPermissionsParams object
+// with the ability to set a context for a request.
+func NewRepoGetRepoPermissionsParamsWithContext(ctx context.Context) *RepoGetRepoPermissionsParams {
+	return &RepoGetRepoPermissionsParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoGetRepoPermissionsParamsWithHTTPClient creates a new RepoGetRepoPermissionsParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoGetRepoPermissionsParamsWithHTTPClient(client *http.Client) *RepoGetRepoPermissionsParams {
+	return &RepoGetRepoPermissionsParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoGetRepoPermissionsParams contains all the parameters to send to the API endpoint
+
+	for the repo get repo permissions operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoGetRepoPermissionsParams struct {
+
+	/* Collaborator.
+
+	   username of the collaborator
+	*/
+	Collaborator string
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo get repo permissions params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoGetRepoPermissionsParams) WithDefaults() *RepoGetRepoPermissionsParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo get repo permissions params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoGetRepoPermissionsParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo get repo permissions params
+func (o *RepoGetRepoPermissionsParams) WithTimeout(timeout time.Duration) *RepoGetRepoPermissionsParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo get repo permissions params
+func (o *RepoGetRepoPermissionsParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo get repo permissions params
+func (o *RepoGetRepoPermissionsParams) WithContext(ctx context.Context) *RepoGetRepoPermissionsParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo get repo permissions params
+func (o *RepoGetRepoPermissionsParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo get repo permissions params
+func (o *RepoGetRepoPermissionsParams) WithHTTPClient(client *http.Client) *RepoGetRepoPermissionsParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo get repo permissions params
+func (o *RepoGetRepoPermissionsParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithCollaborator adds the collaborator to the repo get repo permissions params
+func (o *RepoGetRepoPermissionsParams) WithCollaborator(collaborator string) *RepoGetRepoPermissionsParams {
+	o.SetCollaborator(collaborator)
+	return o
+}
+
+// SetCollaborator adds the collaborator to the repo get repo permissions params
+func (o *RepoGetRepoPermissionsParams) SetCollaborator(collaborator string) {
+	o.Collaborator = collaborator
+}
+
+// WithOwner adds the owner to the repo get repo permissions params
+func (o *RepoGetRepoPermissionsParams) WithOwner(owner string) *RepoGetRepoPermissionsParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo get repo permissions params
+func (o *RepoGetRepoPermissionsParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo get repo permissions params
+func (o *RepoGetRepoPermissionsParams) WithRepo(repo string) *RepoGetRepoPermissionsParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo get repo permissions params
+func (o *RepoGetRepoPermissionsParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoGetRepoPermissionsParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param collaborator
+	if err := r.SetPathParam("collaborator", o.Collaborator); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_get_repo_permissions_responses.go b/bots-common/gitea-generated/client/repository/repo_get_repo_permissions_responses.go
new file mode 100644
index 0000000..728a7c3
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_get_repo_permissions_responses.go
@@ -0,0 +1,246 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoGetRepoPermissionsReader is a Reader for the RepoGetRepoPermissions structure.
+type RepoGetRepoPermissionsReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoGetRepoPermissionsReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoGetRepoPermissionsOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 403:
+		result := NewRepoGetRepoPermissionsForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewRepoGetRepoPermissionsNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/collaborators/{collaborator}/permission] repoGetRepoPermissions", response, response.Code())
+	}
+}
+
+// NewRepoGetRepoPermissionsOK creates a RepoGetRepoPermissionsOK with default headers values
+func NewRepoGetRepoPermissionsOK() *RepoGetRepoPermissionsOK {
+	return &RepoGetRepoPermissionsOK{}
+}
+
+/*
+RepoGetRepoPermissionsOK describes a response with status code 200, with default header values.
+
+RepoCollaboratorPermission
+*/
+type RepoGetRepoPermissionsOK struct {
+	Payload *models.RepoCollaboratorPermission
+}
+
+// IsSuccess returns true when this repo get repo permissions o k response has a 2xx status code
+func (o *RepoGetRepoPermissionsOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo get repo permissions o k response has a 3xx status code
+func (o *RepoGetRepoPermissionsOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo get repo permissions o k response has a 4xx status code
+func (o *RepoGetRepoPermissionsOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo get repo permissions o k response has a 5xx status code
+func (o *RepoGetRepoPermissionsOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo get repo permissions o k response a status code equal to that given
+func (o *RepoGetRepoPermissionsOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo get repo permissions o k response
+func (o *RepoGetRepoPermissionsOK) Code() int {
+	return 200
+}
+
+func (o *RepoGetRepoPermissionsOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/collaborators/{collaborator}/permission][%d] repoGetRepoPermissionsOK %s", 200, payload)
+}
+
+func (o *RepoGetRepoPermissionsOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/collaborators/{collaborator}/permission][%d] repoGetRepoPermissionsOK %s", 200, payload)
+}
+
+func (o *RepoGetRepoPermissionsOK) GetPayload() *models.RepoCollaboratorPermission {
+	return o.Payload
+}
+
+func (o *RepoGetRepoPermissionsOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.RepoCollaboratorPermission)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoGetRepoPermissionsForbidden creates a RepoGetRepoPermissionsForbidden with default headers values
+func NewRepoGetRepoPermissionsForbidden() *RepoGetRepoPermissionsForbidden {
+	return &RepoGetRepoPermissionsForbidden{}
+}
+
+/*
+RepoGetRepoPermissionsForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type RepoGetRepoPermissionsForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo get repo permissions forbidden response has a 2xx status code
+func (o *RepoGetRepoPermissionsForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo get repo permissions forbidden response has a 3xx status code
+func (o *RepoGetRepoPermissionsForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo get repo permissions forbidden response has a 4xx status code
+func (o *RepoGetRepoPermissionsForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo get repo permissions forbidden response has a 5xx status code
+func (o *RepoGetRepoPermissionsForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo get repo permissions forbidden response a status code equal to that given
+func (o *RepoGetRepoPermissionsForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the repo get repo permissions forbidden response
+func (o *RepoGetRepoPermissionsForbidden) Code() int {
+	return 403
+}
+
+func (o *RepoGetRepoPermissionsForbidden) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/collaborators/{collaborator}/permission][%d] repoGetRepoPermissionsForbidden", 403)
+}
+
+func (o *RepoGetRepoPermissionsForbidden) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/collaborators/{collaborator}/permission][%d] repoGetRepoPermissionsForbidden", 403)
+}
+
+func (o *RepoGetRepoPermissionsForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewRepoGetRepoPermissionsNotFound creates a RepoGetRepoPermissionsNotFound with default headers values
+func NewRepoGetRepoPermissionsNotFound() *RepoGetRepoPermissionsNotFound {
+	return &RepoGetRepoPermissionsNotFound{}
+}
+
+/*
+RepoGetRepoPermissionsNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoGetRepoPermissionsNotFound struct {
+}
+
+// IsSuccess returns true when this repo get repo permissions not found response has a 2xx status code
+func (o *RepoGetRepoPermissionsNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo get repo permissions not found response has a 3xx status code
+func (o *RepoGetRepoPermissionsNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo get repo permissions not found response has a 4xx status code
+func (o *RepoGetRepoPermissionsNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo get repo permissions not found response has a 5xx status code
+func (o *RepoGetRepoPermissionsNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo get repo permissions not found response a status code equal to that given
+func (o *RepoGetRepoPermissionsNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo get repo permissions not found response
+func (o *RepoGetRepoPermissionsNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoGetRepoPermissionsNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/collaborators/{collaborator}/permission][%d] repoGetRepoPermissionsNotFound", 404)
+}
+
+func (o *RepoGetRepoPermissionsNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/collaborators/{collaborator}/permission][%d] repoGetRepoPermissionsNotFound", 404)
+}
+
+func (o *RepoGetRepoPermissionsNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_get_responses.go b/bots-common/gitea-generated/client/repository/repo_get_responses.go
new file mode 100644
index 0000000..0d820b8
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_get_responses.go
@@ -0,0 +1,168 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoGetReader is a Reader for the RepoGet structure.
+type RepoGetReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoGetReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoGetOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoGetNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}] repoGet", response, response.Code())
+	}
+}
+
+// NewRepoGetOK creates a RepoGetOK with default headers values
+func NewRepoGetOK() *RepoGetOK {
+	return &RepoGetOK{}
+}
+
+/*
+RepoGetOK describes a response with status code 200, with default header values.
+
+Repository
+*/
+type RepoGetOK struct {
+	Payload *models.Repository
+}
+
+// IsSuccess returns true when this repo get o k response has a 2xx status code
+func (o *RepoGetOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo get o k response has a 3xx status code
+func (o *RepoGetOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo get o k response has a 4xx status code
+func (o *RepoGetOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo get o k response has a 5xx status code
+func (o *RepoGetOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo get o k response a status code equal to that given
+func (o *RepoGetOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo get o k response
+func (o *RepoGetOK) Code() int {
+	return 200
+}
+
+func (o *RepoGetOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}][%d] repoGetOK %s", 200, payload)
+}
+
+func (o *RepoGetOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}][%d] repoGetOK %s", 200, payload)
+}
+
+func (o *RepoGetOK) GetPayload() *models.Repository {
+	return o.Payload
+}
+
+func (o *RepoGetOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.Repository)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoGetNotFound creates a RepoGetNotFound with default headers values
+func NewRepoGetNotFound() *RepoGetNotFound {
+	return &RepoGetNotFound{}
+}
+
+/*
+RepoGetNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoGetNotFound struct {
+}
+
+// IsSuccess returns true when this repo get not found response has a 2xx status code
+func (o *RepoGetNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo get not found response has a 3xx status code
+func (o *RepoGetNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo get not found response has a 4xx status code
+func (o *RepoGetNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo get not found response has a 5xx status code
+func (o *RepoGetNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo get not found response a status code equal to that given
+func (o *RepoGetNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo get not found response
+func (o *RepoGetNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoGetNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}][%d] repoGetNotFound", 404)
+}
+
+func (o *RepoGetNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}][%d] repoGetNotFound", 404)
+}
+
+func (o *RepoGetNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_get_reviewers_parameters.go b/bots-common/gitea-generated/client/repository/repo_get_reviewers_parameters.go
new file mode 100644
index 0000000..d2bfd90
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_get_reviewers_parameters.go
@@ -0,0 +1,173 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewRepoGetReviewersParams creates a new RepoGetReviewersParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoGetReviewersParams() *RepoGetReviewersParams {
+	return &RepoGetReviewersParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoGetReviewersParamsWithTimeout creates a new RepoGetReviewersParams object
+// with the ability to set a timeout on a request.
+func NewRepoGetReviewersParamsWithTimeout(timeout time.Duration) *RepoGetReviewersParams {
+	return &RepoGetReviewersParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoGetReviewersParamsWithContext creates a new RepoGetReviewersParams object
+// with the ability to set a context for a request.
+func NewRepoGetReviewersParamsWithContext(ctx context.Context) *RepoGetReviewersParams {
+	return &RepoGetReviewersParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoGetReviewersParamsWithHTTPClient creates a new RepoGetReviewersParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoGetReviewersParamsWithHTTPClient(client *http.Client) *RepoGetReviewersParams {
+	return &RepoGetReviewersParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoGetReviewersParams contains all the parameters to send to the API endpoint
+
+	for the repo get reviewers operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoGetReviewersParams struct {
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo get reviewers params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoGetReviewersParams) WithDefaults() *RepoGetReviewersParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo get reviewers params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoGetReviewersParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo get reviewers params
+func (o *RepoGetReviewersParams) WithTimeout(timeout time.Duration) *RepoGetReviewersParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo get reviewers params
+func (o *RepoGetReviewersParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo get reviewers params
+func (o *RepoGetReviewersParams) WithContext(ctx context.Context) *RepoGetReviewersParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo get reviewers params
+func (o *RepoGetReviewersParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo get reviewers params
+func (o *RepoGetReviewersParams) WithHTTPClient(client *http.Client) *RepoGetReviewersParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo get reviewers params
+func (o *RepoGetReviewersParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithOwner adds the owner to the repo get reviewers params
+func (o *RepoGetReviewersParams) WithOwner(owner string) *RepoGetReviewersParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo get reviewers params
+func (o *RepoGetReviewersParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo get reviewers params
+func (o *RepoGetReviewersParams) WithRepo(repo string) *RepoGetReviewersParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo get reviewers params
+func (o *RepoGetReviewersParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoGetReviewersParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_get_reviewers_responses.go b/bots-common/gitea-generated/client/repository/repo_get_reviewers_responses.go
new file mode 100644
index 0000000..78404c3
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_get_reviewers_responses.go
@@ -0,0 +1,166 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoGetReviewersReader is a Reader for the RepoGetReviewers structure.
+type RepoGetReviewersReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoGetReviewersReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoGetReviewersOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoGetReviewersNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/reviewers] repoGetReviewers", response, response.Code())
+	}
+}
+
+// NewRepoGetReviewersOK creates a RepoGetReviewersOK with default headers values
+func NewRepoGetReviewersOK() *RepoGetReviewersOK {
+	return &RepoGetReviewersOK{}
+}
+
+/*
+RepoGetReviewersOK describes a response with status code 200, with default header values.
+
+UserList
+*/
+type RepoGetReviewersOK struct {
+	Payload []*models.User
+}
+
+// IsSuccess returns true when this repo get reviewers o k response has a 2xx status code
+func (o *RepoGetReviewersOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo get reviewers o k response has a 3xx status code
+func (o *RepoGetReviewersOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo get reviewers o k response has a 4xx status code
+func (o *RepoGetReviewersOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo get reviewers o k response has a 5xx status code
+func (o *RepoGetReviewersOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo get reviewers o k response a status code equal to that given
+func (o *RepoGetReviewersOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo get reviewers o k response
+func (o *RepoGetReviewersOK) Code() int {
+	return 200
+}
+
+func (o *RepoGetReviewersOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/reviewers][%d] repoGetReviewersOK %s", 200, payload)
+}
+
+func (o *RepoGetReviewersOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/reviewers][%d] repoGetReviewersOK %s", 200, payload)
+}
+
+func (o *RepoGetReviewersOK) GetPayload() []*models.User {
+	return o.Payload
+}
+
+func (o *RepoGetReviewersOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoGetReviewersNotFound creates a RepoGetReviewersNotFound with default headers values
+func NewRepoGetReviewersNotFound() *RepoGetReviewersNotFound {
+	return &RepoGetReviewersNotFound{}
+}
+
+/*
+RepoGetReviewersNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoGetReviewersNotFound struct {
+}
+
+// IsSuccess returns true when this repo get reviewers not found response has a 2xx status code
+func (o *RepoGetReviewersNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo get reviewers not found response has a 3xx status code
+func (o *RepoGetReviewersNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo get reviewers not found response has a 4xx status code
+func (o *RepoGetReviewersNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo get reviewers not found response has a 5xx status code
+func (o *RepoGetReviewersNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo get reviewers not found response a status code equal to that given
+func (o *RepoGetReviewersNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo get reviewers not found response
+func (o *RepoGetReviewersNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoGetReviewersNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/reviewers][%d] repoGetReviewersNotFound", 404)
+}
+
+func (o *RepoGetReviewersNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/reviewers][%d] repoGetReviewersNotFound", 404)
+}
+
+func (o *RepoGetReviewersNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_get_runner_registration_token_parameters.go b/bots-common/gitea-generated/client/repository/repo_get_runner_registration_token_parameters.go
new file mode 100644
index 0000000..525060e
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_get_runner_registration_token_parameters.go
@@ -0,0 +1,173 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewRepoGetRunnerRegistrationTokenParams creates a new RepoGetRunnerRegistrationTokenParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoGetRunnerRegistrationTokenParams() *RepoGetRunnerRegistrationTokenParams {
+	return &RepoGetRunnerRegistrationTokenParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoGetRunnerRegistrationTokenParamsWithTimeout creates a new RepoGetRunnerRegistrationTokenParams object
+// with the ability to set a timeout on a request.
+func NewRepoGetRunnerRegistrationTokenParamsWithTimeout(timeout time.Duration) *RepoGetRunnerRegistrationTokenParams {
+	return &RepoGetRunnerRegistrationTokenParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoGetRunnerRegistrationTokenParamsWithContext creates a new RepoGetRunnerRegistrationTokenParams object
+// with the ability to set a context for a request.
+func NewRepoGetRunnerRegistrationTokenParamsWithContext(ctx context.Context) *RepoGetRunnerRegistrationTokenParams {
+	return &RepoGetRunnerRegistrationTokenParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoGetRunnerRegistrationTokenParamsWithHTTPClient creates a new RepoGetRunnerRegistrationTokenParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoGetRunnerRegistrationTokenParamsWithHTTPClient(client *http.Client) *RepoGetRunnerRegistrationTokenParams {
+	return &RepoGetRunnerRegistrationTokenParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoGetRunnerRegistrationTokenParams contains all the parameters to send to the API endpoint
+
+	for the repo get runner registration token operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoGetRunnerRegistrationTokenParams struct {
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo get runner registration token params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoGetRunnerRegistrationTokenParams) WithDefaults() *RepoGetRunnerRegistrationTokenParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo get runner registration token params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoGetRunnerRegistrationTokenParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo get runner registration token params
+func (o *RepoGetRunnerRegistrationTokenParams) WithTimeout(timeout time.Duration) *RepoGetRunnerRegistrationTokenParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo get runner registration token params
+func (o *RepoGetRunnerRegistrationTokenParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo get runner registration token params
+func (o *RepoGetRunnerRegistrationTokenParams) WithContext(ctx context.Context) *RepoGetRunnerRegistrationTokenParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo get runner registration token params
+func (o *RepoGetRunnerRegistrationTokenParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo get runner registration token params
+func (o *RepoGetRunnerRegistrationTokenParams) WithHTTPClient(client *http.Client) *RepoGetRunnerRegistrationTokenParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo get runner registration token params
+func (o *RepoGetRunnerRegistrationTokenParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithOwner adds the owner to the repo get runner registration token params
+func (o *RepoGetRunnerRegistrationTokenParams) WithOwner(owner string) *RepoGetRunnerRegistrationTokenParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo get runner registration token params
+func (o *RepoGetRunnerRegistrationTokenParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo get runner registration token params
+func (o *RepoGetRunnerRegistrationTokenParams) WithRepo(repo string) *RepoGetRunnerRegistrationTokenParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo get runner registration token params
+func (o *RepoGetRunnerRegistrationTokenParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoGetRunnerRegistrationTokenParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_get_runner_registration_token_responses.go b/bots-common/gitea-generated/client/repository/repo_get_runner_registration_token_responses.go
new file mode 100644
index 0000000..a9c8ae2
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_get_runner_registration_token_responses.go
@@ -0,0 +1,96 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// RepoGetRunnerRegistrationTokenReader is a Reader for the RepoGetRunnerRegistrationToken structure.
+type RepoGetRunnerRegistrationTokenReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoGetRunnerRegistrationTokenReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoGetRunnerRegistrationTokenOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/runners/registration-token] repoGetRunnerRegistrationToken", response, response.Code())
+	}
+}
+
+// NewRepoGetRunnerRegistrationTokenOK creates a RepoGetRunnerRegistrationTokenOK with default headers values
+func NewRepoGetRunnerRegistrationTokenOK() *RepoGetRunnerRegistrationTokenOK {
+	return &RepoGetRunnerRegistrationTokenOK{}
+}
+
+/*
+RepoGetRunnerRegistrationTokenOK describes a response with status code 200, with default header values.
+
+RegistrationToken is response related to registration token
+*/
+type RepoGetRunnerRegistrationTokenOK struct {
+	Token string
+}
+
+// IsSuccess returns true when this repo get runner registration token o k response has a 2xx status code
+func (o *RepoGetRunnerRegistrationTokenOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo get runner registration token o k response has a 3xx status code
+func (o *RepoGetRunnerRegistrationTokenOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo get runner registration token o k response has a 4xx status code
+func (o *RepoGetRunnerRegistrationTokenOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo get runner registration token o k response has a 5xx status code
+func (o *RepoGetRunnerRegistrationTokenOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo get runner registration token o k response a status code equal to that given
+func (o *RepoGetRunnerRegistrationTokenOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo get runner registration token o k response
+func (o *RepoGetRunnerRegistrationTokenOK) Code() int {
+	return 200
+}
+
+func (o *RepoGetRunnerRegistrationTokenOK) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/runners/registration-token][%d] repoGetRunnerRegistrationTokenOK", 200)
+}
+
+func (o *RepoGetRunnerRegistrationTokenOK) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/runners/registration-token][%d] repoGetRunnerRegistrationTokenOK", 200)
+}
+
+func (o *RepoGetRunnerRegistrationTokenOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header token
+	hdrToken := response.GetHeader("token")
+
+	if hdrToken != "" {
+		o.Token = hdrToken
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_get_single_commit_parameters.go b/bots-common/gitea-generated/client/repository/repo_get_single_commit_parameters.go
new file mode 100644
index 0000000..3d327a7
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_get_single_commit_parameters.go
@@ -0,0 +1,298 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewRepoGetSingleCommitParams creates a new RepoGetSingleCommitParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoGetSingleCommitParams() *RepoGetSingleCommitParams {
+	return &RepoGetSingleCommitParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoGetSingleCommitParamsWithTimeout creates a new RepoGetSingleCommitParams object
+// with the ability to set a timeout on a request.
+func NewRepoGetSingleCommitParamsWithTimeout(timeout time.Duration) *RepoGetSingleCommitParams {
+	return &RepoGetSingleCommitParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoGetSingleCommitParamsWithContext creates a new RepoGetSingleCommitParams object
+// with the ability to set a context for a request.
+func NewRepoGetSingleCommitParamsWithContext(ctx context.Context) *RepoGetSingleCommitParams {
+	return &RepoGetSingleCommitParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoGetSingleCommitParamsWithHTTPClient creates a new RepoGetSingleCommitParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoGetSingleCommitParamsWithHTTPClient(client *http.Client) *RepoGetSingleCommitParams {
+	return &RepoGetSingleCommitParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoGetSingleCommitParams contains all the parameters to send to the API endpoint
+
+	for the repo get single commit operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoGetSingleCommitParams struct {
+
+	/* Files.
+
+	   include a list of affected files for every commit (disable for speedup, default 'true')
+	*/
+	Files *bool
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	/* Sha.
+
+	   a git ref or commit sha
+	*/
+	Sha string
+
+	/* Stat.
+
+	   include diff stats for every commit (disable for speedup, default 'true')
+	*/
+	Stat *bool
+
+	/* Verification.
+
+	   include verification for every commit (disable for speedup, default 'true')
+	*/
+	Verification *bool
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo get single commit params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoGetSingleCommitParams) WithDefaults() *RepoGetSingleCommitParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo get single commit params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoGetSingleCommitParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo get single commit params
+func (o *RepoGetSingleCommitParams) WithTimeout(timeout time.Duration) *RepoGetSingleCommitParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo get single commit params
+func (o *RepoGetSingleCommitParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo get single commit params
+func (o *RepoGetSingleCommitParams) WithContext(ctx context.Context) *RepoGetSingleCommitParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo get single commit params
+func (o *RepoGetSingleCommitParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo get single commit params
+func (o *RepoGetSingleCommitParams) WithHTTPClient(client *http.Client) *RepoGetSingleCommitParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo get single commit params
+func (o *RepoGetSingleCommitParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithFiles adds the files to the repo get single commit params
+func (o *RepoGetSingleCommitParams) WithFiles(files *bool) *RepoGetSingleCommitParams {
+	o.SetFiles(files)
+	return o
+}
+
+// SetFiles adds the files to the repo get single commit params
+func (o *RepoGetSingleCommitParams) SetFiles(files *bool) {
+	o.Files = files
+}
+
+// WithOwner adds the owner to the repo get single commit params
+func (o *RepoGetSingleCommitParams) WithOwner(owner string) *RepoGetSingleCommitParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo get single commit params
+func (o *RepoGetSingleCommitParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo get single commit params
+func (o *RepoGetSingleCommitParams) WithRepo(repo string) *RepoGetSingleCommitParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo get single commit params
+func (o *RepoGetSingleCommitParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WithSha adds the sha to the repo get single commit params
+func (o *RepoGetSingleCommitParams) WithSha(sha string) *RepoGetSingleCommitParams {
+	o.SetSha(sha)
+	return o
+}
+
+// SetSha adds the sha to the repo get single commit params
+func (o *RepoGetSingleCommitParams) SetSha(sha string) {
+	o.Sha = sha
+}
+
+// WithStat adds the stat to the repo get single commit params
+func (o *RepoGetSingleCommitParams) WithStat(stat *bool) *RepoGetSingleCommitParams {
+	o.SetStat(stat)
+	return o
+}
+
+// SetStat adds the stat to the repo get single commit params
+func (o *RepoGetSingleCommitParams) SetStat(stat *bool) {
+	o.Stat = stat
+}
+
+// WithVerification adds the verification to the repo get single commit params
+func (o *RepoGetSingleCommitParams) WithVerification(verification *bool) *RepoGetSingleCommitParams {
+	o.SetVerification(verification)
+	return o
+}
+
+// SetVerification adds the verification to the repo get single commit params
+func (o *RepoGetSingleCommitParams) SetVerification(verification *bool) {
+	o.Verification = verification
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoGetSingleCommitParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.Files != nil {
+
+		// query param files
+		var qrFiles bool
+
+		if o.Files != nil {
+			qrFiles = *o.Files
+		}
+		qFiles := swag.FormatBool(qrFiles)
+		if qFiles != "" {
+
+			if err := r.SetQueryParam("files", qFiles); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	// path param sha
+	if err := r.SetPathParam("sha", o.Sha); err != nil {
+		return err
+	}
+
+	if o.Stat != nil {
+
+		// query param stat
+		var qrStat bool
+
+		if o.Stat != nil {
+			qrStat = *o.Stat
+		}
+		qStat := swag.FormatBool(qrStat)
+		if qStat != "" {
+
+			if err := r.SetQueryParam("stat", qStat); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Verification != nil {
+
+		// query param verification
+		var qrVerification bool
+
+		if o.Verification != nil {
+			qrVerification = *o.Verification
+		}
+		qVerification := swag.FormatBool(qrVerification)
+		if qVerification != "" {
+
+			if err := r.SetQueryParam("verification", qVerification); err != nil {
+				return err
+			}
+		}
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_get_single_commit_responses.go b/bots-common/gitea-generated/client/repository/repo_get_single_commit_responses.go
new file mode 100644
index 0000000..de12622
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_get_single_commit_responses.go
@@ -0,0 +1,246 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoGetSingleCommitReader is a Reader for the RepoGetSingleCommit structure.
+type RepoGetSingleCommitReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoGetSingleCommitReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoGetSingleCommitOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoGetSingleCommitNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 422:
+		result := NewRepoGetSingleCommitUnprocessableEntity()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/git/commits/{sha}] repoGetSingleCommit", response, response.Code())
+	}
+}
+
+// NewRepoGetSingleCommitOK creates a RepoGetSingleCommitOK with default headers values
+func NewRepoGetSingleCommitOK() *RepoGetSingleCommitOK {
+	return &RepoGetSingleCommitOK{}
+}
+
+/*
+RepoGetSingleCommitOK describes a response with status code 200, with default header values.
+
+Commit
+*/
+type RepoGetSingleCommitOK struct {
+	Payload *models.Commit
+}
+
+// IsSuccess returns true when this repo get single commit o k response has a 2xx status code
+func (o *RepoGetSingleCommitOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo get single commit o k response has a 3xx status code
+func (o *RepoGetSingleCommitOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo get single commit o k response has a 4xx status code
+func (o *RepoGetSingleCommitOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo get single commit o k response has a 5xx status code
+func (o *RepoGetSingleCommitOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo get single commit o k response a status code equal to that given
+func (o *RepoGetSingleCommitOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo get single commit o k response
+func (o *RepoGetSingleCommitOK) Code() int {
+	return 200
+}
+
+func (o *RepoGetSingleCommitOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/git/commits/{sha}][%d] repoGetSingleCommitOK %s", 200, payload)
+}
+
+func (o *RepoGetSingleCommitOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/git/commits/{sha}][%d] repoGetSingleCommitOK %s", 200, payload)
+}
+
+func (o *RepoGetSingleCommitOK) GetPayload() *models.Commit {
+	return o.Payload
+}
+
+func (o *RepoGetSingleCommitOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.Commit)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoGetSingleCommitNotFound creates a RepoGetSingleCommitNotFound with default headers values
+func NewRepoGetSingleCommitNotFound() *RepoGetSingleCommitNotFound {
+	return &RepoGetSingleCommitNotFound{}
+}
+
+/*
+RepoGetSingleCommitNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoGetSingleCommitNotFound struct {
+}
+
+// IsSuccess returns true when this repo get single commit not found response has a 2xx status code
+func (o *RepoGetSingleCommitNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo get single commit not found response has a 3xx status code
+func (o *RepoGetSingleCommitNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo get single commit not found response has a 4xx status code
+func (o *RepoGetSingleCommitNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo get single commit not found response has a 5xx status code
+func (o *RepoGetSingleCommitNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo get single commit not found response a status code equal to that given
+func (o *RepoGetSingleCommitNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo get single commit not found response
+func (o *RepoGetSingleCommitNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoGetSingleCommitNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/git/commits/{sha}][%d] repoGetSingleCommitNotFound", 404)
+}
+
+func (o *RepoGetSingleCommitNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/git/commits/{sha}][%d] repoGetSingleCommitNotFound", 404)
+}
+
+func (o *RepoGetSingleCommitNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewRepoGetSingleCommitUnprocessableEntity creates a RepoGetSingleCommitUnprocessableEntity with default headers values
+func NewRepoGetSingleCommitUnprocessableEntity() *RepoGetSingleCommitUnprocessableEntity {
+	return &RepoGetSingleCommitUnprocessableEntity{}
+}
+
+/*
+RepoGetSingleCommitUnprocessableEntity describes a response with status code 422, with default header values.
+
+APIValidationError is error format response related to input validation
+*/
+type RepoGetSingleCommitUnprocessableEntity struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo get single commit unprocessable entity response has a 2xx status code
+func (o *RepoGetSingleCommitUnprocessableEntity) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo get single commit unprocessable entity response has a 3xx status code
+func (o *RepoGetSingleCommitUnprocessableEntity) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo get single commit unprocessable entity response has a 4xx status code
+func (o *RepoGetSingleCommitUnprocessableEntity) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo get single commit unprocessable entity response has a 5xx status code
+func (o *RepoGetSingleCommitUnprocessableEntity) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo get single commit unprocessable entity response a status code equal to that given
+func (o *RepoGetSingleCommitUnprocessableEntity) IsCode(code int) bool {
+	return code == 422
+}
+
+// Code gets the status code for the repo get single commit unprocessable entity response
+func (o *RepoGetSingleCommitUnprocessableEntity) Code() int {
+	return 422
+}
+
+func (o *RepoGetSingleCommitUnprocessableEntity) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/git/commits/{sha}][%d] repoGetSingleCommitUnprocessableEntity", 422)
+}
+
+func (o *RepoGetSingleCommitUnprocessableEntity) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/git/commits/{sha}][%d] repoGetSingleCommitUnprocessableEntity", 422)
+}
+
+func (o *RepoGetSingleCommitUnprocessableEntity) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_get_tag_parameters.go b/bots-common/gitea-generated/client/repository/repo_get_tag_parameters.go
new file mode 100644
index 0000000..3018af9
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_get_tag_parameters.go
@@ -0,0 +1,195 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewRepoGetTagParams creates a new RepoGetTagParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoGetTagParams() *RepoGetTagParams {
+	return &RepoGetTagParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoGetTagParamsWithTimeout creates a new RepoGetTagParams object
+// with the ability to set a timeout on a request.
+func NewRepoGetTagParamsWithTimeout(timeout time.Duration) *RepoGetTagParams {
+	return &RepoGetTagParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoGetTagParamsWithContext creates a new RepoGetTagParams object
+// with the ability to set a context for a request.
+func NewRepoGetTagParamsWithContext(ctx context.Context) *RepoGetTagParams {
+	return &RepoGetTagParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoGetTagParamsWithHTTPClient creates a new RepoGetTagParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoGetTagParamsWithHTTPClient(client *http.Client) *RepoGetTagParams {
+	return &RepoGetTagParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoGetTagParams contains all the parameters to send to the API endpoint
+
+	for the repo get tag operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoGetTagParams struct {
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	/* Tag.
+
+	   name of tag
+	*/
+	Tag string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo get tag params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoGetTagParams) WithDefaults() *RepoGetTagParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo get tag params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoGetTagParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo get tag params
+func (o *RepoGetTagParams) WithTimeout(timeout time.Duration) *RepoGetTagParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo get tag params
+func (o *RepoGetTagParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo get tag params
+func (o *RepoGetTagParams) WithContext(ctx context.Context) *RepoGetTagParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo get tag params
+func (o *RepoGetTagParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo get tag params
+func (o *RepoGetTagParams) WithHTTPClient(client *http.Client) *RepoGetTagParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo get tag params
+func (o *RepoGetTagParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithOwner adds the owner to the repo get tag params
+func (o *RepoGetTagParams) WithOwner(owner string) *RepoGetTagParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo get tag params
+func (o *RepoGetTagParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo get tag params
+func (o *RepoGetTagParams) WithRepo(repo string) *RepoGetTagParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo get tag params
+func (o *RepoGetTagParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WithTag adds the tag to the repo get tag params
+func (o *RepoGetTagParams) WithTag(tag string) *RepoGetTagParams {
+	o.SetTag(tag)
+	return o
+}
+
+// SetTag adds the tag to the repo get tag params
+func (o *RepoGetTagParams) SetTag(tag string) {
+	o.Tag = tag
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoGetTagParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	// path param tag
+	if err := r.SetPathParam("tag", o.Tag); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_get_tag_responses.go b/bots-common/gitea-generated/client/repository/repo_get_tag_responses.go
new file mode 100644
index 0000000..cf292e5
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_get_tag_responses.go
@@ -0,0 +1,168 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoGetTagReader is a Reader for the RepoGetTag structure.
+type RepoGetTagReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoGetTagReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoGetTagOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoGetTagNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/tags/{tag}] repoGetTag", response, response.Code())
+	}
+}
+
+// NewRepoGetTagOK creates a RepoGetTagOK with default headers values
+func NewRepoGetTagOK() *RepoGetTagOK {
+	return &RepoGetTagOK{}
+}
+
+/*
+RepoGetTagOK describes a response with status code 200, with default header values.
+
+Tag
+*/
+type RepoGetTagOK struct {
+	Payload *models.Tag
+}
+
+// IsSuccess returns true when this repo get tag o k response has a 2xx status code
+func (o *RepoGetTagOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo get tag o k response has a 3xx status code
+func (o *RepoGetTagOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo get tag o k response has a 4xx status code
+func (o *RepoGetTagOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo get tag o k response has a 5xx status code
+func (o *RepoGetTagOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo get tag o k response a status code equal to that given
+func (o *RepoGetTagOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo get tag o k response
+func (o *RepoGetTagOK) Code() int {
+	return 200
+}
+
+func (o *RepoGetTagOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/tags/{tag}][%d] repoGetTagOK %s", 200, payload)
+}
+
+func (o *RepoGetTagOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/tags/{tag}][%d] repoGetTagOK %s", 200, payload)
+}
+
+func (o *RepoGetTagOK) GetPayload() *models.Tag {
+	return o.Payload
+}
+
+func (o *RepoGetTagOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.Tag)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoGetTagNotFound creates a RepoGetTagNotFound with default headers values
+func NewRepoGetTagNotFound() *RepoGetTagNotFound {
+	return &RepoGetTagNotFound{}
+}
+
+/*
+RepoGetTagNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoGetTagNotFound struct {
+}
+
+// IsSuccess returns true when this repo get tag not found response has a 2xx status code
+func (o *RepoGetTagNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo get tag not found response has a 3xx status code
+func (o *RepoGetTagNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo get tag not found response has a 4xx status code
+func (o *RepoGetTagNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo get tag not found response has a 5xx status code
+func (o *RepoGetTagNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo get tag not found response a status code equal to that given
+func (o *RepoGetTagNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo get tag not found response
+func (o *RepoGetTagNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoGetTagNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/tags/{tag}][%d] repoGetTagNotFound", 404)
+}
+
+func (o *RepoGetTagNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/tags/{tag}][%d] repoGetTagNotFound", 404)
+}
+
+func (o *RepoGetTagNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_get_wiki_page_parameters.go b/bots-common/gitea-generated/client/repository/repo_get_wiki_page_parameters.go
new file mode 100644
index 0000000..6714c13
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_get_wiki_page_parameters.go
@@ -0,0 +1,195 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewRepoGetWikiPageParams creates a new RepoGetWikiPageParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoGetWikiPageParams() *RepoGetWikiPageParams {
+	return &RepoGetWikiPageParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoGetWikiPageParamsWithTimeout creates a new RepoGetWikiPageParams object
+// with the ability to set a timeout on a request.
+func NewRepoGetWikiPageParamsWithTimeout(timeout time.Duration) *RepoGetWikiPageParams {
+	return &RepoGetWikiPageParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoGetWikiPageParamsWithContext creates a new RepoGetWikiPageParams object
+// with the ability to set a context for a request.
+func NewRepoGetWikiPageParamsWithContext(ctx context.Context) *RepoGetWikiPageParams {
+	return &RepoGetWikiPageParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoGetWikiPageParamsWithHTTPClient creates a new RepoGetWikiPageParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoGetWikiPageParamsWithHTTPClient(client *http.Client) *RepoGetWikiPageParams {
+	return &RepoGetWikiPageParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoGetWikiPageParams contains all the parameters to send to the API endpoint
+
+	for the repo get wiki page operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoGetWikiPageParams struct {
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* PageName.
+
+	   name of the page
+	*/
+	PageName string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo get wiki page params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoGetWikiPageParams) WithDefaults() *RepoGetWikiPageParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo get wiki page params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoGetWikiPageParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo get wiki page params
+func (o *RepoGetWikiPageParams) WithTimeout(timeout time.Duration) *RepoGetWikiPageParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo get wiki page params
+func (o *RepoGetWikiPageParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo get wiki page params
+func (o *RepoGetWikiPageParams) WithContext(ctx context.Context) *RepoGetWikiPageParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo get wiki page params
+func (o *RepoGetWikiPageParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo get wiki page params
+func (o *RepoGetWikiPageParams) WithHTTPClient(client *http.Client) *RepoGetWikiPageParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo get wiki page params
+func (o *RepoGetWikiPageParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithOwner adds the owner to the repo get wiki page params
+func (o *RepoGetWikiPageParams) WithOwner(owner string) *RepoGetWikiPageParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo get wiki page params
+func (o *RepoGetWikiPageParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithPageName adds the pageName to the repo get wiki page params
+func (o *RepoGetWikiPageParams) WithPageName(pageName string) *RepoGetWikiPageParams {
+	o.SetPageName(pageName)
+	return o
+}
+
+// SetPageName adds the pageName to the repo get wiki page params
+func (o *RepoGetWikiPageParams) SetPageName(pageName string) {
+	o.PageName = pageName
+}
+
+// WithRepo adds the repo to the repo get wiki page params
+func (o *RepoGetWikiPageParams) WithRepo(repo string) *RepoGetWikiPageParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo get wiki page params
+func (o *RepoGetWikiPageParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoGetWikiPageParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param pageName
+	if err := r.SetPathParam("pageName", o.PageName); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_get_wiki_page_responses.go b/bots-common/gitea-generated/client/repository/repo_get_wiki_page_responses.go
new file mode 100644
index 0000000..4dc8a46
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_get_wiki_page_responses.go
@@ -0,0 +1,168 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoGetWikiPageReader is a Reader for the RepoGetWikiPage structure.
+type RepoGetWikiPageReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoGetWikiPageReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoGetWikiPageOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoGetWikiPageNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/wiki/page/{pageName}] repoGetWikiPage", response, response.Code())
+	}
+}
+
+// NewRepoGetWikiPageOK creates a RepoGetWikiPageOK with default headers values
+func NewRepoGetWikiPageOK() *RepoGetWikiPageOK {
+	return &RepoGetWikiPageOK{}
+}
+
+/*
+RepoGetWikiPageOK describes a response with status code 200, with default header values.
+
+WikiPage
+*/
+type RepoGetWikiPageOK struct {
+	Payload *models.WikiPage
+}
+
+// IsSuccess returns true when this repo get wiki page o k response has a 2xx status code
+func (o *RepoGetWikiPageOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo get wiki page o k response has a 3xx status code
+func (o *RepoGetWikiPageOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo get wiki page o k response has a 4xx status code
+func (o *RepoGetWikiPageOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo get wiki page o k response has a 5xx status code
+func (o *RepoGetWikiPageOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo get wiki page o k response a status code equal to that given
+func (o *RepoGetWikiPageOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo get wiki page o k response
+func (o *RepoGetWikiPageOK) Code() int {
+	return 200
+}
+
+func (o *RepoGetWikiPageOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/wiki/page/{pageName}][%d] repoGetWikiPageOK %s", 200, payload)
+}
+
+func (o *RepoGetWikiPageOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/wiki/page/{pageName}][%d] repoGetWikiPageOK %s", 200, payload)
+}
+
+func (o *RepoGetWikiPageOK) GetPayload() *models.WikiPage {
+	return o.Payload
+}
+
+func (o *RepoGetWikiPageOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.WikiPage)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoGetWikiPageNotFound creates a RepoGetWikiPageNotFound with default headers values
+func NewRepoGetWikiPageNotFound() *RepoGetWikiPageNotFound {
+	return &RepoGetWikiPageNotFound{}
+}
+
+/*
+RepoGetWikiPageNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoGetWikiPageNotFound struct {
+}
+
+// IsSuccess returns true when this repo get wiki page not found response has a 2xx status code
+func (o *RepoGetWikiPageNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo get wiki page not found response has a 3xx status code
+func (o *RepoGetWikiPageNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo get wiki page not found response has a 4xx status code
+func (o *RepoGetWikiPageNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo get wiki page not found response has a 5xx status code
+func (o *RepoGetWikiPageNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo get wiki page not found response a status code equal to that given
+func (o *RepoGetWikiPageNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo get wiki page not found response
+func (o *RepoGetWikiPageNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoGetWikiPageNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/wiki/page/{pageName}][%d] repoGetWikiPageNotFound", 404)
+}
+
+func (o *RepoGetWikiPageNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/wiki/page/{pageName}][%d] repoGetWikiPageNotFound", 404)
+}
+
+func (o *RepoGetWikiPageNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_get_wiki_page_revisions_parameters.go b/bots-common/gitea-generated/client/repository/repo_get_wiki_page_revisions_parameters.go
new file mode 100644
index 0000000..dcead86
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_get_wiki_page_revisions_parameters.go
@@ -0,0 +1,230 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewRepoGetWikiPageRevisionsParams creates a new RepoGetWikiPageRevisionsParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoGetWikiPageRevisionsParams() *RepoGetWikiPageRevisionsParams {
+	return &RepoGetWikiPageRevisionsParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoGetWikiPageRevisionsParamsWithTimeout creates a new RepoGetWikiPageRevisionsParams object
+// with the ability to set a timeout on a request.
+func NewRepoGetWikiPageRevisionsParamsWithTimeout(timeout time.Duration) *RepoGetWikiPageRevisionsParams {
+	return &RepoGetWikiPageRevisionsParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoGetWikiPageRevisionsParamsWithContext creates a new RepoGetWikiPageRevisionsParams object
+// with the ability to set a context for a request.
+func NewRepoGetWikiPageRevisionsParamsWithContext(ctx context.Context) *RepoGetWikiPageRevisionsParams {
+	return &RepoGetWikiPageRevisionsParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoGetWikiPageRevisionsParamsWithHTTPClient creates a new RepoGetWikiPageRevisionsParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoGetWikiPageRevisionsParamsWithHTTPClient(client *http.Client) *RepoGetWikiPageRevisionsParams {
+	return &RepoGetWikiPageRevisionsParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoGetWikiPageRevisionsParams contains all the parameters to send to the API endpoint
+
+	for the repo get wiki page revisions operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoGetWikiPageRevisionsParams struct {
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Page.
+
+	   page number of results to return (1-based)
+	*/
+	Page *int64
+
+	/* PageName.
+
+	   name of the page
+	*/
+	PageName string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo get wiki page revisions params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoGetWikiPageRevisionsParams) WithDefaults() *RepoGetWikiPageRevisionsParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo get wiki page revisions params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoGetWikiPageRevisionsParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo get wiki page revisions params
+func (o *RepoGetWikiPageRevisionsParams) WithTimeout(timeout time.Duration) *RepoGetWikiPageRevisionsParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo get wiki page revisions params
+func (o *RepoGetWikiPageRevisionsParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo get wiki page revisions params
+func (o *RepoGetWikiPageRevisionsParams) WithContext(ctx context.Context) *RepoGetWikiPageRevisionsParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo get wiki page revisions params
+func (o *RepoGetWikiPageRevisionsParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo get wiki page revisions params
+func (o *RepoGetWikiPageRevisionsParams) WithHTTPClient(client *http.Client) *RepoGetWikiPageRevisionsParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo get wiki page revisions params
+func (o *RepoGetWikiPageRevisionsParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithOwner adds the owner to the repo get wiki page revisions params
+func (o *RepoGetWikiPageRevisionsParams) WithOwner(owner string) *RepoGetWikiPageRevisionsParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo get wiki page revisions params
+func (o *RepoGetWikiPageRevisionsParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithPage adds the page to the repo get wiki page revisions params
+func (o *RepoGetWikiPageRevisionsParams) WithPage(page *int64) *RepoGetWikiPageRevisionsParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the repo get wiki page revisions params
+func (o *RepoGetWikiPageRevisionsParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WithPageName adds the pageName to the repo get wiki page revisions params
+func (o *RepoGetWikiPageRevisionsParams) WithPageName(pageName string) *RepoGetWikiPageRevisionsParams {
+	o.SetPageName(pageName)
+	return o
+}
+
+// SetPageName adds the pageName to the repo get wiki page revisions params
+func (o *RepoGetWikiPageRevisionsParams) SetPageName(pageName string) {
+	o.PageName = pageName
+}
+
+// WithRepo adds the repo to the repo get wiki page revisions params
+func (o *RepoGetWikiPageRevisionsParams) WithRepo(repo string) *RepoGetWikiPageRevisionsParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo get wiki page revisions params
+func (o *RepoGetWikiPageRevisionsParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoGetWikiPageRevisionsParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param pageName
+	if err := r.SetPathParam("pageName", o.PageName); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_get_wiki_page_revisions_responses.go b/bots-common/gitea-generated/client/repository/repo_get_wiki_page_revisions_responses.go
new file mode 100644
index 0000000..aeba82a
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_get_wiki_page_revisions_responses.go
@@ -0,0 +1,168 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoGetWikiPageRevisionsReader is a Reader for the RepoGetWikiPageRevisions structure.
+type RepoGetWikiPageRevisionsReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoGetWikiPageRevisionsReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoGetWikiPageRevisionsOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoGetWikiPageRevisionsNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/wiki/revisions/{pageName}] repoGetWikiPageRevisions", response, response.Code())
+	}
+}
+
+// NewRepoGetWikiPageRevisionsOK creates a RepoGetWikiPageRevisionsOK with default headers values
+func NewRepoGetWikiPageRevisionsOK() *RepoGetWikiPageRevisionsOK {
+	return &RepoGetWikiPageRevisionsOK{}
+}
+
+/*
+RepoGetWikiPageRevisionsOK describes a response with status code 200, with default header values.
+
+WikiCommitList
+*/
+type RepoGetWikiPageRevisionsOK struct {
+	Payload *models.WikiCommitList
+}
+
+// IsSuccess returns true when this repo get wiki page revisions o k response has a 2xx status code
+func (o *RepoGetWikiPageRevisionsOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo get wiki page revisions o k response has a 3xx status code
+func (o *RepoGetWikiPageRevisionsOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo get wiki page revisions o k response has a 4xx status code
+func (o *RepoGetWikiPageRevisionsOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo get wiki page revisions o k response has a 5xx status code
+func (o *RepoGetWikiPageRevisionsOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo get wiki page revisions o k response a status code equal to that given
+func (o *RepoGetWikiPageRevisionsOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo get wiki page revisions o k response
+func (o *RepoGetWikiPageRevisionsOK) Code() int {
+	return 200
+}
+
+func (o *RepoGetWikiPageRevisionsOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/wiki/revisions/{pageName}][%d] repoGetWikiPageRevisionsOK %s", 200, payload)
+}
+
+func (o *RepoGetWikiPageRevisionsOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/wiki/revisions/{pageName}][%d] repoGetWikiPageRevisionsOK %s", 200, payload)
+}
+
+func (o *RepoGetWikiPageRevisionsOK) GetPayload() *models.WikiCommitList {
+	return o.Payload
+}
+
+func (o *RepoGetWikiPageRevisionsOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.WikiCommitList)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoGetWikiPageRevisionsNotFound creates a RepoGetWikiPageRevisionsNotFound with default headers values
+func NewRepoGetWikiPageRevisionsNotFound() *RepoGetWikiPageRevisionsNotFound {
+	return &RepoGetWikiPageRevisionsNotFound{}
+}
+
+/*
+RepoGetWikiPageRevisionsNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoGetWikiPageRevisionsNotFound struct {
+}
+
+// IsSuccess returns true when this repo get wiki page revisions not found response has a 2xx status code
+func (o *RepoGetWikiPageRevisionsNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo get wiki page revisions not found response has a 3xx status code
+func (o *RepoGetWikiPageRevisionsNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo get wiki page revisions not found response has a 4xx status code
+func (o *RepoGetWikiPageRevisionsNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo get wiki page revisions not found response has a 5xx status code
+func (o *RepoGetWikiPageRevisionsNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo get wiki page revisions not found response a status code equal to that given
+func (o *RepoGetWikiPageRevisionsNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo get wiki page revisions not found response
+func (o *RepoGetWikiPageRevisionsNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoGetWikiPageRevisionsNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/wiki/revisions/{pageName}][%d] repoGetWikiPageRevisionsNotFound", 404)
+}
+
+func (o *RepoGetWikiPageRevisionsNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/wiki/revisions/{pageName}][%d] repoGetWikiPageRevisionsNotFound", 404)
+}
+
+func (o *RepoGetWikiPageRevisionsNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_get_wiki_pages_parameters.go b/bots-common/gitea-generated/client/repository/repo_get_wiki_pages_parameters.go
new file mode 100644
index 0000000..8462de2
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_get_wiki_pages_parameters.go
@@ -0,0 +1,242 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewRepoGetWikiPagesParams creates a new RepoGetWikiPagesParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoGetWikiPagesParams() *RepoGetWikiPagesParams {
+	return &RepoGetWikiPagesParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoGetWikiPagesParamsWithTimeout creates a new RepoGetWikiPagesParams object
+// with the ability to set a timeout on a request.
+func NewRepoGetWikiPagesParamsWithTimeout(timeout time.Duration) *RepoGetWikiPagesParams {
+	return &RepoGetWikiPagesParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoGetWikiPagesParamsWithContext creates a new RepoGetWikiPagesParams object
+// with the ability to set a context for a request.
+func NewRepoGetWikiPagesParamsWithContext(ctx context.Context) *RepoGetWikiPagesParams {
+	return &RepoGetWikiPagesParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoGetWikiPagesParamsWithHTTPClient creates a new RepoGetWikiPagesParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoGetWikiPagesParamsWithHTTPClient(client *http.Client) *RepoGetWikiPagesParams {
+	return &RepoGetWikiPagesParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoGetWikiPagesParams contains all the parameters to send to the API endpoint
+
+	for the repo get wiki pages operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoGetWikiPagesParams struct {
+
+	/* Limit.
+
+	   page size of results
+	*/
+	Limit *int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Page.
+
+	   page number of results to return (1-based)
+	*/
+	Page *int64
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo get wiki pages params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoGetWikiPagesParams) WithDefaults() *RepoGetWikiPagesParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo get wiki pages params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoGetWikiPagesParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo get wiki pages params
+func (o *RepoGetWikiPagesParams) WithTimeout(timeout time.Duration) *RepoGetWikiPagesParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo get wiki pages params
+func (o *RepoGetWikiPagesParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo get wiki pages params
+func (o *RepoGetWikiPagesParams) WithContext(ctx context.Context) *RepoGetWikiPagesParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo get wiki pages params
+func (o *RepoGetWikiPagesParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo get wiki pages params
+func (o *RepoGetWikiPagesParams) WithHTTPClient(client *http.Client) *RepoGetWikiPagesParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo get wiki pages params
+func (o *RepoGetWikiPagesParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithLimit adds the limit to the repo get wiki pages params
+func (o *RepoGetWikiPagesParams) WithLimit(limit *int64) *RepoGetWikiPagesParams {
+	o.SetLimit(limit)
+	return o
+}
+
+// SetLimit adds the limit to the repo get wiki pages params
+func (o *RepoGetWikiPagesParams) SetLimit(limit *int64) {
+	o.Limit = limit
+}
+
+// WithOwner adds the owner to the repo get wiki pages params
+func (o *RepoGetWikiPagesParams) WithOwner(owner string) *RepoGetWikiPagesParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo get wiki pages params
+func (o *RepoGetWikiPagesParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithPage adds the page to the repo get wiki pages params
+func (o *RepoGetWikiPagesParams) WithPage(page *int64) *RepoGetWikiPagesParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the repo get wiki pages params
+func (o *RepoGetWikiPagesParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WithRepo adds the repo to the repo get wiki pages params
+func (o *RepoGetWikiPagesParams) WithRepo(repo string) *RepoGetWikiPagesParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo get wiki pages params
+func (o *RepoGetWikiPagesParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoGetWikiPagesParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.Limit != nil {
+
+		// query param limit
+		var qrLimit int64
+
+		if o.Limit != nil {
+			qrLimit = *o.Limit
+		}
+		qLimit := swag.FormatInt64(qrLimit)
+		if qLimit != "" {
+
+			if err := r.SetQueryParam("limit", qLimit); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_get_wiki_pages_responses.go b/bots-common/gitea-generated/client/repository/repo_get_wiki_pages_responses.go
new file mode 100644
index 0000000..944edca
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_get_wiki_pages_responses.go
@@ -0,0 +1,166 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoGetWikiPagesReader is a Reader for the RepoGetWikiPages structure.
+type RepoGetWikiPagesReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoGetWikiPagesReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoGetWikiPagesOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoGetWikiPagesNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/wiki/pages] repoGetWikiPages", response, response.Code())
+	}
+}
+
+// NewRepoGetWikiPagesOK creates a RepoGetWikiPagesOK with default headers values
+func NewRepoGetWikiPagesOK() *RepoGetWikiPagesOK {
+	return &RepoGetWikiPagesOK{}
+}
+
+/*
+RepoGetWikiPagesOK describes a response with status code 200, with default header values.
+
+WikiPageList
+*/
+type RepoGetWikiPagesOK struct {
+	Payload []*models.WikiPageMetaData
+}
+
+// IsSuccess returns true when this repo get wiki pages o k response has a 2xx status code
+func (o *RepoGetWikiPagesOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo get wiki pages o k response has a 3xx status code
+func (o *RepoGetWikiPagesOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo get wiki pages o k response has a 4xx status code
+func (o *RepoGetWikiPagesOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo get wiki pages o k response has a 5xx status code
+func (o *RepoGetWikiPagesOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo get wiki pages o k response a status code equal to that given
+func (o *RepoGetWikiPagesOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo get wiki pages o k response
+func (o *RepoGetWikiPagesOK) Code() int {
+	return 200
+}
+
+func (o *RepoGetWikiPagesOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/wiki/pages][%d] repoGetWikiPagesOK %s", 200, payload)
+}
+
+func (o *RepoGetWikiPagesOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/wiki/pages][%d] repoGetWikiPagesOK %s", 200, payload)
+}
+
+func (o *RepoGetWikiPagesOK) GetPayload() []*models.WikiPageMetaData {
+	return o.Payload
+}
+
+func (o *RepoGetWikiPagesOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoGetWikiPagesNotFound creates a RepoGetWikiPagesNotFound with default headers values
+func NewRepoGetWikiPagesNotFound() *RepoGetWikiPagesNotFound {
+	return &RepoGetWikiPagesNotFound{}
+}
+
+/*
+RepoGetWikiPagesNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoGetWikiPagesNotFound struct {
+}
+
+// IsSuccess returns true when this repo get wiki pages not found response has a 2xx status code
+func (o *RepoGetWikiPagesNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo get wiki pages not found response has a 3xx status code
+func (o *RepoGetWikiPagesNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo get wiki pages not found response has a 4xx status code
+func (o *RepoGetWikiPagesNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo get wiki pages not found response has a 5xx status code
+func (o *RepoGetWikiPagesNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo get wiki pages not found response a status code equal to that given
+func (o *RepoGetWikiPagesNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo get wiki pages not found response
+func (o *RepoGetWikiPagesNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoGetWikiPagesNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/wiki/pages][%d] repoGetWikiPagesNotFound", 404)
+}
+
+func (o *RepoGetWikiPagesNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/wiki/pages][%d] repoGetWikiPagesNotFound", 404)
+}
+
+func (o *RepoGetWikiPagesNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_list_actions_secrets_parameters.go b/bots-common/gitea-generated/client/repository/repo_list_actions_secrets_parameters.go
new file mode 100644
index 0000000..6fd1437
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_list_actions_secrets_parameters.go
@@ -0,0 +1,242 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewRepoListActionsSecretsParams creates a new RepoListActionsSecretsParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoListActionsSecretsParams() *RepoListActionsSecretsParams {
+	return &RepoListActionsSecretsParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoListActionsSecretsParamsWithTimeout creates a new RepoListActionsSecretsParams object
+// with the ability to set a timeout on a request.
+func NewRepoListActionsSecretsParamsWithTimeout(timeout time.Duration) *RepoListActionsSecretsParams {
+	return &RepoListActionsSecretsParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoListActionsSecretsParamsWithContext creates a new RepoListActionsSecretsParams object
+// with the ability to set a context for a request.
+func NewRepoListActionsSecretsParamsWithContext(ctx context.Context) *RepoListActionsSecretsParams {
+	return &RepoListActionsSecretsParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoListActionsSecretsParamsWithHTTPClient creates a new RepoListActionsSecretsParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoListActionsSecretsParamsWithHTTPClient(client *http.Client) *RepoListActionsSecretsParams {
+	return &RepoListActionsSecretsParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoListActionsSecretsParams contains all the parameters to send to the API endpoint
+
+	for the repo list actions secrets operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoListActionsSecretsParams struct {
+
+	/* Limit.
+
+	   page size of results
+	*/
+	Limit *int64
+
+	/* Owner.
+
+	   owner of the repository
+	*/
+	Owner string
+
+	/* Page.
+
+	   page number of results to return (1-based)
+	*/
+	Page *int64
+
+	/* Repo.
+
+	   name of the repository
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo list actions secrets params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoListActionsSecretsParams) WithDefaults() *RepoListActionsSecretsParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo list actions secrets params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoListActionsSecretsParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo list actions secrets params
+func (o *RepoListActionsSecretsParams) WithTimeout(timeout time.Duration) *RepoListActionsSecretsParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo list actions secrets params
+func (o *RepoListActionsSecretsParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo list actions secrets params
+func (o *RepoListActionsSecretsParams) WithContext(ctx context.Context) *RepoListActionsSecretsParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo list actions secrets params
+func (o *RepoListActionsSecretsParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo list actions secrets params
+func (o *RepoListActionsSecretsParams) WithHTTPClient(client *http.Client) *RepoListActionsSecretsParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo list actions secrets params
+func (o *RepoListActionsSecretsParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithLimit adds the limit to the repo list actions secrets params
+func (o *RepoListActionsSecretsParams) WithLimit(limit *int64) *RepoListActionsSecretsParams {
+	o.SetLimit(limit)
+	return o
+}
+
+// SetLimit adds the limit to the repo list actions secrets params
+func (o *RepoListActionsSecretsParams) SetLimit(limit *int64) {
+	o.Limit = limit
+}
+
+// WithOwner adds the owner to the repo list actions secrets params
+func (o *RepoListActionsSecretsParams) WithOwner(owner string) *RepoListActionsSecretsParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo list actions secrets params
+func (o *RepoListActionsSecretsParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithPage adds the page to the repo list actions secrets params
+func (o *RepoListActionsSecretsParams) WithPage(page *int64) *RepoListActionsSecretsParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the repo list actions secrets params
+func (o *RepoListActionsSecretsParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WithRepo adds the repo to the repo list actions secrets params
+func (o *RepoListActionsSecretsParams) WithRepo(repo string) *RepoListActionsSecretsParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo list actions secrets params
+func (o *RepoListActionsSecretsParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoListActionsSecretsParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.Limit != nil {
+
+		// query param limit
+		var qrLimit int64
+
+		if o.Limit != nil {
+			qrLimit = *o.Limit
+		}
+		qLimit := swag.FormatInt64(qrLimit)
+		if qLimit != "" {
+
+			if err := r.SetQueryParam("limit", qLimit); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_list_actions_secrets_responses.go b/bots-common/gitea-generated/client/repository/repo_list_actions_secrets_responses.go
new file mode 100644
index 0000000..136ebea
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_list_actions_secrets_responses.go
@@ -0,0 +1,166 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoListActionsSecretsReader is a Reader for the RepoListActionsSecrets structure.
+type RepoListActionsSecretsReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoListActionsSecretsReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoListActionsSecretsOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoListActionsSecretsNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/actions/secrets] repoListActionsSecrets", response, response.Code())
+	}
+}
+
+// NewRepoListActionsSecretsOK creates a RepoListActionsSecretsOK with default headers values
+func NewRepoListActionsSecretsOK() *RepoListActionsSecretsOK {
+	return &RepoListActionsSecretsOK{}
+}
+
+/*
+RepoListActionsSecretsOK describes a response with status code 200, with default header values.
+
+SecretList
+*/
+type RepoListActionsSecretsOK struct {
+	Payload []*models.Secret
+}
+
+// IsSuccess returns true when this repo list actions secrets o k response has a 2xx status code
+func (o *RepoListActionsSecretsOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo list actions secrets o k response has a 3xx status code
+func (o *RepoListActionsSecretsOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo list actions secrets o k response has a 4xx status code
+func (o *RepoListActionsSecretsOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo list actions secrets o k response has a 5xx status code
+func (o *RepoListActionsSecretsOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo list actions secrets o k response a status code equal to that given
+func (o *RepoListActionsSecretsOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo list actions secrets o k response
+func (o *RepoListActionsSecretsOK) Code() int {
+	return 200
+}
+
+func (o *RepoListActionsSecretsOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/actions/secrets][%d] repoListActionsSecretsOK %s", 200, payload)
+}
+
+func (o *RepoListActionsSecretsOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/actions/secrets][%d] repoListActionsSecretsOK %s", 200, payload)
+}
+
+func (o *RepoListActionsSecretsOK) GetPayload() []*models.Secret {
+	return o.Payload
+}
+
+func (o *RepoListActionsSecretsOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoListActionsSecretsNotFound creates a RepoListActionsSecretsNotFound with default headers values
+func NewRepoListActionsSecretsNotFound() *RepoListActionsSecretsNotFound {
+	return &RepoListActionsSecretsNotFound{}
+}
+
+/*
+RepoListActionsSecretsNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoListActionsSecretsNotFound struct {
+}
+
+// IsSuccess returns true when this repo list actions secrets not found response has a 2xx status code
+func (o *RepoListActionsSecretsNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo list actions secrets not found response has a 3xx status code
+func (o *RepoListActionsSecretsNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo list actions secrets not found response has a 4xx status code
+func (o *RepoListActionsSecretsNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo list actions secrets not found response has a 5xx status code
+func (o *RepoListActionsSecretsNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo list actions secrets not found response a status code equal to that given
+func (o *RepoListActionsSecretsNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo list actions secrets not found response
+func (o *RepoListActionsSecretsNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoListActionsSecretsNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/actions/secrets][%d] repoListActionsSecretsNotFound", 404)
+}
+
+func (o *RepoListActionsSecretsNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/actions/secrets][%d] repoListActionsSecretsNotFound", 404)
+}
+
+func (o *RepoListActionsSecretsNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_list_activity_feeds_parameters.go b/bots-common/gitea-generated/client/repository/repo_list_activity_feeds_parameters.go
new file mode 100644
index 0000000..9dd5664
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_list_activity_feeds_parameters.go
@@ -0,0 +1,278 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewRepoListActivityFeedsParams creates a new RepoListActivityFeedsParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoListActivityFeedsParams() *RepoListActivityFeedsParams {
+	return &RepoListActivityFeedsParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoListActivityFeedsParamsWithTimeout creates a new RepoListActivityFeedsParams object
+// with the ability to set a timeout on a request.
+func NewRepoListActivityFeedsParamsWithTimeout(timeout time.Duration) *RepoListActivityFeedsParams {
+	return &RepoListActivityFeedsParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoListActivityFeedsParamsWithContext creates a new RepoListActivityFeedsParams object
+// with the ability to set a context for a request.
+func NewRepoListActivityFeedsParamsWithContext(ctx context.Context) *RepoListActivityFeedsParams {
+	return &RepoListActivityFeedsParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoListActivityFeedsParamsWithHTTPClient creates a new RepoListActivityFeedsParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoListActivityFeedsParamsWithHTTPClient(client *http.Client) *RepoListActivityFeedsParams {
+	return &RepoListActivityFeedsParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoListActivityFeedsParams contains all the parameters to send to the API endpoint
+
+	for the repo list activity feeds operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoListActivityFeedsParams struct {
+
+	/* Date.
+
+	   the date of the activities to be found
+
+	   Format: date
+	*/
+	Date *strfmt.Date
+
+	/* Limit.
+
+	   page size of results
+	*/
+	Limit *int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Page.
+
+	   page number of results to return (1-based)
+	*/
+	Page *int64
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo list activity feeds params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoListActivityFeedsParams) WithDefaults() *RepoListActivityFeedsParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo list activity feeds params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoListActivityFeedsParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo list activity feeds params
+func (o *RepoListActivityFeedsParams) WithTimeout(timeout time.Duration) *RepoListActivityFeedsParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo list activity feeds params
+func (o *RepoListActivityFeedsParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo list activity feeds params
+func (o *RepoListActivityFeedsParams) WithContext(ctx context.Context) *RepoListActivityFeedsParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo list activity feeds params
+func (o *RepoListActivityFeedsParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo list activity feeds params
+func (o *RepoListActivityFeedsParams) WithHTTPClient(client *http.Client) *RepoListActivityFeedsParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo list activity feeds params
+func (o *RepoListActivityFeedsParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithDate adds the date to the repo list activity feeds params
+func (o *RepoListActivityFeedsParams) WithDate(date *strfmt.Date) *RepoListActivityFeedsParams {
+	o.SetDate(date)
+	return o
+}
+
+// SetDate adds the date to the repo list activity feeds params
+func (o *RepoListActivityFeedsParams) SetDate(date *strfmt.Date) {
+	o.Date = date
+}
+
+// WithLimit adds the limit to the repo list activity feeds params
+func (o *RepoListActivityFeedsParams) WithLimit(limit *int64) *RepoListActivityFeedsParams {
+	o.SetLimit(limit)
+	return o
+}
+
+// SetLimit adds the limit to the repo list activity feeds params
+func (o *RepoListActivityFeedsParams) SetLimit(limit *int64) {
+	o.Limit = limit
+}
+
+// WithOwner adds the owner to the repo list activity feeds params
+func (o *RepoListActivityFeedsParams) WithOwner(owner string) *RepoListActivityFeedsParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo list activity feeds params
+func (o *RepoListActivityFeedsParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithPage adds the page to the repo list activity feeds params
+func (o *RepoListActivityFeedsParams) WithPage(page *int64) *RepoListActivityFeedsParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the repo list activity feeds params
+func (o *RepoListActivityFeedsParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WithRepo adds the repo to the repo list activity feeds params
+func (o *RepoListActivityFeedsParams) WithRepo(repo string) *RepoListActivityFeedsParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo list activity feeds params
+func (o *RepoListActivityFeedsParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoListActivityFeedsParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.Date != nil {
+
+		// query param date
+		var qrDate strfmt.Date
+
+		if o.Date != nil {
+			qrDate = *o.Date
+		}
+		qDate := qrDate.String()
+		if qDate != "" {
+
+			if err := r.SetQueryParam("date", qDate); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Limit != nil {
+
+		// query param limit
+		var qrLimit int64
+
+		if o.Limit != nil {
+			qrLimit = *o.Limit
+		}
+		qLimit := swag.FormatInt64(qrLimit)
+		if qLimit != "" {
+
+			if err := r.SetQueryParam("limit", qLimit); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_list_activity_feeds_responses.go b/bots-common/gitea-generated/client/repository/repo_list_activity_feeds_responses.go
new file mode 100644
index 0000000..bf886a1
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_list_activity_feeds_responses.go
@@ -0,0 +1,166 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoListActivityFeedsReader is a Reader for the RepoListActivityFeeds structure.
+type RepoListActivityFeedsReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoListActivityFeedsReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoListActivityFeedsOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoListActivityFeedsNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/activities/feeds] repoListActivityFeeds", response, response.Code())
+	}
+}
+
+// NewRepoListActivityFeedsOK creates a RepoListActivityFeedsOK with default headers values
+func NewRepoListActivityFeedsOK() *RepoListActivityFeedsOK {
+	return &RepoListActivityFeedsOK{}
+}
+
+/*
+RepoListActivityFeedsOK describes a response with status code 200, with default header values.
+
+ActivityFeedsList
+*/
+type RepoListActivityFeedsOK struct {
+	Payload []*models.Activity
+}
+
+// IsSuccess returns true when this repo list activity feeds o k response has a 2xx status code
+func (o *RepoListActivityFeedsOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo list activity feeds o k response has a 3xx status code
+func (o *RepoListActivityFeedsOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo list activity feeds o k response has a 4xx status code
+func (o *RepoListActivityFeedsOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo list activity feeds o k response has a 5xx status code
+func (o *RepoListActivityFeedsOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo list activity feeds o k response a status code equal to that given
+func (o *RepoListActivityFeedsOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo list activity feeds o k response
+func (o *RepoListActivityFeedsOK) Code() int {
+	return 200
+}
+
+func (o *RepoListActivityFeedsOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/activities/feeds][%d] repoListActivityFeedsOK %s", 200, payload)
+}
+
+func (o *RepoListActivityFeedsOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/activities/feeds][%d] repoListActivityFeedsOK %s", 200, payload)
+}
+
+func (o *RepoListActivityFeedsOK) GetPayload() []*models.Activity {
+	return o.Payload
+}
+
+func (o *RepoListActivityFeedsOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoListActivityFeedsNotFound creates a RepoListActivityFeedsNotFound with default headers values
+func NewRepoListActivityFeedsNotFound() *RepoListActivityFeedsNotFound {
+	return &RepoListActivityFeedsNotFound{}
+}
+
+/*
+RepoListActivityFeedsNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoListActivityFeedsNotFound struct {
+}
+
+// IsSuccess returns true when this repo list activity feeds not found response has a 2xx status code
+func (o *RepoListActivityFeedsNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo list activity feeds not found response has a 3xx status code
+func (o *RepoListActivityFeedsNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo list activity feeds not found response has a 4xx status code
+func (o *RepoListActivityFeedsNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo list activity feeds not found response has a 5xx status code
+func (o *RepoListActivityFeedsNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo list activity feeds not found response a status code equal to that given
+func (o *RepoListActivityFeedsNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo list activity feeds not found response
+func (o *RepoListActivityFeedsNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoListActivityFeedsNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/activities/feeds][%d] repoListActivityFeedsNotFound", 404)
+}
+
+func (o *RepoListActivityFeedsNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/activities/feeds][%d] repoListActivityFeedsNotFound", 404)
+}
+
+func (o *RepoListActivityFeedsNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_list_all_git_refs_parameters.go b/bots-common/gitea-generated/client/repository/repo_list_all_git_refs_parameters.go
new file mode 100644
index 0000000..f8f33dc
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_list_all_git_refs_parameters.go
@@ -0,0 +1,173 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewRepoListAllGitRefsParams creates a new RepoListAllGitRefsParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoListAllGitRefsParams() *RepoListAllGitRefsParams {
+	return &RepoListAllGitRefsParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoListAllGitRefsParamsWithTimeout creates a new RepoListAllGitRefsParams object
+// with the ability to set a timeout on a request.
+func NewRepoListAllGitRefsParamsWithTimeout(timeout time.Duration) *RepoListAllGitRefsParams {
+	return &RepoListAllGitRefsParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoListAllGitRefsParamsWithContext creates a new RepoListAllGitRefsParams object
+// with the ability to set a context for a request.
+func NewRepoListAllGitRefsParamsWithContext(ctx context.Context) *RepoListAllGitRefsParams {
+	return &RepoListAllGitRefsParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoListAllGitRefsParamsWithHTTPClient creates a new RepoListAllGitRefsParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoListAllGitRefsParamsWithHTTPClient(client *http.Client) *RepoListAllGitRefsParams {
+	return &RepoListAllGitRefsParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoListAllGitRefsParams contains all the parameters to send to the API endpoint
+
+	for the repo list all git refs operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoListAllGitRefsParams struct {
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo list all git refs params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoListAllGitRefsParams) WithDefaults() *RepoListAllGitRefsParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo list all git refs params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoListAllGitRefsParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo list all git refs params
+func (o *RepoListAllGitRefsParams) WithTimeout(timeout time.Duration) *RepoListAllGitRefsParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo list all git refs params
+func (o *RepoListAllGitRefsParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo list all git refs params
+func (o *RepoListAllGitRefsParams) WithContext(ctx context.Context) *RepoListAllGitRefsParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo list all git refs params
+func (o *RepoListAllGitRefsParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo list all git refs params
+func (o *RepoListAllGitRefsParams) WithHTTPClient(client *http.Client) *RepoListAllGitRefsParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo list all git refs params
+func (o *RepoListAllGitRefsParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithOwner adds the owner to the repo list all git refs params
+func (o *RepoListAllGitRefsParams) WithOwner(owner string) *RepoListAllGitRefsParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo list all git refs params
+func (o *RepoListAllGitRefsParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo list all git refs params
+func (o *RepoListAllGitRefsParams) WithRepo(repo string) *RepoListAllGitRefsParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo list all git refs params
+func (o *RepoListAllGitRefsParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoListAllGitRefsParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_list_all_git_refs_responses.go b/bots-common/gitea-generated/client/repository/repo_list_all_git_refs_responses.go
new file mode 100644
index 0000000..e64e701
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_list_all_git_refs_responses.go
@@ -0,0 +1,166 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoListAllGitRefsReader is a Reader for the RepoListAllGitRefs structure.
+type RepoListAllGitRefsReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoListAllGitRefsReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoListAllGitRefsOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoListAllGitRefsNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/git/refs] repoListAllGitRefs", response, response.Code())
+	}
+}
+
+// NewRepoListAllGitRefsOK creates a RepoListAllGitRefsOK with default headers values
+func NewRepoListAllGitRefsOK() *RepoListAllGitRefsOK {
+	return &RepoListAllGitRefsOK{}
+}
+
+/*
+RepoListAllGitRefsOK describes a response with status code 200, with default header values.
+
+ReferenceList
+*/
+type RepoListAllGitRefsOK struct {
+	Payload []*models.Reference
+}
+
+// IsSuccess returns true when this repo list all git refs o k response has a 2xx status code
+func (o *RepoListAllGitRefsOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo list all git refs o k response has a 3xx status code
+func (o *RepoListAllGitRefsOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo list all git refs o k response has a 4xx status code
+func (o *RepoListAllGitRefsOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo list all git refs o k response has a 5xx status code
+func (o *RepoListAllGitRefsOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo list all git refs o k response a status code equal to that given
+func (o *RepoListAllGitRefsOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo list all git refs o k response
+func (o *RepoListAllGitRefsOK) Code() int {
+	return 200
+}
+
+func (o *RepoListAllGitRefsOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/git/refs][%d] repoListAllGitRefsOK %s", 200, payload)
+}
+
+func (o *RepoListAllGitRefsOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/git/refs][%d] repoListAllGitRefsOK %s", 200, payload)
+}
+
+func (o *RepoListAllGitRefsOK) GetPayload() []*models.Reference {
+	return o.Payload
+}
+
+func (o *RepoListAllGitRefsOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoListAllGitRefsNotFound creates a RepoListAllGitRefsNotFound with default headers values
+func NewRepoListAllGitRefsNotFound() *RepoListAllGitRefsNotFound {
+	return &RepoListAllGitRefsNotFound{}
+}
+
+/*
+RepoListAllGitRefsNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoListAllGitRefsNotFound struct {
+}
+
+// IsSuccess returns true when this repo list all git refs not found response has a 2xx status code
+func (o *RepoListAllGitRefsNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo list all git refs not found response has a 3xx status code
+func (o *RepoListAllGitRefsNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo list all git refs not found response has a 4xx status code
+func (o *RepoListAllGitRefsNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo list all git refs not found response has a 5xx status code
+func (o *RepoListAllGitRefsNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo list all git refs not found response a status code equal to that given
+func (o *RepoListAllGitRefsNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo list all git refs not found response
+func (o *RepoListAllGitRefsNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoListAllGitRefsNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/git/refs][%d] repoListAllGitRefsNotFound", 404)
+}
+
+func (o *RepoListAllGitRefsNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/git/refs][%d] repoListAllGitRefsNotFound", 404)
+}
+
+func (o *RepoListAllGitRefsNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_list_branch_protection_parameters.go b/bots-common/gitea-generated/client/repository/repo_list_branch_protection_parameters.go
new file mode 100644
index 0000000..936a2ab
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_list_branch_protection_parameters.go
@@ -0,0 +1,173 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewRepoListBranchProtectionParams creates a new RepoListBranchProtectionParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoListBranchProtectionParams() *RepoListBranchProtectionParams {
+	return &RepoListBranchProtectionParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoListBranchProtectionParamsWithTimeout creates a new RepoListBranchProtectionParams object
+// with the ability to set a timeout on a request.
+func NewRepoListBranchProtectionParamsWithTimeout(timeout time.Duration) *RepoListBranchProtectionParams {
+	return &RepoListBranchProtectionParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoListBranchProtectionParamsWithContext creates a new RepoListBranchProtectionParams object
+// with the ability to set a context for a request.
+func NewRepoListBranchProtectionParamsWithContext(ctx context.Context) *RepoListBranchProtectionParams {
+	return &RepoListBranchProtectionParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoListBranchProtectionParamsWithHTTPClient creates a new RepoListBranchProtectionParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoListBranchProtectionParamsWithHTTPClient(client *http.Client) *RepoListBranchProtectionParams {
+	return &RepoListBranchProtectionParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoListBranchProtectionParams contains all the parameters to send to the API endpoint
+
+	for the repo list branch protection operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoListBranchProtectionParams struct {
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo list branch protection params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoListBranchProtectionParams) WithDefaults() *RepoListBranchProtectionParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo list branch protection params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoListBranchProtectionParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo list branch protection params
+func (o *RepoListBranchProtectionParams) WithTimeout(timeout time.Duration) *RepoListBranchProtectionParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo list branch protection params
+func (o *RepoListBranchProtectionParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo list branch protection params
+func (o *RepoListBranchProtectionParams) WithContext(ctx context.Context) *RepoListBranchProtectionParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo list branch protection params
+func (o *RepoListBranchProtectionParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo list branch protection params
+func (o *RepoListBranchProtectionParams) WithHTTPClient(client *http.Client) *RepoListBranchProtectionParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo list branch protection params
+func (o *RepoListBranchProtectionParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithOwner adds the owner to the repo list branch protection params
+func (o *RepoListBranchProtectionParams) WithOwner(owner string) *RepoListBranchProtectionParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo list branch protection params
+func (o *RepoListBranchProtectionParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo list branch protection params
+func (o *RepoListBranchProtectionParams) WithRepo(repo string) *RepoListBranchProtectionParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo list branch protection params
+func (o *RepoListBranchProtectionParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoListBranchProtectionParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_list_branch_protection_responses.go b/bots-common/gitea-generated/client/repository/repo_list_branch_protection_responses.go
new file mode 100644
index 0000000..d11f3cf
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_list_branch_protection_responses.go
@@ -0,0 +1,104 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoListBranchProtectionReader is a Reader for the RepoListBranchProtection structure.
+type RepoListBranchProtectionReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoListBranchProtectionReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoListBranchProtectionOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/branch_protections] repoListBranchProtection", response, response.Code())
+	}
+}
+
+// NewRepoListBranchProtectionOK creates a RepoListBranchProtectionOK with default headers values
+func NewRepoListBranchProtectionOK() *RepoListBranchProtectionOK {
+	return &RepoListBranchProtectionOK{}
+}
+
+/*
+RepoListBranchProtectionOK describes a response with status code 200, with default header values.
+
+BranchProtectionList
+*/
+type RepoListBranchProtectionOK struct {
+	Payload []*models.BranchProtection
+}
+
+// IsSuccess returns true when this repo list branch protection o k response has a 2xx status code
+func (o *RepoListBranchProtectionOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo list branch protection o k response has a 3xx status code
+func (o *RepoListBranchProtectionOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo list branch protection o k response has a 4xx status code
+func (o *RepoListBranchProtectionOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo list branch protection o k response has a 5xx status code
+func (o *RepoListBranchProtectionOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo list branch protection o k response a status code equal to that given
+func (o *RepoListBranchProtectionOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo list branch protection o k response
+func (o *RepoListBranchProtectionOK) Code() int {
+	return 200
+}
+
+func (o *RepoListBranchProtectionOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/branch_protections][%d] repoListBranchProtectionOK %s", 200, payload)
+}
+
+func (o *RepoListBranchProtectionOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/branch_protections][%d] repoListBranchProtectionOK %s", 200, payload)
+}
+
+func (o *RepoListBranchProtectionOK) GetPayload() []*models.BranchProtection {
+	return o.Payload
+}
+
+func (o *RepoListBranchProtectionOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_list_branches_parameters.go b/bots-common/gitea-generated/client/repository/repo_list_branches_parameters.go
new file mode 100644
index 0000000..a70204e
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_list_branches_parameters.go
@@ -0,0 +1,242 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewRepoListBranchesParams creates a new RepoListBranchesParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoListBranchesParams() *RepoListBranchesParams {
+	return &RepoListBranchesParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoListBranchesParamsWithTimeout creates a new RepoListBranchesParams object
+// with the ability to set a timeout on a request.
+func NewRepoListBranchesParamsWithTimeout(timeout time.Duration) *RepoListBranchesParams {
+	return &RepoListBranchesParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoListBranchesParamsWithContext creates a new RepoListBranchesParams object
+// with the ability to set a context for a request.
+func NewRepoListBranchesParamsWithContext(ctx context.Context) *RepoListBranchesParams {
+	return &RepoListBranchesParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoListBranchesParamsWithHTTPClient creates a new RepoListBranchesParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoListBranchesParamsWithHTTPClient(client *http.Client) *RepoListBranchesParams {
+	return &RepoListBranchesParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoListBranchesParams contains all the parameters to send to the API endpoint
+
+	for the repo list branches operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoListBranchesParams struct {
+
+	/* Limit.
+
+	   page size of results
+	*/
+	Limit *int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Page.
+
+	   page number of results to return (1-based)
+	*/
+	Page *int64
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo list branches params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoListBranchesParams) WithDefaults() *RepoListBranchesParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo list branches params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoListBranchesParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo list branches params
+func (o *RepoListBranchesParams) WithTimeout(timeout time.Duration) *RepoListBranchesParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo list branches params
+func (o *RepoListBranchesParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo list branches params
+func (o *RepoListBranchesParams) WithContext(ctx context.Context) *RepoListBranchesParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo list branches params
+func (o *RepoListBranchesParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo list branches params
+func (o *RepoListBranchesParams) WithHTTPClient(client *http.Client) *RepoListBranchesParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo list branches params
+func (o *RepoListBranchesParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithLimit adds the limit to the repo list branches params
+func (o *RepoListBranchesParams) WithLimit(limit *int64) *RepoListBranchesParams {
+	o.SetLimit(limit)
+	return o
+}
+
+// SetLimit adds the limit to the repo list branches params
+func (o *RepoListBranchesParams) SetLimit(limit *int64) {
+	o.Limit = limit
+}
+
+// WithOwner adds the owner to the repo list branches params
+func (o *RepoListBranchesParams) WithOwner(owner string) *RepoListBranchesParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo list branches params
+func (o *RepoListBranchesParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithPage adds the page to the repo list branches params
+func (o *RepoListBranchesParams) WithPage(page *int64) *RepoListBranchesParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the repo list branches params
+func (o *RepoListBranchesParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WithRepo adds the repo to the repo list branches params
+func (o *RepoListBranchesParams) WithRepo(repo string) *RepoListBranchesParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo list branches params
+func (o *RepoListBranchesParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoListBranchesParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.Limit != nil {
+
+		// query param limit
+		var qrLimit int64
+
+		if o.Limit != nil {
+			qrLimit = *o.Limit
+		}
+		qLimit := swag.FormatInt64(qrLimit)
+		if qLimit != "" {
+
+			if err := r.SetQueryParam("limit", qLimit); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_list_branches_responses.go b/bots-common/gitea-generated/client/repository/repo_list_branches_responses.go
new file mode 100644
index 0000000..f848112
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_list_branches_responses.go
@@ -0,0 +1,104 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoListBranchesReader is a Reader for the RepoListBranches structure.
+type RepoListBranchesReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoListBranchesReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoListBranchesOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/branches] repoListBranches", response, response.Code())
+	}
+}
+
+// NewRepoListBranchesOK creates a RepoListBranchesOK with default headers values
+func NewRepoListBranchesOK() *RepoListBranchesOK {
+	return &RepoListBranchesOK{}
+}
+
+/*
+RepoListBranchesOK describes a response with status code 200, with default header values.
+
+BranchList
+*/
+type RepoListBranchesOK struct {
+	Payload []*models.Branch
+}
+
+// IsSuccess returns true when this repo list branches o k response has a 2xx status code
+func (o *RepoListBranchesOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo list branches o k response has a 3xx status code
+func (o *RepoListBranchesOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo list branches o k response has a 4xx status code
+func (o *RepoListBranchesOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo list branches o k response has a 5xx status code
+func (o *RepoListBranchesOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo list branches o k response a status code equal to that given
+func (o *RepoListBranchesOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo list branches o k response
+func (o *RepoListBranchesOK) Code() int {
+	return 200
+}
+
+func (o *RepoListBranchesOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/branches][%d] repoListBranchesOK %s", 200, payload)
+}
+
+func (o *RepoListBranchesOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/branches][%d] repoListBranchesOK %s", 200, payload)
+}
+
+func (o *RepoListBranchesOK) GetPayload() []*models.Branch {
+	return o.Payload
+}
+
+func (o *RepoListBranchesOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_list_collaborators_parameters.go b/bots-common/gitea-generated/client/repository/repo_list_collaborators_parameters.go
new file mode 100644
index 0000000..4b8ec45
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_list_collaborators_parameters.go
@@ -0,0 +1,242 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewRepoListCollaboratorsParams creates a new RepoListCollaboratorsParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoListCollaboratorsParams() *RepoListCollaboratorsParams {
+	return &RepoListCollaboratorsParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoListCollaboratorsParamsWithTimeout creates a new RepoListCollaboratorsParams object
+// with the ability to set a timeout on a request.
+func NewRepoListCollaboratorsParamsWithTimeout(timeout time.Duration) *RepoListCollaboratorsParams {
+	return &RepoListCollaboratorsParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoListCollaboratorsParamsWithContext creates a new RepoListCollaboratorsParams object
+// with the ability to set a context for a request.
+func NewRepoListCollaboratorsParamsWithContext(ctx context.Context) *RepoListCollaboratorsParams {
+	return &RepoListCollaboratorsParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoListCollaboratorsParamsWithHTTPClient creates a new RepoListCollaboratorsParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoListCollaboratorsParamsWithHTTPClient(client *http.Client) *RepoListCollaboratorsParams {
+	return &RepoListCollaboratorsParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoListCollaboratorsParams contains all the parameters to send to the API endpoint
+
+	for the repo list collaborators operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoListCollaboratorsParams struct {
+
+	/* Limit.
+
+	   page size of results
+	*/
+	Limit *int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Page.
+
+	   page number of results to return (1-based)
+	*/
+	Page *int64
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo list collaborators params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoListCollaboratorsParams) WithDefaults() *RepoListCollaboratorsParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo list collaborators params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoListCollaboratorsParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo list collaborators params
+func (o *RepoListCollaboratorsParams) WithTimeout(timeout time.Duration) *RepoListCollaboratorsParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo list collaborators params
+func (o *RepoListCollaboratorsParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo list collaborators params
+func (o *RepoListCollaboratorsParams) WithContext(ctx context.Context) *RepoListCollaboratorsParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo list collaborators params
+func (o *RepoListCollaboratorsParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo list collaborators params
+func (o *RepoListCollaboratorsParams) WithHTTPClient(client *http.Client) *RepoListCollaboratorsParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo list collaborators params
+func (o *RepoListCollaboratorsParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithLimit adds the limit to the repo list collaborators params
+func (o *RepoListCollaboratorsParams) WithLimit(limit *int64) *RepoListCollaboratorsParams {
+	o.SetLimit(limit)
+	return o
+}
+
+// SetLimit adds the limit to the repo list collaborators params
+func (o *RepoListCollaboratorsParams) SetLimit(limit *int64) {
+	o.Limit = limit
+}
+
+// WithOwner adds the owner to the repo list collaborators params
+func (o *RepoListCollaboratorsParams) WithOwner(owner string) *RepoListCollaboratorsParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo list collaborators params
+func (o *RepoListCollaboratorsParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithPage adds the page to the repo list collaborators params
+func (o *RepoListCollaboratorsParams) WithPage(page *int64) *RepoListCollaboratorsParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the repo list collaborators params
+func (o *RepoListCollaboratorsParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WithRepo adds the repo to the repo list collaborators params
+func (o *RepoListCollaboratorsParams) WithRepo(repo string) *RepoListCollaboratorsParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo list collaborators params
+func (o *RepoListCollaboratorsParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoListCollaboratorsParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.Limit != nil {
+
+		// query param limit
+		var qrLimit int64
+
+		if o.Limit != nil {
+			qrLimit = *o.Limit
+		}
+		qLimit := swag.FormatInt64(qrLimit)
+		if qLimit != "" {
+
+			if err := r.SetQueryParam("limit", qLimit); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_list_collaborators_responses.go b/bots-common/gitea-generated/client/repository/repo_list_collaborators_responses.go
new file mode 100644
index 0000000..806ca58
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_list_collaborators_responses.go
@@ -0,0 +1,166 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoListCollaboratorsReader is a Reader for the RepoListCollaborators structure.
+type RepoListCollaboratorsReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoListCollaboratorsReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoListCollaboratorsOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoListCollaboratorsNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/collaborators] repoListCollaborators", response, response.Code())
+	}
+}
+
+// NewRepoListCollaboratorsOK creates a RepoListCollaboratorsOK with default headers values
+func NewRepoListCollaboratorsOK() *RepoListCollaboratorsOK {
+	return &RepoListCollaboratorsOK{}
+}
+
+/*
+RepoListCollaboratorsOK describes a response with status code 200, with default header values.
+
+UserList
+*/
+type RepoListCollaboratorsOK struct {
+	Payload []*models.User
+}
+
+// IsSuccess returns true when this repo list collaborators o k response has a 2xx status code
+func (o *RepoListCollaboratorsOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo list collaborators o k response has a 3xx status code
+func (o *RepoListCollaboratorsOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo list collaborators o k response has a 4xx status code
+func (o *RepoListCollaboratorsOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo list collaborators o k response has a 5xx status code
+func (o *RepoListCollaboratorsOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo list collaborators o k response a status code equal to that given
+func (o *RepoListCollaboratorsOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo list collaborators o k response
+func (o *RepoListCollaboratorsOK) Code() int {
+	return 200
+}
+
+func (o *RepoListCollaboratorsOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/collaborators][%d] repoListCollaboratorsOK %s", 200, payload)
+}
+
+func (o *RepoListCollaboratorsOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/collaborators][%d] repoListCollaboratorsOK %s", 200, payload)
+}
+
+func (o *RepoListCollaboratorsOK) GetPayload() []*models.User {
+	return o.Payload
+}
+
+func (o *RepoListCollaboratorsOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoListCollaboratorsNotFound creates a RepoListCollaboratorsNotFound with default headers values
+func NewRepoListCollaboratorsNotFound() *RepoListCollaboratorsNotFound {
+	return &RepoListCollaboratorsNotFound{}
+}
+
+/*
+RepoListCollaboratorsNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoListCollaboratorsNotFound struct {
+}
+
+// IsSuccess returns true when this repo list collaborators not found response has a 2xx status code
+func (o *RepoListCollaboratorsNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo list collaborators not found response has a 3xx status code
+func (o *RepoListCollaboratorsNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo list collaborators not found response has a 4xx status code
+func (o *RepoListCollaboratorsNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo list collaborators not found response has a 5xx status code
+func (o *RepoListCollaboratorsNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo list collaborators not found response a status code equal to that given
+func (o *RepoListCollaboratorsNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo list collaborators not found response
+func (o *RepoListCollaboratorsNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoListCollaboratorsNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/collaborators][%d] repoListCollaboratorsNotFound", 404)
+}
+
+func (o *RepoListCollaboratorsNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/collaborators][%d] repoListCollaboratorsNotFound", 404)
+}
+
+func (o *RepoListCollaboratorsNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_list_git_hooks_parameters.go b/bots-common/gitea-generated/client/repository/repo_list_git_hooks_parameters.go
new file mode 100644
index 0000000..b9223c3
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_list_git_hooks_parameters.go
@@ -0,0 +1,173 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewRepoListGitHooksParams creates a new RepoListGitHooksParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoListGitHooksParams() *RepoListGitHooksParams {
+	return &RepoListGitHooksParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoListGitHooksParamsWithTimeout creates a new RepoListGitHooksParams object
+// with the ability to set a timeout on a request.
+func NewRepoListGitHooksParamsWithTimeout(timeout time.Duration) *RepoListGitHooksParams {
+	return &RepoListGitHooksParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoListGitHooksParamsWithContext creates a new RepoListGitHooksParams object
+// with the ability to set a context for a request.
+func NewRepoListGitHooksParamsWithContext(ctx context.Context) *RepoListGitHooksParams {
+	return &RepoListGitHooksParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoListGitHooksParamsWithHTTPClient creates a new RepoListGitHooksParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoListGitHooksParamsWithHTTPClient(client *http.Client) *RepoListGitHooksParams {
+	return &RepoListGitHooksParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoListGitHooksParams contains all the parameters to send to the API endpoint
+
+	for the repo list git hooks operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoListGitHooksParams struct {
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo list git hooks params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoListGitHooksParams) WithDefaults() *RepoListGitHooksParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo list git hooks params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoListGitHooksParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo list git hooks params
+func (o *RepoListGitHooksParams) WithTimeout(timeout time.Duration) *RepoListGitHooksParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo list git hooks params
+func (o *RepoListGitHooksParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo list git hooks params
+func (o *RepoListGitHooksParams) WithContext(ctx context.Context) *RepoListGitHooksParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo list git hooks params
+func (o *RepoListGitHooksParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo list git hooks params
+func (o *RepoListGitHooksParams) WithHTTPClient(client *http.Client) *RepoListGitHooksParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo list git hooks params
+func (o *RepoListGitHooksParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithOwner adds the owner to the repo list git hooks params
+func (o *RepoListGitHooksParams) WithOwner(owner string) *RepoListGitHooksParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo list git hooks params
+func (o *RepoListGitHooksParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo list git hooks params
+func (o *RepoListGitHooksParams) WithRepo(repo string) *RepoListGitHooksParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo list git hooks params
+func (o *RepoListGitHooksParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoListGitHooksParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_list_git_hooks_responses.go b/bots-common/gitea-generated/client/repository/repo_list_git_hooks_responses.go
new file mode 100644
index 0000000..47bebd1
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_list_git_hooks_responses.go
@@ -0,0 +1,166 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoListGitHooksReader is a Reader for the RepoListGitHooks structure.
+type RepoListGitHooksReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoListGitHooksReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoListGitHooksOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoListGitHooksNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/hooks/git] repoListGitHooks", response, response.Code())
+	}
+}
+
+// NewRepoListGitHooksOK creates a RepoListGitHooksOK with default headers values
+func NewRepoListGitHooksOK() *RepoListGitHooksOK {
+	return &RepoListGitHooksOK{}
+}
+
+/*
+RepoListGitHooksOK describes a response with status code 200, with default header values.
+
+GitHookList
+*/
+type RepoListGitHooksOK struct {
+	Payload []*models.GitHook
+}
+
+// IsSuccess returns true when this repo list git hooks o k response has a 2xx status code
+func (o *RepoListGitHooksOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo list git hooks o k response has a 3xx status code
+func (o *RepoListGitHooksOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo list git hooks o k response has a 4xx status code
+func (o *RepoListGitHooksOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo list git hooks o k response has a 5xx status code
+func (o *RepoListGitHooksOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo list git hooks o k response a status code equal to that given
+func (o *RepoListGitHooksOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo list git hooks o k response
+func (o *RepoListGitHooksOK) Code() int {
+	return 200
+}
+
+func (o *RepoListGitHooksOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/hooks/git][%d] repoListGitHooksOK %s", 200, payload)
+}
+
+func (o *RepoListGitHooksOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/hooks/git][%d] repoListGitHooksOK %s", 200, payload)
+}
+
+func (o *RepoListGitHooksOK) GetPayload() []*models.GitHook {
+	return o.Payload
+}
+
+func (o *RepoListGitHooksOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoListGitHooksNotFound creates a RepoListGitHooksNotFound with default headers values
+func NewRepoListGitHooksNotFound() *RepoListGitHooksNotFound {
+	return &RepoListGitHooksNotFound{}
+}
+
+/*
+RepoListGitHooksNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoListGitHooksNotFound struct {
+}
+
+// IsSuccess returns true when this repo list git hooks not found response has a 2xx status code
+func (o *RepoListGitHooksNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo list git hooks not found response has a 3xx status code
+func (o *RepoListGitHooksNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo list git hooks not found response has a 4xx status code
+func (o *RepoListGitHooksNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo list git hooks not found response has a 5xx status code
+func (o *RepoListGitHooksNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo list git hooks not found response a status code equal to that given
+func (o *RepoListGitHooksNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo list git hooks not found response
+func (o *RepoListGitHooksNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoListGitHooksNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/hooks/git][%d] repoListGitHooksNotFound", 404)
+}
+
+func (o *RepoListGitHooksNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/hooks/git][%d] repoListGitHooksNotFound", 404)
+}
+
+func (o *RepoListGitHooksNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_list_git_refs_parameters.go b/bots-common/gitea-generated/client/repository/repo_list_git_refs_parameters.go
new file mode 100644
index 0000000..5527c8b
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_list_git_refs_parameters.go
@@ -0,0 +1,195 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewRepoListGitRefsParams creates a new RepoListGitRefsParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoListGitRefsParams() *RepoListGitRefsParams {
+	return &RepoListGitRefsParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoListGitRefsParamsWithTimeout creates a new RepoListGitRefsParams object
+// with the ability to set a timeout on a request.
+func NewRepoListGitRefsParamsWithTimeout(timeout time.Duration) *RepoListGitRefsParams {
+	return &RepoListGitRefsParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoListGitRefsParamsWithContext creates a new RepoListGitRefsParams object
+// with the ability to set a context for a request.
+func NewRepoListGitRefsParamsWithContext(ctx context.Context) *RepoListGitRefsParams {
+	return &RepoListGitRefsParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoListGitRefsParamsWithHTTPClient creates a new RepoListGitRefsParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoListGitRefsParamsWithHTTPClient(client *http.Client) *RepoListGitRefsParams {
+	return &RepoListGitRefsParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoListGitRefsParams contains all the parameters to send to the API endpoint
+
+	for the repo list git refs operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoListGitRefsParams struct {
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Ref.
+
+	   part or full name of the ref
+	*/
+	Ref string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo list git refs params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoListGitRefsParams) WithDefaults() *RepoListGitRefsParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo list git refs params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoListGitRefsParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo list git refs params
+func (o *RepoListGitRefsParams) WithTimeout(timeout time.Duration) *RepoListGitRefsParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo list git refs params
+func (o *RepoListGitRefsParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo list git refs params
+func (o *RepoListGitRefsParams) WithContext(ctx context.Context) *RepoListGitRefsParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo list git refs params
+func (o *RepoListGitRefsParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo list git refs params
+func (o *RepoListGitRefsParams) WithHTTPClient(client *http.Client) *RepoListGitRefsParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo list git refs params
+func (o *RepoListGitRefsParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithOwner adds the owner to the repo list git refs params
+func (o *RepoListGitRefsParams) WithOwner(owner string) *RepoListGitRefsParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo list git refs params
+func (o *RepoListGitRefsParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRef adds the ref to the repo list git refs params
+func (o *RepoListGitRefsParams) WithRef(ref string) *RepoListGitRefsParams {
+	o.SetRef(ref)
+	return o
+}
+
+// SetRef adds the ref to the repo list git refs params
+func (o *RepoListGitRefsParams) SetRef(ref string) {
+	o.Ref = ref
+}
+
+// WithRepo adds the repo to the repo list git refs params
+func (o *RepoListGitRefsParams) WithRepo(repo string) *RepoListGitRefsParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo list git refs params
+func (o *RepoListGitRefsParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoListGitRefsParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param ref
+	if err := r.SetPathParam("ref", o.Ref); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_list_git_refs_responses.go b/bots-common/gitea-generated/client/repository/repo_list_git_refs_responses.go
new file mode 100644
index 0000000..cb52c3b
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_list_git_refs_responses.go
@@ -0,0 +1,166 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoListGitRefsReader is a Reader for the RepoListGitRefs structure.
+type RepoListGitRefsReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoListGitRefsReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoListGitRefsOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoListGitRefsNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/git/refs/{ref}] repoListGitRefs", response, response.Code())
+	}
+}
+
+// NewRepoListGitRefsOK creates a RepoListGitRefsOK with default headers values
+func NewRepoListGitRefsOK() *RepoListGitRefsOK {
+	return &RepoListGitRefsOK{}
+}
+
+/*
+RepoListGitRefsOK describes a response with status code 200, with default header values.
+
+ReferenceList
+*/
+type RepoListGitRefsOK struct {
+	Payload []*models.Reference
+}
+
+// IsSuccess returns true when this repo list git refs o k response has a 2xx status code
+func (o *RepoListGitRefsOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo list git refs o k response has a 3xx status code
+func (o *RepoListGitRefsOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo list git refs o k response has a 4xx status code
+func (o *RepoListGitRefsOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo list git refs o k response has a 5xx status code
+func (o *RepoListGitRefsOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo list git refs o k response a status code equal to that given
+func (o *RepoListGitRefsOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo list git refs o k response
+func (o *RepoListGitRefsOK) Code() int {
+	return 200
+}
+
+func (o *RepoListGitRefsOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/git/refs/{ref}][%d] repoListGitRefsOK %s", 200, payload)
+}
+
+func (o *RepoListGitRefsOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/git/refs/{ref}][%d] repoListGitRefsOK %s", 200, payload)
+}
+
+func (o *RepoListGitRefsOK) GetPayload() []*models.Reference {
+	return o.Payload
+}
+
+func (o *RepoListGitRefsOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoListGitRefsNotFound creates a RepoListGitRefsNotFound with default headers values
+func NewRepoListGitRefsNotFound() *RepoListGitRefsNotFound {
+	return &RepoListGitRefsNotFound{}
+}
+
+/*
+RepoListGitRefsNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoListGitRefsNotFound struct {
+}
+
+// IsSuccess returns true when this repo list git refs not found response has a 2xx status code
+func (o *RepoListGitRefsNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo list git refs not found response has a 3xx status code
+func (o *RepoListGitRefsNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo list git refs not found response has a 4xx status code
+func (o *RepoListGitRefsNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo list git refs not found response has a 5xx status code
+func (o *RepoListGitRefsNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo list git refs not found response a status code equal to that given
+func (o *RepoListGitRefsNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo list git refs not found response
+func (o *RepoListGitRefsNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoListGitRefsNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/git/refs/{ref}][%d] repoListGitRefsNotFound", 404)
+}
+
+func (o *RepoListGitRefsNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/git/refs/{ref}][%d] repoListGitRefsNotFound", 404)
+}
+
+func (o *RepoListGitRefsNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_list_hooks_parameters.go b/bots-common/gitea-generated/client/repository/repo_list_hooks_parameters.go
new file mode 100644
index 0000000..500572b
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_list_hooks_parameters.go
@@ -0,0 +1,242 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewRepoListHooksParams creates a new RepoListHooksParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoListHooksParams() *RepoListHooksParams {
+	return &RepoListHooksParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoListHooksParamsWithTimeout creates a new RepoListHooksParams object
+// with the ability to set a timeout on a request.
+func NewRepoListHooksParamsWithTimeout(timeout time.Duration) *RepoListHooksParams {
+	return &RepoListHooksParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoListHooksParamsWithContext creates a new RepoListHooksParams object
+// with the ability to set a context for a request.
+func NewRepoListHooksParamsWithContext(ctx context.Context) *RepoListHooksParams {
+	return &RepoListHooksParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoListHooksParamsWithHTTPClient creates a new RepoListHooksParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoListHooksParamsWithHTTPClient(client *http.Client) *RepoListHooksParams {
+	return &RepoListHooksParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoListHooksParams contains all the parameters to send to the API endpoint
+
+	for the repo list hooks operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoListHooksParams struct {
+
+	/* Limit.
+
+	   page size of results
+	*/
+	Limit *int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Page.
+
+	   page number of results to return (1-based)
+	*/
+	Page *int64
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo list hooks params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoListHooksParams) WithDefaults() *RepoListHooksParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo list hooks params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoListHooksParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo list hooks params
+func (o *RepoListHooksParams) WithTimeout(timeout time.Duration) *RepoListHooksParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo list hooks params
+func (o *RepoListHooksParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo list hooks params
+func (o *RepoListHooksParams) WithContext(ctx context.Context) *RepoListHooksParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo list hooks params
+func (o *RepoListHooksParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo list hooks params
+func (o *RepoListHooksParams) WithHTTPClient(client *http.Client) *RepoListHooksParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo list hooks params
+func (o *RepoListHooksParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithLimit adds the limit to the repo list hooks params
+func (o *RepoListHooksParams) WithLimit(limit *int64) *RepoListHooksParams {
+	o.SetLimit(limit)
+	return o
+}
+
+// SetLimit adds the limit to the repo list hooks params
+func (o *RepoListHooksParams) SetLimit(limit *int64) {
+	o.Limit = limit
+}
+
+// WithOwner adds the owner to the repo list hooks params
+func (o *RepoListHooksParams) WithOwner(owner string) *RepoListHooksParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo list hooks params
+func (o *RepoListHooksParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithPage adds the page to the repo list hooks params
+func (o *RepoListHooksParams) WithPage(page *int64) *RepoListHooksParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the repo list hooks params
+func (o *RepoListHooksParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WithRepo adds the repo to the repo list hooks params
+func (o *RepoListHooksParams) WithRepo(repo string) *RepoListHooksParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo list hooks params
+func (o *RepoListHooksParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoListHooksParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.Limit != nil {
+
+		// query param limit
+		var qrLimit int64
+
+		if o.Limit != nil {
+			qrLimit = *o.Limit
+		}
+		qLimit := swag.FormatInt64(qrLimit)
+		if qLimit != "" {
+
+			if err := r.SetQueryParam("limit", qLimit); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_list_hooks_responses.go b/bots-common/gitea-generated/client/repository/repo_list_hooks_responses.go
new file mode 100644
index 0000000..6d72019
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_list_hooks_responses.go
@@ -0,0 +1,166 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoListHooksReader is a Reader for the RepoListHooks structure.
+type RepoListHooksReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoListHooksReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoListHooksOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoListHooksNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/hooks] repoListHooks", response, response.Code())
+	}
+}
+
+// NewRepoListHooksOK creates a RepoListHooksOK with default headers values
+func NewRepoListHooksOK() *RepoListHooksOK {
+	return &RepoListHooksOK{}
+}
+
+/*
+RepoListHooksOK describes a response with status code 200, with default header values.
+
+HookList
+*/
+type RepoListHooksOK struct {
+	Payload []*models.Hook
+}
+
+// IsSuccess returns true when this repo list hooks o k response has a 2xx status code
+func (o *RepoListHooksOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo list hooks o k response has a 3xx status code
+func (o *RepoListHooksOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo list hooks o k response has a 4xx status code
+func (o *RepoListHooksOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo list hooks o k response has a 5xx status code
+func (o *RepoListHooksOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo list hooks o k response a status code equal to that given
+func (o *RepoListHooksOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo list hooks o k response
+func (o *RepoListHooksOK) Code() int {
+	return 200
+}
+
+func (o *RepoListHooksOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/hooks][%d] repoListHooksOK %s", 200, payload)
+}
+
+func (o *RepoListHooksOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/hooks][%d] repoListHooksOK %s", 200, payload)
+}
+
+func (o *RepoListHooksOK) GetPayload() []*models.Hook {
+	return o.Payload
+}
+
+func (o *RepoListHooksOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoListHooksNotFound creates a RepoListHooksNotFound with default headers values
+func NewRepoListHooksNotFound() *RepoListHooksNotFound {
+	return &RepoListHooksNotFound{}
+}
+
+/*
+RepoListHooksNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoListHooksNotFound struct {
+}
+
+// IsSuccess returns true when this repo list hooks not found response has a 2xx status code
+func (o *RepoListHooksNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo list hooks not found response has a 3xx status code
+func (o *RepoListHooksNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo list hooks not found response has a 4xx status code
+func (o *RepoListHooksNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo list hooks not found response has a 5xx status code
+func (o *RepoListHooksNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo list hooks not found response a status code equal to that given
+func (o *RepoListHooksNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo list hooks not found response
+func (o *RepoListHooksNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoListHooksNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/hooks][%d] repoListHooksNotFound", 404)
+}
+
+func (o *RepoListHooksNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/hooks][%d] repoListHooksNotFound", 404)
+}
+
+func (o *RepoListHooksNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_list_keys_parameters.go b/bots-common/gitea-generated/client/repository/repo_list_keys_parameters.go
new file mode 100644
index 0000000..7b7ff09
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_list_keys_parameters.go
@@ -0,0 +1,310 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewRepoListKeysParams creates a new RepoListKeysParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoListKeysParams() *RepoListKeysParams {
+	return &RepoListKeysParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoListKeysParamsWithTimeout creates a new RepoListKeysParams object
+// with the ability to set a timeout on a request.
+func NewRepoListKeysParamsWithTimeout(timeout time.Duration) *RepoListKeysParams {
+	return &RepoListKeysParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoListKeysParamsWithContext creates a new RepoListKeysParams object
+// with the ability to set a context for a request.
+func NewRepoListKeysParamsWithContext(ctx context.Context) *RepoListKeysParams {
+	return &RepoListKeysParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoListKeysParamsWithHTTPClient creates a new RepoListKeysParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoListKeysParamsWithHTTPClient(client *http.Client) *RepoListKeysParams {
+	return &RepoListKeysParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoListKeysParams contains all the parameters to send to the API endpoint
+
+	for the repo list keys operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoListKeysParams struct {
+
+	/* Fingerprint.
+
+	   fingerprint of the key
+	*/
+	Fingerprint *string
+
+	/* KeyID.
+
+	   the key_id to search for
+	*/
+	KeyID *int64
+
+	/* Limit.
+
+	   page size of results
+	*/
+	Limit *int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Page.
+
+	   page number of results to return (1-based)
+	*/
+	Page *int64
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo list keys params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoListKeysParams) WithDefaults() *RepoListKeysParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo list keys params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoListKeysParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo list keys params
+func (o *RepoListKeysParams) WithTimeout(timeout time.Duration) *RepoListKeysParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo list keys params
+func (o *RepoListKeysParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo list keys params
+func (o *RepoListKeysParams) WithContext(ctx context.Context) *RepoListKeysParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo list keys params
+func (o *RepoListKeysParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo list keys params
+func (o *RepoListKeysParams) WithHTTPClient(client *http.Client) *RepoListKeysParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo list keys params
+func (o *RepoListKeysParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithFingerprint adds the fingerprint to the repo list keys params
+func (o *RepoListKeysParams) WithFingerprint(fingerprint *string) *RepoListKeysParams {
+	o.SetFingerprint(fingerprint)
+	return o
+}
+
+// SetFingerprint adds the fingerprint to the repo list keys params
+func (o *RepoListKeysParams) SetFingerprint(fingerprint *string) {
+	o.Fingerprint = fingerprint
+}
+
+// WithKeyID adds the keyID to the repo list keys params
+func (o *RepoListKeysParams) WithKeyID(keyID *int64) *RepoListKeysParams {
+	o.SetKeyID(keyID)
+	return o
+}
+
+// SetKeyID adds the keyId to the repo list keys params
+func (o *RepoListKeysParams) SetKeyID(keyID *int64) {
+	o.KeyID = keyID
+}
+
+// WithLimit adds the limit to the repo list keys params
+func (o *RepoListKeysParams) WithLimit(limit *int64) *RepoListKeysParams {
+	o.SetLimit(limit)
+	return o
+}
+
+// SetLimit adds the limit to the repo list keys params
+func (o *RepoListKeysParams) SetLimit(limit *int64) {
+	o.Limit = limit
+}
+
+// WithOwner adds the owner to the repo list keys params
+func (o *RepoListKeysParams) WithOwner(owner string) *RepoListKeysParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo list keys params
+func (o *RepoListKeysParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithPage adds the page to the repo list keys params
+func (o *RepoListKeysParams) WithPage(page *int64) *RepoListKeysParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the repo list keys params
+func (o *RepoListKeysParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WithRepo adds the repo to the repo list keys params
+func (o *RepoListKeysParams) WithRepo(repo string) *RepoListKeysParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo list keys params
+func (o *RepoListKeysParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoListKeysParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.Fingerprint != nil {
+
+		// query param fingerprint
+		var qrFingerprint string
+
+		if o.Fingerprint != nil {
+			qrFingerprint = *o.Fingerprint
+		}
+		qFingerprint := qrFingerprint
+		if qFingerprint != "" {
+
+			if err := r.SetQueryParam("fingerprint", qFingerprint); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.KeyID != nil {
+
+		// query param key_id
+		var qrKeyID int64
+
+		if o.KeyID != nil {
+			qrKeyID = *o.KeyID
+		}
+		qKeyID := swag.FormatInt64(qrKeyID)
+		if qKeyID != "" {
+
+			if err := r.SetQueryParam("key_id", qKeyID); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Limit != nil {
+
+		// query param limit
+		var qrLimit int64
+
+		if o.Limit != nil {
+			qrLimit = *o.Limit
+		}
+		qLimit := swag.FormatInt64(qrLimit)
+		if qLimit != "" {
+
+			if err := r.SetQueryParam("limit", qLimit); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_list_keys_responses.go b/bots-common/gitea-generated/client/repository/repo_list_keys_responses.go
new file mode 100644
index 0000000..12eb2f9
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_list_keys_responses.go
@@ -0,0 +1,166 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoListKeysReader is a Reader for the RepoListKeys structure.
+type RepoListKeysReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoListKeysReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoListKeysOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoListKeysNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/keys] repoListKeys", response, response.Code())
+	}
+}
+
+// NewRepoListKeysOK creates a RepoListKeysOK with default headers values
+func NewRepoListKeysOK() *RepoListKeysOK {
+	return &RepoListKeysOK{}
+}
+
+/*
+RepoListKeysOK describes a response with status code 200, with default header values.
+
+DeployKeyList
+*/
+type RepoListKeysOK struct {
+	Payload []*models.DeployKey
+}
+
+// IsSuccess returns true when this repo list keys o k response has a 2xx status code
+func (o *RepoListKeysOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo list keys o k response has a 3xx status code
+func (o *RepoListKeysOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo list keys o k response has a 4xx status code
+func (o *RepoListKeysOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo list keys o k response has a 5xx status code
+func (o *RepoListKeysOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo list keys o k response a status code equal to that given
+func (o *RepoListKeysOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo list keys o k response
+func (o *RepoListKeysOK) Code() int {
+	return 200
+}
+
+func (o *RepoListKeysOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/keys][%d] repoListKeysOK %s", 200, payload)
+}
+
+func (o *RepoListKeysOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/keys][%d] repoListKeysOK %s", 200, payload)
+}
+
+func (o *RepoListKeysOK) GetPayload() []*models.DeployKey {
+	return o.Payload
+}
+
+func (o *RepoListKeysOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoListKeysNotFound creates a RepoListKeysNotFound with default headers values
+func NewRepoListKeysNotFound() *RepoListKeysNotFound {
+	return &RepoListKeysNotFound{}
+}
+
+/*
+RepoListKeysNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoListKeysNotFound struct {
+}
+
+// IsSuccess returns true when this repo list keys not found response has a 2xx status code
+func (o *RepoListKeysNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo list keys not found response has a 3xx status code
+func (o *RepoListKeysNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo list keys not found response has a 4xx status code
+func (o *RepoListKeysNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo list keys not found response has a 5xx status code
+func (o *RepoListKeysNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo list keys not found response a status code equal to that given
+func (o *RepoListKeysNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo list keys not found response
+func (o *RepoListKeysNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoListKeysNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/keys][%d] repoListKeysNotFound", 404)
+}
+
+func (o *RepoListKeysNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/keys][%d] repoListKeysNotFound", 404)
+}
+
+func (o *RepoListKeysNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_list_pinned_issues_parameters.go b/bots-common/gitea-generated/client/repository/repo_list_pinned_issues_parameters.go
new file mode 100644
index 0000000..e7d90f6
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_list_pinned_issues_parameters.go
@@ -0,0 +1,173 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewRepoListPinnedIssuesParams creates a new RepoListPinnedIssuesParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoListPinnedIssuesParams() *RepoListPinnedIssuesParams {
+	return &RepoListPinnedIssuesParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoListPinnedIssuesParamsWithTimeout creates a new RepoListPinnedIssuesParams object
+// with the ability to set a timeout on a request.
+func NewRepoListPinnedIssuesParamsWithTimeout(timeout time.Duration) *RepoListPinnedIssuesParams {
+	return &RepoListPinnedIssuesParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoListPinnedIssuesParamsWithContext creates a new RepoListPinnedIssuesParams object
+// with the ability to set a context for a request.
+func NewRepoListPinnedIssuesParamsWithContext(ctx context.Context) *RepoListPinnedIssuesParams {
+	return &RepoListPinnedIssuesParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoListPinnedIssuesParamsWithHTTPClient creates a new RepoListPinnedIssuesParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoListPinnedIssuesParamsWithHTTPClient(client *http.Client) *RepoListPinnedIssuesParams {
+	return &RepoListPinnedIssuesParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoListPinnedIssuesParams contains all the parameters to send to the API endpoint
+
+	for the repo list pinned issues operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoListPinnedIssuesParams struct {
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo list pinned issues params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoListPinnedIssuesParams) WithDefaults() *RepoListPinnedIssuesParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo list pinned issues params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoListPinnedIssuesParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo list pinned issues params
+func (o *RepoListPinnedIssuesParams) WithTimeout(timeout time.Duration) *RepoListPinnedIssuesParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo list pinned issues params
+func (o *RepoListPinnedIssuesParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo list pinned issues params
+func (o *RepoListPinnedIssuesParams) WithContext(ctx context.Context) *RepoListPinnedIssuesParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo list pinned issues params
+func (o *RepoListPinnedIssuesParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo list pinned issues params
+func (o *RepoListPinnedIssuesParams) WithHTTPClient(client *http.Client) *RepoListPinnedIssuesParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo list pinned issues params
+func (o *RepoListPinnedIssuesParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithOwner adds the owner to the repo list pinned issues params
+func (o *RepoListPinnedIssuesParams) WithOwner(owner string) *RepoListPinnedIssuesParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo list pinned issues params
+func (o *RepoListPinnedIssuesParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo list pinned issues params
+func (o *RepoListPinnedIssuesParams) WithRepo(repo string) *RepoListPinnedIssuesParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo list pinned issues params
+func (o *RepoListPinnedIssuesParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoListPinnedIssuesParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_list_pinned_issues_responses.go b/bots-common/gitea-generated/client/repository/repo_list_pinned_issues_responses.go
new file mode 100644
index 0000000..a0463ed
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_list_pinned_issues_responses.go
@@ -0,0 +1,166 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoListPinnedIssuesReader is a Reader for the RepoListPinnedIssues structure.
+type RepoListPinnedIssuesReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoListPinnedIssuesReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoListPinnedIssuesOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoListPinnedIssuesNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/issues/pinned] repoListPinnedIssues", response, response.Code())
+	}
+}
+
+// NewRepoListPinnedIssuesOK creates a RepoListPinnedIssuesOK with default headers values
+func NewRepoListPinnedIssuesOK() *RepoListPinnedIssuesOK {
+	return &RepoListPinnedIssuesOK{}
+}
+
+/*
+RepoListPinnedIssuesOK describes a response with status code 200, with default header values.
+
+IssueList
+*/
+type RepoListPinnedIssuesOK struct {
+	Payload []*models.Issue
+}
+
+// IsSuccess returns true when this repo list pinned issues o k response has a 2xx status code
+func (o *RepoListPinnedIssuesOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo list pinned issues o k response has a 3xx status code
+func (o *RepoListPinnedIssuesOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo list pinned issues o k response has a 4xx status code
+func (o *RepoListPinnedIssuesOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo list pinned issues o k response has a 5xx status code
+func (o *RepoListPinnedIssuesOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo list pinned issues o k response a status code equal to that given
+func (o *RepoListPinnedIssuesOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo list pinned issues o k response
+func (o *RepoListPinnedIssuesOK) Code() int {
+	return 200
+}
+
+func (o *RepoListPinnedIssuesOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issues/pinned][%d] repoListPinnedIssuesOK %s", 200, payload)
+}
+
+func (o *RepoListPinnedIssuesOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issues/pinned][%d] repoListPinnedIssuesOK %s", 200, payload)
+}
+
+func (o *RepoListPinnedIssuesOK) GetPayload() []*models.Issue {
+	return o.Payload
+}
+
+func (o *RepoListPinnedIssuesOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoListPinnedIssuesNotFound creates a RepoListPinnedIssuesNotFound with default headers values
+func NewRepoListPinnedIssuesNotFound() *RepoListPinnedIssuesNotFound {
+	return &RepoListPinnedIssuesNotFound{}
+}
+
+/*
+RepoListPinnedIssuesNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoListPinnedIssuesNotFound struct {
+}
+
+// IsSuccess returns true when this repo list pinned issues not found response has a 2xx status code
+func (o *RepoListPinnedIssuesNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo list pinned issues not found response has a 3xx status code
+func (o *RepoListPinnedIssuesNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo list pinned issues not found response has a 4xx status code
+func (o *RepoListPinnedIssuesNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo list pinned issues not found response has a 5xx status code
+func (o *RepoListPinnedIssuesNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo list pinned issues not found response a status code equal to that given
+func (o *RepoListPinnedIssuesNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo list pinned issues not found response
+func (o *RepoListPinnedIssuesNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoListPinnedIssuesNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issues/pinned][%d] repoListPinnedIssuesNotFound", 404)
+}
+
+func (o *RepoListPinnedIssuesNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issues/pinned][%d] repoListPinnedIssuesNotFound", 404)
+}
+
+func (o *RepoListPinnedIssuesNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_list_pinned_pull_requests_parameters.go b/bots-common/gitea-generated/client/repository/repo_list_pinned_pull_requests_parameters.go
new file mode 100644
index 0000000..e8beae4
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_list_pinned_pull_requests_parameters.go
@@ -0,0 +1,173 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewRepoListPinnedPullRequestsParams creates a new RepoListPinnedPullRequestsParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoListPinnedPullRequestsParams() *RepoListPinnedPullRequestsParams {
+	return &RepoListPinnedPullRequestsParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoListPinnedPullRequestsParamsWithTimeout creates a new RepoListPinnedPullRequestsParams object
+// with the ability to set a timeout on a request.
+func NewRepoListPinnedPullRequestsParamsWithTimeout(timeout time.Duration) *RepoListPinnedPullRequestsParams {
+	return &RepoListPinnedPullRequestsParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoListPinnedPullRequestsParamsWithContext creates a new RepoListPinnedPullRequestsParams object
+// with the ability to set a context for a request.
+func NewRepoListPinnedPullRequestsParamsWithContext(ctx context.Context) *RepoListPinnedPullRequestsParams {
+	return &RepoListPinnedPullRequestsParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoListPinnedPullRequestsParamsWithHTTPClient creates a new RepoListPinnedPullRequestsParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoListPinnedPullRequestsParamsWithHTTPClient(client *http.Client) *RepoListPinnedPullRequestsParams {
+	return &RepoListPinnedPullRequestsParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoListPinnedPullRequestsParams contains all the parameters to send to the API endpoint
+
+	for the repo list pinned pull requests operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoListPinnedPullRequestsParams struct {
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo list pinned pull requests params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoListPinnedPullRequestsParams) WithDefaults() *RepoListPinnedPullRequestsParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo list pinned pull requests params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoListPinnedPullRequestsParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo list pinned pull requests params
+func (o *RepoListPinnedPullRequestsParams) WithTimeout(timeout time.Duration) *RepoListPinnedPullRequestsParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo list pinned pull requests params
+func (o *RepoListPinnedPullRequestsParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo list pinned pull requests params
+func (o *RepoListPinnedPullRequestsParams) WithContext(ctx context.Context) *RepoListPinnedPullRequestsParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo list pinned pull requests params
+func (o *RepoListPinnedPullRequestsParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo list pinned pull requests params
+func (o *RepoListPinnedPullRequestsParams) WithHTTPClient(client *http.Client) *RepoListPinnedPullRequestsParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo list pinned pull requests params
+func (o *RepoListPinnedPullRequestsParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithOwner adds the owner to the repo list pinned pull requests params
+func (o *RepoListPinnedPullRequestsParams) WithOwner(owner string) *RepoListPinnedPullRequestsParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo list pinned pull requests params
+func (o *RepoListPinnedPullRequestsParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo list pinned pull requests params
+func (o *RepoListPinnedPullRequestsParams) WithRepo(repo string) *RepoListPinnedPullRequestsParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo list pinned pull requests params
+func (o *RepoListPinnedPullRequestsParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoListPinnedPullRequestsParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_list_pinned_pull_requests_responses.go b/bots-common/gitea-generated/client/repository/repo_list_pinned_pull_requests_responses.go
new file mode 100644
index 0000000..136af64
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_list_pinned_pull_requests_responses.go
@@ -0,0 +1,166 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoListPinnedPullRequestsReader is a Reader for the RepoListPinnedPullRequests structure.
+type RepoListPinnedPullRequestsReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoListPinnedPullRequestsReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoListPinnedPullRequestsOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoListPinnedPullRequestsNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/pulls/pinned] repoListPinnedPullRequests", response, response.Code())
+	}
+}
+
+// NewRepoListPinnedPullRequestsOK creates a RepoListPinnedPullRequestsOK with default headers values
+func NewRepoListPinnedPullRequestsOK() *RepoListPinnedPullRequestsOK {
+	return &RepoListPinnedPullRequestsOK{}
+}
+
+/*
+RepoListPinnedPullRequestsOK describes a response with status code 200, with default header values.
+
+PullRequestList
+*/
+type RepoListPinnedPullRequestsOK struct {
+	Payload []*models.PullRequest
+}
+
+// IsSuccess returns true when this repo list pinned pull requests o k response has a 2xx status code
+func (o *RepoListPinnedPullRequestsOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo list pinned pull requests o k response has a 3xx status code
+func (o *RepoListPinnedPullRequestsOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo list pinned pull requests o k response has a 4xx status code
+func (o *RepoListPinnedPullRequestsOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo list pinned pull requests o k response has a 5xx status code
+func (o *RepoListPinnedPullRequestsOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo list pinned pull requests o k response a status code equal to that given
+func (o *RepoListPinnedPullRequestsOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo list pinned pull requests o k response
+func (o *RepoListPinnedPullRequestsOK) Code() int {
+	return 200
+}
+
+func (o *RepoListPinnedPullRequestsOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/pulls/pinned][%d] repoListPinnedPullRequestsOK %s", 200, payload)
+}
+
+func (o *RepoListPinnedPullRequestsOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/pulls/pinned][%d] repoListPinnedPullRequestsOK %s", 200, payload)
+}
+
+func (o *RepoListPinnedPullRequestsOK) GetPayload() []*models.PullRequest {
+	return o.Payload
+}
+
+func (o *RepoListPinnedPullRequestsOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoListPinnedPullRequestsNotFound creates a RepoListPinnedPullRequestsNotFound with default headers values
+func NewRepoListPinnedPullRequestsNotFound() *RepoListPinnedPullRequestsNotFound {
+	return &RepoListPinnedPullRequestsNotFound{}
+}
+
+/*
+RepoListPinnedPullRequestsNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoListPinnedPullRequestsNotFound struct {
+}
+
+// IsSuccess returns true when this repo list pinned pull requests not found response has a 2xx status code
+func (o *RepoListPinnedPullRequestsNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo list pinned pull requests not found response has a 3xx status code
+func (o *RepoListPinnedPullRequestsNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo list pinned pull requests not found response has a 4xx status code
+func (o *RepoListPinnedPullRequestsNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo list pinned pull requests not found response has a 5xx status code
+func (o *RepoListPinnedPullRequestsNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo list pinned pull requests not found response a status code equal to that given
+func (o *RepoListPinnedPullRequestsNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo list pinned pull requests not found response
+func (o *RepoListPinnedPullRequestsNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoListPinnedPullRequestsNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/pulls/pinned][%d] repoListPinnedPullRequestsNotFound", 404)
+}
+
+func (o *RepoListPinnedPullRequestsNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/pulls/pinned][%d] repoListPinnedPullRequestsNotFound", 404)
+}
+
+func (o *RepoListPinnedPullRequestsNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_list_pull_requests_parameters.go b/bots-common/gitea-generated/client/repository/repo_list_pull_requests_parameters.go
new file mode 100644
index 0000000..8b6aac0
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_list_pull_requests_parameters.go
@@ -0,0 +1,391 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewRepoListPullRequestsParams creates a new RepoListPullRequestsParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoListPullRequestsParams() *RepoListPullRequestsParams {
+	return &RepoListPullRequestsParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoListPullRequestsParamsWithTimeout creates a new RepoListPullRequestsParams object
+// with the ability to set a timeout on a request.
+func NewRepoListPullRequestsParamsWithTimeout(timeout time.Duration) *RepoListPullRequestsParams {
+	return &RepoListPullRequestsParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoListPullRequestsParamsWithContext creates a new RepoListPullRequestsParams object
+// with the ability to set a context for a request.
+func NewRepoListPullRequestsParamsWithContext(ctx context.Context) *RepoListPullRequestsParams {
+	return &RepoListPullRequestsParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoListPullRequestsParamsWithHTTPClient creates a new RepoListPullRequestsParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoListPullRequestsParamsWithHTTPClient(client *http.Client) *RepoListPullRequestsParams {
+	return &RepoListPullRequestsParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoListPullRequestsParams contains all the parameters to send to the API endpoint
+
+	for the repo list pull requests operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoListPullRequestsParams struct {
+
+	/* Labels.
+
+	   Label IDs
+	*/
+	Labels []int64
+
+	/* Limit.
+
+	   page size of results
+	*/
+	Limit *int64
+
+	/* Milestone.
+
+	   ID of the milestone
+
+	   Format: int64
+	*/
+	Milestone *int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Page.
+
+	   page number of results to return (1-based)
+	*/
+	Page *int64
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	/* Sort.
+
+	   Type of sort
+	*/
+	Sort *string
+
+	/* State.
+
+	   State of pull request: open or closed (optional)
+	*/
+	State *string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo list pull requests params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoListPullRequestsParams) WithDefaults() *RepoListPullRequestsParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo list pull requests params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoListPullRequestsParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo list pull requests params
+func (o *RepoListPullRequestsParams) WithTimeout(timeout time.Duration) *RepoListPullRequestsParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo list pull requests params
+func (o *RepoListPullRequestsParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo list pull requests params
+func (o *RepoListPullRequestsParams) WithContext(ctx context.Context) *RepoListPullRequestsParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo list pull requests params
+func (o *RepoListPullRequestsParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo list pull requests params
+func (o *RepoListPullRequestsParams) WithHTTPClient(client *http.Client) *RepoListPullRequestsParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo list pull requests params
+func (o *RepoListPullRequestsParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithLabels adds the labels to the repo list pull requests params
+func (o *RepoListPullRequestsParams) WithLabels(labels []int64) *RepoListPullRequestsParams {
+	o.SetLabels(labels)
+	return o
+}
+
+// SetLabels adds the labels to the repo list pull requests params
+func (o *RepoListPullRequestsParams) SetLabels(labels []int64) {
+	o.Labels = labels
+}
+
+// WithLimit adds the limit to the repo list pull requests params
+func (o *RepoListPullRequestsParams) WithLimit(limit *int64) *RepoListPullRequestsParams {
+	o.SetLimit(limit)
+	return o
+}
+
+// SetLimit adds the limit to the repo list pull requests params
+func (o *RepoListPullRequestsParams) SetLimit(limit *int64) {
+	o.Limit = limit
+}
+
+// WithMilestone adds the milestone to the repo list pull requests params
+func (o *RepoListPullRequestsParams) WithMilestone(milestone *int64) *RepoListPullRequestsParams {
+	o.SetMilestone(milestone)
+	return o
+}
+
+// SetMilestone adds the milestone to the repo list pull requests params
+func (o *RepoListPullRequestsParams) SetMilestone(milestone *int64) {
+	o.Milestone = milestone
+}
+
+// WithOwner adds the owner to the repo list pull requests params
+func (o *RepoListPullRequestsParams) WithOwner(owner string) *RepoListPullRequestsParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo list pull requests params
+func (o *RepoListPullRequestsParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithPage adds the page to the repo list pull requests params
+func (o *RepoListPullRequestsParams) WithPage(page *int64) *RepoListPullRequestsParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the repo list pull requests params
+func (o *RepoListPullRequestsParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WithRepo adds the repo to the repo list pull requests params
+func (o *RepoListPullRequestsParams) WithRepo(repo string) *RepoListPullRequestsParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo list pull requests params
+func (o *RepoListPullRequestsParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WithSort adds the sort to the repo list pull requests params
+func (o *RepoListPullRequestsParams) WithSort(sort *string) *RepoListPullRequestsParams {
+	o.SetSort(sort)
+	return o
+}
+
+// SetSort adds the sort to the repo list pull requests params
+func (o *RepoListPullRequestsParams) SetSort(sort *string) {
+	o.Sort = sort
+}
+
+// WithState adds the state to the repo list pull requests params
+func (o *RepoListPullRequestsParams) WithState(state *string) *RepoListPullRequestsParams {
+	o.SetState(state)
+	return o
+}
+
+// SetState adds the state to the repo list pull requests params
+func (o *RepoListPullRequestsParams) SetState(state *string) {
+	o.State = state
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoListPullRequestsParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.Labels != nil {
+
+		// binding items for labels
+		joinedLabels := o.bindParamLabels(reg)
+
+		// query array param labels
+		if err := r.SetQueryParam("labels", joinedLabels...); err != nil {
+			return err
+		}
+	}
+
+	if o.Limit != nil {
+
+		// query param limit
+		var qrLimit int64
+
+		if o.Limit != nil {
+			qrLimit = *o.Limit
+		}
+		qLimit := swag.FormatInt64(qrLimit)
+		if qLimit != "" {
+
+			if err := r.SetQueryParam("limit", qLimit); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Milestone != nil {
+
+		// query param milestone
+		var qrMilestone int64
+
+		if o.Milestone != nil {
+			qrMilestone = *o.Milestone
+		}
+		qMilestone := swag.FormatInt64(qrMilestone)
+		if qMilestone != "" {
+
+			if err := r.SetQueryParam("milestone", qMilestone); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if o.Sort != nil {
+
+		// query param sort
+		var qrSort string
+
+		if o.Sort != nil {
+			qrSort = *o.Sort
+		}
+		qSort := qrSort
+		if qSort != "" {
+
+			if err := r.SetQueryParam("sort", qSort); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.State != nil {
+
+		// query param state
+		var qrState string
+
+		if o.State != nil {
+			qrState = *o.State
+		}
+		qState := qrState
+		if qState != "" {
+
+			if err := r.SetQueryParam("state", qState); err != nil {
+				return err
+			}
+		}
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+// bindParamRepoListPullRequests binds the parameter labels
+func (o *RepoListPullRequestsParams) bindParamLabels(formats strfmt.Registry) []string {
+	labelsIR := o.Labels
+
+	var labelsIC []string
+	for _, labelsIIR := range labelsIR { // explode []int64
+
+		labelsIIV := swag.FormatInt64(labelsIIR) // int64 as string
+		labelsIC = append(labelsIC, labelsIIV)
+	}
+
+	// items.CollectionFormat: "multi"
+	labelsIS := swag.JoinByFormat(labelsIC, "multi")
+
+	return labelsIS
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_list_pull_requests_responses.go b/bots-common/gitea-generated/client/repository/repo_list_pull_requests_responses.go
new file mode 100644
index 0000000..d9caa11
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_list_pull_requests_responses.go
@@ -0,0 +1,166 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoListPullRequestsReader is a Reader for the RepoListPullRequests structure.
+type RepoListPullRequestsReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoListPullRequestsReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoListPullRequestsOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoListPullRequestsNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/pulls] repoListPullRequests", response, response.Code())
+	}
+}
+
+// NewRepoListPullRequestsOK creates a RepoListPullRequestsOK with default headers values
+func NewRepoListPullRequestsOK() *RepoListPullRequestsOK {
+	return &RepoListPullRequestsOK{}
+}
+
+/*
+RepoListPullRequestsOK describes a response with status code 200, with default header values.
+
+PullRequestList
+*/
+type RepoListPullRequestsOK struct {
+	Payload []*models.PullRequest
+}
+
+// IsSuccess returns true when this repo list pull requests o k response has a 2xx status code
+func (o *RepoListPullRequestsOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo list pull requests o k response has a 3xx status code
+func (o *RepoListPullRequestsOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo list pull requests o k response has a 4xx status code
+func (o *RepoListPullRequestsOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo list pull requests o k response has a 5xx status code
+func (o *RepoListPullRequestsOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo list pull requests o k response a status code equal to that given
+func (o *RepoListPullRequestsOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo list pull requests o k response
+func (o *RepoListPullRequestsOK) Code() int {
+	return 200
+}
+
+func (o *RepoListPullRequestsOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/pulls][%d] repoListPullRequestsOK %s", 200, payload)
+}
+
+func (o *RepoListPullRequestsOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/pulls][%d] repoListPullRequestsOK %s", 200, payload)
+}
+
+func (o *RepoListPullRequestsOK) GetPayload() []*models.PullRequest {
+	return o.Payload
+}
+
+func (o *RepoListPullRequestsOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoListPullRequestsNotFound creates a RepoListPullRequestsNotFound with default headers values
+func NewRepoListPullRequestsNotFound() *RepoListPullRequestsNotFound {
+	return &RepoListPullRequestsNotFound{}
+}
+
+/*
+RepoListPullRequestsNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoListPullRequestsNotFound struct {
+}
+
+// IsSuccess returns true when this repo list pull requests not found response has a 2xx status code
+func (o *RepoListPullRequestsNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo list pull requests not found response has a 3xx status code
+func (o *RepoListPullRequestsNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo list pull requests not found response has a 4xx status code
+func (o *RepoListPullRequestsNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo list pull requests not found response has a 5xx status code
+func (o *RepoListPullRequestsNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo list pull requests not found response a status code equal to that given
+func (o *RepoListPullRequestsNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo list pull requests not found response
+func (o *RepoListPullRequestsNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoListPullRequestsNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/pulls][%d] repoListPullRequestsNotFound", 404)
+}
+
+func (o *RepoListPullRequestsNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/pulls][%d] repoListPullRequestsNotFound", 404)
+}
+
+func (o *RepoListPullRequestsNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_list_pull_reviews_parameters.go b/bots-common/gitea-generated/client/repository/repo_list_pull_reviews_parameters.go
new file mode 100644
index 0000000..f62ac6d
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_list_pull_reviews_parameters.go
@@ -0,0 +1,266 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewRepoListPullReviewsParams creates a new RepoListPullReviewsParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoListPullReviewsParams() *RepoListPullReviewsParams {
+	return &RepoListPullReviewsParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoListPullReviewsParamsWithTimeout creates a new RepoListPullReviewsParams object
+// with the ability to set a timeout on a request.
+func NewRepoListPullReviewsParamsWithTimeout(timeout time.Duration) *RepoListPullReviewsParams {
+	return &RepoListPullReviewsParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoListPullReviewsParamsWithContext creates a new RepoListPullReviewsParams object
+// with the ability to set a context for a request.
+func NewRepoListPullReviewsParamsWithContext(ctx context.Context) *RepoListPullReviewsParams {
+	return &RepoListPullReviewsParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoListPullReviewsParamsWithHTTPClient creates a new RepoListPullReviewsParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoListPullReviewsParamsWithHTTPClient(client *http.Client) *RepoListPullReviewsParams {
+	return &RepoListPullReviewsParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoListPullReviewsParams contains all the parameters to send to the API endpoint
+
+	for the repo list pull reviews operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoListPullReviewsParams struct {
+
+	/* Index.
+
+	   index of the pull request
+
+	   Format: int64
+	*/
+	Index int64
+
+	/* Limit.
+
+	   page size of results
+	*/
+	Limit *int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Page.
+
+	   page number of results to return (1-based)
+	*/
+	Page *int64
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo list pull reviews params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoListPullReviewsParams) WithDefaults() *RepoListPullReviewsParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo list pull reviews params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoListPullReviewsParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo list pull reviews params
+func (o *RepoListPullReviewsParams) WithTimeout(timeout time.Duration) *RepoListPullReviewsParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo list pull reviews params
+func (o *RepoListPullReviewsParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo list pull reviews params
+func (o *RepoListPullReviewsParams) WithContext(ctx context.Context) *RepoListPullReviewsParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo list pull reviews params
+func (o *RepoListPullReviewsParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo list pull reviews params
+func (o *RepoListPullReviewsParams) WithHTTPClient(client *http.Client) *RepoListPullReviewsParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo list pull reviews params
+func (o *RepoListPullReviewsParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithIndex adds the index to the repo list pull reviews params
+func (o *RepoListPullReviewsParams) WithIndex(index int64) *RepoListPullReviewsParams {
+	o.SetIndex(index)
+	return o
+}
+
+// SetIndex adds the index to the repo list pull reviews params
+func (o *RepoListPullReviewsParams) SetIndex(index int64) {
+	o.Index = index
+}
+
+// WithLimit adds the limit to the repo list pull reviews params
+func (o *RepoListPullReviewsParams) WithLimit(limit *int64) *RepoListPullReviewsParams {
+	o.SetLimit(limit)
+	return o
+}
+
+// SetLimit adds the limit to the repo list pull reviews params
+func (o *RepoListPullReviewsParams) SetLimit(limit *int64) {
+	o.Limit = limit
+}
+
+// WithOwner adds the owner to the repo list pull reviews params
+func (o *RepoListPullReviewsParams) WithOwner(owner string) *RepoListPullReviewsParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo list pull reviews params
+func (o *RepoListPullReviewsParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithPage adds the page to the repo list pull reviews params
+func (o *RepoListPullReviewsParams) WithPage(page *int64) *RepoListPullReviewsParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the repo list pull reviews params
+func (o *RepoListPullReviewsParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WithRepo adds the repo to the repo list pull reviews params
+func (o *RepoListPullReviewsParams) WithRepo(repo string) *RepoListPullReviewsParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo list pull reviews params
+func (o *RepoListPullReviewsParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoListPullReviewsParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param index
+	if err := r.SetPathParam("index", swag.FormatInt64(o.Index)); err != nil {
+		return err
+	}
+
+	if o.Limit != nil {
+
+		// query param limit
+		var qrLimit int64
+
+		if o.Limit != nil {
+			qrLimit = *o.Limit
+		}
+		qLimit := swag.FormatInt64(qrLimit)
+		if qLimit != "" {
+
+			if err := r.SetQueryParam("limit", qLimit); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_list_pull_reviews_responses.go b/bots-common/gitea-generated/client/repository/repo_list_pull_reviews_responses.go
new file mode 100644
index 0000000..ca9c8df
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_list_pull_reviews_responses.go
@@ -0,0 +1,166 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoListPullReviewsReader is a Reader for the RepoListPullReviews structure.
+type RepoListPullReviewsReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoListPullReviewsReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoListPullReviewsOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoListPullReviewsNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/pulls/{index}/reviews] repoListPullReviews", response, response.Code())
+	}
+}
+
+// NewRepoListPullReviewsOK creates a RepoListPullReviewsOK with default headers values
+func NewRepoListPullReviewsOK() *RepoListPullReviewsOK {
+	return &RepoListPullReviewsOK{}
+}
+
+/*
+RepoListPullReviewsOK describes a response with status code 200, with default header values.
+
+PullReviewList
+*/
+type RepoListPullReviewsOK struct {
+	Payload []*models.PullReview
+}
+
+// IsSuccess returns true when this repo list pull reviews o k response has a 2xx status code
+func (o *RepoListPullReviewsOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo list pull reviews o k response has a 3xx status code
+func (o *RepoListPullReviewsOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo list pull reviews o k response has a 4xx status code
+func (o *RepoListPullReviewsOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo list pull reviews o k response has a 5xx status code
+func (o *RepoListPullReviewsOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo list pull reviews o k response a status code equal to that given
+func (o *RepoListPullReviewsOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo list pull reviews o k response
+func (o *RepoListPullReviewsOK) Code() int {
+	return 200
+}
+
+func (o *RepoListPullReviewsOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/pulls/{index}/reviews][%d] repoListPullReviewsOK %s", 200, payload)
+}
+
+func (o *RepoListPullReviewsOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/pulls/{index}/reviews][%d] repoListPullReviewsOK %s", 200, payload)
+}
+
+func (o *RepoListPullReviewsOK) GetPayload() []*models.PullReview {
+	return o.Payload
+}
+
+func (o *RepoListPullReviewsOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoListPullReviewsNotFound creates a RepoListPullReviewsNotFound with default headers values
+func NewRepoListPullReviewsNotFound() *RepoListPullReviewsNotFound {
+	return &RepoListPullReviewsNotFound{}
+}
+
+/*
+RepoListPullReviewsNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoListPullReviewsNotFound struct {
+}
+
+// IsSuccess returns true when this repo list pull reviews not found response has a 2xx status code
+func (o *RepoListPullReviewsNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo list pull reviews not found response has a 3xx status code
+func (o *RepoListPullReviewsNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo list pull reviews not found response has a 4xx status code
+func (o *RepoListPullReviewsNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo list pull reviews not found response has a 5xx status code
+func (o *RepoListPullReviewsNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo list pull reviews not found response a status code equal to that given
+func (o *RepoListPullReviewsNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo list pull reviews not found response
+func (o *RepoListPullReviewsNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoListPullReviewsNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/pulls/{index}/reviews][%d] repoListPullReviewsNotFound", 404)
+}
+
+func (o *RepoListPullReviewsNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/pulls/{index}/reviews][%d] repoListPullReviewsNotFound", 404)
+}
+
+func (o *RepoListPullReviewsNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_list_push_mirrors_parameters.go b/bots-common/gitea-generated/client/repository/repo_list_push_mirrors_parameters.go
new file mode 100644
index 0000000..81698d7
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_list_push_mirrors_parameters.go
@@ -0,0 +1,242 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewRepoListPushMirrorsParams creates a new RepoListPushMirrorsParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoListPushMirrorsParams() *RepoListPushMirrorsParams {
+	return &RepoListPushMirrorsParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoListPushMirrorsParamsWithTimeout creates a new RepoListPushMirrorsParams object
+// with the ability to set a timeout on a request.
+func NewRepoListPushMirrorsParamsWithTimeout(timeout time.Duration) *RepoListPushMirrorsParams {
+	return &RepoListPushMirrorsParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoListPushMirrorsParamsWithContext creates a new RepoListPushMirrorsParams object
+// with the ability to set a context for a request.
+func NewRepoListPushMirrorsParamsWithContext(ctx context.Context) *RepoListPushMirrorsParams {
+	return &RepoListPushMirrorsParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoListPushMirrorsParamsWithHTTPClient creates a new RepoListPushMirrorsParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoListPushMirrorsParamsWithHTTPClient(client *http.Client) *RepoListPushMirrorsParams {
+	return &RepoListPushMirrorsParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoListPushMirrorsParams contains all the parameters to send to the API endpoint
+
+	for the repo list push mirrors operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoListPushMirrorsParams struct {
+
+	/* Limit.
+
+	   page size of results
+	*/
+	Limit *int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Page.
+
+	   page number of results to return (1-based)
+	*/
+	Page *int64
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo list push mirrors params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoListPushMirrorsParams) WithDefaults() *RepoListPushMirrorsParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo list push mirrors params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoListPushMirrorsParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo list push mirrors params
+func (o *RepoListPushMirrorsParams) WithTimeout(timeout time.Duration) *RepoListPushMirrorsParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo list push mirrors params
+func (o *RepoListPushMirrorsParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo list push mirrors params
+func (o *RepoListPushMirrorsParams) WithContext(ctx context.Context) *RepoListPushMirrorsParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo list push mirrors params
+func (o *RepoListPushMirrorsParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo list push mirrors params
+func (o *RepoListPushMirrorsParams) WithHTTPClient(client *http.Client) *RepoListPushMirrorsParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo list push mirrors params
+func (o *RepoListPushMirrorsParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithLimit adds the limit to the repo list push mirrors params
+func (o *RepoListPushMirrorsParams) WithLimit(limit *int64) *RepoListPushMirrorsParams {
+	o.SetLimit(limit)
+	return o
+}
+
+// SetLimit adds the limit to the repo list push mirrors params
+func (o *RepoListPushMirrorsParams) SetLimit(limit *int64) {
+	o.Limit = limit
+}
+
+// WithOwner adds the owner to the repo list push mirrors params
+func (o *RepoListPushMirrorsParams) WithOwner(owner string) *RepoListPushMirrorsParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo list push mirrors params
+func (o *RepoListPushMirrorsParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithPage adds the page to the repo list push mirrors params
+func (o *RepoListPushMirrorsParams) WithPage(page *int64) *RepoListPushMirrorsParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the repo list push mirrors params
+func (o *RepoListPushMirrorsParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WithRepo adds the repo to the repo list push mirrors params
+func (o *RepoListPushMirrorsParams) WithRepo(repo string) *RepoListPushMirrorsParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo list push mirrors params
+func (o *RepoListPushMirrorsParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoListPushMirrorsParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.Limit != nil {
+
+		// query param limit
+		var qrLimit int64
+
+		if o.Limit != nil {
+			qrLimit = *o.Limit
+		}
+		qLimit := swag.FormatInt64(qrLimit)
+		if qLimit != "" {
+
+			if err := r.SetQueryParam("limit", qLimit); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_list_push_mirrors_responses.go b/bots-common/gitea-generated/client/repository/repo_list_push_mirrors_responses.go
new file mode 100644
index 0000000..af22954
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_list_push_mirrors_responses.go
@@ -0,0 +1,322 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoListPushMirrorsReader is a Reader for the RepoListPushMirrors structure.
+type RepoListPushMirrorsReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoListPushMirrorsReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoListPushMirrorsOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 400:
+		result := NewRepoListPushMirrorsBadRequest()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 403:
+		result := NewRepoListPushMirrorsForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewRepoListPushMirrorsNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/push_mirrors] repoListPushMirrors", response, response.Code())
+	}
+}
+
+// NewRepoListPushMirrorsOK creates a RepoListPushMirrorsOK with default headers values
+func NewRepoListPushMirrorsOK() *RepoListPushMirrorsOK {
+	return &RepoListPushMirrorsOK{}
+}
+
+/*
+RepoListPushMirrorsOK describes a response with status code 200, with default header values.
+
+PushMirrorList
+*/
+type RepoListPushMirrorsOK struct {
+	Payload []*models.PushMirror
+}
+
+// IsSuccess returns true when this repo list push mirrors o k response has a 2xx status code
+func (o *RepoListPushMirrorsOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo list push mirrors o k response has a 3xx status code
+func (o *RepoListPushMirrorsOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo list push mirrors o k response has a 4xx status code
+func (o *RepoListPushMirrorsOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo list push mirrors o k response has a 5xx status code
+func (o *RepoListPushMirrorsOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo list push mirrors o k response a status code equal to that given
+func (o *RepoListPushMirrorsOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo list push mirrors o k response
+func (o *RepoListPushMirrorsOK) Code() int {
+	return 200
+}
+
+func (o *RepoListPushMirrorsOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/push_mirrors][%d] repoListPushMirrorsOK %s", 200, payload)
+}
+
+func (o *RepoListPushMirrorsOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/push_mirrors][%d] repoListPushMirrorsOK %s", 200, payload)
+}
+
+func (o *RepoListPushMirrorsOK) GetPayload() []*models.PushMirror {
+	return o.Payload
+}
+
+func (o *RepoListPushMirrorsOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoListPushMirrorsBadRequest creates a RepoListPushMirrorsBadRequest with default headers values
+func NewRepoListPushMirrorsBadRequest() *RepoListPushMirrorsBadRequest {
+	return &RepoListPushMirrorsBadRequest{}
+}
+
+/*
+RepoListPushMirrorsBadRequest describes a response with status code 400, with default header values.
+
+APIError is error format response
+*/
+type RepoListPushMirrorsBadRequest struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo list push mirrors bad request response has a 2xx status code
+func (o *RepoListPushMirrorsBadRequest) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo list push mirrors bad request response has a 3xx status code
+func (o *RepoListPushMirrorsBadRequest) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo list push mirrors bad request response has a 4xx status code
+func (o *RepoListPushMirrorsBadRequest) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo list push mirrors bad request response has a 5xx status code
+func (o *RepoListPushMirrorsBadRequest) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo list push mirrors bad request response a status code equal to that given
+func (o *RepoListPushMirrorsBadRequest) IsCode(code int) bool {
+	return code == 400
+}
+
+// Code gets the status code for the repo list push mirrors bad request response
+func (o *RepoListPushMirrorsBadRequest) Code() int {
+	return 400
+}
+
+func (o *RepoListPushMirrorsBadRequest) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/push_mirrors][%d] repoListPushMirrorsBadRequest", 400)
+}
+
+func (o *RepoListPushMirrorsBadRequest) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/push_mirrors][%d] repoListPushMirrorsBadRequest", 400)
+}
+
+func (o *RepoListPushMirrorsBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewRepoListPushMirrorsForbidden creates a RepoListPushMirrorsForbidden with default headers values
+func NewRepoListPushMirrorsForbidden() *RepoListPushMirrorsForbidden {
+	return &RepoListPushMirrorsForbidden{}
+}
+
+/*
+RepoListPushMirrorsForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type RepoListPushMirrorsForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo list push mirrors forbidden response has a 2xx status code
+func (o *RepoListPushMirrorsForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo list push mirrors forbidden response has a 3xx status code
+func (o *RepoListPushMirrorsForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo list push mirrors forbidden response has a 4xx status code
+func (o *RepoListPushMirrorsForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo list push mirrors forbidden response has a 5xx status code
+func (o *RepoListPushMirrorsForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo list push mirrors forbidden response a status code equal to that given
+func (o *RepoListPushMirrorsForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the repo list push mirrors forbidden response
+func (o *RepoListPushMirrorsForbidden) Code() int {
+	return 403
+}
+
+func (o *RepoListPushMirrorsForbidden) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/push_mirrors][%d] repoListPushMirrorsForbidden", 403)
+}
+
+func (o *RepoListPushMirrorsForbidden) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/push_mirrors][%d] repoListPushMirrorsForbidden", 403)
+}
+
+func (o *RepoListPushMirrorsForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewRepoListPushMirrorsNotFound creates a RepoListPushMirrorsNotFound with default headers values
+func NewRepoListPushMirrorsNotFound() *RepoListPushMirrorsNotFound {
+	return &RepoListPushMirrorsNotFound{}
+}
+
+/*
+RepoListPushMirrorsNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoListPushMirrorsNotFound struct {
+}
+
+// IsSuccess returns true when this repo list push mirrors not found response has a 2xx status code
+func (o *RepoListPushMirrorsNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo list push mirrors not found response has a 3xx status code
+func (o *RepoListPushMirrorsNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo list push mirrors not found response has a 4xx status code
+func (o *RepoListPushMirrorsNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo list push mirrors not found response has a 5xx status code
+func (o *RepoListPushMirrorsNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo list push mirrors not found response a status code equal to that given
+func (o *RepoListPushMirrorsNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo list push mirrors not found response
+func (o *RepoListPushMirrorsNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoListPushMirrorsNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/push_mirrors][%d] repoListPushMirrorsNotFound", 404)
+}
+
+func (o *RepoListPushMirrorsNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/push_mirrors][%d] repoListPushMirrorsNotFound", 404)
+}
+
+func (o *RepoListPushMirrorsNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_list_release_attachments_parameters.go b/bots-common/gitea-generated/client/repository/repo_list_release_attachments_parameters.go
new file mode 100644
index 0000000..a147bf6
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_list_release_attachments_parameters.go
@@ -0,0 +1,198 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewRepoListReleaseAttachmentsParams creates a new RepoListReleaseAttachmentsParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoListReleaseAttachmentsParams() *RepoListReleaseAttachmentsParams {
+	return &RepoListReleaseAttachmentsParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoListReleaseAttachmentsParamsWithTimeout creates a new RepoListReleaseAttachmentsParams object
+// with the ability to set a timeout on a request.
+func NewRepoListReleaseAttachmentsParamsWithTimeout(timeout time.Duration) *RepoListReleaseAttachmentsParams {
+	return &RepoListReleaseAttachmentsParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoListReleaseAttachmentsParamsWithContext creates a new RepoListReleaseAttachmentsParams object
+// with the ability to set a context for a request.
+func NewRepoListReleaseAttachmentsParamsWithContext(ctx context.Context) *RepoListReleaseAttachmentsParams {
+	return &RepoListReleaseAttachmentsParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoListReleaseAttachmentsParamsWithHTTPClient creates a new RepoListReleaseAttachmentsParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoListReleaseAttachmentsParamsWithHTTPClient(client *http.Client) *RepoListReleaseAttachmentsParams {
+	return &RepoListReleaseAttachmentsParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoListReleaseAttachmentsParams contains all the parameters to send to the API endpoint
+
+	for the repo list release attachments operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoListReleaseAttachmentsParams struct {
+
+	/* ID.
+
+	   id of the release
+
+	   Format: int64
+	*/
+	ID int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo list release attachments params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoListReleaseAttachmentsParams) WithDefaults() *RepoListReleaseAttachmentsParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo list release attachments params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoListReleaseAttachmentsParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo list release attachments params
+func (o *RepoListReleaseAttachmentsParams) WithTimeout(timeout time.Duration) *RepoListReleaseAttachmentsParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo list release attachments params
+func (o *RepoListReleaseAttachmentsParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo list release attachments params
+func (o *RepoListReleaseAttachmentsParams) WithContext(ctx context.Context) *RepoListReleaseAttachmentsParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo list release attachments params
+func (o *RepoListReleaseAttachmentsParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo list release attachments params
+func (o *RepoListReleaseAttachmentsParams) WithHTTPClient(client *http.Client) *RepoListReleaseAttachmentsParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo list release attachments params
+func (o *RepoListReleaseAttachmentsParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithID adds the id to the repo list release attachments params
+func (o *RepoListReleaseAttachmentsParams) WithID(id int64) *RepoListReleaseAttachmentsParams {
+	o.SetID(id)
+	return o
+}
+
+// SetID adds the id to the repo list release attachments params
+func (o *RepoListReleaseAttachmentsParams) SetID(id int64) {
+	o.ID = id
+}
+
+// WithOwner adds the owner to the repo list release attachments params
+func (o *RepoListReleaseAttachmentsParams) WithOwner(owner string) *RepoListReleaseAttachmentsParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo list release attachments params
+func (o *RepoListReleaseAttachmentsParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo list release attachments params
+func (o *RepoListReleaseAttachmentsParams) WithRepo(repo string) *RepoListReleaseAttachmentsParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo list release attachments params
+func (o *RepoListReleaseAttachmentsParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoListReleaseAttachmentsParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param id
+	if err := r.SetPathParam("id", swag.FormatInt64(o.ID)); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_list_release_attachments_responses.go b/bots-common/gitea-generated/client/repository/repo_list_release_attachments_responses.go
new file mode 100644
index 0000000..ee22aeb
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_list_release_attachments_responses.go
@@ -0,0 +1,166 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoListReleaseAttachmentsReader is a Reader for the RepoListReleaseAttachments structure.
+type RepoListReleaseAttachmentsReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoListReleaseAttachmentsReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoListReleaseAttachmentsOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoListReleaseAttachmentsNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/releases/{id}/assets] repoListReleaseAttachments", response, response.Code())
+	}
+}
+
+// NewRepoListReleaseAttachmentsOK creates a RepoListReleaseAttachmentsOK with default headers values
+func NewRepoListReleaseAttachmentsOK() *RepoListReleaseAttachmentsOK {
+	return &RepoListReleaseAttachmentsOK{}
+}
+
+/*
+RepoListReleaseAttachmentsOK describes a response with status code 200, with default header values.
+
+AttachmentList
+*/
+type RepoListReleaseAttachmentsOK struct {
+	Payload []*models.Attachment
+}
+
+// IsSuccess returns true when this repo list release attachments o k response has a 2xx status code
+func (o *RepoListReleaseAttachmentsOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo list release attachments o k response has a 3xx status code
+func (o *RepoListReleaseAttachmentsOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo list release attachments o k response has a 4xx status code
+func (o *RepoListReleaseAttachmentsOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo list release attachments o k response has a 5xx status code
+func (o *RepoListReleaseAttachmentsOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo list release attachments o k response a status code equal to that given
+func (o *RepoListReleaseAttachmentsOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo list release attachments o k response
+func (o *RepoListReleaseAttachmentsOK) Code() int {
+	return 200
+}
+
+func (o *RepoListReleaseAttachmentsOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/releases/{id}/assets][%d] repoListReleaseAttachmentsOK %s", 200, payload)
+}
+
+func (o *RepoListReleaseAttachmentsOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/releases/{id}/assets][%d] repoListReleaseAttachmentsOK %s", 200, payload)
+}
+
+func (o *RepoListReleaseAttachmentsOK) GetPayload() []*models.Attachment {
+	return o.Payload
+}
+
+func (o *RepoListReleaseAttachmentsOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoListReleaseAttachmentsNotFound creates a RepoListReleaseAttachmentsNotFound with default headers values
+func NewRepoListReleaseAttachmentsNotFound() *RepoListReleaseAttachmentsNotFound {
+	return &RepoListReleaseAttachmentsNotFound{}
+}
+
+/*
+RepoListReleaseAttachmentsNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoListReleaseAttachmentsNotFound struct {
+}
+
+// IsSuccess returns true when this repo list release attachments not found response has a 2xx status code
+func (o *RepoListReleaseAttachmentsNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo list release attachments not found response has a 3xx status code
+func (o *RepoListReleaseAttachmentsNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo list release attachments not found response has a 4xx status code
+func (o *RepoListReleaseAttachmentsNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo list release attachments not found response has a 5xx status code
+func (o *RepoListReleaseAttachmentsNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo list release attachments not found response a status code equal to that given
+func (o *RepoListReleaseAttachmentsNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo list release attachments not found response
+func (o *RepoListReleaseAttachmentsNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoListReleaseAttachmentsNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/releases/{id}/assets][%d] repoListReleaseAttachmentsNotFound", 404)
+}
+
+func (o *RepoListReleaseAttachmentsNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/releases/{id}/assets][%d] repoListReleaseAttachmentsNotFound", 404)
+}
+
+func (o *RepoListReleaseAttachmentsNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_list_releases_parameters.go b/bots-common/gitea-generated/client/repository/repo_list_releases_parameters.go
new file mode 100644
index 0000000..fba3c19
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_list_releases_parameters.go
@@ -0,0 +1,310 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewRepoListReleasesParams creates a new RepoListReleasesParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoListReleasesParams() *RepoListReleasesParams {
+	return &RepoListReleasesParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoListReleasesParamsWithTimeout creates a new RepoListReleasesParams object
+// with the ability to set a timeout on a request.
+func NewRepoListReleasesParamsWithTimeout(timeout time.Duration) *RepoListReleasesParams {
+	return &RepoListReleasesParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoListReleasesParamsWithContext creates a new RepoListReleasesParams object
+// with the ability to set a context for a request.
+func NewRepoListReleasesParamsWithContext(ctx context.Context) *RepoListReleasesParams {
+	return &RepoListReleasesParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoListReleasesParamsWithHTTPClient creates a new RepoListReleasesParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoListReleasesParamsWithHTTPClient(client *http.Client) *RepoListReleasesParams {
+	return &RepoListReleasesParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoListReleasesParams contains all the parameters to send to the API endpoint
+
+	for the repo list releases operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoListReleasesParams struct {
+
+	/* Draft.
+
+	   filter (exclude / include) drafts, if you dont have repo write access none will show
+	*/
+	Draft *bool
+
+	/* Limit.
+
+	   page size of results
+	*/
+	Limit *int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Page.
+
+	   page number of results to return (1-based)
+	*/
+	Page *int64
+
+	/* PreRelease.
+
+	   filter (exclude / include) pre-releases
+	*/
+	PreRelease *bool
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo list releases params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoListReleasesParams) WithDefaults() *RepoListReleasesParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo list releases params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoListReleasesParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo list releases params
+func (o *RepoListReleasesParams) WithTimeout(timeout time.Duration) *RepoListReleasesParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo list releases params
+func (o *RepoListReleasesParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo list releases params
+func (o *RepoListReleasesParams) WithContext(ctx context.Context) *RepoListReleasesParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo list releases params
+func (o *RepoListReleasesParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo list releases params
+func (o *RepoListReleasesParams) WithHTTPClient(client *http.Client) *RepoListReleasesParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo list releases params
+func (o *RepoListReleasesParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithDraft adds the draft to the repo list releases params
+func (o *RepoListReleasesParams) WithDraft(draft *bool) *RepoListReleasesParams {
+	o.SetDraft(draft)
+	return o
+}
+
+// SetDraft adds the draft to the repo list releases params
+func (o *RepoListReleasesParams) SetDraft(draft *bool) {
+	o.Draft = draft
+}
+
+// WithLimit adds the limit to the repo list releases params
+func (o *RepoListReleasesParams) WithLimit(limit *int64) *RepoListReleasesParams {
+	o.SetLimit(limit)
+	return o
+}
+
+// SetLimit adds the limit to the repo list releases params
+func (o *RepoListReleasesParams) SetLimit(limit *int64) {
+	o.Limit = limit
+}
+
+// WithOwner adds the owner to the repo list releases params
+func (o *RepoListReleasesParams) WithOwner(owner string) *RepoListReleasesParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo list releases params
+func (o *RepoListReleasesParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithPage adds the page to the repo list releases params
+func (o *RepoListReleasesParams) WithPage(page *int64) *RepoListReleasesParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the repo list releases params
+func (o *RepoListReleasesParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WithPreRelease adds the preRelease to the repo list releases params
+func (o *RepoListReleasesParams) WithPreRelease(preRelease *bool) *RepoListReleasesParams {
+	o.SetPreRelease(preRelease)
+	return o
+}
+
+// SetPreRelease adds the preRelease to the repo list releases params
+func (o *RepoListReleasesParams) SetPreRelease(preRelease *bool) {
+	o.PreRelease = preRelease
+}
+
+// WithRepo adds the repo to the repo list releases params
+func (o *RepoListReleasesParams) WithRepo(repo string) *RepoListReleasesParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo list releases params
+func (o *RepoListReleasesParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoListReleasesParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.Draft != nil {
+
+		// query param draft
+		var qrDraft bool
+
+		if o.Draft != nil {
+			qrDraft = *o.Draft
+		}
+		qDraft := swag.FormatBool(qrDraft)
+		if qDraft != "" {
+
+			if err := r.SetQueryParam("draft", qDraft); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Limit != nil {
+
+		// query param limit
+		var qrLimit int64
+
+		if o.Limit != nil {
+			qrLimit = *o.Limit
+		}
+		qLimit := swag.FormatInt64(qrLimit)
+		if qLimit != "" {
+
+			if err := r.SetQueryParam("limit", qLimit); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.PreRelease != nil {
+
+		// query param pre-release
+		var qrPreRelease bool
+
+		if o.PreRelease != nil {
+			qrPreRelease = *o.PreRelease
+		}
+		qPreRelease := swag.FormatBool(qrPreRelease)
+		if qPreRelease != "" {
+
+			if err := r.SetQueryParam("pre-release", qPreRelease); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_list_releases_responses.go b/bots-common/gitea-generated/client/repository/repo_list_releases_responses.go
new file mode 100644
index 0000000..684dd38
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_list_releases_responses.go
@@ -0,0 +1,166 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoListReleasesReader is a Reader for the RepoListReleases structure.
+type RepoListReleasesReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoListReleasesReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoListReleasesOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoListReleasesNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/releases] repoListReleases", response, response.Code())
+	}
+}
+
+// NewRepoListReleasesOK creates a RepoListReleasesOK with default headers values
+func NewRepoListReleasesOK() *RepoListReleasesOK {
+	return &RepoListReleasesOK{}
+}
+
+/*
+RepoListReleasesOK describes a response with status code 200, with default header values.
+
+ReleaseList
+*/
+type RepoListReleasesOK struct {
+	Payload []*models.Release
+}
+
+// IsSuccess returns true when this repo list releases o k response has a 2xx status code
+func (o *RepoListReleasesOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo list releases o k response has a 3xx status code
+func (o *RepoListReleasesOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo list releases o k response has a 4xx status code
+func (o *RepoListReleasesOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo list releases o k response has a 5xx status code
+func (o *RepoListReleasesOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo list releases o k response a status code equal to that given
+func (o *RepoListReleasesOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo list releases o k response
+func (o *RepoListReleasesOK) Code() int {
+	return 200
+}
+
+func (o *RepoListReleasesOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/releases][%d] repoListReleasesOK %s", 200, payload)
+}
+
+func (o *RepoListReleasesOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/releases][%d] repoListReleasesOK %s", 200, payload)
+}
+
+func (o *RepoListReleasesOK) GetPayload() []*models.Release {
+	return o.Payload
+}
+
+func (o *RepoListReleasesOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoListReleasesNotFound creates a RepoListReleasesNotFound with default headers values
+func NewRepoListReleasesNotFound() *RepoListReleasesNotFound {
+	return &RepoListReleasesNotFound{}
+}
+
+/*
+RepoListReleasesNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoListReleasesNotFound struct {
+}
+
+// IsSuccess returns true when this repo list releases not found response has a 2xx status code
+func (o *RepoListReleasesNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo list releases not found response has a 3xx status code
+func (o *RepoListReleasesNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo list releases not found response has a 4xx status code
+func (o *RepoListReleasesNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo list releases not found response has a 5xx status code
+func (o *RepoListReleasesNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo list releases not found response a status code equal to that given
+func (o *RepoListReleasesNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo list releases not found response
+func (o *RepoListReleasesNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoListReleasesNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/releases][%d] repoListReleasesNotFound", 404)
+}
+
+func (o *RepoListReleasesNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/releases][%d] repoListReleasesNotFound", 404)
+}
+
+func (o *RepoListReleasesNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_list_stargazers_parameters.go b/bots-common/gitea-generated/client/repository/repo_list_stargazers_parameters.go
new file mode 100644
index 0000000..6a0a82e
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_list_stargazers_parameters.go
@@ -0,0 +1,242 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewRepoListStargazersParams creates a new RepoListStargazersParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoListStargazersParams() *RepoListStargazersParams {
+	return &RepoListStargazersParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoListStargazersParamsWithTimeout creates a new RepoListStargazersParams object
+// with the ability to set a timeout on a request.
+func NewRepoListStargazersParamsWithTimeout(timeout time.Duration) *RepoListStargazersParams {
+	return &RepoListStargazersParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoListStargazersParamsWithContext creates a new RepoListStargazersParams object
+// with the ability to set a context for a request.
+func NewRepoListStargazersParamsWithContext(ctx context.Context) *RepoListStargazersParams {
+	return &RepoListStargazersParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoListStargazersParamsWithHTTPClient creates a new RepoListStargazersParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoListStargazersParamsWithHTTPClient(client *http.Client) *RepoListStargazersParams {
+	return &RepoListStargazersParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoListStargazersParams contains all the parameters to send to the API endpoint
+
+	for the repo list stargazers operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoListStargazersParams struct {
+
+	/* Limit.
+
+	   page size of results
+	*/
+	Limit *int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Page.
+
+	   page number of results to return (1-based)
+	*/
+	Page *int64
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo list stargazers params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoListStargazersParams) WithDefaults() *RepoListStargazersParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo list stargazers params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoListStargazersParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo list stargazers params
+func (o *RepoListStargazersParams) WithTimeout(timeout time.Duration) *RepoListStargazersParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo list stargazers params
+func (o *RepoListStargazersParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo list stargazers params
+func (o *RepoListStargazersParams) WithContext(ctx context.Context) *RepoListStargazersParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo list stargazers params
+func (o *RepoListStargazersParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo list stargazers params
+func (o *RepoListStargazersParams) WithHTTPClient(client *http.Client) *RepoListStargazersParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo list stargazers params
+func (o *RepoListStargazersParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithLimit adds the limit to the repo list stargazers params
+func (o *RepoListStargazersParams) WithLimit(limit *int64) *RepoListStargazersParams {
+	o.SetLimit(limit)
+	return o
+}
+
+// SetLimit adds the limit to the repo list stargazers params
+func (o *RepoListStargazersParams) SetLimit(limit *int64) {
+	o.Limit = limit
+}
+
+// WithOwner adds the owner to the repo list stargazers params
+func (o *RepoListStargazersParams) WithOwner(owner string) *RepoListStargazersParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo list stargazers params
+func (o *RepoListStargazersParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithPage adds the page to the repo list stargazers params
+func (o *RepoListStargazersParams) WithPage(page *int64) *RepoListStargazersParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the repo list stargazers params
+func (o *RepoListStargazersParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WithRepo adds the repo to the repo list stargazers params
+func (o *RepoListStargazersParams) WithRepo(repo string) *RepoListStargazersParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo list stargazers params
+func (o *RepoListStargazersParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoListStargazersParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.Limit != nil {
+
+		// query param limit
+		var qrLimit int64
+
+		if o.Limit != nil {
+			qrLimit = *o.Limit
+		}
+		qLimit := swag.FormatInt64(qrLimit)
+		if qLimit != "" {
+
+			if err := r.SetQueryParam("limit", qLimit); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_list_stargazers_responses.go b/bots-common/gitea-generated/client/repository/repo_list_stargazers_responses.go
new file mode 100644
index 0000000..508a21b
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_list_stargazers_responses.go
@@ -0,0 +1,166 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoListStargazersReader is a Reader for the RepoListStargazers structure.
+type RepoListStargazersReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoListStargazersReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoListStargazersOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoListStargazersNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/stargazers] repoListStargazers", response, response.Code())
+	}
+}
+
+// NewRepoListStargazersOK creates a RepoListStargazersOK with default headers values
+func NewRepoListStargazersOK() *RepoListStargazersOK {
+	return &RepoListStargazersOK{}
+}
+
+/*
+RepoListStargazersOK describes a response with status code 200, with default header values.
+
+UserList
+*/
+type RepoListStargazersOK struct {
+	Payload []*models.User
+}
+
+// IsSuccess returns true when this repo list stargazers o k response has a 2xx status code
+func (o *RepoListStargazersOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo list stargazers o k response has a 3xx status code
+func (o *RepoListStargazersOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo list stargazers o k response has a 4xx status code
+func (o *RepoListStargazersOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo list stargazers o k response has a 5xx status code
+func (o *RepoListStargazersOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo list stargazers o k response a status code equal to that given
+func (o *RepoListStargazersOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo list stargazers o k response
+func (o *RepoListStargazersOK) Code() int {
+	return 200
+}
+
+func (o *RepoListStargazersOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/stargazers][%d] repoListStargazersOK %s", 200, payload)
+}
+
+func (o *RepoListStargazersOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/stargazers][%d] repoListStargazersOK %s", 200, payload)
+}
+
+func (o *RepoListStargazersOK) GetPayload() []*models.User {
+	return o.Payload
+}
+
+func (o *RepoListStargazersOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoListStargazersNotFound creates a RepoListStargazersNotFound with default headers values
+func NewRepoListStargazersNotFound() *RepoListStargazersNotFound {
+	return &RepoListStargazersNotFound{}
+}
+
+/*
+RepoListStargazersNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoListStargazersNotFound struct {
+}
+
+// IsSuccess returns true when this repo list stargazers not found response has a 2xx status code
+func (o *RepoListStargazersNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo list stargazers not found response has a 3xx status code
+func (o *RepoListStargazersNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo list stargazers not found response has a 4xx status code
+func (o *RepoListStargazersNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo list stargazers not found response has a 5xx status code
+func (o *RepoListStargazersNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo list stargazers not found response a status code equal to that given
+func (o *RepoListStargazersNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo list stargazers not found response
+func (o *RepoListStargazersNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoListStargazersNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/stargazers][%d] repoListStargazersNotFound", 404)
+}
+
+func (o *RepoListStargazersNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/stargazers][%d] repoListStargazersNotFound", 404)
+}
+
+func (o *RepoListStargazersNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_list_statuses_by_ref_parameters.go b/bots-common/gitea-generated/client/repository/repo_list_statuses_by_ref_parameters.go
new file mode 100644
index 0000000..8c980e8
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_list_statuses_by_ref_parameters.go
@@ -0,0 +1,332 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewRepoListStatusesByRefParams creates a new RepoListStatusesByRefParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoListStatusesByRefParams() *RepoListStatusesByRefParams {
+	return &RepoListStatusesByRefParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoListStatusesByRefParamsWithTimeout creates a new RepoListStatusesByRefParams object
+// with the ability to set a timeout on a request.
+func NewRepoListStatusesByRefParamsWithTimeout(timeout time.Duration) *RepoListStatusesByRefParams {
+	return &RepoListStatusesByRefParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoListStatusesByRefParamsWithContext creates a new RepoListStatusesByRefParams object
+// with the ability to set a context for a request.
+func NewRepoListStatusesByRefParamsWithContext(ctx context.Context) *RepoListStatusesByRefParams {
+	return &RepoListStatusesByRefParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoListStatusesByRefParamsWithHTTPClient creates a new RepoListStatusesByRefParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoListStatusesByRefParamsWithHTTPClient(client *http.Client) *RepoListStatusesByRefParams {
+	return &RepoListStatusesByRefParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoListStatusesByRefParams contains all the parameters to send to the API endpoint
+
+	for the repo list statuses by ref operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoListStatusesByRefParams struct {
+
+	/* Limit.
+
+	   page size of results
+	*/
+	Limit *int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Page.
+
+	   page number of results to return (1-based)
+	*/
+	Page *int64
+
+	/* Ref.
+
+	   name of branch/tag/commit
+	*/
+	Ref string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	/* Sort.
+
+	   type of sort
+	*/
+	Sort *string
+
+	/* State.
+
+	   type of state
+	*/
+	State *string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo list statuses by ref params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoListStatusesByRefParams) WithDefaults() *RepoListStatusesByRefParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo list statuses by ref params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoListStatusesByRefParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo list statuses by ref params
+func (o *RepoListStatusesByRefParams) WithTimeout(timeout time.Duration) *RepoListStatusesByRefParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo list statuses by ref params
+func (o *RepoListStatusesByRefParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo list statuses by ref params
+func (o *RepoListStatusesByRefParams) WithContext(ctx context.Context) *RepoListStatusesByRefParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo list statuses by ref params
+func (o *RepoListStatusesByRefParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo list statuses by ref params
+func (o *RepoListStatusesByRefParams) WithHTTPClient(client *http.Client) *RepoListStatusesByRefParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo list statuses by ref params
+func (o *RepoListStatusesByRefParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithLimit adds the limit to the repo list statuses by ref params
+func (o *RepoListStatusesByRefParams) WithLimit(limit *int64) *RepoListStatusesByRefParams {
+	o.SetLimit(limit)
+	return o
+}
+
+// SetLimit adds the limit to the repo list statuses by ref params
+func (o *RepoListStatusesByRefParams) SetLimit(limit *int64) {
+	o.Limit = limit
+}
+
+// WithOwner adds the owner to the repo list statuses by ref params
+func (o *RepoListStatusesByRefParams) WithOwner(owner string) *RepoListStatusesByRefParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo list statuses by ref params
+func (o *RepoListStatusesByRefParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithPage adds the page to the repo list statuses by ref params
+func (o *RepoListStatusesByRefParams) WithPage(page *int64) *RepoListStatusesByRefParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the repo list statuses by ref params
+func (o *RepoListStatusesByRefParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WithRef adds the ref to the repo list statuses by ref params
+func (o *RepoListStatusesByRefParams) WithRef(ref string) *RepoListStatusesByRefParams {
+	o.SetRef(ref)
+	return o
+}
+
+// SetRef adds the ref to the repo list statuses by ref params
+func (o *RepoListStatusesByRefParams) SetRef(ref string) {
+	o.Ref = ref
+}
+
+// WithRepo adds the repo to the repo list statuses by ref params
+func (o *RepoListStatusesByRefParams) WithRepo(repo string) *RepoListStatusesByRefParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo list statuses by ref params
+func (o *RepoListStatusesByRefParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WithSort adds the sort to the repo list statuses by ref params
+func (o *RepoListStatusesByRefParams) WithSort(sort *string) *RepoListStatusesByRefParams {
+	o.SetSort(sort)
+	return o
+}
+
+// SetSort adds the sort to the repo list statuses by ref params
+func (o *RepoListStatusesByRefParams) SetSort(sort *string) {
+	o.Sort = sort
+}
+
+// WithState adds the state to the repo list statuses by ref params
+func (o *RepoListStatusesByRefParams) WithState(state *string) *RepoListStatusesByRefParams {
+	o.SetState(state)
+	return o
+}
+
+// SetState adds the state to the repo list statuses by ref params
+func (o *RepoListStatusesByRefParams) SetState(state *string) {
+	o.State = state
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoListStatusesByRefParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.Limit != nil {
+
+		// query param limit
+		var qrLimit int64
+
+		if o.Limit != nil {
+			qrLimit = *o.Limit
+		}
+		qLimit := swag.FormatInt64(qrLimit)
+		if qLimit != "" {
+
+			if err := r.SetQueryParam("limit", qLimit); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param ref
+	if err := r.SetPathParam("ref", o.Ref); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if o.Sort != nil {
+
+		// query param sort
+		var qrSort string
+
+		if o.Sort != nil {
+			qrSort = *o.Sort
+		}
+		qSort := qrSort
+		if qSort != "" {
+
+			if err := r.SetQueryParam("sort", qSort); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.State != nil {
+
+		// query param state
+		var qrState string
+
+		if o.State != nil {
+			qrState = *o.State
+		}
+		qState := qrState
+		if qState != "" {
+
+			if err := r.SetQueryParam("state", qState); err != nil {
+				return err
+			}
+		}
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_list_statuses_by_ref_responses.go b/bots-common/gitea-generated/client/repository/repo_list_statuses_by_ref_responses.go
new file mode 100644
index 0000000..79c7b96
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_list_statuses_by_ref_responses.go
@@ -0,0 +1,244 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoListStatusesByRefReader is a Reader for the RepoListStatusesByRef structure.
+type RepoListStatusesByRefReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoListStatusesByRefReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoListStatusesByRefOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 400:
+		result := NewRepoListStatusesByRefBadRequest()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewRepoListStatusesByRefNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/commits/{ref}/statuses] repoListStatusesByRef", response, response.Code())
+	}
+}
+
+// NewRepoListStatusesByRefOK creates a RepoListStatusesByRefOK with default headers values
+func NewRepoListStatusesByRefOK() *RepoListStatusesByRefOK {
+	return &RepoListStatusesByRefOK{}
+}
+
+/*
+RepoListStatusesByRefOK describes a response with status code 200, with default header values.
+
+CommitStatusList
+*/
+type RepoListStatusesByRefOK struct {
+	Payload []*models.CommitStatus
+}
+
+// IsSuccess returns true when this repo list statuses by ref o k response has a 2xx status code
+func (o *RepoListStatusesByRefOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo list statuses by ref o k response has a 3xx status code
+func (o *RepoListStatusesByRefOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo list statuses by ref o k response has a 4xx status code
+func (o *RepoListStatusesByRefOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo list statuses by ref o k response has a 5xx status code
+func (o *RepoListStatusesByRefOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo list statuses by ref o k response a status code equal to that given
+func (o *RepoListStatusesByRefOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo list statuses by ref o k response
+func (o *RepoListStatusesByRefOK) Code() int {
+	return 200
+}
+
+func (o *RepoListStatusesByRefOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/commits/{ref}/statuses][%d] repoListStatusesByRefOK %s", 200, payload)
+}
+
+func (o *RepoListStatusesByRefOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/commits/{ref}/statuses][%d] repoListStatusesByRefOK %s", 200, payload)
+}
+
+func (o *RepoListStatusesByRefOK) GetPayload() []*models.CommitStatus {
+	return o.Payload
+}
+
+func (o *RepoListStatusesByRefOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoListStatusesByRefBadRequest creates a RepoListStatusesByRefBadRequest with default headers values
+func NewRepoListStatusesByRefBadRequest() *RepoListStatusesByRefBadRequest {
+	return &RepoListStatusesByRefBadRequest{}
+}
+
+/*
+RepoListStatusesByRefBadRequest describes a response with status code 400, with default header values.
+
+APIError is error format response
+*/
+type RepoListStatusesByRefBadRequest struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo list statuses by ref bad request response has a 2xx status code
+func (o *RepoListStatusesByRefBadRequest) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo list statuses by ref bad request response has a 3xx status code
+func (o *RepoListStatusesByRefBadRequest) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo list statuses by ref bad request response has a 4xx status code
+func (o *RepoListStatusesByRefBadRequest) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo list statuses by ref bad request response has a 5xx status code
+func (o *RepoListStatusesByRefBadRequest) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo list statuses by ref bad request response a status code equal to that given
+func (o *RepoListStatusesByRefBadRequest) IsCode(code int) bool {
+	return code == 400
+}
+
+// Code gets the status code for the repo list statuses by ref bad request response
+func (o *RepoListStatusesByRefBadRequest) Code() int {
+	return 400
+}
+
+func (o *RepoListStatusesByRefBadRequest) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/commits/{ref}/statuses][%d] repoListStatusesByRefBadRequest", 400)
+}
+
+func (o *RepoListStatusesByRefBadRequest) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/commits/{ref}/statuses][%d] repoListStatusesByRefBadRequest", 400)
+}
+
+func (o *RepoListStatusesByRefBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewRepoListStatusesByRefNotFound creates a RepoListStatusesByRefNotFound with default headers values
+func NewRepoListStatusesByRefNotFound() *RepoListStatusesByRefNotFound {
+	return &RepoListStatusesByRefNotFound{}
+}
+
+/*
+RepoListStatusesByRefNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoListStatusesByRefNotFound struct {
+}
+
+// IsSuccess returns true when this repo list statuses by ref not found response has a 2xx status code
+func (o *RepoListStatusesByRefNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo list statuses by ref not found response has a 3xx status code
+func (o *RepoListStatusesByRefNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo list statuses by ref not found response has a 4xx status code
+func (o *RepoListStatusesByRefNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo list statuses by ref not found response has a 5xx status code
+func (o *RepoListStatusesByRefNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo list statuses by ref not found response a status code equal to that given
+func (o *RepoListStatusesByRefNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo list statuses by ref not found response
+func (o *RepoListStatusesByRefNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoListStatusesByRefNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/commits/{ref}/statuses][%d] repoListStatusesByRefNotFound", 404)
+}
+
+func (o *RepoListStatusesByRefNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/commits/{ref}/statuses][%d] repoListStatusesByRefNotFound", 404)
+}
+
+func (o *RepoListStatusesByRefNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_list_statuses_parameters.go b/bots-common/gitea-generated/client/repository/repo_list_statuses_parameters.go
new file mode 100644
index 0000000..60076da
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_list_statuses_parameters.go
@@ -0,0 +1,332 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewRepoListStatusesParams creates a new RepoListStatusesParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoListStatusesParams() *RepoListStatusesParams {
+	return &RepoListStatusesParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoListStatusesParamsWithTimeout creates a new RepoListStatusesParams object
+// with the ability to set a timeout on a request.
+func NewRepoListStatusesParamsWithTimeout(timeout time.Duration) *RepoListStatusesParams {
+	return &RepoListStatusesParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoListStatusesParamsWithContext creates a new RepoListStatusesParams object
+// with the ability to set a context for a request.
+func NewRepoListStatusesParamsWithContext(ctx context.Context) *RepoListStatusesParams {
+	return &RepoListStatusesParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoListStatusesParamsWithHTTPClient creates a new RepoListStatusesParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoListStatusesParamsWithHTTPClient(client *http.Client) *RepoListStatusesParams {
+	return &RepoListStatusesParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoListStatusesParams contains all the parameters to send to the API endpoint
+
+	for the repo list statuses operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoListStatusesParams struct {
+
+	/* Limit.
+
+	   page size of results
+	*/
+	Limit *int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Page.
+
+	   page number of results to return (1-based)
+	*/
+	Page *int64
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	/* Sha.
+
+	   sha of the commit
+	*/
+	Sha string
+
+	/* Sort.
+
+	   type of sort
+	*/
+	Sort *string
+
+	/* State.
+
+	   type of state
+	*/
+	State *string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo list statuses params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoListStatusesParams) WithDefaults() *RepoListStatusesParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo list statuses params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoListStatusesParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo list statuses params
+func (o *RepoListStatusesParams) WithTimeout(timeout time.Duration) *RepoListStatusesParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo list statuses params
+func (o *RepoListStatusesParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo list statuses params
+func (o *RepoListStatusesParams) WithContext(ctx context.Context) *RepoListStatusesParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo list statuses params
+func (o *RepoListStatusesParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo list statuses params
+func (o *RepoListStatusesParams) WithHTTPClient(client *http.Client) *RepoListStatusesParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo list statuses params
+func (o *RepoListStatusesParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithLimit adds the limit to the repo list statuses params
+func (o *RepoListStatusesParams) WithLimit(limit *int64) *RepoListStatusesParams {
+	o.SetLimit(limit)
+	return o
+}
+
+// SetLimit adds the limit to the repo list statuses params
+func (o *RepoListStatusesParams) SetLimit(limit *int64) {
+	o.Limit = limit
+}
+
+// WithOwner adds the owner to the repo list statuses params
+func (o *RepoListStatusesParams) WithOwner(owner string) *RepoListStatusesParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo list statuses params
+func (o *RepoListStatusesParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithPage adds the page to the repo list statuses params
+func (o *RepoListStatusesParams) WithPage(page *int64) *RepoListStatusesParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the repo list statuses params
+func (o *RepoListStatusesParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WithRepo adds the repo to the repo list statuses params
+func (o *RepoListStatusesParams) WithRepo(repo string) *RepoListStatusesParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo list statuses params
+func (o *RepoListStatusesParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WithSha adds the sha to the repo list statuses params
+func (o *RepoListStatusesParams) WithSha(sha string) *RepoListStatusesParams {
+	o.SetSha(sha)
+	return o
+}
+
+// SetSha adds the sha to the repo list statuses params
+func (o *RepoListStatusesParams) SetSha(sha string) {
+	o.Sha = sha
+}
+
+// WithSort adds the sort to the repo list statuses params
+func (o *RepoListStatusesParams) WithSort(sort *string) *RepoListStatusesParams {
+	o.SetSort(sort)
+	return o
+}
+
+// SetSort adds the sort to the repo list statuses params
+func (o *RepoListStatusesParams) SetSort(sort *string) {
+	o.Sort = sort
+}
+
+// WithState adds the state to the repo list statuses params
+func (o *RepoListStatusesParams) WithState(state *string) *RepoListStatusesParams {
+	o.SetState(state)
+	return o
+}
+
+// SetState adds the state to the repo list statuses params
+func (o *RepoListStatusesParams) SetState(state *string) {
+	o.State = state
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoListStatusesParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.Limit != nil {
+
+		// query param limit
+		var qrLimit int64
+
+		if o.Limit != nil {
+			qrLimit = *o.Limit
+		}
+		qLimit := swag.FormatInt64(qrLimit)
+		if qLimit != "" {
+
+			if err := r.SetQueryParam("limit", qLimit); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	// path param sha
+	if err := r.SetPathParam("sha", o.Sha); err != nil {
+		return err
+	}
+
+	if o.Sort != nil {
+
+		// query param sort
+		var qrSort string
+
+		if o.Sort != nil {
+			qrSort = *o.Sort
+		}
+		qSort := qrSort
+		if qSort != "" {
+
+			if err := r.SetQueryParam("sort", qSort); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.State != nil {
+
+		// query param state
+		var qrState string
+
+		if o.State != nil {
+			qrState = *o.State
+		}
+		qState := qrState
+		if qState != "" {
+
+			if err := r.SetQueryParam("state", qState); err != nil {
+				return err
+			}
+		}
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_list_statuses_responses.go b/bots-common/gitea-generated/client/repository/repo_list_statuses_responses.go
new file mode 100644
index 0000000..06d53d5
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_list_statuses_responses.go
@@ -0,0 +1,244 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoListStatusesReader is a Reader for the RepoListStatuses structure.
+type RepoListStatusesReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoListStatusesReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoListStatusesOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 400:
+		result := NewRepoListStatusesBadRequest()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewRepoListStatusesNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/statuses/{sha}] repoListStatuses", response, response.Code())
+	}
+}
+
+// NewRepoListStatusesOK creates a RepoListStatusesOK with default headers values
+func NewRepoListStatusesOK() *RepoListStatusesOK {
+	return &RepoListStatusesOK{}
+}
+
+/*
+RepoListStatusesOK describes a response with status code 200, with default header values.
+
+CommitStatusList
+*/
+type RepoListStatusesOK struct {
+	Payload []*models.CommitStatus
+}
+
+// IsSuccess returns true when this repo list statuses o k response has a 2xx status code
+func (o *RepoListStatusesOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo list statuses o k response has a 3xx status code
+func (o *RepoListStatusesOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo list statuses o k response has a 4xx status code
+func (o *RepoListStatusesOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo list statuses o k response has a 5xx status code
+func (o *RepoListStatusesOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo list statuses o k response a status code equal to that given
+func (o *RepoListStatusesOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo list statuses o k response
+func (o *RepoListStatusesOK) Code() int {
+	return 200
+}
+
+func (o *RepoListStatusesOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/statuses/{sha}][%d] repoListStatusesOK %s", 200, payload)
+}
+
+func (o *RepoListStatusesOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/statuses/{sha}][%d] repoListStatusesOK %s", 200, payload)
+}
+
+func (o *RepoListStatusesOK) GetPayload() []*models.CommitStatus {
+	return o.Payload
+}
+
+func (o *RepoListStatusesOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoListStatusesBadRequest creates a RepoListStatusesBadRequest with default headers values
+func NewRepoListStatusesBadRequest() *RepoListStatusesBadRequest {
+	return &RepoListStatusesBadRequest{}
+}
+
+/*
+RepoListStatusesBadRequest describes a response with status code 400, with default header values.
+
+APIError is error format response
+*/
+type RepoListStatusesBadRequest struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo list statuses bad request response has a 2xx status code
+func (o *RepoListStatusesBadRequest) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo list statuses bad request response has a 3xx status code
+func (o *RepoListStatusesBadRequest) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo list statuses bad request response has a 4xx status code
+func (o *RepoListStatusesBadRequest) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo list statuses bad request response has a 5xx status code
+func (o *RepoListStatusesBadRequest) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo list statuses bad request response a status code equal to that given
+func (o *RepoListStatusesBadRequest) IsCode(code int) bool {
+	return code == 400
+}
+
+// Code gets the status code for the repo list statuses bad request response
+func (o *RepoListStatusesBadRequest) Code() int {
+	return 400
+}
+
+func (o *RepoListStatusesBadRequest) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/statuses/{sha}][%d] repoListStatusesBadRequest", 400)
+}
+
+func (o *RepoListStatusesBadRequest) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/statuses/{sha}][%d] repoListStatusesBadRequest", 400)
+}
+
+func (o *RepoListStatusesBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewRepoListStatusesNotFound creates a RepoListStatusesNotFound with default headers values
+func NewRepoListStatusesNotFound() *RepoListStatusesNotFound {
+	return &RepoListStatusesNotFound{}
+}
+
+/*
+RepoListStatusesNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoListStatusesNotFound struct {
+}
+
+// IsSuccess returns true when this repo list statuses not found response has a 2xx status code
+func (o *RepoListStatusesNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo list statuses not found response has a 3xx status code
+func (o *RepoListStatusesNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo list statuses not found response has a 4xx status code
+func (o *RepoListStatusesNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo list statuses not found response has a 5xx status code
+func (o *RepoListStatusesNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo list statuses not found response a status code equal to that given
+func (o *RepoListStatusesNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo list statuses not found response
+func (o *RepoListStatusesNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoListStatusesNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/statuses/{sha}][%d] repoListStatusesNotFound", 404)
+}
+
+func (o *RepoListStatusesNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/statuses/{sha}][%d] repoListStatusesNotFound", 404)
+}
+
+func (o *RepoListStatusesNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_list_subscribers_parameters.go b/bots-common/gitea-generated/client/repository/repo_list_subscribers_parameters.go
new file mode 100644
index 0000000..d5b7ce7
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_list_subscribers_parameters.go
@@ -0,0 +1,242 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewRepoListSubscribersParams creates a new RepoListSubscribersParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoListSubscribersParams() *RepoListSubscribersParams {
+	return &RepoListSubscribersParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoListSubscribersParamsWithTimeout creates a new RepoListSubscribersParams object
+// with the ability to set a timeout on a request.
+func NewRepoListSubscribersParamsWithTimeout(timeout time.Duration) *RepoListSubscribersParams {
+	return &RepoListSubscribersParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoListSubscribersParamsWithContext creates a new RepoListSubscribersParams object
+// with the ability to set a context for a request.
+func NewRepoListSubscribersParamsWithContext(ctx context.Context) *RepoListSubscribersParams {
+	return &RepoListSubscribersParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoListSubscribersParamsWithHTTPClient creates a new RepoListSubscribersParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoListSubscribersParamsWithHTTPClient(client *http.Client) *RepoListSubscribersParams {
+	return &RepoListSubscribersParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoListSubscribersParams contains all the parameters to send to the API endpoint
+
+	for the repo list subscribers operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoListSubscribersParams struct {
+
+	/* Limit.
+
+	   page size of results
+	*/
+	Limit *int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Page.
+
+	   page number of results to return (1-based)
+	*/
+	Page *int64
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo list subscribers params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoListSubscribersParams) WithDefaults() *RepoListSubscribersParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo list subscribers params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoListSubscribersParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo list subscribers params
+func (o *RepoListSubscribersParams) WithTimeout(timeout time.Duration) *RepoListSubscribersParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo list subscribers params
+func (o *RepoListSubscribersParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo list subscribers params
+func (o *RepoListSubscribersParams) WithContext(ctx context.Context) *RepoListSubscribersParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo list subscribers params
+func (o *RepoListSubscribersParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo list subscribers params
+func (o *RepoListSubscribersParams) WithHTTPClient(client *http.Client) *RepoListSubscribersParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo list subscribers params
+func (o *RepoListSubscribersParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithLimit adds the limit to the repo list subscribers params
+func (o *RepoListSubscribersParams) WithLimit(limit *int64) *RepoListSubscribersParams {
+	o.SetLimit(limit)
+	return o
+}
+
+// SetLimit adds the limit to the repo list subscribers params
+func (o *RepoListSubscribersParams) SetLimit(limit *int64) {
+	o.Limit = limit
+}
+
+// WithOwner adds the owner to the repo list subscribers params
+func (o *RepoListSubscribersParams) WithOwner(owner string) *RepoListSubscribersParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo list subscribers params
+func (o *RepoListSubscribersParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithPage adds the page to the repo list subscribers params
+func (o *RepoListSubscribersParams) WithPage(page *int64) *RepoListSubscribersParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the repo list subscribers params
+func (o *RepoListSubscribersParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WithRepo adds the repo to the repo list subscribers params
+func (o *RepoListSubscribersParams) WithRepo(repo string) *RepoListSubscribersParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo list subscribers params
+func (o *RepoListSubscribersParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoListSubscribersParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.Limit != nil {
+
+		// query param limit
+		var qrLimit int64
+
+		if o.Limit != nil {
+			qrLimit = *o.Limit
+		}
+		qLimit := swag.FormatInt64(qrLimit)
+		if qLimit != "" {
+
+			if err := r.SetQueryParam("limit", qLimit); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_list_subscribers_responses.go b/bots-common/gitea-generated/client/repository/repo_list_subscribers_responses.go
new file mode 100644
index 0000000..74714f6
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_list_subscribers_responses.go
@@ -0,0 +1,166 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoListSubscribersReader is a Reader for the RepoListSubscribers structure.
+type RepoListSubscribersReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoListSubscribersReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoListSubscribersOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoListSubscribersNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/subscribers] repoListSubscribers", response, response.Code())
+	}
+}
+
+// NewRepoListSubscribersOK creates a RepoListSubscribersOK with default headers values
+func NewRepoListSubscribersOK() *RepoListSubscribersOK {
+	return &RepoListSubscribersOK{}
+}
+
+/*
+RepoListSubscribersOK describes a response with status code 200, with default header values.
+
+UserList
+*/
+type RepoListSubscribersOK struct {
+	Payload []*models.User
+}
+
+// IsSuccess returns true when this repo list subscribers o k response has a 2xx status code
+func (o *RepoListSubscribersOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo list subscribers o k response has a 3xx status code
+func (o *RepoListSubscribersOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo list subscribers o k response has a 4xx status code
+func (o *RepoListSubscribersOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo list subscribers o k response has a 5xx status code
+func (o *RepoListSubscribersOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo list subscribers o k response a status code equal to that given
+func (o *RepoListSubscribersOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo list subscribers o k response
+func (o *RepoListSubscribersOK) Code() int {
+	return 200
+}
+
+func (o *RepoListSubscribersOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/subscribers][%d] repoListSubscribersOK %s", 200, payload)
+}
+
+func (o *RepoListSubscribersOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/subscribers][%d] repoListSubscribersOK %s", 200, payload)
+}
+
+func (o *RepoListSubscribersOK) GetPayload() []*models.User {
+	return o.Payload
+}
+
+func (o *RepoListSubscribersOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoListSubscribersNotFound creates a RepoListSubscribersNotFound with default headers values
+func NewRepoListSubscribersNotFound() *RepoListSubscribersNotFound {
+	return &RepoListSubscribersNotFound{}
+}
+
+/*
+RepoListSubscribersNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoListSubscribersNotFound struct {
+}
+
+// IsSuccess returns true when this repo list subscribers not found response has a 2xx status code
+func (o *RepoListSubscribersNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo list subscribers not found response has a 3xx status code
+func (o *RepoListSubscribersNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo list subscribers not found response has a 4xx status code
+func (o *RepoListSubscribersNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo list subscribers not found response has a 5xx status code
+func (o *RepoListSubscribersNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo list subscribers not found response a status code equal to that given
+func (o *RepoListSubscribersNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo list subscribers not found response
+func (o *RepoListSubscribersNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoListSubscribersNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/subscribers][%d] repoListSubscribersNotFound", 404)
+}
+
+func (o *RepoListSubscribersNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/subscribers][%d] repoListSubscribersNotFound", 404)
+}
+
+func (o *RepoListSubscribersNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_list_tags_parameters.go b/bots-common/gitea-generated/client/repository/repo_list_tags_parameters.go
new file mode 100644
index 0000000..469a915
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_list_tags_parameters.go
@@ -0,0 +1,242 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewRepoListTagsParams creates a new RepoListTagsParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoListTagsParams() *RepoListTagsParams {
+	return &RepoListTagsParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoListTagsParamsWithTimeout creates a new RepoListTagsParams object
+// with the ability to set a timeout on a request.
+func NewRepoListTagsParamsWithTimeout(timeout time.Duration) *RepoListTagsParams {
+	return &RepoListTagsParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoListTagsParamsWithContext creates a new RepoListTagsParams object
+// with the ability to set a context for a request.
+func NewRepoListTagsParamsWithContext(ctx context.Context) *RepoListTagsParams {
+	return &RepoListTagsParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoListTagsParamsWithHTTPClient creates a new RepoListTagsParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoListTagsParamsWithHTTPClient(client *http.Client) *RepoListTagsParams {
+	return &RepoListTagsParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoListTagsParams contains all the parameters to send to the API endpoint
+
+	for the repo list tags operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoListTagsParams struct {
+
+	/* Limit.
+
+	   page size of results, default maximum page size is 50
+	*/
+	Limit *int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Page.
+
+	   page number of results to return (1-based)
+	*/
+	Page *int64
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo list tags params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoListTagsParams) WithDefaults() *RepoListTagsParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo list tags params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoListTagsParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo list tags params
+func (o *RepoListTagsParams) WithTimeout(timeout time.Duration) *RepoListTagsParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo list tags params
+func (o *RepoListTagsParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo list tags params
+func (o *RepoListTagsParams) WithContext(ctx context.Context) *RepoListTagsParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo list tags params
+func (o *RepoListTagsParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo list tags params
+func (o *RepoListTagsParams) WithHTTPClient(client *http.Client) *RepoListTagsParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo list tags params
+func (o *RepoListTagsParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithLimit adds the limit to the repo list tags params
+func (o *RepoListTagsParams) WithLimit(limit *int64) *RepoListTagsParams {
+	o.SetLimit(limit)
+	return o
+}
+
+// SetLimit adds the limit to the repo list tags params
+func (o *RepoListTagsParams) SetLimit(limit *int64) {
+	o.Limit = limit
+}
+
+// WithOwner adds the owner to the repo list tags params
+func (o *RepoListTagsParams) WithOwner(owner string) *RepoListTagsParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo list tags params
+func (o *RepoListTagsParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithPage adds the page to the repo list tags params
+func (o *RepoListTagsParams) WithPage(page *int64) *RepoListTagsParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the repo list tags params
+func (o *RepoListTagsParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WithRepo adds the repo to the repo list tags params
+func (o *RepoListTagsParams) WithRepo(repo string) *RepoListTagsParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo list tags params
+func (o *RepoListTagsParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoListTagsParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.Limit != nil {
+
+		// query param limit
+		var qrLimit int64
+
+		if o.Limit != nil {
+			qrLimit = *o.Limit
+		}
+		qLimit := swag.FormatInt64(qrLimit)
+		if qLimit != "" {
+
+			if err := r.SetQueryParam("limit", qLimit); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_list_tags_responses.go b/bots-common/gitea-generated/client/repository/repo_list_tags_responses.go
new file mode 100644
index 0000000..4de718f
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_list_tags_responses.go
@@ -0,0 +1,166 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoListTagsReader is a Reader for the RepoListTags structure.
+type RepoListTagsReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoListTagsReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoListTagsOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoListTagsNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/tags] repoListTags", response, response.Code())
+	}
+}
+
+// NewRepoListTagsOK creates a RepoListTagsOK with default headers values
+func NewRepoListTagsOK() *RepoListTagsOK {
+	return &RepoListTagsOK{}
+}
+
+/*
+RepoListTagsOK describes a response with status code 200, with default header values.
+
+TagList
+*/
+type RepoListTagsOK struct {
+	Payload []*models.Tag
+}
+
+// IsSuccess returns true when this repo list tags o k response has a 2xx status code
+func (o *RepoListTagsOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo list tags o k response has a 3xx status code
+func (o *RepoListTagsOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo list tags o k response has a 4xx status code
+func (o *RepoListTagsOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo list tags o k response has a 5xx status code
+func (o *RepoListTagsOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo list tags o k response a status code equal to that given
+func (o *RepoListTagsOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo list tags o k response
+func (o *RepoListTagsOK) Code() int {
+	return 200
+}
+
+func (o *RepoListTagsOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/tags][%d] repoListTagsOK %s", 200, payload)
+}
+
+func (o *RepoListTagsOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/tags][%d] repoListTagsOK %s", 200, payload)
+}
+
+func (o *RepoListTagsOK) GetPayload() []*models.Tag {
+	return o.Payload
+}
+
+func (o *RepoListTagsOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoListTagsNotFound creates a RepoListTagsNotFound with default headers values
+func NewRepoListTagsNotFound() *RepoListTagsNotFound {
+	return &RepoListTagsNotFound{}
+}
+
+/*
+RepoListTagsNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoListTagsNotFound struct {
+}
+
+// IsSuccess returns true when this repo list tags not found response has a 2xx status code
+func (o *RepoListTagsNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo list tags not found response has a 3xx status code
+func (o *RepoListTagsNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo list tags not found response has a 4xx status code
+func (o *RepoListTagsNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo list tags not found response has a 5xx status code
+func (o *RepoListTagsNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo list tags not found response a status code equal to that given
+func (o *RepoListTagsNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo list tags not found response
+func (o *RepoListTagsNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoListTagsNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/tags][%d] repoListTagsNotFound", 404)
+}
+
+func (o *RepoListTagsNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/tags][%d] repoListTagsNotFound", 404)
+}
+
+func (o *RepoListTagsNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_list_teams_parameters.go b/bots-common/gitea-generated/client/repository/repo_list_teams_parameters.go
new file mode 100644
index 0000000..224cf5c
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_list_teams_parameters.go
@@ -0,0 +1,173 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewRepoListTeamsParams creates a new RepoListTeamsParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoListTeamsParams() *RepoListTeamsParams {
+	return &RepoListTeamsParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoListTeamsParamsWithTimeout creates a new RepoListTeamsParams object
+// with the ability to set a timeout on a request.
+func NewRepoListTeamsParamsWithTimeout(timeout time.Duration) *RepoListTeamsParams {
+	return &RepoListTeamsParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoListTeamsParamsWithContext creates a new RepoListTeamsParams object
+// with the ability to set a context for a request.
+func NewRepoListTeamsParamsWithContext(ctx context.Context) *RepoListTeamsParams {
+	return &RepoListTeamsParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoListTeamsParamsWithHTTPClient creates a new RepoListTeamsParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoListTeamsParamsWithHTTPClient(client *http.Client) *RepoListTeamsParams {
+	return &RepoListTeamsParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoListTeamsParams contains all the parameters to send to the API endpoint
+
+	for the repo list teams operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoListTeamsParams struct {
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo list teams params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoListTeamsParams) WithDefaults() *RepoListTeamsParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo list teams params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoListTeamsParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo list teams params
+func (o *RepoListTeamsParams) WithTimeout(timeout time.Duration) *RepoListTeamsParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo list teams params
+func (o *RepoListTeamsParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo list teams params
+func (o *RepoListTeamsParams) WithContext(ctx context.Context) *RepoListTeamsParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo list teams params
+func (o *RepoListTeamsParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo list teams params
+func (o *RepoListTeamsParams) WithHTTPClient(client *http.Client) *RepoListTeamsParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo list teams params
+func (o *RepoListTeamsParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithOwner adds the owner to the repo list teams params
+func (o *RepoListTeamsParams) WithOwner(owner string) *RepoListTeamsParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo list teams params
+func (o *RepoListTeamsParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo list teams params
+func (o *RepoListTeamsParams) WithRepo(repo string) *RepoListTeamsParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo list teams params
+func (o *RepoListTeamsParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoListTeamsParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_list_teams_responses.go b/bots-common/gitea-generated/client/repository/repo_list_teams_responses.go
new file mode 100644
index 0000000..8e8a133
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_list_teams_responses.go
@@ -0,0 +1,166 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoListTeamsReader is a Reader for the RepoListTeams structure.
+type RepoListTeamsReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoListTeamsReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoListTeamsOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoListTeamsNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/teams] repoListTeams", response, response.Code())
+	}
+}
+
+// NewRepoListTeamsOK creates a RepoListTeamsOK with default headers values
+func NewRepoListTeamsOK() *RepoListTeamsOK {
+	return &RepoListTeamsOK{}
+}
+
+/*
+RepoListTeamsOK describes a response with status code 200, with default header values.
+
+TeamList
+*/
+type RepoListTeamsOK struct {
+	Payload []*models.Team
+}
+
+// IsSuccess returns true when this repo list teams o k response has a 2xx status code
+func (o *RepoListTeamsOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo list teams o k response has a 3xx status code
+func (o *RepoListTeamsOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo list teams o k response has a 4xx status code
+func (o *RepoListTeamsOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo list teams o k response has a 5xx status code
+func (o *RepoListTeamsOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo list teams o k response a status code equal to that given
+func (o *RepoListTeamsOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo list teams o k response
+func (o *RepoListTeamsOK) Code() int {
+	return 200
+}
+
+func (o *RepoListTeamsOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/teams][%d] repoListTeamsOK %s", 200, payload)
+}
+
+func (o *RepoListTeamsOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/teams][%d] repoListTeamsOK %s", 200, payload)
+}
+
+func (o *RepoListTeamsOK) GetPayload() []*models.Team {
+	return o.Payload
+}
+
+func (o *RepoListTeamsOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoListTeamsNotFound creates a RepoListTeamsNotFound with default headers values
+func NewRepoListTeamsNotFound() *RepoListTeamsNotFound {
+	return &RepoListTeamsNotFound{}
+}
+
+/*
+RepoListTeamsNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoListTeamsNotFound struct {
+}
+
+// IsSuccess returns true when this repo list teams not found response has a 2xx status code
+func (o *RepoListTeamsNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo list teams not found response has a 3xx status code
+func (o *RepoListTeamsNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo list teams not found response has a 4xx status code
+func (o *RepoListTeamsNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo list teams not found response has a 5xx status code
+func (o *RepoListTeamsNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo list teams not found response a status code equal to that given
+func (o *RepoListTeamsNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo list teams not found response
+func (o *RepoListTeamsNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoListTeamsNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/teams][%d] repoListTeamsNotFound", 404)
+}
+
+func (o *RepoListTeamsNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/teams][%d] repoListTeamsNotFound", 404)
+}
+
+func (o *RepoListTeamsNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_list_topics_parameters.go b/bots-common/gitea-generated/client/repository/repo_list_topics_parameters.go
new file mode 100644
index 0000000..d628439
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_list_topics_parameters.go
@@ -0,0 +1,242 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewRepoListTopicsParams creates a new RepoListTopicsParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoListTopicsParams() *RepoListTopicsParams {
+	return &RepoListTopicsParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoListTopicsParamsWithTimeout creates a new RepoListTopicsParams object
+// with the ability to set a timeout on a request.
+func NewRepoListTopicsParamsWithTimeout(timeout time.Duration) *RepoListTopicsParams {
+	return &RepoListTopicsParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoListTopicsParamsWithContext creates a new RepoListTopicsParams object
+// with the ability to set a context for a request.
+func NewRepoListTopicsParamsWithContext(ctx context.Context) *RepoListTopicsParams {
+	return &RepoListTopicsParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoListTopicsParamsWithHTTPClient creates a new RepoListTopicsParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoListTopicsParamsWithHTTPClient(client *http.Client) *RepoListTopicsParams {
+	return &RepoListTopicsParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoListTopicsParams contains all the parameters to send to the API endpoint
+
+	for the repo list topics operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoListTopicsParams struct {
+
+	/* Limit.
+
+	   page size of results
+	*/
+	Limit *int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Page.
+
+	   page number of results to return (1-based)
+	*/
+	Page *int64
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo list topics params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoListTopicsParams) WithDefaults() *RepoListTopicsParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo list topics params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoListTopicsParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo list topics params
+func (o *RepoListTopicsParams) WithTimeout(timeout time.Duration) *RepoListTopicsParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo list topics params
+func (o *RepoListTopicsParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo list topics params
+func (o *RepoListTopicsParams) WithContext(ctx context.Context) *RepoListTopicsParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo list topics params
+func (o *RepoListTopicsParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo list topics params
+func (o *RepoListTopicsParams) WithHTTPClient(client *http.Client) *RepoListTopicsParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo list topics params
+func (o *RepoListTopicsParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithLimit adds the limit to the repo list topics params
+func (o *RepoListTopicsParams) WithLimit(limit *int64) *RepoListTopicsParams {
+	o.SetLimit(limit)
+	return o
+}
+
+// SetLimit adds the limit to the repo list topics params
+func (o *RepoListTopicsParams) SetLimit(limit *int64) {
+	o.Limit = limit
+}
+
+// WithOwner adds the owner to the repo list topics params
+func (o *RepoListTopicsParams) WithOwner(owner string) *RepoListTopicsParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo list topics params
+func (o *RepoListTopicsParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithPage adds the page to the repo list topics params
+func (o *RepoListTopicsParams) WithPage(page *int64) *RepoListTopicsParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the repo list topics params
+func (o *RepoListTopicsParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WithRepo adds the repo to the repo list topics params
+func (o *RepoListTopicsParams) WithRepo(repo string) *RepoListTopicsParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo list topics params
+func (o *RepoListTopicsParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoListTopicsParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.Limit != nil {
+
+		// query param limit
+		var qrLimit int64
+
+		if o.Limit != nil {
+			qrLimit = *o.Limit
+		}
+		qLimit := swag.FormatInt64(qrLimit)
+		if qLimit != "" {
+
+			if err := r.SetQueryParam("limit", qLimit); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_list_topics_responses.go b/bots-common/gitea-generated/client/repository/repo_list_topics_responses.go
new file mode 100644
index 0000000..6855d9c
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_list_topics_responses.go
@@ -0,0 +1,168 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoListTopicsReader is a Reader for the RepoListTopics structure.
+type RepoListTopicsReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoListTopicsReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoListTopicsOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoListTopicsNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/topics] repoListTopics", response, response.Code())
+	}
+}
+
+// NewRepoListTopicsOK creates a RepoListTopicsOK with default headers values
+func NewRepoListTopicsOK() *RepoListTopicsOK {
+	return &RepoListTopicsOK{}
+}
+
+/*
+RepoListTopicsOK describes a response with status code 200, with default header values.
+
+TopicNames
+*/
+type RepoListTopicsOK struct {
+	Payload *models.TopicName
+}
+
+// IsSuccess returns true when this repo list topics o k response has a 2xx status code
+func (o *RepoListTopicsOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo list topics o k response has a 3xx status code
+func (o *RepoListTopicsOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo list topics o k response has a 4xx status code
+func (o *RepoListTopicsOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo list topics o k response has a 5xx status code
+func (o *RepoListTopicsOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo list topics o k response a status code equal to that given
+func (o *RepoListTopicsOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo list topics o k response
+func (o *RepoListTopicsOK) Code() int {
+	return 200
+}
+
+func (o *RepoListTopicsOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/topics][%d] repoListTopicsOK %s", 200, payload)
+}
+
+func (o *RepoListTopicsOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/topics][%d] repoListTopicsOK %s", 200, payload)
+}
+
+func (o *RepoListTopicsOK) GetPayload() *models.TopicName {
+	return o.Payload
+}
+
+func (o *RepoListTopicsOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.TopicName)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoListTopicsNotFound creates a RepoListTopicsNotFound with default headers values
+func NewRepoListTopicsNotFound() *RepoListTopicsNotFound {
+	return &RepoListTopicsNotFound{}
+}
+
+/*
+RepoListTopicsNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoListTopicsNotFound struct {
+}
+
+// IsSuccess returns true when this repo list topics not found response has a 2xx status code
+func (o *RepoListTopicsNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo list topics not found response has a 3xx status code
+func (o *RepoListTopicsNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo list topics not found response has a 4xx status code
+func (o *RepoListTopicsNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo list topics not found response has a 5xx status code
+func (o *RepoListTopicsNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo list topics not found response a status code equal to that given
+func (o *RepoListTopicsNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo list topics not found response
+func (o *RepoListTopicsNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoListTopicsNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/topics][%d] repoListTopicsNotFound", 404)
+}
+
+func (o *RepoListTopicsNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/topics][%d] repoListTopicsNotFound", 404)
+}
+
+func (o *RepoListTopicsNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_merge_pull_request_parameters.go b/bots-common/gitea-generated/client/repository/repo_merge_pull_request_parameters.go
new file mode 100644
index 0000000..6bcf44b
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_merge_pull_request_parameters.go
@@ -0,0 +1,219 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewRepoMergePullRequestParams creates a new RepoMergePullRequestParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoMergePullRequestParams() *RepoMergePullRequestParams {
+	return &RepoMergePullRequestParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoMergePullRequestParamsWithTimeout creates a new RepoMergePullRequestParams object
+// with the ability to set a timeout on a request.
+func NewRepoMergePullRequestParamsWithTimeout(timeout time.Duration) *RepoMergePullRequestParams {
+	return &RepoMergePullRequestParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoMergePullRequestParamsWithContext creates a new RepoMergePullRequestParams object
+// with the ability to set a context for a request.
+func NewRepoMergePullRequestParamsWithContext(ctx context.Context) *RepoMergePullRequestParams {
+	return &RepoMergePullRequestParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoMergePullRequestParamsWithHTTPClient creates a new RepoMergePullRequestParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoMergePullRequestParamsWithHTTPClient(client *http.Client) *RepoMergePullRequestParams {
+	return &RepoMergePullRequestParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoMergePullRequestParams contains all the parameters to send to the API endpoint
+
+	for the repo merge pull request operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoMergePullRequestParams struct {
+
+	// Body.
+	Body *models.MergePullRequestForm
+
+	/* Index.
+
+	   index of the pull request to merge
+
+	   Format: int64
+	*/
+	Index int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo merge pull request params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoMergePullRequestParams) WithDefaults() *RepoMergePullRequestParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo merge pull request params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoMergePullRequestParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo merge pull request params
+func (o *RepoMergePullRequestParams) WithTimeout(timeout time.Duration) *RepoMergePullRequestParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo merge pull request params
+func (o *RepoMergePullRequestParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo merge pull request params
+func (o *RepoMergePullRequestParams) WithContext(ctx context.Context) *RepoMergePullRequestParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo merge pull request params
+func (o *RepoMergePullRequestParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo merge pull request params
+func (o *RepoMergePullRequestParams) WithHTTPClient(client *http.Client) *RepoMergePullRequestParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo merge pull request params
+func (o *RepoMergePullRequestParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the repo merge pull request params
+func (o *RepoMergePullRequestParams) WithBody(body *models.MergePullRequestForm) *RepoMergePullRequestParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the repo merge pull request params
+func (o *RepoMergePullRequestParams) SetBody(body *models.MergePullRequestForm) {
+	o.Body = body
+}
+
+// WithIndex adds the index to the repo merge pull request params
+func (o *RepoMergePullRequestParams) WithIndex(index int64) *RepoMergePullRequestParams {
+	o.SetIndex(index)
+	return o
+}
+
+// SetIndex adds the index to the repo merge pull request params
+func (o *RepoMergePullRequestParams) SetIndex(index int64) {
+	o.Index = index
+}
+
+// WithOwner adds the owner to the repo merge pull request params
+func (o *RepoMergePullRequestParams) WithOwner(owner string) *RepoMergePullRequestParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo merge pull request params
+func (o *RepoMergePullRequestParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo merge pull request params
+func (o *RepoMergePullRequestParams) WithRepo(repo string) *RepoMergePullRequestParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo merge pull request params
+func (o *RepoMergePullRequestParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoMergePullRequestParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	// path param index
+	if err := r.SetPathParam("index", swag.FormatInt64(o.Index)); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_merge_pull_request_responses.go b/bots-common/gitea-generated/client/repository/repo_merge_pull_request_responses.go
new file mode 100644
index 0000000..bfb935b
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_merge_pull_request_responses.go
@@ -0,0 +1,368 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// RepoMergePullRequestReader is a Reader for the RepoMergePullRequest structure.
+type RepoMergePullRequestReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoMergePullRequestReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoMergePullRequestOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoMergePullRequestNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 405:
+		result := NewRepoMergePullRequestMethodNotAllowed()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 409:
+		result := NewRepoMergePullRequestConflict()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 423:
+		result := NewRepoMergePullRequestLocked()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[POST /repos/{owner}/{repo}/pulls/{index}/merge] repoMergePullRequest", response, response.Code())
+	}
+}
+
+// NewRepoMergePullRequestOK creates a RepoMergePullRequestOK with default headers values
+func NewRepoMergePullRequestOK() *RepoMergePullRequestOK {
+	return &RepoMergePullRequestOK{}
+}
+
+/*
+RepoMergePullRequestOK describes a response with status code 200, with default header values.
+
+APIEmpty is an empty response
+*/
+type RepoMergePullRequestOK struct {
+}
+
+// IsSuccess returns true when this repo merge pull request o k response has a 2xx status code
+func (o *RepoMergePullRequestOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo merge pull request o k response has a 3xx status code
+func (o *RepoMergePullRequestOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo merge pull request o k response has a 4xx status code
+func (o *RepoMergePullRequestOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo merge pull request o k response has a 5xx status code
+func (o *RepoMergePullRequestOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo merge pull request o k response a status code equal to that given
+func (o *RepoMergePullRequestOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo merge pull request o k response
+func (o *RepoMergePullRequestOK) Code() int {
+	return 200
+}
+
+func (o *RepoMergePullRequestOK) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/pulls/{index}/merge][%d] repoMergePullRequestOK", 200)
+}
+
+func (o *RepoMergePullRequestOK) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/pulls/{index}/merge][%d] repoMergePullRequestOK", 200)
+}
+
+func (o *RepoMergePullRequestOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewRepoMergePullRequestNotFound creates a RepoMergePullRequestNotFound with default headers values
+func NewRepoMergePullRequestNotFound() *RepoMergePullRequestNotFound {
+	return &RepoMergePullRequestNotFound{}
+}
+
+/*
+RepoMergePullRequestNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoMergePullRequestNotFound struct {
+}
+
+// IsSuccess returns true when this repo merge pull request not found response has a 2xx status code
+func (o *RepoMergePullRequestNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo merge pull request not found response has a 3xx status code
+func (o *RepoMergePullRequestNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo merge pull request not found response has a 4xx status code
+func (o *RepoMergePullRequestNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo merge pull request not found response has a 5xx status code
+func (o *RepoMergePullRequestNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo merge pull request not found response a status code equal to that given
+func (o *RepoMergePullRequestNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo merge pull request not found response
+func (o *RepoMergePullRequestNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoMergePullRequestNotFound) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/pulls/{index}/merge][%d] repoMergePullRequestNotFound", 404)
+}
+
+func (o *RepoMergePullRequestNotFound) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/pulls/{index}/merge][%d] repoMergePullRequestNotFound", 404)
+}
+
+func (o *RepoMergePullRequestNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewRepoMergePullRequestMethodNotAllowed creates a RepoMergePullRequestMethodNotAllowed with default headers values
+func NewRepoMergePullRequestMethodNotAllowed() *RepoMergePullRequestMethodNotAllowed {
+	return &RepoMergePullRequestMethodNotAllowed{}
+}
+
+/*
+RepoMergePullRequestMethodNotAllowed describes a response with status code 405, with default header values.
+
+APIEmpty is an empty response
+*/
+type RepoMergePullRequestMethodNotAllowed struct {
+}
+
+// IsSuccess returns true when this repo merge pull request method not allowed response has a 2xx status code
+func (o *RepoMergePullRequestMethodNotAllowed) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo merge pull request method not allowed response has a 3xx status code
+func (o *RepoMergePullRequestMethodNotAllowed) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo merge pull request method not allowed response has a 4xx status code
+func (o *RepoMergePullRequestMethodNotAllowed) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo merge pull request method not allowed response has a 5xx status code
+func (o *RepoMergePullRequestMethodNotAllowed) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo merge pull request method not allowed response a status code equal to that given
+func (o *RepoMergePullRequestMethodNotAllowed) IsCode(code int) bool {
+	return code == 405
+}
+
+// Code gets the status code for the repo merge pull request method not allowed response
+func (o *RepoMergePullRequestMethodNotAllowed) Code() int {
+	return 405
+}
+
+func (o *RepoMergePullRequestMethodNotAllowed) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/pulls/{index}/merge][%d] repoMergePullRequestMethodNotAllowed", 405)
+}
+
+func (o *RepoMergePullRequestMethodNotAllowed) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/pulls/{index}/merge][%d] repoMergePullRequestMethodNotAllowed", 405)
+}
+
+func (o *RepoMergePullRequestMethodNotAllowed) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewRepoMergePullRequestConflict creates a RepoMergePullRequestConflict with default headers values
+func NewRepoMergePullRequestConflict() *RepoMergePullRequestConflict {
+	return &RepoMergePullRequestConflict{}
+}
+
+/*
+RepoMergePullRequestConflict describes a response with status code 409, with default header values.
+
+APIError is error format response
+*/
+type RepoMergePullRequestConflict struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo merge pull request conflict response has a 2xx status code
+func (o *RepoMergePullRequestConflict) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo merge pull request conflict response has a 3xx status code
+func (o *RepoMergePullRequestConflict) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo merge pull request conflict response has a 4xx status code
+func (o *RepoMergePullRequestConflict) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo merge pull request conflict response has a 5xx status code
+func (o *RepoMergePullRequestConflict) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo merge pull request conflict response a status code equal to that given
+func (o *RepoMergePullRequestConflict) IsCode(code int) bool {
+	return code == 409
+}
+
+// Code gets the status code for the repo merge pull request conflict response
+func (o *RepoMergePullRequestConflict) Code() int {
+	return 409
+}
+
+func (o *RepoMergePullRequestConflict) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/pulls/{index}/merge][%d] repoMergePullRequestConflict", 409)
+}
+
+func (o *RepoMergePullRequestConflict) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/pulls/{index}/merge][%d] repoMergePullRequestConflict", 409)
+}
+
+func (o *RepoMergePullRequestConflict) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewRepoMergePullRequestLocked creates a RepoMergePullRequestLocked with default headers values
+func NewRepoMergePullRequestLocked() *RepoMergePullRequestLocked {
+	return &RepoMergePullRequestLocked{}
+}
+
+/*
+RepoMergePullRequestLocked describes a response with status code 423, with default header values.
+
+APIRepoArchivedError is an error that is raised when an archived repo should be modified
+*/
+type RepoMergePullRequestLocked struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo merge pull request locked response has a 2xx status code
+func (o *RepoMergePullRequestLocked) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo merge pull request locked response has a 3xx status code
+func (o *RepoMergePullRequestLocked) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo merge pull request locked response has a 4xx status code
+func (o *RepoMergePullRequestLocked) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo merge pull request locked response has a 5xx status code
+func (o *RepoMergePullRequestLocked) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo merge pull request locked response a status code equal to that given
+func (o *RepoMergePullRequestLocked) IsCode(code int) bool {
+	return code == 423
+}
+
+// Code gets the status code for the repo merge pull request locked response
+func (o *RepoMergePullRequestLocked) Code() int {
+	return 423
+}
+
+func (o *RepoMergePullRequestLocked) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/pulls/{index}/merge][%d] repoMergePullRequestLocked", 423)
+}
+
+func (o *RepoMergePullRequestLocked) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/pulls/{index}/merge][%d] repoMergePullRequestLocked", 423)
+}
+
+func (o *RepoMergePullRequestLocked) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_migrate_parameters.go b/bots-common/gitea-generated/client/repository/repo_migrate_parameters.go
new file mode 100644
index 0000000..c9e9045
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_migrate_parameters.go
@@ -0,0 +1,150 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewRepoMigrateParams creates a new RepoMigrateParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoMigrateParams() *RepoMigrateParams {
+	return &RepoMigrateParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoMigrateParamsWithTimeout creates a new RepoMigrateParams object
+// with the ability to set a timeout on a request.
+func NewRepoMigrateParamsWithTimeout(timeout time.Duration) *RepoMigrateParams {
+	return &RepoMigrateParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoMigrateParamsWithContext creates a new RepoMigrateParams object
+// with the ability to set a context for a request.
+func NewRepoMigrateParamsWithContext(ctx context.Context) *RepoMigrateParams {
+	return &RepoMigrateParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoMigrateParamsWithHTTPClient creates a new RepoMigrateParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoMigrateParamsWithHTTPClient(client *http.Client) *RepoMigrateParams {
+	return &RepoMigrateParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoMigrateParams contains all the parameters to send to the API endpoint
+
+	for the repo migrate operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoMigrateParams struct {
+
+	// Body.
+	Body *models.MigrateRepoOptions
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo migrate params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoMigrateParams) WithDefaults() *RepoMigrateParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo migrate params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoMigrateParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo migrate params
+func (o *RepoMigrateParams) WithTimeout(timeout time.Duration) *RepoMigrateParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo migrate params
+func (o *RepoMigrateParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo migrate params
+func (o *RepoMigrateParams) WithContext(ctx context.Context) *RepoMigrateParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo migrate params
+func (o *RepoMigrateParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo migrate params
+func (o *RepoMigrateParams) WithHTTPClient(client *http.Client) *RepoMigrateParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo migrate params
+func (o *RepoMigrateParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the repo migrate params
+func (o *RepoMigrateParams) WithBody(body *models.MigrateRepoOptions) *RepoMigrateParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the repo migrate params
+func (o *RepoMigrateParams) SetBody(body *models.MigrateRepoOptions) {
+	o.Body = body
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoMigrateParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_migrate_responses.go b/bots-common/gitea-generated/client/repository/repo_migrate_responses.go
new file mode 100644
index 0000000..8a97abe
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_migrate_responses.go
@@ -0,0 +1,324 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoMigrateReader is a Reader for the RepoMigrate structure.
+type RepoMigrateReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoMigrateReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 201:
+		result := NewRepoMigrateCreated()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 403:
+		result := NewRepoMigrateForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 409:
+		result := NewRepoMigrateConflict()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 422:
+		result := NewRepoMigrateUnprocessableEntity()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[POST /repos/migrate] repoMigrate", response, response.Code())
+	}
+}
+
+// NewRepoMigrateCreated creates a RepoMigrateCreated with default headers values
+func NewRepoMigrateCreated() *RepoMigrateCreated {
+	return &RepoMigrateCreated{}
+}
+
+/*
+RepoMigrateCreated describes a response with status code 201, with default header values.
+
+Repository
+*/
+type RepoMigrateCreated struct {
+	Payload *models.Repository
+}
+
+// IsSuccess returns true when this repo migrate created response has a 2xx status code
+func (o *RepoMigrateCreated) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo migrate created response has a 3xx status code
+func (o *RepoMigrateCreated) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo migrate created response has a 4xx status code
+func (o *RepoMigrateCreated) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo migrate created response has a 5xx status code
+func (o *RepoMigrateCreated) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo migrate created response a status code equal to that given
+func (o *RepoMigrateCreated) IsCode(code int) bool {
+	return code == 201
+}
+
+// Code gets the status code for the repo migrate created response
+func (o *RepoMigrateCreated) Code() int {
+	return 201
+}
+
+func (o *RepoMigrateCreated) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /repos/migrate][%d] repoMigrateCreated %s", 201, payload)
+}
+
+func (o *RepoMigrateCreated) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /repos/migrate][%d] repoMigrateCreated %s", 201, payload)
+}
+
+func (o *RepoMigrateCreated) GetPayload() *models.Repository {
+	return o.Payload
+}
+
+func (o *RepoMigrateCreated) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.Repository)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoMigrateForbidden creates a RepoMigrateForbidden with default headers values
+func NewRepoMigrateForbidden() *RepoMigrateForbidden {
+	return &RepoMigrateForbidden{}
+}
+
+/*
+RepoMigrateForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type RepoMigrateForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo migrate forbidden response has a 2xx status code
+func (o *RepoMigrateForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo migrate forbidden response has a 3xx status code
+func (o *RepoMigrateForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo migrate forbidden response has a 4xx status code
+func (o *RepoMigrateForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo migrate forbidden response has a 5xx status code
+func (o *RepoMigrateForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo migrate forbidden response a status code equal to that given
+func (o *RepoMigrateForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the repo migrate forbidden response
+func (o *RepoMigrateForbidden) Code() int {
+	return 403
+}
+
+func (o *RepoMigrateForbidden) Error() string {
+	return fmt.Sprintf("[POST /repos/migrate][%d] repoMigrateForbidden", 403)
+}
+
+func (o *RepoMigrateForbidden) String() string {
+	return fmt.Sprintf("[POST /repos/migrate][%d] repoMigrateForbidden", 403)
+}
+
+func (o *RepoMigrateForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewRepoMigrateConflict creates a RepoMigrateConflict with default headers values
+func NewRepoMigrateConflict() *RepoMigrateConflict {
+	return &RepoMigrateConflict{}
+}
+
+/*
+RepoMigrateConflict describes a response with status code 409, with default header values.
+
+The repository with the same name already exists.
+*/
+type RepoMigrateConflict struct {
+}
+
+// IsSuccess returns true when this repo migrate conflict response has a 2xx status code
+func (o *RepoMigrateConflict) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo migrate conflict response has a 3xx status code
+func (o *RepoMigrateConflict) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo migrate conflict response has a 4xx status code
+func (o *RepoMigrateConflict) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo migrate conflict response has a 5xx status code
+func (o *RepoMigrateConflict) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo migrate conflict response a status code equal to that given
+func (o *RepoMigrateConflict) IsCode(code int) bool {
+	return code == 409
+}
+
+// Code gets the status code for the repo migrate conflict response
+func (o *RepoMigrateConflict) Code() int {
+	return 409
+}
+
+func (o *RepoMigrateConflict) Error() string {
+	return fmt.Sprintf("[POST /repos/migrate][%d] repoMigrateConflict", 409)
+}
+
+func (o *RepoMigrateConflict) String() string {
+	return fmt.Sprintf("[POST /repos/migrate][%d] repoMigrateConflict", 409)
+}
+
+func (o *RepoMigrateConflict) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewRepoMigrateUnprocessableEntity creates a RepoMigrateUnprocessableEntity with default headers values
+func NewRepoMigrateUnprocessableEntity() *RepoMigrateUnprocessableEntity {
+	return &RepoMigrateUnprocessableEntity{}
+}
+
+/*
+RepoMigrateUnprocessableEntity describes a response with status code 422, with default header values.
+
+APIValidationError is error format response related to input validation
+*/
+type RepoMigrateUnprocessableEntity struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo migrate unprocessable entity response has a 2xx status code
+func (o *RepoMigrateUnprocessableEntity) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo migrate unprocessable entity response has a 3xx status code
+func (o *RepoMigrateUnprocessableEntity) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo migrate unprocessable entity response has a 4xx status code
+func (o *RepoMigrateUnprocessableEntity) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo migrate unprocessable entity response has a 5xx status code
+func (o *RepoMigrateUnprocessableEntity) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo migrate unprocessable entity response a status code equal to that given
+func (o *RepoMigrateUnprocessableEntity) IsCode(code int) bool {
+	return code == 422
+}
+
+// Code gets the status code for the repo migrate unprocessable entity response
+func (o *RepoMigrateUnprocessableEntity) Code() int {
+	return 422
+}
+
+func (o *RepoMigrateUnprocessableEntity) Error() string {
+	return fmt.Sprintf("[POST /repos/migrate][%d] repoMigrateUnprocessableEntity", 422)
+}
+
+func (o *RepoMigrateUnprocessableEntity) String() string {
+	return fmt.Sprintf("[POST /repos/migrate][%d] repoMigrateUnprocessableEntity", 422)
+}
+
+func (o *RepoMigrateUnprocessableEntity) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_mirror_sync_parameters.go b/bots-common/gitea-generated/client/repository/repo_mirror_sync_parameters.go
new file mode 100644
index 0000000..d0f8e87
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_mirror_sync_parameters.go
@@ -0,0 +1,173 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewRepoMirrorSyncParams creates a new RepoMirrorSyncParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoMirrorSyncParams() *RepoMirrorSyncParams {
+	return &RepoMirrorSyncParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoMirrorSyncParamsWithTimeout creates a new RepoMirrorSyncParams object
+// with the ability to set a timeout on a request.
+func NewRepoMirrorSyncParamsWithTimeout(timeout time.Duration) *RepoMirrorSyncParams {
+	return &RepoMirrorSyncParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoMirrorSyncParamsWithContext creates a new RepoMirrorSyncParams object
+// with the ability to set a context for a request.
+func NewRepoMirrorSyncParamsWithContext(ctx context.Context) *RepoMirrorSyncParams {
+	return &RepoMirrorSyncParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoMirrorSyncParamsWithHTTPClient creates a new RepoMirrorSyncParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoMirrorSyncParamsWithHTTPClient(client *http.Client) *RepoMirrorSyncParams {
+	return &RepoMirrorSyncParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoMirrorSyncParams contains all the parameters to send to the API endpoint
+
+	for the repo mirror sync operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoMirrorSyncParams struct {
+
+	/* Owner.
+
+	   owner of the repo to sync
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo to sync
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo mirror sync params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoMirrorSyncParams) WithDefaults() *RepoMirrorSyncParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo mirror sync params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoMirrorSyncParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo mirror sync params
+func (o *RepoMirrorSyncParams) WithTimeout(timeout time.Duration) *RepoMirrorSyncParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo mirror sync params
+func (o *RepoMirrorSyncParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo mirror sync params
+func (o *RepoMirrorSyncParams) WithContext(ctx context.Context) *RepoMirrorSyncParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo mirror sync params
+func (o *RepoMirrorSyncParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo mirror sync params
+func (o *RepoMirrorSyncParams) WithHTTPClient(client *http.Client) *RepoMirrorSyncParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo mirror sync params
+func (o *RepoMirrorSyncParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithOwner adds the owner to the repo mirror sync params
+func (o *RepoMirrorSyncParams) WithOwner(owner string) *RepoMirrorSyncParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo mirror sync params
+func (o *RepoMirrorSyncParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo mirror sync params
+func (o *RepoMirrorSyncParams) WithRepo(repo string) *RepoMirrorSyncParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo mirror sync params
+func (o *RepoMirrorSyncParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoMirrorSyncParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_mirror_sync_responses.go b/bots-common/gitea-generated/client/repository/repo_mirror_sync_responses.go
new file mode 100644
index 0000000..3aaadcf
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_mirror_sync_responses.go
@@ -0,0 +1,228 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// RepoMirrorSyncReader is a Reader for the RepoMirrorSync structure.
+type RepoMirrorSyncReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoMirrorSyncReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoMirrorSyncOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 403:
+		result := NewRepoMirrorSyncForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewRepoMirrorSyncNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[POST /repos/{owner}/{repo}/mirror-sync] repoMirrorSync", response, response.Code())
+	}
+}
+
+// NewRepoMirrorSyncOK creates a RepoMirrorSyncOK with default headers values
+func NewRepoMirrorSyncOK() *RepoMirrorSyncOK {
+	return &RepoMirrorSyncOK{}
+}
+
+/*
+RepoMirrorSyncOK describes a response with status code 200, with default header values.
+
+APIEmpty is an empty response
+*/
+type RepoMirrorSyncOK struct {
+}
+
+// IsSuccess returns true when this repo mirror sync o k response has a 2xx status code
+func (o *RepoMirrorSyncOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo mirror sync o k response has a 3xx status code
+func (o *RepoMirrorSyncOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo mirror sync o k response has a 4xx status code
+func (o *RepoMirrorSyncOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo mirror sync o k response has a 5xx status code
+func (o *RepoMirrorSyncOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo mirror sync o k response a status code equal to that given
+func (o *RepoMirrorSyncOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo mirror sync o k response
+func (o *RepoMirrorSyncOK) Code() int {
+	return 200
+}
+
+func (o *RepoMirrorSyncOK) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/mirror-sync][%d] repoMirrorSyncOK", 200)
+}
+
+func (o *RepoMirrorSyncOK) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/mirror-sync][%d] repoMirrorSyncOK", 200)
+}
+
+func (o *RepoMirrorSyncOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewRepoMirrorSyncForbidden creates a RepoMirrorSyncForbidden with default headers values
+func NewRepoMirrorSyncForbidden() *RepoMirrorSyncForbidden {
+	return &RepoMirrorSyncForbidden{}
+}
+
+/*
+RepoMirrorSyncForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type RepoMirrorSyncForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo mirror sync forbidden response has a 2xx status code
+func (o *RepoMirrorSyncForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo mirror sync forbidden response has a 3xx status code
+func (o *RepoMirrorSyncForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo mirror sync forbidden response has a 4xx status code
+func (o *RepoMirrorSyncForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo mirror sync forbidden response has a 5xx status code
+func (o *RepoMirrorSyncForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo mirror sync forbidden response a status code equal to that given
+func (o *RepoMirrorSyncForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the repo mirror sync forbidden response
+func (o *RepoMirrorSyncForbidden) Code() int {
+	return 403
+}
+
+func (o *RepoMirrorSyncForbidden) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/mirror-sync][%d] repoMirrorSyncForbidden", 403)
+}
+
+func (o *RepoMirrorSyncForbidden) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/mirror-sync][%d] repoMirrorSyncForbidden", 403)
+}
+
+func (o *RepoMirrorSyncForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewRepoMirrorSyncNotFound creates a RepoMirrorSyncNotFound with default headers values
+func NewRepoMirrorSyncNotFound() *RepoMirrorSyncNotFound {
+	return &RepoMirrorSyncNotFound{}
+}
+
+/*
+RepoMirrorSyncNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoMirrorSyncNotFound struct {
+}
+
+// IsSuccess returns true when this repo mirror sync not found response has a 2xx status code
+func (o *RepoMirrorSyncNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo mirror sync not found response has a 3xx status code
+func (o *RepoMirrorSyncNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo mirror sync not found response has a 4xx status code
+func (o *RepoMirrorSyncNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo mirror sync not found response has a 5xx status code
+func (o *RepoMirrorSyncNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo mirror sync not found response a status code equal to that given
+func (o *RepoMirrorSyncNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo mirror sync not found response
+func (o *RepoMirrorSyncNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoMirrorSyncNotFound) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/mirror-sync][%d] repoMirrorSyncNotFound", 404)
+}
+
+func (o *RepoMirrorSyncNotFound) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/mirror-sync][%d] repoMirrorSyncNotFound", 404)
+}
+
+func (o *RepoMirrorSyncNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_new_pin_allowed_parameters.go b/bots-common/gitea-generated/client/repository/repo_new_pin_allowed_parameters.go
new file mode 100644
index 0000000..fe2ba72
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_new_pin_allowed_parameters.go
@@ -0,0 +1,173 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewRepoNewPinAllowedParams creates a new RepoNewPinAllowedParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoNewPinAllowedParams() *RepoNewPinAllowedParams {
+	return &RepoNewPinAllowedParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoNewPinAllowedParamsWithTimeout creates a new RepoNewPinAllowedParams object
+// with the ability to set a timeout on a request.
+func NewRepoNewPinAllowedParamsWithTimeout(timeout time.Duration) *RepoNewPinAllowedParams {
+	return &RepoNewPinAllowedParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoNewPinAllowedParamsWithContext creates a new RepoNewPinAllowedParams object
+// with the ability to set a context for a request.
+func NewRepoNewPinAllowedParamsWithContext(ctx context.Context) *RepoNewPinAllowedParams {
+	return &RepoNewPinAllowedParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoNewPinAllowedParamsWithHTTPClient creates a new RepoNewPinAllowedParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoNewPinAllowedParamsWithHTTPClient(client *http.Client) *RepoNewPinAllowedParams {
+	return &RepoNewPinAllowedParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoNewPinAllowedParams contains all the parameters to send to the API endpoint
+
+	for the repo new pin allowed operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoNewPinAllowedParams struct {
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo new pin allowed params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoNewPinAllowedParams) WithDefaults() *RepoNewPinAllowedParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo new pin allowed params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoNewPinAllowedParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo new pin allowed params
+func (o *RepoNewPinAllowedParams) WithTimeout(timeout time.Duration) *RepoNewPinAllowedParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo new pin allowed params
+func (o *RepoNewPinAllowedParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo new pin allowed params
+func (o *RepoNewPinAllowedParams) WithContext(ctx context.Context) *RepoNewPinAllowedParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo new pin allowed params
+func (o *RepoNewPinAllowedParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo new pin allowed params
+func (o *RepoNewPinAllowedParams) WithHTTPClient(client *http.Client) *RepoNewPinAllowedParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo new pin allowed params
+func (o *RepoNewPinAllowedParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithOwner adds the owner to the repo new pin allowed params
+func (o *RepoNewPinAllowedParams) WithOwner(owner string) *RepoNewPinAllowedParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo new pin allowed params
+func (o *RepoNewPinAllowedParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo new pin allowed params
+func (o *RepoNewPinAllowedParams) WithRepo(repo string) *RepoNewPinAllowedParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo new pin allowed params
+func (o *RepoNewPinAllowedParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoNewPinAllowedParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_new_pin_allowed_responses.go b/bots-common/gitea-generated/client/repository/repo_new_pin_allowed_responses.go
new file mode 100644
index 0000000..f90186e
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_new_pin_allowed_responses.go
@@ -0,0 +1,168 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoNewPinAllowedReader is a Reader for the RepoNewPinAllowed structure.
+type RepoNewPinAllowedReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoNewPinAllowedReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoNewPinAllowedOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoNewPinAllowedNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/new_pin_allowed] repoNewPinAllowed", response, response.Code())
+	}
+}
+
+// NewRepoNewPinAllowedOK creates a RepoNewPinAllowedOK with default headers values
+func NewRepoNewPinAllowedOK() *RepoNewPinAllowedOK {
+	return &RepoNewPinAllowedOK{}
+}
+
+/*
+RepoNewPinAllowedOK describes a response with status code 200, with default header values.
+
+RepoNewIssuePinsAllowed
+*/
+type RepoNewPinAllowedOK struct {
+	Payload *models.NewIssuePinsAllowed
+}
+
+// IsSuccess returns true when this repo new pin allowed o k response has a 2xx status code
+func (o *RepoNewPinAllowedOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo new pin allowed o k response has a 3xx status code
+func (o *RepoNewPinAllowedOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo new pin allowed o k response has a 4xx status code
+func (o *RepoNewPinAllowedOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo new pin allowed o k response has a 5xx status code
+func (o *RepoNewPinAllowedOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo new pin allowed o k response a status code equal to that given
+func (o *RepoNewPinAllowedOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo new pin allowed o k response
+func (o *RepoNewPinAllowedOK) Code() int {
+	return 200
+}
+
+func (o *RepoNewPinAllowedOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/new_pin_allowed][%d] repoNewPinAllowedOK %s", 200, payload)
+}
+
+func (o *RepoNewPinAllowedOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/new_pin_allowed][%d] repoNewPinAllowedOK %s", 200, payload)
+}
+
+func (o *RepoNewPinAllowedOK) GetPayload() *models.NewIssuePinsAllowed {
+	return o.Payload
+}
+
+func (o *RepoNewPinAllowedOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.NewIssuePinsAllowed)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoNewPinAllowedNotFound creates a RepoNewPinAllowedNotFound with default headers values
+func NewRepoNewPinAllowedNotFound() *RepoNewPinAllowedNotFound {
+	return &RepoNewPinAllowedNotFound{}
+}
+
+/*
+RepoNewPinAllowedNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoNewPinAllowedNotFound struct {
+}
+
+// IsSuccess returns true when this repo new pin allowed not found response has a 2xx status code
+func (o *RepoNewPinAllowedNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo new pin allowed not found response has a 3xx status code
+func (o *RepoNewPinAllowedNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo new pin allowed not found response has a 4xx status code
+func (o *RepoNewPinAllowedNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo new pin allowed not found response has a 5xx status code
+func (o *RepoNewPinAllowedNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo new pin allowed not found response a status code equal to that given
+func (o *RepoNewPinAllowedNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo new pin allowed not found response
+func (o *RepoNewPinAllowedNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoNewPinAllowedNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/new_pin_allowed][%d] repoNewPinAllowedNotFound", 404)
+}
+
+func (o *RepoNewPinAllowedNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/new_pin_allowed][%d] repoNewPinAllowedNotFound", 404)
+}
+
+func (o *RepoNewPinAllowedNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_pull_request_is_merged_parameters.go b/bots-common/gitea-generated/client/repository/repo_pull_request_is_merged_parameters.go
new file mode 100644
index 0000000..b7777f8
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_pull_request_is_merged_parameters.go
@@ -0,0 +1,198 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewRepoPullRequestIsMergedParams creates a new RepoPullRequestIsMergedParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoPullRequestIsMergedParams() *RepoPullRequestIsMergedParams {
+	return &RepoPullRequestIsMergedParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoPullRequestIsMergedParamsWithTimeout creates a new RepoPullRequestIsMergedParams object
+// with the ability to set a timeout on a request.
+func NewRepoPullRequestIsMergedParamsWithTimeout(timeout time.Duration) *RepoPullRequestIsMergedParams {
+	return &RepoPullRequestIsMergedParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoPullRequestIsMergedParamsWithContext creates a new RepoPullRequestIsMergedParams object
+// with the ability to set a context for a request.
+func NewRepoPullRequestIsMergedParamsWithContext(ctx context.Context) *RepoPullRequestIsMergedParams {
+	return &RepoPullRequestIsMergedParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoPullRequestIsMergedParamsWithHTTPClient creates a new RepoPullRequestIsMergedParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoPullRequestIsMergedParamsWithHTTPClient(client *http.Client) *RepoPullRequestIsMergedParams {
+	return &RepoPullRequestIsMergedParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoPullRequestIsMergedParams contains all the parameters to send to the API endpoint
+
+	for the repo pull request is merged operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoPullRequestIsMergedParams struct {
+
+	/* Index.
+
+	   index of the pull request
+
+	   Format: int64
+	*/
+	Index int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo pull request is merged params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoPullRequestIsMergedParams) WithDefaults() *RepoPullRequestIsMergedParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo pull request is merged params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoPullRequestIsMergedParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo pull request is merged params
+func (o *RepoPullRequestIsMergedParams) WithTimeout(timeout time.Duration) *RepoPullRequestIsMergedParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo pull request is merged params
+func (o *RepoPullRequestIsMergedParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo pull request is merged params
+func (o *RepoPullRequestIsMergedParams) WithContext(ctx context.Context) *RepoPullRequestIsMergedParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo pull request is merged params
+func (o *RepoPullRequestIsMergedParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo pull request is merged params
+func (o *RepoPullRequestIsMergedParams) WithHTTPClient(client *http.Client) *RepoPullRequestIsMergedParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo pull request is merged params
+func (o *RepoPullRequestIsMergedParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithIndex adds the index to the repo pull request is merged params
+func (o *RepoPullRequestIsMergedParams) WithIndex(index int64) *RepoPullRequestIsMergedParams {
+	o.SetIndex(index)
+	return o
+}
+
+// SetIndex adds the index to the repo pull request is merged params
+func (o *RepoPullRequestIsMergedParams) SetIndex(index int64) {
+	o.Index = index
+}
+
+// WithOwner adds the owner to the repo pull request is merged params
+func (o *RepoPullRequestIsMergedParams) WithOwner(owner string) *RepoPullRequestIsMergedParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo pull request is merged params
+func (o *RepoPullRequestIsMergedParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo pull request is merged params
+func (o *RepoPullRequestIsMergedParams) WithRepo(repo string) *RepoPullRequestIsMergedParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo pull request is merged params
+func (o *RepoPullRequestIsMergedParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoPullRequestIsMergedParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param index
+	if err := r.SetPathParam("index", swag.FormatInt64(o.Index)); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_pull_request_is_merged_responses.go b/bots-common/gitea-generated/client/repository/repo_pull_request_is_merged_responses.go
new file mode 100644
index 0000000..0c695ee
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_pull_request_is_merged_responses.go
@@ -0,0 +1,150 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// RepoPullRequestIsMergedReader is a Reader for the RepoPullRequestIsMerged structure.
+type RepoPullRequestIsMergedReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoPullRequestIsMergedReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewRepoPullRequestIsMergedNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoPullRequestIsMergedNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/pulls/{index}/merge] repoPullRequestIsMerged", response, response.Code())
+	}
+}
+
+// NewRepoPullRequestIsMergedNoContent creates a RepoPullRequestIsMergedNoContent with default headers values
+func NewRepoPullRequestIsMergedNoContent() *RepoPullRequestIsMergedNoContent {
+	return &RepoPullRequestIsMergedNoContent{}
+}
+
+/*
+RepoPullRequestIsMergedNoContent describes a response with status code 204, with default header values.
+
+pull request has been merged
+*/
+type RepoPullRequestIsMergedNoContent struct {
+}
+
+// IsSuccess returns true when this repo pull request is merged no content response has a 2xx status code
+func (o *RepoPullRequestIsMergedNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo pull request is merged no content response has a 3xx status code
+func (o *RepoPullRequestIsMergedNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo pull request is merged no content response has a 4xx status code
+func (o *RepoPullRequestIsMergedNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo pull request is merged no content response has a 5xx status code
+func (o *RepoPullRequestIsMergedNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo pull request is merged no content response a status code equal to that given
+func (o *RepoPullRequestIsMergedNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the repo pull request is merged no content response
+func (o *RepoPullRequestIsMergedNoContent) Code() int {
+	return 204
+}
+
+func (o *RepoPullRequestIsMergedNoContent) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/pulls/{index}/merge][%d] repoPullRequestIsMergedNoContent", 204)
+}
+
+func (o *RepoPullRequestIsMergedNoContent) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/pulls/{index}/merge][%d] repoPullRequestIsMergedNoContent", 204)
+}
+
+func (o *RepoPullRequestIsMergedNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewRepoPullRequestIsMergedNotFound creates a RepoPullRequestIsMergedNotFound with default headers values
+func NewRepoPullRequestIsMergedNotFound() *RepoPullRequestIsMergedNotFound {
+	return &RepoPullRequestIsMergedNotFound{}
+}
+
+/*
+RepoPullRequestIsMergedNotFound describes a response with status code 404, with default header values.
+
+pull request has not been merged
+*/
+type RepoPullRequestIsMergedNotFound struct {
+}
+
+// IsSuccess returns true when this repo pull request is merged not found response has a 2xx status code
+func (o *RepoPullRequestIsMergedNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo pull request is merged not found response has a 3xx status code
+func (o *RepoPullRequestIsMergedNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo pull request is merged not found response has a 4xx status code
+func (o *RepoPullRequestIsMergedNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo pull request is merged not found response has a 5xx status code
+func (o *RepoPullRequestIsMergedNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo pull request is merged not found response a status code equal to that given
+func (o *RepoPullRequestIsMergedNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo pull request is merged not found response
+func (o *RepoPullRequestIsMergedNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoPullRequestIsMergedNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/pulls/{index}/merge][%d] repoPullRequestIsMergedNotFound", 404)
+}
+
+func (o *RepoPullRequestIsMergedNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/pulls/{index}/merge][%d] repoPullRequestIsMergedNotFound", 404)
+}
+
+func (o *RepoPullRequestIsMergedNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_push_mirror_sync_parameters.go b/bots-common/gitea-generated/client/repository/repo_push_mirror_sync_parameters.go
new file mode 100644
index 0000000..934e983
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_push_mirror_sync_parameters.go
@@ -0,0 +1,173 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewRepoPushMirrorSyncParams creates a new RepoPushMirrorSyncParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoPushMirrorSyncParams() *RepoPushMirrorSyncParams {
+	return &RepoPushMirrorSyncParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoPushMirrorSyncParamsWithTimeout creates a new RepoPushMirrorSyncParams object
+// with the ability to set a timeout on a request.
+func NewRepoPushMirrorSyncParamsWithTimeout(timeout time.Duration) *RepoPushMirrorSyncParams {
+	return &RepoPushMirrorSyncParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoPushMirrorSyncParamsWithContext creates a new RepoPushMirrorSyncParams object
+// with the ability to set a context for a request.
+func NewRepoPushMirrorSyncParamsWithContext(ctx context.Context) *RepoPushMirrorSyncParams {
+	return &RepoPushMirrorSyncParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoPushMirrorSyncParamsWithHTTPClient creates a new RepoPushMirrorSyncParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoPushMirrorSyncParamsWithHTTPClient(client *http.Client) *RepoPushMirrorSyncParams {
+	return &RepoPushMirrorSyncParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoPushMirrorSyncParams contains all the parameters to send to the API endpoint
+
+	for the repo push mirror sync operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoPushMirrorSyncParams struct {
+
+	/* Owner.
+
+	   owner of the repo to sync
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo to sync
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo push mirror sync params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoPushMirrorSyncParams) WithDefaults() *RepoPushMirrorSyncParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo push mirror sync params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoPushMirrorSyncParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo push mirror sync params
+func (o *RepoPushMirrorSyncParams) WithTimeout(timeout time.Duration) *RepoPushMirrorSyncParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo push mirror sync params
+func (o *RepoPushMirrorSyncParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo push mirror sync params
+func (o *RepoPushMirrorSyncParams) WithContext(ctx context.Context) *RepoPushMirrorSyncParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo push mirror sync params
+func (o *RepoPushMirrorSyncParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo push mirror sync params
+func (o *RepoPushMirrorSyncParams) WithHTTPClient(client *http.Client) *RepoPushMirrorSyncParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo push mirror sync params
+func (o *RepoPushMirrorSyncParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithOwner adds the owner to the repo push mirror sync params
+func (o *RepoPushMirrorSyncParams) WithOwner(owner string) *RepoPushMirrorSyncParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo push mirror sync params
+func (o *RepoPushMirrorSyncParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo push mirror sync params
+func (o *RepoPushMirrorSyncParams) WithRepo(repo string) *RepoPushMirrorSyncParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo push mirror sync params
+func (o *RepoPushMirrorSyncParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoPushMirrorSyncParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_push_mirror_sync_responses.go b/bots-common/gitea-generated/client/repository/repo_push_mirror_sync_responses.go
new file mode 100644
index 0000000..1d2a962
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_push_mirror_sync_responses.go
@@ -0,0 +1,306 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// RepoPushMirrorSyncReader is a Reader for the RepoPushMirrorSync structure.
+type RepoPushMirrorSyncReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoPushMirrorSyncReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoPushMirrorSyncOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 400:
+		result := NewRepoPushMirrorSyncBadRequest()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 403:
+		result := NewRepoPushMirrorSyncForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewRepoPushMirrorSyncNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[POST /repos/{owner}/{repo}/push_mirrors-sync] repoPushMirrorSync", response, response.Code())
+	}
+}
+
+// NewRepoPushMirrorSyncOK creates a RepoPushMirrorSyncOK with default headers values
+func NewRepoPushMirrorSyncOK() *RepoPushMirrorSyncOK {
+	return &RepoPushMirrorSyncOK{}
+}
+
+/*
+RepoPushMirrorSyncOK describes a response with status code 200, with default header values.
+
+APIEmpty is an empty response
+*/
+type RepoPushMirrorSyncOK struct {
+}
+
+// IsSuccess returns true when this repo push mirror sync o k response has a 2xx status code
+func (o *RepoPushMirrorSyncOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo push mirror sync o k response has a 3xx status code
+func (o *RepoPushMirrorSyncOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo push mirror sync o k response has a 4xx status code
+func (o *RepoPushMirrorSyncOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo push mirror sync o k response has a 5xx status code
+func (o *RepoPushMirrorSyncOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo push mirror sync o k response a status code equal to that given
+func (o *RepoPushMirrorSyncOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo push mirror sync o k response
+func (o *RepoPushMirrorSyncOK) Code() int {
+	return 200
+}
+
+func (o *RepoPushMirrorSyncOK) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/push_mirrors-sync][%d] repoPushMirrorSyncOK", 200)
+}
+
+func (o *RepoPushMirrorSyncOK) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/push_mirrors-sync][%d] repoPushMirrorSyncOK", 200)
+}
+
+func (o *RepoPushMirrorSyncOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewRepoPushMirrorSyncBadRequest creates a RepoPushMirrorSyncBadRequest with default headers values
+func NewRepoPushMirrorSyncBadRequest() *RepoPushMirrorSyncBadRequest {
+	return &RepoPushMirrorSyncBadRequest{}
+}
+
+/*
+RepoPushMirrorSyncBadRequest describes a response with status code 400, with default header values.
+
+APIError is error format response
+*/
+type RepoPushMirrorSyncBadRequest struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo push mirror sync bad request response has a 2xx status code
+func (o *RepoPushMirrorSyncBadRequest) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo push mirror sync bad request response has a 3xx status code
+func (o *RepoPushMirrorSyncBadRequest) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo push mirror sync bad request response has a 4xx status code
+func (o *RepoPushMirrorSyncBadRequest) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo push mirror sync bad request response has a 5xx status code
+func (o *RepoPushMirrorSyncBadRequest) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo push mirror sync bad request response a status code equal to that given
+func (o *RepoPushMirrorSyncBadRequest) IsCode(code int) bool {
+	return code == 400
+}
+
+// Code gets the status code for the repo push mirror sync bad request response
+func (o *RepoPushMirrorSyncBadRequest) Code() int {
+	return 400
+}
+
+func (o *RepoPushMirrorSyncBadRequest) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/push_mirrors-sync][%d] repoPushMirrorSyncBadRequest", 400)
+}
+
+func (o *RepoPushMirrorSyncBadRequest) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/push_mirrors-sync][%d] repoPushMirrorSyncBadRequest", 400)
+}
+
+func (o *RepoPushMirrorSyncBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewRepoPushMirrorSyncForbidden creates a RepoPushMirrorSyncForbidden with default headers values
+func NewRepoPushMirrorSyncForbidden() *RepoPushMirrorSyncForbidden {
+	return &RepoPushMirrorSyncForbidden{}
+}
+
+/*
+RepoPushMirrorSyncForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type RepoPushMirrorSyncForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo push mirror sync forbidden response has a 2xx status code
+func (o *RepoPushMirrorSyncForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo push mirror sync forbidden response has a 3xx status code
+func (o *RepoPushMirrorSyncForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo push mirror sync forbidden response has a 4xx status code
+func (o *RepoPushMirrorSyncForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo push mirror sync forbidden response has a 5xx status code
+func (o *RepoPushMirrorSyncForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo push mirror sync forbidden response a status code equal to that given
+func (o *RepoPushMirrorSyncForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the repo push mirror sync forbidden response
+func (o *RepoPushMirrorSyncForbidden) Code() int {
+	return 403
+}
+
+func (o *RepoPushMirrorSyncForbidden) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/push_mirrors-sync][%d] repoPushMirrorSyncForbidden", 403)
+}
+
+func (o *RepoPushMirrorSyncForbidden) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/push_mirrors-sync][%d] repoPushMirrorSyncForbidden", 403)
+}
+
+func (o *RepoPushMirrorSyncForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewRepoPushMirrorSyncNotFound creates a RepoPushMirrorSyncNotFound with default headers values
+func NewRepoPushMirrorSyncNotFound() *RepoPushMirrorSyncNotFound {
+	return &RepoPushMirrorSyncNotFound{}
+}
+
+/*
+RepoPushMirrorSyncNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoPushMirrorSyncNotFound struct {
+}
+
+// IsSuccess returns true when this repo push mirror sync not found response has a 2xx status code
+func (o *RepoPushMirrorSyncNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo push mirror sync not found response has a 3xx status code
+func (o *RepoPushMirrorSyncNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo push mirror sync not found response has a 4xx status code
+func (o *RepoPushMirrorSyncNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo push mirror sync not found response has a 5xx status code
+func (o *RepoPushMirrorSyncNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo push mirror sync not found response a status code equal to that given
+func (o *RepoPushMirrorSyncNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo push mirror sync not found response
+func (o *RepoPushMirrorSyncNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoPushMirrorSyncNotFound) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/push_mirrors-sync][%d] repoPushMirrorSyncNotFound", 404)
+}
+
+func (o *RepoPushMirrorSyncNotFound) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/push_mirrors-sync][%d] repoPushMirrorSyncNotFound", 404)
+}
+
+func (o *RepoPushMirrorSyncNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_search_parameters.go b/bots-common/gitea-generated/client/repository/repo_search_parameters.go
new file mode 100644
index 0000000..7ce9c27
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_search_parameters.go
@@ -0,0 +1,716 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewRepoSearchParams creates a new RepoSearchParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoSearchParams() *RepoSearchParams {
+	return &RepoSearchParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoSearchParamsWithTimeout creates a new RepoSearchParams object
+// with the ability to set a timeout on a request.
+func NewRepoSearchParamsWithTimeout(timeout time.Duration) *RepoSearchParams {
+	return &RepoSearchParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoSearchParamsWithContext creates a new RepoSearchParams object
+// with the ability to set a context for a request.
+func NewRepoSearchParamsWithContext(ctx context.Context) *RepoSearchParams {
+	return &RepoSearchParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoSearchParamsWithHTTPClient creates a new RepoSearchParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoSearchParamsWithHTTPClient(client *http.Client) *RepoSearchParams {
+	return &RepoSearchParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoSearchParams contains all the parameters to send to the API endpoint
+
+	for the repo search operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoSearchParams struct {
+
+	/* Archived.
+
+	   show only archived, non-archived or all repositories (defaults to all)
+	*/
+	Archived *bool
+
+	/* Exclusive.
+
+	   if `uid` is given, search only for repos that the user owns
+	*/
+	Exclusive *bool
+
+	/* IncludeDesc.
+
+	   include search of keyword within repository description
+	*/
+	IncludeDesc *bool
+
+	/* IsPrivate.
+
+	   show only pubic, private or all repositories (defaults to all)
+	*/
+	IsPrivate *bool
+
+	/* Limit.
+
+	   page size of results
+	*/
+	Limit *int64
+
+	/* Mode.
+
+	   type of repository to search for. Supported values are "fork", "source", "mirror" and "collaborative"
+	*/
+	Mode *string
+
+	/* Order.
+
+	   sort order, either "asc" (ascending) or "desc" (descending). Default is "asc", ignored if "sort" is not specified.
+	*/
+	Order *string
+
+	/* Page.
+
+	   page number of results to return (1-based)
+	*/
+	Page *int64
+
+	/* PriorityOwnerID.
+
+	   repo owner to prioritize in the results
+
+	   Format: int64
+	*/
+	PriorityOwnerID *int64
+
+	/* Private.
+
+	   include private repositories this user has access to (defaults to true)
+	*/
+	Private *bool
+
+	/* Q.
+
+	   keyword
+	*/
+	Q *string
+
+	/* Sort.
+
+	   sort repos by attribute. Supported values are "alpha", "created", "updated", "size", and "id". Default is "alpha"
+	*/
+	Sort *string
+
+	/* StarredBy.
+
+	   search only for repos that the user with the given id has starred
+
+	   Format: int64
+	*/
+	StarredBy *int64
+
+	/* TeamID.
+
+	   search only for repos that belong to the given team id
+
+	   Format: int64
+	*/
+	TeamID *int64
+
+	/* Template.
+
+	   include template repositories this user has access to (defaults to true)
+	*/
+	Template *bool
+
+	/* Topic.
+
+	   Limit search to repositories with keyword as topic
+	*/
+	Topic *bool
+
+	/* UID.
+
+	   search only for repos that the user with the given id owns or contributes to
+
+	   Format: int64
+	*/
+	UID *int64
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo search params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoSearchParams) WithDefaults() *RepoSearchParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo search params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoSearchParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo search params
+func (o *RepoSearchParams) WithTimeout(timeout time.Duration) *RepoSearchParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo search params
+func (o *RepoSearchParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo search params
+func (o *RepoSearchParams) WithContext(ctx context.Context) *RepoSearchParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo search params
+func (o *RepoSearchParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo search params
+func (o *RepoSearchParams) WithHTTPClient(client *http.Client) *RepoSearchParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo search params
+func (o *RepoSearchParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithArchived adds the archived to the repo search params
+func (o *RepoSearchParams) WithArchived(archived *bool) *RepoSearchParams {
+	o.SetArchived(archived)
+	return o
+}
+
+// SetArchived adds the archived to the repo search params
+func (o *RepoSearchParams) SetArchived(archived *bool) {
+	o.Archived = archived
+}
+
+// WithExclusive adds the exclusive to the repo search params
+func (o *RepoSearchParams) WithExclusive(exclusive *bool) *RepoSearchParams {
+	o.SetExclusive(exclusive)
+	return o
+}
+
+// SetExclusive adds the exclusive to the repo search params
+func (o *RepoSearchParams) SetExclusive(exclusive *bool) {
+	o.Exclusive = exclusive
+}
+
+// WithIncludeDesc adds the includeDesc to the repo search params
+func (o *RepoSearchParams) WithIncludeDesc(includeDesc *bool) *RepoSearchParams {
+	o.SetIncludeDesc(includeDesc)
+	return o
+}
+
+// SetIncludeDesc adds the includeDesc to the repo search params
+func (o *RepoSearchParams) SetIncludeDesc(includeDesc *bool) {
+	o.IncludeDesc = includeDesc
+}
+
+// WithIsPrivate adds the isPrivate to the repo search params
+func (o *RepoSearchParams) WithIsPrivate(isPrivate *bool) *RepoSearchParams {
+	o.SetIsPrivate(isPrivate)
+	return o
+}
+
+// SetIsPrivate adds the isPrivate to the repo search params
+func (o *RepoSearchParams) SetIsPrivate(isPrivate *bool) {
+	o.IsPrivate = isPrivate
+}
+
+// WithLimit adds the limit to the repo search params
+func (o *RepoSearchParams) WithLimit(limit *int64) *RepoSearchParams {
+	o.SetLimit(limit)
+	return o
+}
+
+// SetLimit adds the limit to the repo search params
+func (o *RepoSearchParams) SetLimit(limit *int64) {
+	o.Limit = limit
+}
+
+// WithMode adds the mode to the repo search params
+func (o *RepoSearchParams) WithMode(mode *string) *RepoSearchParams {
+	o.SetMode(mode)
+	return o
+}
+
+// SetMode adds the mode to the repo search params
+func (o *RepoSearchParams) SetMode(mode *string) {
+	o.Mode = mode
+}
+
+// WithOrder adds the order to the repo search params
+func (o *RepoSearchParams) WithOrder(order *string) *RepoSearchParams {
+	o.SetOrder(order)
+	return o
+}
+
+// SetOrder adds the order to the repo search params
+func (o *RepoSearchParams) SetOrder(order *string) {
+	o.Order = order
+}
+
+// WithPage adds the page to the repo search params
+func (o *RepoSearchParams) WithPage(page *int64) *RepoSearchParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the repo search params
+func (o *RepoSearchParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WithPriorityOwnerID adds the priorityOwnerID to the repo search params
+func (o *RepoSearchParams) WithPriorityOwnerID(priorityOwnerID *int64) *RepoSearchParams {
+	o.SetPriorityOwnerID(priorityOwnerID)
+	return o
+}
+
+// SetPriorityOwnerID adds the priorityOwnerId to the repo search params
+func (o *RepoSearchParams) SetPriorityOwnerID(priorityOwnerID *int64) {
+	o.PriorityOwnerID = priorityOwnerID
+}
+
+// WithPrivate adds the private to the repo search params
+func (o *RepoSearchParams) WithPrivate(private *bool) *RepoSearchParams {
+	o.SetPrivate(private)
+	return o
+}
+
+// SetPrivate adds the private to the repo search params
+func (o *RepoSearchParams) SetPrivate(private *bool) {
+	o.Private = private
+}
+
+// WithQ adds the q to the repo search params
+func (o *RepoSearchParams) WithQ(q *string) *RepoSearchParams {
+	o.SetQ(q)
+	return o
+}
+
+// SetQ adds the q to the repo search params
+func (o *RepoSearchParams) SetQ(q *string) {
+	o.Q = q
+}
+
+// WithSort adds the sort to the repo search params
+func (o *RepoSearchParams) WithSort(sort *string) *RepoSearchParams {
+	o.SetSort(sort)
+	return o
+}
+
+// SetSort adds the sort to the repo search params
+func (o *RepoSearchParams) SetSort(sort *string) {
+	o.Sort = sort
+}
+
+// WithStarredBy adds the starredBy to the repo search params
+func (o *RepoSearchParams) WithStarredBy(starredBy *int64) *RepoSearchParams {
+	o.SetStarredBy(starredBy)
+	return o
+}
+
+// SetStarredBy adds the starredBy to the repo search params
+func (o *RepoSearchParams) SetStarredBy(starredBy *int64) {
+	o.StarredBy = starredBy
+}
+
+// WithTeamID adds the teamID to the repo search params
+func (o *RepoSearchParams) WithTeamID(teamID *int64) *RepoSearchParams {
+	o.SetTeamID(teamID)
+	return o
+}
+
+// SetTeamID adds the teamId to the repo search params
+func (o *RepoSearchParams) SetTeamID(teamID *int64) {
+	o.TeamID = teamID
+}
+
+// WithTemplate adds the template to the repo search params
+func (o *RepoSearchParams) WithTemplate(template *bool) *RepoSearchParams {
+	o.SetTemplate(template)
+	return o
+}
+
+// SetTemplate adds the template to the repo search params
+func (o *RepoSearchParams) SetTemplate(template *bool) {
+	o.Template = template
+}
+
+// WithTopic adds the topic to the repo search params
+func (o *RepoSearchParams) WithTopic(topic *bool) *RepoSearchParams {
+	o.SetTopic(topic)
+	return o
+}
+
+// SetTopic adds the topic to the repo search params
+func (o *RepoSearchParams) SetTopic(topic *bool) {
+	o.Topic = topic
+}
+
+// WithUID adds the uid to the repo search params
+func (o *RepoSearchParams) WithUID(uid *int64) *RepoSearchParams {
+	o.SetUID(uid)
+	return o
+}
+
+// SetUID adds the uid to the repo search params
+func (o *RepoSearchParams) SetUID(uid *int64) {
+	o.UID = uid
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoSearchParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.Archived != nil {
+
+		// query param archived
+		var qrArchived bool
+
+		if o.Archived != nil {
+			qrArchived = *o.Archived
+		}
+		qArchived := swag.FormatBool(qrArchived)
+		if qArchived != "" {
+
+			if err := r.SetQueryParam("archived", qArchived); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Exclusive != nil {
+
+		// query param exclusive
+		var qrExclusive bool
+
+		if o.Exclusive != nil {
+			qrExclusive = *o.Exclusive
+		}
+		qExclusive := swag.FormatBool(qrExclusive)
+		if qExclusive != "" {
+
+			if err := r.SetQueryParam("exclusive", qExclusive); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.IncludeDesc != nil {
+
+		// query param includeDesc
+		var qrIncludeDesc bool
+
+		if o.IncludeDesc != nil {
+			qrIncludeDesc = *o.IncludeDesc
+		}
+		qIncludeDesc := swag.FormatBool(qrIncludeDesc)
+		if qIncludeDesc != "" {
+
+			if err := r.SetQueryParam("includeDesc", qIncludeDesc); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.IsPrivate != nil {
+
+		// query param is_private
+		var qrIsPrivate bool
+
+		if o.IsPrivate != nil {
+			qrIsPrivate = *o.IsPrivate
+		}
+		qIsPrivate := swag.FormatBool(qrIsPrivate)
+		if qIsPrivate != "" {
+
+			if err := r.SetQueryParam("is_private", qIsPrivate); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Limit != nil {
+
+		// query param limit
+		var qrLimit int64
+
+		if o.Limit != nil {
+			qrLimit = *o.Limit
+		}
+		qLimit := swag.FormatInt64(qrLimit)
+		if qLimit != "" {
+
+			if err := r.SetQueryParam("limit", qLimit); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Mode != nil {
+
+		// query param mode
+		var qrMode string
+
+		if o.Mode != nil {
+			qrMode = *o.Mode
+		}
+		qMode := qrMode
+		if qMode != "" {
+
+			if err := r.SetQueryParam("mode", qMode); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Order != nil {
+
+		// query param order
+		var qrOrder string
+
+		if o.Order != nil {
+			qrOrder = *o.Order
+		}
+		qOrder := qrOrder
+		if qOrder != "" {
+
+			if err := r.SetQueryParam("order", qOrder); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.PriorityOwnerID != nil {
+
+		// query param priority_owner_id
+		var qrPriorityOwnerID int64
+
+		if o.PriorityOwnerID != nil {
+			qrPriorityOwnerID = *o.PriorityOwnerID
+		}
+		qPriorityOwnerID := swag.FormatInt64(qrPriorityOwnerID)
+		if qPriorityOwnerID != "" {
+
+			if err := r.SetQueryParam("priority_owner_id", qPriorityOwnerID); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Private != nil {
+
+		// query param private
+		var qrPrivate bool
+
+		if o.Private != nil {
+			qrPrivate = *o.Private
+		}
+		qPrivate := swag.FormatBool(qrPrivate)
+		if qPrivate != "" {
+
+			if err := r.SetQueryParam("private", qPrivate); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Q != nil {
+
+		// query param q
+		var qrQ string
+
+		if o.Q != nil {
+			qrQ = *o.Q
+		}
+		qQ := qrQ
+		if qQ != "" {
+
+			if err := r.SetQueryParam("q", qQ); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Sort != nil {
+
+		// query param sort
+		var qrSort string
+
+		if o.Sort != nil {
+			qrSort = *o.Sort
+		}
+		qSort := qrSort
+		if qSort != "" {
+
+			if err := r.SetQueryParam("sort", qSort); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.StarredBy != nil {
+
+		// query param starredBy
+		var qrStarredBy int64
+
+		if o.StarredBy != nil {
+			qrStarredBy = *o.StarredBy
+		}
+		qStarredBy := swag.FormatInt64(qrStarredBy)
+		if qStarredBy != "" {
+
+			if err := r.SetQueryParam("starredBy", qStarredBy); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.TeamID != nil {
+
+		// query param team_id
+		var qrTeamID int64
+
+		if o.TeamID != nil {
+			qrTeamID = *o.TeamID
+		}
+		qTeamID := swag.FormatInt64(qrTeamID)
+		if qTeamID != "" {
+
+			if err := r.SetQueryParam("team_id", qTeamID); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Template != nil {
+
+		// query param template
+		var qrTemplate bool
+
+		if o.Template != nil {
+			qrTemplate = *o.Template
+		}
+		qTemplate := swag.FormatBool(qrTemplate)
+		if qTemplate != "" {
+
+			if err := r.SetQueryParam("template", qTemplate); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Topic != nil {
+
+		// query param topic
+		var qrTopic bool
+
+		if o.Topic != nil {
+			qrTopic = *o.Topic
+		}
+		qTopic := swag.FormatBool(qrTopic)
+		if qTopic != "" {
+
+			if err := r.SetQueryParam("topic", qTopic); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.UID != nil {
+
+		// query param uid
+		var qrUID int64
+
+		if o.UID != nil {
+			qrUID = *o.UID
+		}
+		qUID := swag.FormatInt64(qrUID)
+		if qUID != "" {
+
+			if err := r.SetQueryParam("uid", qUID); err != nil {
+				return err
+			}
+		}
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_search_responses.go b/bots-common/gitea-generated/client/repository/repo_search_responses.go
new file mode 100644
index 0000000..443e49f
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_search_responses.go
@@ -0,0 +1,184 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoSearchReader is a Reader for the RepoSearch structure.
+type RepoSearchReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoSearchReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoSearchOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 422:
+		result := NewRepoSearchUnprocessableEntity()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/search] repoSearch", response, response.Code())
+	}
+}
+
+// NewRepoSearchOK creates a RepoSearchOK with default headers values
+func NewRepoSearchOK() *RepoSearchOK {
+	return &RepoSearchOK{}
+}
+
+/*
+RepoSearchOK describes a response with status code 200, with default header values.
+
+SearchResults
+*/
+type RepoSearchOK struct {
+	Payload *models.SearchResults
+}
+
+// IsSuccess returns true when this repo search o k response has a 2xx status code
+func (o *RepoSearchOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo search o k response has a 3xx status code
+func (o *RepoSearchOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo search o k response has a 4xx status code
+func (o *RepoSearchOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo search o k response has a 5xx status code
+func (o *RepoSearchOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo search o k response a status code equal to that given
+func (o *RepoSearchOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo search o k response
+func (o *RepoSearchOK) Code() int {
+	return 200
+}
+
+func (o *RepoSearchOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/search][%d] repoSearchOK %s", 200, payload)
+}
+
+func (o *RepoSearchOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/search][%d] repoSearchOK %s", 200, payload)
+}
+
+func (o *RepoSearchOK) GetPayload() *models.SearchResults {
+	return o.Payload
+}
+
+func (o *RepoSearchOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.SearchResults)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoSearchUnprocessableEntity creates a RepoSearchUnprocessableEntity with default headers values
+func NewRepoSearchUnprocessableEntity() *RepoSearchUnprocessableEntity {
+	return &RepoSearchUnprocessableEntity{}
+}
+
+/*
+RepoSearchUnprocessableEntity describes a response with status code 422, with default header values.
+
+APIValidationError is error format response related to input validation
+*/
+type RepoSearchUnprocessableEntity struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo search unprocessable entity response has a 2xx status code
+func (o *RepoSearchUnprocessableEntity) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo search unprocessable entity response has a 3xx status code
+func (o *RepoSearchUnprocessableEntity) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo search unprocessable entity response has a 4xx status code
+func (o *RepoSearchUnprocessableEntity) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo search unprocessable entity response has a 5xx status code
+func (o *RepoSearchUnprocessableEntity) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo search unprocessable entity response a status code equal to that given
+func (o *RepoSearchUnprocessableEntity) IsCode(code int) bool {
+	return code == 422
+}
+
+// Code gets the status code for the repo search unprocessable entity response
+func (o *RepoSearchUnprocessableEntity) Code() int {
+	return 422
+}
+
+func (o *RepoSearchUnprocessableEntity) Error() string {
+	return fmt.Sprintf("[GET /repos/search][%d] repoSearchUnprocessableEntity", 422)
+}
+
+func (o *RepoSearchUnprocessableEntity) String() string {
+	return fmt.Sprintf("[GET /repos/search][%d] repoSearchUnprocessableEntity", 422)
+}
+
+func (o *RepoSearchUnprocessableEntity) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_signing_key_parameters.go b/bots-common/gitea-generated/client/repository/repo_signing_key_parameters.go
new file mode 100644
index 0000000..0cbe600
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_signing_key_parameters.go
@@ -0,0 +1,173 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewRepoSigningKeyParams creates a new RepoSigningKeyParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoSigningKeyParams() *RepoSigningKeyParams {
+	return &RepoSigningKeyParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoSigningKeyParamsWithTimeout creates a new RepoSigningKeyParams object
+// with the ability to set a timeout on a request.
+func NewRepoSigningKeyParamsWithTimeout(timeout time.Duration) *RepoSigningKeyParams {
+	return &RepoSigningKeyParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoSigningKeyParamsWithContext creates a new RepoSigningKeyParams object
+// with the ability to set a context for a request.
+func NewRepoSigningKeyParamsWithContext(ctx context.Context) *RepoSigningKeyParams {
+	return &RepoSigningKeyParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoSigningKeyParamsWithHTTPClient creates a new RepoSigningKeyParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoSigningKeyParamsWithHTTPClient(client *http.Client) *RepoSigningKeyParams {
+	return &RepoSigningKeyParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoSigningKeyParams contains all the parameters to send to the API endpoint
+
+	for the repo signing key operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoSigningKeyParams struct {
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo signing key params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoSigningKeyParams) WithDefaults() *RepoSigningKeyParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo signing key params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoSigningKeyParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo signing key params
+func (o *RepoSigningKeyParams) WithTimeout(timeout time.Duration) *RepoSigningKeyParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo signing key params
+func (o *RepoSigningKeyParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo signing key params
+func (o *RepoSigningKeyParams) WithContext(ctx context.Context) *RepoSigningKeyParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo signing key params
+func (o *RepoSigningKeyParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo signing key params
+func (o *RepoSigningKeyParams) WithHTTPClient(client *http.Client) *RepoSigningKeyParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo signing key params
+func (o *RepoSigningKeyParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithOwner adds the owner to the repo signing key params
+func (o *RepoSigningKeyParams) WithOwner(owner string) *RepoSigningKeyParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo signing key params
+func (o *RepoSigningKeyParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo signing key params
+func (o *RepoSigningKeyParams) WithRepo(repo string) *RepoSigningKeyParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo signing key params
+func (o *RepoSigningKeyParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoSigningKeyParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_signing_key_responses.go b/bots-common/gitea-generated/client/repository/repo_signing_key_responses.go
new file mode 100644
index 0000000..b442f24
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_signing_key_responses.go
@@ -0,0 +1,102 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// RepoSigningKeyReader is a Reader for the RepoSigningKey structure.
+type RepoSigningKeyReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoSigningKeyReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoSigningKeyOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/signing-key.gpg] repoSigningKey", response, response.Code())
+	}
+}
+
+// NewRepoSigningKeyOK creates a RepoSigningKeyOK with default headers values
+func NewRepoSigningKeyOK() *RepoSigningKeyOK {
+	return &RepoSigningKeyOK{}
+}
+
+/*
+RepoSigningKeyOK describes a response with status code 200, with default header values.
+
+GPG armored public key
+*/
+type RepoSigningKeyOK struct {
+	Payload string
+}
+
+// IsSuccess returns true when this repo signing key o k response has a 2xx status code
+func (o *RepoSigningKeyOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo signing key o k response has a 3xx status code
+func (o *RepoSigningKeyOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo signing key o k response has a 4xx status code
+func (o *RepoSigningKeyOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo signing key o k response has a 5xx status code
+func (o *RepoSigningKeyOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo signing key o k response a status code equal to that given
+func (o *RepoSigningKeyOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo signing key o k response
+func (o *RepoSigningKeyOK) Code() int {
+	return 200
+}
+
+func (o *RepoSigningKeyOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/signing-key.gpg][%d] repoSigningKeyOK %s", 200, payload)
+}
+
+func (o *RepoSigningKeyOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/signing-key.gpg][%d] repoSigningKeyOK %s", 200, payload)
+}
+
+func (o *RepoSigningKeyOK) GetPayload() string {
+	return o.Payload
+}
+
+func (o *RepoSigningKeyOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_submit_pull_review_parameters.go b/bots-common/gitea-generated/client/repository/repo_submit_pull_review_parameters.go
new file mode 100644
index 0000000..c77d652
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_submit_pull_review_parameters.go
@@ -0,0 +1,243 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewRepoSubmitPullReviewParams creates a new RepoSubmitPullReviewParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoSubmitPullReviewParams() *RepoSubmitPullReviewParams {
+	return &RepoSubmitPullReviewParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoSubmitPullReviewParamsWithTimeout creates a new RepoSubmitPullReviewParams object
+// with the ability to set a timeout on a request.
+func NewRepoSubmitPullReviewParamsWithTimeout(timeout time.Duration) *RepoSubmitPullReviewParams {
+	return &RepoSubmitPullReviewParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoSubmitPullReviewParamsWithContext creates a new RepoSubmitPullReviewParams object
+// with the ability to set a context for a request.
+func NewRepoSubmitPullReviewParamsWithContext(ctx context.Context) *RepoSubmitPullReviewParams {
+	return &RepoSubmitPullReviewParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoSubmitPullReviewParamsWithHTTPClient creates a new RepoSubmitPullReviewParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoSubmitPullReviewParamsWithHTTPClient(client *http.Client) *RepoSubmitPullReviewParams {
+	return &RepoSubmitPullReviewParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoSubmitPullReviewParams contains all the parameters to send to the API endpoint
+
+	for the repo submit pull review operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoSubmitPullReviewParams struct {
+
+	// Body.
+	Body *models.SubmitPullReviewOptions
+
+	/* ID.
+
+	   id of the review
+
+	   Format: int64
+	*/
+	ID int64
+
+	/* Index.
+
+	   index of the pull request
+
+	   Format: int64
+	*/
+	Index int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo submit pull review params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoSubmitPullReviewParams) WithDefaults() *RepoSubmitPullReviewParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo submit pull review params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoSubmitPullReviewParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo submit pull review params
+func (o *RepoSubmitPullReviewParams) WithTimeout(timeout time.Duration) *RepoSubmitPullReviewParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo submit pull review params
+func (o *RepoSubmitPullReviewParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo submit pull review params
+func (o *RepoSubmitPullReviewParams) WithContext(ctx context.Context) *RepoSubmitPullReviewParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo submit pull review params
+func (o *RepoSubmitPullReviewParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo submit pull review params
+func (o *RepoSubmitPullReviewParams) WithHTTPClient(client *http.Client) *RepoSubmitPullReviewParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo submit pull review params
+func (o *RepoSubmitPullReviewParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the repo submit pull review params
+func (o *RepoSubmitPullReviewParams) WithBody(body *models.SubmitPullReviewOptions) *RepoSubmitPullReviewParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the repo submit pull review params
+func (o *RepoSubmitPullReviewParams) SetBody(body *models.SubmitPullReviewOptions) {
+	o.Body = body
+}
+
+// WithID adds the id to the repo submit pull review params
+func (o *RepoSubmitPullReviewParams) WithID(id int64) *RepoSubmitPullReviewParams {
+	o.SetID(id)
+	return o
+}
+
+// SetID adds the id to the repo submit pull review params
+func (o *RepoSubmitPullReviewParams) SetID(id int64) {
+	o.ID = id
+}
+
+// WithIndex adds the index to the repo submit pull review params
+func (o *RepoSubmitPullReviewParams) WithIndex(index int64) *RepoSubmitPullReviewParams {
+	o.SetIndex(index)
+	return o
+}
+
+// SetIndex adds the index to the repo submit pull review params
+func (o *RepoSubmitPullReviewParams) SetIndex(index int64) {
+	o.Index = index
+}
+
+// WithOwner adds the owner to the repo submit pull review params
+func (o *RepoSubmitPullReviewParams) WithOwner(owner string) *RepoSubmitPullReviewParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo submit pull review params
+func (o *RepoSubmitPullReviewParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo submit pull review params
+func (o *RepoSubmitPullReviewParams) WithRepo(repo string) *RepoSubmitPullReviewParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo submit pull review params
+func (o *RepoSubmitPullReviewParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoSubmitPullReviewParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	// path param id
+	if err := r.SetPathParam("id", swag.FormatInt64(o.ID)); err != nil {
+		return err
+	}
+
+	// path param index
+	if err := r.SetPathParam("index", swag.FormatInt64(o.Index)); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_submit_pull_review_responses.go b/bots-common/gitea-generated/client/repository/repo_submit_pull_review_responses.go
new file mode 100644
index 0000000..e625f43
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_submit_pull_review_responses.go
@@ -0,0 +1,246 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoSubmitPullReviewReader is a Reader for the RepoSubmitPullReview structure.
+type RepoSubmitPullReviewReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoSubmitPullReviewReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoSubmitPullReviewOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoSubmitPullReviewNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 422:
+		result := NewRepoSubmitPullReviewUnprocessableEntity()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[POST /repos/{owner}/{repo}/pulls/{index}/reviews/{id}] repoSubmitPullReview", response, response.Code())
+	}
+}
+
+// NewRepoSubmitPullReviewOK creates a RepoSubmitPullReviewOK with default headers values
+func NewRepoSubmitPullReviewOK() *RepoSubmitPullReviewOK {
+	return &RepoSubmitPullReviewOK{}
+}
+
+/*
+RepoSubmitPullReviewOK describes a response with status code 200, with default header values.
+
+PullReview
+*/
+type RepoSubmitPullReviewOK struct {
+	Payload *models.PullReview
+}
+
+// IsSuccess returns true when this repo submit pull review o k response has a 2xx status code
+func (o *RepoSubmitPullReviewOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo submit pull review o k response has a 3xx status code
+func (o *RepoSubmitPullReviewOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo submit pull review o k response has a 4xx status code
+func (o *RepoSubmitPullReviewOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo submit pull review o k response has a 5xx status code
+func (o *RepoSubmitPullReviewOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo submit pull review o k response a status code equal to that given
+func (o *RepoSubmitPullReviewOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo submit pull review o k response
+func (o *RepoSubmitPullReviewOK) Code() int {
+	return 200
+}
+
+func (o *RepoSubmitPullReviewOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/pulls/{index}/reviews/{id}][%d] repoSubmitPullReviewOK %s", 200, payload)
+}
+
+func (o *RepoSubmitPullReviewOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/pulls/{index}/reviews/{id}][%d] repoSubmitPullReviewOK %s", 200, payload)
+}
+
+func (o *RepoSubmitPullReviewOK) GetPayload() *models.PullReview {
+	return o.Payload
+}
+
+func (o *RepoSubmitPullReviewOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.PullReview)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoSubmitPullReviewNotFound creates a RepoSubmitPullReviewNotFound with default headers values
+func NewRepoSubmitPullReviewNotFound() *RepoSubmitPullReviewNotFound {
+	return &RepoSubmitPullReviewNotFound{}
+}
+
+/*
+RepoSubmitPullReviewNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoSubmitPullReviewNotFound struct {
+}
+
+// IsSuccess returns true when this repo submit pull review not found response has a 2xx status code
+func (o *RepoSubmitPullReviewNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo submit pull review not found response has a 3xx status code
+func (o *RepoSubmitPullReviewNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo submit pull review not found response has a 4xx status code
+func (o *RepoSubmitPullReviewNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo submit pull review not found response has a 5xx status code
+func (o *RepoSubmitPullReviewNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo submit pull review not found response a status code equal to that given
+func (o *RepoSubmitPullReviewNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo submit pull review not found response
+func (o *RepoSubmitPullReviewNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoSubmitPullReviewNotFound) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/pulls/{index}/reviews/{id}][%d] repoSubmitPullReviewNotFound", 404)
+}
+
+func (o *RepoSubmitPullReviewNotFound) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/pulls/{index}/reviews/{id}][%d] repoSubmitPullReviewNotFound", 404)
+}
+
+func (o *RepoSubmitPullReviewNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewRepoSubmitPullReviewUnprocessableEntity creates a RepoSubmitPullReviewUnprocessableEntity with default headers values
+func NewRepoSubmitPullReviewUnprocessableEntity() *RepoSubmitPullReviewUnprocessableEntity {
+	return &RepoSubmitPullReviewUnprocessableEntity{}
+}
+
+/*
+RepoSubmitPullReviewUnprocessableEntity describes a response with status code 422, with default header values.
+
+APIValidationError is error format response related to input validation
+*/
+type RepoSubmitPullReviewUnprocessableEntity struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo submit pull review unprocessable entity response has a 2xx status code
+func (o *RepoSubmitPullReviewUnprocessableEntity) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo submit pull review unprocessable entity response has a 3xx status code
+func (o *RepoSubmitPullReviewUnprocessableEntity) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo submit pull review unprocessable entity response has a 4xx status code
+func (o *RepoSubmitPullReviewUnprocessableEntity) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo submit pull review unprocessable entity response has a 5xx status code
+func (o *RepoSubmitPullReviewUnprocessableEntity) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo submit pull review unprocessable entity response a status code equal to that given
+func (o *RepoSubmitPullReviewUnprocessableEntity) IsCode(code int) bool {
+	return code == 422
+}
+
+// Code gets the status code for the repo submit pull review unprocessable entity response
+func (o *RepoSubmitPullReviewUnprocessableEntity) Code() int {
+	return 422
+}
+
+func (o *RepoSubmitPullReviewUnprocessableEntity) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/pulls/{index}/reviews/{id}][%d] repoSubmitPullReviewUnprocessableEntity", 422)
+}
+
+func (o *RepoSubmitPullReviewUnprocessableEntity) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/pulls/{index}/reviews/{id}][%d] repoSubmitPullReviewUnprocessableEntity", 422)
+}
+
+func (o *RepoSubmitPullReviewUnprocessableEntity) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_test_hook_parameters.go b/bots-common/gitea-generated/client/repository/repo_test_hook_parameters.go
new file mode 100644
index 0000000..19d1a30
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_test_hook_parameters.go
@@ -0,0 +1,232 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewRepoTestHookParams creates a new RepoTestHookParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoTestHookParams() *RepoTestHookParams {
+	return &RepoTestHookParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoTestHookParamsWithTimeout creates a new RepoTestHookParams object
+// with the ability to set a timeout on a request.
+func NewRepoTestHookParamsWithTimeout(timeout time.Duration) *RepoTestHookParams {
+	return &RepoTestHookParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoTestHookParamsWithContext creates a new RepoTestHookParams object
+// with the ability to set a context for a request.
+func NewRepoTestHookParamsWithContext(ctx context.Context) *RepoTestHookParams {
+	return &RepoTestHookParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoTestHookParamsWithHTTPClient creates a new RepoTestHookParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoTestHookParamsWithHTTPClient(client *http.Client) *RepoTestHookParams {
+	return &RepoTestHookParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoTestHookParams contains all the parameters to send to the API endpoint
+
+	for the repo test hook operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoTestHookParams struct {
+
+	/* ID.
+
+	   id of the hook to test
+
+	   Format: int64
+	*/
+	ID int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Ref.
+
+	   The name of the commit/branch/tag, indicates which commit will be loaded to the webhook payload.
+	*/
+	Ref *string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo test hook params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoTestHookParams) WithDefaults() *RepoTestHookParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo test hook params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoTestHookParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo test hook params
+func (o *RepoTestHookParams) WithTimeout(timeout time.Duration) *RepoTestHookParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo test hook params
+func (o *RepoTestHookParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo test hook params
+func (o *RepoTestHookParams) WithContext(ctx context.Context) *RepoTestHookParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo test hook params
+func (o *RepoTestHookParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo test hook params
+func (o *RepoTestHookParams) WithHTTPClient(client *http.Client) *RepoTestHookParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo test hook params
+func (o *RepoTestHookParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithID adds the id to the repo test hook params
+func (o *RepoTestHookParams) WithID(id int64) *RepoTestHookParams {
+	o.SetID(id)
+	return o
+}
+
+// SetID adds the id to the repo test hook params
+func (o *RepoTestHookParams) SetID(id int64) {
+	o.ID = id
+}
+
+// WithOwner adds the owner to the repo test hook params
+func (o *RepoTestHookParams) WithOwner(owner string) *RepoTestHookParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo test hook params
+func (o *RepoTestHookParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRef adds the ref to the repo test hook params
+func (o *RepoTestHookParams) WithRef(ref *string) *RepoTestHookParams {
+	o.SetRef(ref)
+	return o
+}
+
+// SetRef adds the ref to the repo test hook params
+func (o *RepoTestHookParams) SetRef(ref *string) {
+	o.Ref = ref
+}
+
+// WithRepo adds the repo to the repo test hook params
+func (o *RepoTestHookParams) WithRepo(repo string) *RepoTestHookParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo test hook params
+func (o *RepoTestHookParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoTestHookParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param id
+	if err := r.SetPathParam("id", swag.FormatInt64(o.ID)); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	if o.Ref != nil {
+
+		// query param ref
+		var qrRef string
+
+		if o.Ref != nil {
+			qrRef = *o.Ref
+		}
+		qRef := qrRef
+		if qRef != "" {
+
+			if err := r.SetQueryParam("ref", qRef); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_test_hook_responses.go b/bots-common/gitea-generated/client/repository/repo_test_hook_responses.go
new file mode 100644
index 0000000..08f20ca
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_test_hook_responses.go
@@ -0,0 +1,150 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// RepoTestHookReader is a Reader for the RepoTestHook structure.
+type RepoTestHookReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoTestHookReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewRepoTestHookNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoTestHookNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[POST /repos/{owner}/{repo}/hooks/{id}/tests] repoTestHook", response, response.Code())
+	}
+}
+
+// NewRepoTestHookNoContent creates a RepoTestHookNoContent with default headers values
+func NewRepoTestHookNoContent() *RepoTestHookNoContent {
+	return &RepoTestHookNoContent{}
+}
+
+/*
+RepoTestHookNoContent describes a response with status code 204, with default header values.
+
+APIEmpty is an empty response
+*/
+type RepoTestHookNoContent struct {
+}
+
+// IsSuccess returns true when this repo test hook no content response has a 2xx status code
+func (o *RepoTestHookNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo test hook no content response has a 3xx status code
+func (o *RepoTestHookNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo test hook no content response has a 4xx status code
+func (o *RepoTestHookNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo test hook no content response has a 5xx status code
+func (o *RepoTestHookNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo test hook no content response a status code equal to that given
+func (o *RepoTestHookNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the repo test hook no content response
+func (o *RepoTestHookNoContent) Code() int {
+	return 204
+}
+
+func (o *RepoTestHookNoContent) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/hooks/{id}/tests][%d] repoTestHookNoContent", 204)
+}
+
+func (o *RepoTestHookNoContent) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/hooks/{id}/tests][%d] repoTestHookNoContent", 204)
+}
+
+func (o *RepoTestHookNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewRepoTestHookNotFound creates a RepoTestHookNotFound with default headers values
+func NewRepoTestHookNotFound() *RepoTestHookNotFound {
+	return &RepoTestHookNotFound{}
+}
+
+/*
+RepoTestHookNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoTestHookNotFound struct {
+}
+
+// IsSuccess returns true when this repo test hook not found response has a 2xx status code
+func (o *RepoTestHookNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo test hook not found response has a 3xx status code
+func (o *RepoTestHookNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo test hook not found response has a 4xx status code
+func (o *RepoTestHookNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo test hook not found response has a 5xx status code
+func (o *RepoTestHookNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo test hook not found response a status code equal to that given
+func (o *RepoTestHookNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo test hook not found response
+func (o *RepoTestHookNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoTestHookNotFound) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/hooks/{id}/tests][%d] repoTestHookNotFound", 404)
+}
+
+func (o *RepoTestHookNotFound) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/hooks/{id}/tests][%d] repoTestHookNotFound", 404)
+}
+
+func (o *RepoTestHookNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_tracked_times_parameters.go b/bots-common/gitea-generated/client/repository/repo_tracked_times_parameters.go
new file mode 100644
index 0000000..ed7bf7f
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_tracked_times_parameters.go
@@ -0,0 +1,348 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewRepoTrackedTimesParams creates a new RepoTrackedTimesParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoTrackedTimesParams() *RepoTrackedTimesParams {
+	return &RepoTrackedTimesParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoTrackedTimesParamsWithTimeout creates a new RepoTrackedTimesParams object
+// with the ability to set a timeout on a request.
+func NewRepoTrackedTimesParamsWithTimeout(timeout time.Duration) *RepoTrackedTimesParams {
+	return &RepoTrackedTimesParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoTrackedTimesParamsWithContext creates a new RepoTrackedTimesParams object
+// with the ability to set a context for a request.
+func NewRepoTrackedTimesParamsWithContext(ctx context.Context) *RepoTrackedTimesParams {
+	return &RepoTrackedTimesParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoTrackedTimesParamsWithHTTPClient creates a new RepoTrackedTimesParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoTrackedTimesParamsWithHTTPClient(client *http.Client) *RepoTrackedTimesParams {
+	return &RepoTrackedTimesParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoTrackedTimesParams contains all the parameters to send to the API endpoint
+
+	for the repo tracked times operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoTrackedTimesParams struct {
+
+	/* Before.
+
+	   Only show times updated before the given time. This is a timestamp in RFC 3339 format
+
+	   Format: date-time
+	*/
+	Before *strfmt.DateTime
+
+	/* Limit.
+
+	   page size of results
+	*/
+	Limit *int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Page.
+
+	   page number of results to return (1-based)
+	*/
+	Page *int64
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	/* Since.
+
+	   Only show times updated after the given time. This is a timestamp in RFC 3339 format
+
+	   Format: date-time
+	*/
+	Since *strfmt.DateTime
+
+	/* User.
+
+	   optional filter by user (available for issue managers)
+	*/
+	User *string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo tracked times params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoTrackedTimesParams) WithDefaults() *RepoTrackedTimesParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo tracked times params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoTrackedTimesParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo tracked times params
+func (o *RepoTrackedTimesParams) WithTimeout(timeout time.Duration) *RepoTrackedTimesParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo tracked times params
+func (o *RepoTrackedTimesParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo tracked times params
+func (o *RepoTrackedTimesParams) WithContext(ctx context.Context) *RepoTrackedTimesParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo tracked times params
+func (o *RepoTrackedTimesParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo tracked times params
+func (o *RepoTrackedTimesParams) WithHTTPClient(client *http.Client) *RepoTrackedTimesParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo tracked times params
+func (o *RepoTrackedTimesParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBefore adds the before to the repo tracked times params
+func (o *RepoTrackedTimesParams) WithBefore(before *strfmt.DateTime) *RepoTrackedTimesParams {
+	o.SetBefore(before)
+	return o
+}
+
+// SetBefore adds the before to the repo tracked times params
+func (o *RepoTrackedTimesParams) SetBefore(before *strfmt.DateTime) {
+	o.Before = before
+}
+
+// WithLimit adds the limit to the repo tracked times params
+func (o *RepoTrackedTimesParams) WithLimit(limit *int64) *RepoTrackedTimesParams {
+	o.SetLimit(limit)
+	return o
+}
+
+// SetLimit adds the limit to the repo tracked times params
+func (o *RepoTrackedTimesParams) SetLimit(limit *int64) {
+	o.Limit = limit
+}
+
+// WithOwner adds the owner to the repo tracked times params
+func (o *RepoTrackedTimesParams) WithOwner(owner string) *RepoTrackedTimesParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo tracked times params
+func (o *RepoTrackedTimesParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithPage adds the page to the repo tracked times params
+func (o *RepoTrackedTimesParams) WithPage(page *int64) *RepoTrackedTimesParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the repo tracked times params
+func (o *RepoTrackedTimesParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WithRepo adds the repo to the repo tracked times params
+func (o *RepoTrackedTimesParams) WithRepo(repo string) *RepoTrackedTimesParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo tracked times params
+func (o *RepoTrackedTimesParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WithSince adds the since to the repo tracked times params
+func (o *RepoTrackedTimesParams) WithSince(since *strfmt.DateTime) *RepoTrackedTimesParams {
+	o.SetSince(since)
+	return o
+}
+
+// SetSince adds the since to the repo tracked times params
+func (o *RepoTrackedTimesParams) SetSince(since *strfmt.DateTime) {
+	o.Since = since
+}
+
+// WithUser adds the user to the repo tracked times params
+func (o *RepoTrackedTimesParams) WithUser(user *string) *RepoTrackedTimesParams {
+	o.SetUser(user)
+	return o
+}
+
+// SetUser adds the user to the repo tracked times params
+func (o *RepoTrackedTimesParams) SetUser(user *string) {
+	o.User = user
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoTrackedTimesParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.Before != nil {
+
+		// query param before
+		var qrBefore strfmt.DateTime
+
+		if o.Before != nil {
+			qrBefore = *o.Before
+		}
+		qBefore := qrBefore.String()
+		if qBefore != "" {
+
+			if err := r.SetQueryParam("before", qBefore); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Limit != nil {
+
+		// query param limit
+		var qrLimit int64
+
+		if o.Limit != nil {
+			qrLimit = *o.Limit
+		}
+		qLimit := swag.FormatInt64(qrLimit)
+		if qLimit != "" {
+
+			if err := r.SetQueryParam("limit", qLimit); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if o.Since != nil {
+
+		// query param since
+		var qrSince strfmt.DateTime
+
+		if o.Since != nil {
+			qrSince = *o.Since
+		}
+		qSince := qrSince.String()
+		if qSince != "" {
+
+			if err := r.SetQueryParam("since", qSince); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.User != nil {
+
+		// query param user
+		var qrUser string
+
+		if o.User != nil {
+			qrUser = *o.User
+		}
+		qUser := qrUser
+		if qUser != "" {
+
+			if err := r.SetQueryParam("user", qUser); err != nil {
+				return err
+			}
+		}
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_tracked_times_responses.go b/bots-common/gitea-generated/client/repository/repo_tracked_times_responses.go
new file mode 100644
index 0000000..10992e1
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_tracked_times_responses.go
@@ -0,0 +1,322 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoTrackedTimesReader is a Reader for the RepoTrackedTimes structure.
+type RepoTrackedTimesReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoTrackedTimesReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoTrackedTimesOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 400:
+		result := NewRepoTrackedTimesBadRequest()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 403:
+		result := NewRepoTrackedTimesForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewRepoTrackedTimesNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/times] repoTrackedTimes", response, response.Code())
+	}
+}
+
+// NewRepoTrackedTimesOK creates a RepoTrackedTimesOK with default headers values
+func NewRepoTrackedTimesOK() *RepoTrackedTimesOK {
+	return &RepoTrackedTimesOK{}
+}
+
+/*
+RepoTrackedTimesOK describes a response with status code 200, with default header values.
+
+TrackedTimeList
+*/
+type RepoTrackedTimesOK struct {
+	Payload []*models.TrackedTime
+}
+
+// IsSuccess returns true when this repo tracked times o k response has a 2xx status code
+func (o *RepoTrackedTimesOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo tracked times o k response has a 3xx status code
+func (o *RepoTrackedTimesOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo tracked times o k response has a 4xx status code
+func (o *RepoTrackedTimesOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo tracked times o k response has a 5xx status code
+func (o *RepoTrackedTimesOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo tracked times o k response a status code equal to that given
+func (o *RepoTrackedTimesOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo tracked times o k response
+func (o *RepoTrackedTimesOK) Code() int {
+	return 200
+}
+
+func (o *RepoTrackedTimesOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/times][%d] repoTrackedTimesOK %s", 200, payload)
+}
+
+func (o *RepoTrackedTimesOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/times][%d] repoTrackedTimesOK %s", 200, payload)
+}
+
+func (o *RepoTrackedTimesOK) GetPayload() []*models.TrackedTime {
+	return o.Payload
+}
+
+func (o *RepoTrackedTimesOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoTrackedTimesBadRequest creates a RepoTrackedTimesBadRequest with default headers values
+func NewRepoTrackedTimesBadRequest() *RepoTrackedTimesBadRequest {
+	return &RepoTrackedTimesBadRequest{}
+}
+
+/*
+RepoTrackedTimesBadRequest describes a response with status code 400, with default header values.
+
+APIError is error format response
+*/
+type RepoTrackedTimesBadRequest struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo tracked times bad request response has a 2xx status code
+func (o *RepoTrackedTimesBadRequest) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo tracked times bad request response has a 3xx status code
+func (o *RepoTrackedTimesBadRequest) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo tracked times bad request response has a 4xx status code
+func (o *RepoTrackedTimesBadRequest) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo tracked times bad request response has a 5xx status code
+func (o *RepoTrackedTimesBadRequest) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo tracked times bad request response a status code equal to that given
+func (o *RepoTrackedTimesBadRequest) IsCode(code int) bool {
+	return code == 400
+}
+
+// Code gets the status code for the repo tracked times bad request response
+func (o *RepoTrackedTimesBadRequest) Code() int {
+	return 400
+}
+
+func (o *RepoTrackedTimesBadRequest) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/times][%d] repoTrackedTimesBadRequest", 400)
+}
+
+func (o *RepoTrackedTimesBadRequest) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/times][%d] repoTrackedTimesBadRequest", 400)
+}
+
+func (o *RepoTrackedTimesBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewRepoTrackedTimesForbidden creates a RepoTrackedTimesForbidden with default headers values
+func NewRepoTrackedTimesForbidden() *RepoTrackedTimesForbidden {
+	return &RepoTrackedTimesForbidden{}
+}
+
+/*
+RepoTrackedTimesForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type RepoTrackedTimesForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo tracked times forbidden response has a 2xx status code
+func (o *RepoTrackedTimesForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo tracked times forbidden response has a 3xx status code
+func (o *RepoTrackedTimesForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo tracked times forbidden response has a 4xx status code
+func (o *RepoTrackedTimesForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo tracked times forbidden response has a 5xx status code
+func (o *RepoTrackedTimesForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo tracked times forbidden response a status code equal to that given
+func (o *RepoTrackedTimesForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the repo tracked times forbidden response
+func (o *RepoTrackedTimesForbidden) Code() int {
+	return 403
+}
+
+func (o *RepoTrackedTimesForbidden) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/times][%d] repoTrackedTimesForbidden", 403)
+}
+
+func (o *RepoTrackedTimesForbidden) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/times][%d] repoTrackedTimesForbidden", 403)
+}
+
+func (o *RepoTrackedTimesForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewRepoTrackedTimesNotFound creates a RepoTrackedTimesNotFound with default headers values
+func NewRepoTrackedTimesNotFound() *RepoTrackedTimesNotFound {
+	return &RepoTrackedTimesNotFound{}
+}
+
+/*
+RepoTrackedTimesNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoTrackedTimesNotFound struct {
+}
+
+// IsSuccess returns true when this repo tracked times not found response has a 2xx status code
+func (o *RepoTrackedTimesNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo tracked times not found response has a 3xx status code
+func (o *RepoTrackedTimesNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo tracked times not found response has a 4xx status code
+func (o *RepoTrackedTimesNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo tracked times not found response has a 5xx status code
+func (o *RepoTrackedTimesNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo tracked times not found response a status code equal to that given
+func (o *RepoTrackedTimesNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo tracked times not found response
+func (o *RepoTrackedTimesNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoTrackedTimesNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/times][%d] repoTrackedTimesNotFound", 404)
+}
+
+func (o *RepoTrackedTimesNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/times][%d] repoTrackedTimesNotFound", 404)
+}
+
+func (o *RepoTrackedTimesNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_transfer_parameters.go b/bots-common/gitea-generated/client/repository/repo_transfer_parameters.go
new file mode 100644
index 0000000..91a28c7
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_transfer_parameters.go
@@ -0,0 +1,197 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewRepoTransferParams creates a new RepoTransferParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoTransferParams() *RepoTransferParams {
+	return &RepoTransferParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoTransferParamsWithTimeout creates a new RepoTransferParams object
+// with the ability to set a timeout on a request.
+func NewRepoTransferParamsWithTimeout(timeout time.Duration) *RepoTransferParams {
+	return &RepoTransferParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoTransferParamsWithContext creates a new RepoTransferParams object
+// with the ability to set a context for a request.
+func NewRepoTransferParamsWithContext(ctx context.Context) *RepoTransferParams {
+	return &RepoTransferParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoTransferParamsWithHTTPClient creates a new RepoTransferParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoTransferParamsWithHTTPClient(client *http.Client) *RepoTransferParams {
+	return &RepoTransferParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoTransferParams contains all the parameters to send to the API endpoint
+
+	for the repo transfer operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoTransferParams struct {
+
+	/* Body.
+
+	   Transfer Options
+	*/
+	Body *models.TransferRepoOption
+
+	/* Owner.
+
+	   owner of the repo to transfer
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo to transfer
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo transfer params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoTransferParams) WithDefaults() *RepoTransferParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo transfer params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoTransferParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo transfer params
+func (o *RepoTransferParams) WithTimeout(timeout time.Duration) *RepoTransferParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo transfer params
+func (o *RepoTransferParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo transfer params
+func (o *RepoTransferParams) WithContext(ctx context.Context) *RepoTransferParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo transfer params
+func (o *RepoTransferParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo transfer params
+func (o *RepoTransferParams) WithHTTPClient(client *http.Client) *RepoTransferParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo transfer params
+func (o *RepoTransferParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the repo transfer params
+func (o *RepoTransferParams) WithBody(body *models.TransferRepoOption) *RepoTransferParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the repo transfer params
+func (o *RepoTransferParams) SetBody(body *models.TransferRepoOption) {
+	o.Body = body
+}
+
+// WithOwner adds the owner to the repo transfer params
+func (o *RepoTransferParams) WithOwner(owner string) *RepoTransferParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo transfer params
+func (o *RepoTransferParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo transfer params
+func (o *RepoTransferParams) WithRepo(repo string) *RepoTransferParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo transfer params
+func (o *RepoTransferParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoTransferParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_transfer_responses.go b/bots-common/gitea-generated/client/repository/repo_transfer_responses.go
new file mode 100644
index 0000000..ad870d1
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_transfer_responses.go
@@ -0,0 +1,324 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoTransferReader is a Reader for the RepoTransfer structure.
+type RepoTransferReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoTransferReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 202:
+		result := NewRepoTransferAccepted()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 403:
+		result := NewRepoTransferForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewRepoTransferNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 422:
+		result := NewRepoTransferUnprocessableEntity()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[POST /repos/{owner}/{repo}/transfer] repoTransfer", response, response.Code())
+	}
+}
+
+// NewRepoTransferAccepted creates a RepoTransferAccepted with default headers values
+func NewRepoTransferAccepted() *RepoTransferAccepted {
+	return &RepoTransferAccepted{}
+}
+
+/*
+RepoTransferAccepted describes a response with status code 202, with default header values.
+
+Repository
+*/
+type RepoTransferAccepted struct {
+	Payload *models.Repository
+}
+
+// IsSuccess returns true when this repo transfer accepted response has a 2xx status code
+func (o *RepoTransferAccepted) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo transfer accepted response has a 3xx status code
+func (o *RepoTransferAccepted) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo transfer accepted response has a 4xx status code
+func (o *RepoTransferAccepted) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo transfer accepted response has a 5xx status code
+func (o *RepoTransferAccepted) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo transfer accepted response a status code equal to that given
+func (o *RepoTransferAccepted) IsCode(code int) bool {
+	return code == 202
+}
+
+// Code gets the status code for the repo transfer accepted response
+func (o *RepoTransferAccepted) Code() int {
+	return 202
+}
+
+func (o *RepoTransferAccepted) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/transfer][%d] repoTransferAccepted %s", 202, payload)
+}
+
+func (o *RepoTransferAccepted) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/transfer][%d] repoTransferAccepted %s", 202, payload)
+}
+
+func (o *RepoTransferAccepted) GetPayload() *models.Repository {
+	return o.Payload
+}
+
+func (o *RepoTransferAccepted) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.Repository)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoTransferForbidden creates a RepoTransferForbidden with default headers values
+func NewRepoTransferForbidden() *RepoTransferForbidden {
+	return &RepoTransferForbidden{}
+}
+
+/*
+RepoTransferForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type RepoTransferForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo transfer forbidden response has a 2xx status code
+func (o *RepoTransferForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo transfer forbidden response has a 3xx status code
+func (o *RepoTransferForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo transfer forbidden response has a 4xx status code
+func (o *RepoTransferForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo transfer forbidden response has a 5xx status code
+func (o *RepoTransferForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo transfer forbidden response a status code equal to that given
+func (o *RepoTransferForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the repo transfer forbidden response
+func (o *RepoTransferForbidden) Code() int {
+	return 403
+}
+
+func (o *RepoTransferForbidden) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/transfer][%d] repoTransferForbidden", 403)
+}
+
+func (o *RepoTransferForbidden) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/transfer][%d] repoTransferForbidden", 403)
+}
+
+func (o *RepoTransferForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewRepoTransferNotFound creates a RepoTransferNotFound with default headers values
+func NewRepoTransferNotFound() *RepoTransferNotFound {
+	return &RepoTransferNotFound{}
+}
+
+/*
+RepoTransferNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoTransferNotFound struct {
+}
+
+// IsSuccess returns true when this repo transfer not found response has a 2xx status code
+func (o *RepoTransferNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo transfer not found response has a 3xx status code
+func (o *RepoTransferNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo transfer not found response has a 4xx status code
+func (o *RepoTransferNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo transfer not found response has a 5xx status code
+func (o *RepoTransferNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo transfer not found response a status code equal to that given
+func (o *RepoTransferNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo transfer not found response
+func (o *RepoTransferNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoTransferNotFound) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/transfer][%d] repoTransferNotFound", 404)
+}
+
+func (o *RepoTransferNotFound) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/transfer][%d] repoTransferNotFound", 404)
+}
+
+func (o *RepoTransferNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewRepoTransferUnprocessableEntity creates a RepoTransferUnprocessableEntity with default headers values
+func NewRepoTransferUnprocessableEntity() *RepoTransferUnprocessableEntity {
+	return &RepoTransferUnprocessableEntity{}
+}
+
+/*
+RepoTransferUnprocessableEntity describes a response with status code 422, with default header values.
+
+APIValidationError is error format response related to input validation
+*/
+type RepoTransferUnprocessableEntity struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo transfer unprocessable entity response has a 2xx status code
+func (o *RepoTransferUnprocessableEntity) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo transfer unprocessable entity response has a 3xx status code
+func (o *RepoTransferUnprocessableEntity) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo transfer unprocessable entity response has a 4xx status code
+func (o *RepoTransferUnprocessableEntity) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo transfer unprocessable entity response has a 5xx status code
+func (o *RepoTransferUnprocessableEntity) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo transfer unprocessable entity response a status code equal to that given
+func (o *RepoTransferUnprocessableEntity) IsCode(code int) bool {
+	return code == 422
+}
+
+// Code gets the status code for the repo transfer unprocessable entity response
+func (o *RepoTransferUnprocessableEntity) Code() int {
+	return 422
+}
+
+func (o *RepoTransferUnprocessableEntity) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/transfer][%d] repoTransferUnprocessableEntity", 422)
+}
+
+func (o *RepoTransferUnprocessableEntity) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/transfer][%d] repoTransferUnprocessableEntity", 422)
+}
+
+func (o *RepoTransferUnprocessableEntity) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_un_dismiss_pull_review_parameters.go b/bots-common/gitea-generated/client/repository/repo_un_dismiss_pull_review_parameters.go
new file mode 100644
index 0000000..c30b213
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_un_dismiss_pull_review_parameters.go
@@ -0,0 +1,222 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewRepoUnDismissPullReviewParams creates a new RepoUnDismissPullReviewParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoUnDismissPullReviewParams() *RepoUnDismissPullReviewParams {
+	return &RepoUnDismissPullReviewParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoUnDismissPullReviewParamsWithTimeout creates a new RepoUnDismissPullReviewParams object
+// with the ability to set a timeout on a request.
+func NewRepoUnDismissPullReviewParamsWithTimeout(timeout time.Duration) *RepoUnDismissPullReviewParams {
+	return &RepoUnDismissPullReviewParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoUnDismissPullReviewParamsWithContext creates a new RepoUnDismissPullReviewParams object
+// with the ability to set a context for a request.
+func NewRepoUnDismissPullReviewParamsWithContext(ctx context.Context) *RepoUnDismissPullReviewParams {
+	return &RepoUnDismissPullReviewParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoUnDismissPullReviewParamsWithHTTPClient creates a new RepoUnDismissPullReviewParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoUnDismissPullReviewParamsWithHTTPClient(client *http.Client) *RepoUnDismissPullReviewParams {
+	return &RepoUnDismissPullReviewParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoUnDismissPullReviewParams contains all the parameters to send to the API endpoint
+
+	for the repo un dismiss pull review operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoUnDismissPullReviewParams struct {
+
+	/* ID.
+
+	   id of the review
+
+	   Format: int64
+	*/
+	ID int64
+
+	/* Index.
+
+	   index of the pull request
+
+	   Format: int64
+	*/
+	Index int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo un dismiss pull review params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoUnDismissPullReviewParams) WithDefaults() *RepoUnDismissPullReviewParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo un dismiss pull review params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoUnDismissPullReviewParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo un dismiss pull review params
+func (o *RepoUnDismissPullReviewParams) WithTimeout(timeout time.Duration) *RepoUnDismissPullReviewParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo un dismiss pull review params
+func (o *RepoUnDismissPullReviewParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo un dismiss pull review params
+func (o *RepoUnDismissPullReviewParams) WithContext(ctx context.Context) *RepoUnDismissPullReviewParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo un dismiss pull review params
+func (o *RepoUnDismissPullReviewParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo un dismiss pull review params
+func (o *RepoUnDismissPullReviewParams) WithHTTPClient(client *http.Client) *RepoUnDismissPullReviewParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo un dismiss pull review params
+func (o *RepoUnDismissPullReviewParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithID adds the id to the repo un dismiss pull review params
+func (o *RepoUnDismissPullReviewParams) WithID(id int64) *RepoUnDismissPullReviewParams {
+	o.SetID(id)
+	return o
+}
+
+// SetID adds the id to the repo un dismiss pull review params
+func (o *RepoUnDismissPullReviewParams) SetID(id int64) {
+	o.ID = id
+}
+
+// WithIndex adds the index to the repo un dismiss pull review params
+func (o *RepoUnDismissPullReviewParams) WithIndex(index int64) *RepoUnDismissPullReviewParams {
+	o.SetIndex(index)
+	return o
+}
+
+// SetIndex adds the index to the repo un dismiss pull review params
+func (o *RepoUnDismissPullReviewParams) SetIndex(index int64) {
+	o.Index = index
+}
+
+// WithOwner adds the owner to the repo un dismiss pull review params
+func (o *RepoUnDismissPullReviewParams) WithOwner(owner string) *RepoUnDismissPullReviewParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo un dismiss pull review params
+func (o *RepoUnDismissPullReviewParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo un dismiss pull review params
+func (o *RepoUnDismissPullReviewParams) WithRepo(repo string) *RepoUnDismissPullReviewParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo un dismiss pull review params
+func (o *RepoUnDismissPullReviewParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoUnDismissPullReviewParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param id
+	if err := r.SetPathParam("id", swag.FormatInt64(o.ID)); err != nil {
+		return err
+	}
+
+	// path param index
+	if err := r.SetPathParam("index", swag.FormatInt64(o.Index)); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_un_dismiss_pull_review_responses.go b/bots-common/gitea-generated/client/repository/repo_un_dismiss_pull_review_responses.go
new file mode 100644
index 0000000..b4710bc
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_un_dismiss_pull_review_responses.go
@@ -0,0 +1,324 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoUnDismissPullReviewReader is a Reader for the RepoUnDismissPullReview structure.
+type RepoUnDismissPullReviewReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoUnDismissPullReviewReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoUnDismissPullReviewOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 403:
+		result := NewRepoUnDismissPullReviewForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewRepoUnDismissPullReviewNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 422:
+		result := NewRepoUnDismissPullReviewUnprocessableEntity()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[POST /repos/{owner}/{repo}/pulls/{index}/reviews/{id}/undismissals] repoUnDismissPullReview", response, response.Code())
+	}
+}
+
+// NewRepoUnDismissPullReviewOK creates a RepoUnDismissPullReviewOK with default headers values
+func NewRepoUnDismissPullReviewOK() *RepoUnDismissPullReviewOK {
+	return &RepoUnDismissPullReviewOK{}
+}
+
+/*
+RepoUnDismissPullReviewOK describes a response with status code 200, with default header values.
+
+PullReview
+*/
+type RepoUnDismissPullReviewOK struct {
+	Payload *models.PullReview
+}
+
+// IsSuccess returns true when this repo un dismiss pull review o k response has a 2xx status code
+func (o *RepoUnDismissPullReviewOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo un dismiss pull review o k response has a 3xx status code
+func (o *RepoUnDismissPullReviewOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo un dismiss pull review o k response has a 4xx status code
+func (o *RepoUnDismissPullReviewOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo un dismiss pull review o k response has a 5xx status code
+func (o *RepoUnDismissPullReviewOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo un dismiss pull review o k response a status code equal to that given
+func (o *RepoUnDismissPullReviewOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo un dismiss pull review o k response
+func (o *RepoUnDismissPullReviewOK) Code() int {
+	return 200
+}
+
+func (o *RepoUnDismissPullReviewOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/pulls/{index}/reviews/{id}/undismissals][%d] repoUnDismissPullReviewOK %s", 200, payload)
+}
+
+func (o *RepoUnDismissPullReviewOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/pulls/{index}/reviews/{id}/undismissals][%d] repoUnDismissPullReviewOK %s", 200, payload)
+}
+
+func (o *RepoUnDismissPullReviewOK) GetPayload() *models.PullReview {
+	return o.Payload
+}
+
+func (o *RepoUnDismissPullReviewOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.PullReview)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoUnDismissPullReviewForbidden creates a RepoUnDismissPullReviewForbidden with default headers values
+func NewRepoUnDismissPullReviewForbidden() *RepoUnDismissPullReviewForbidden {
+	return &RepoUnDismissPullReviewForbidden{}
+}
+
+/*
+RepoUnDismissPullReviewForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type RepoUnDismissPullReviewForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo un dismiss pull review forbidden response has a 2xx status code
+func (o *RepoUnDismissPullReviewForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo un dismiss pull review forbidden response has a 3xx status code
+func (o *RepoUnDismissPullReviewForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo un dismiss pull review forbidden response has a 4xx status code
+func (o *RepoUnDismissPullReviewForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo un dismiss pull review forbidden response has a 5xx status code
+func (o *RepoUnDismissPullReviewForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo un dismiss pull review forbidden response a status code equal to that given
+func (o *RepoUnDismissPullReviewForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the repo un dismiss pull review forbidden response
+func (o *RepoUnDismissPullReviewForbidden) Code() int {
+	return 403
+}
+
+func (o *RepoUnDismissPullReviewForbidden) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/pulls/{index}/reviews/{id}/undismissals][%d] repoUnDismissPullReviewForbidden", 403)
+}
+
+func (o *RepoUnDismissPullReviewForbidden) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/pulls/{index}/reviews/{id}/undismissals][%d] repoUnDismissPullReviewForbidden", 403)
+}
+
+func (o *RepoUnDismissPullReviewForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewRepoUnDismissPullReviewNotFound creates a RepoUnDismissPullReviewNotFound with default headers values
+func NewRepoUnDismissPullReviewNotFound() *RepoUnDismissPullReviewNotFound {
+	return &RepoUnDismissPullReviewNotFound{}
+}
+
+/*
+RepoUnDismissPullReviewNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoUnDismissPullReviewNotFound struct {
+}
+
+// IsSuccess returns true when this repo un dismiss pull review not found response has a 2xx status code
+func (o *RepoUnDismissPullReviewNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo un dismiss pull review not found response has a 3xx status code
+func (o *RepoUnDismissPullReviewNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo un dismiss pull review not found response has a 4xx status code
+func (o *RepoUnDismissPullReviewNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo un dismiss pull review not found response has a 5xx status code
+func (o *RepoUnDismissPullReviewNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo un dismiss pull review not found response a status code equal to that given
+func (o *RepoUnDismissPullReviewNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo un dismiss pull review not found response
+func (o *RepoUnDismissPullReviewNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoUnDismissPullReviewNotFound) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/pulls/{index}/reviews/{id}/undismissals][%d] repoUnDismissPullReviewNotFound", 404)
+}
+
+func (o *RepoUnDismissPullReviewNotFound) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/pulls/{index}/reviews/{id}/undismissals][%d] repoUnDismissPullReviewNotFound", 404)
+}
+
+func (o *RepoUnDismissPullReviewNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewRepoUnDismissPullReviewUnprocessableEntity creates a RepoUnDismissPullReviewUnprocessableEntity with default headers values
+func NewRepoUnDismissPullReviewUnprocessableEntity() *RepoUnDismissPullReviewUnprocessableEntity {
+	return &RepoUnDismissPullReviewUnprocessableEntity{}
+}
+
+/*
+RepoUnDismissPullReviewUnprocessableEntity describes a response with status code 422, with default header values.
+
+APIValidationError is error format response related to input validation
+*/
+type RepoUnDismissPullReviewUnprocessableEntity struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo un dismiss pull review unprocessable entity response has a 2xx status code
+func (o *RepoUnDismissPullReviewUnprocessableEntity) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo un dismiss pull review unprocessable entity response has a 3xx status code
+func (o *RepoUnDismissPullReviewUnprocessableEntity) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo un dismiss pull review unprocessable entity response has a 4xx status code
+func (o *RepoUnDismissPullReviewUnprocessableEntity) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo un dismiss pull review unprocessable entity response has a 5xx status code
+func (o *RepoUnDismissPullReviewUnprocessableEntity) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo un dismiss pull review unprocessable entity response a status code equal to that given
+func (o *RepoUnDismissPullReviewUnprocessableEntity) IsCode(code int) bool {
+	return code == 422
+}
+
+// Code gets the status code for the repo un dismiss pull review unprocessable entity response
+func (o *RepoUnDismissPullReviewUnprocessableEntity) Code() int {
+	return 422
+}
+
+func (o *RepoUnDismissPullReviewUnprocessableEntity) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/pulls/{index}/reviews/{id}/undismissals][%d] repoUnDismissPullReviewUnprocessableEntity", 422)
+}
+
+func (o *RepoUnDismissPullReviewUnprocessableEntity) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/pulls/{index}/reviews/{id}/undismissals][%d] repoUnDismissPullReviewUnprocessableEntity", 422)
+}
+
+func (o *RepoUnDismissPullReviewUnprocessableEntity) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_update_avatar_parameters.go b/bots-common/gitea-generated/client/repository/repo_update_avatar_parameters.go
new file mode 100644
index 0000000..29339e7
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_update_avatar_parameters.go
@@ -0,0 +1,194 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewRepoUpdateAvatarParams creates a new RepoUpdateAvatarParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoUpdateAvatarParams() *RepoUpdateAvatarParams {
+	return &RepoUpdateAvatarParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoUpdateAvatarParamsWithTimeout creates a new RepoUpdateAvatarParams object
+// with the ability to set a timeout on a request.
+func NewRepoUpdateAvatarParamsWithTimeout(timeout time.Duration) *RepoUpdateAvatarParams {
+	return &RepoUpdateAvatarParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoUpdateAvatarParamsWithContext creates a new RepoUpdateAvatarParams object
+// with the ability to set a context for a request.
+func NewRepoUpdateAvatarParamsWithContext(ctx context.Context) *RepoUpdateAvatarParams {
+	return &RepoUpdateAvatarParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoUpdateAvatarParamsWithHTTPClient creates a new RepoUpdateAvatarParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoUpdateAvatarParamsWithHTTPClient(client *http.Client) *RepoUpdateAvatarParams {
+	return &RepoUpdateAvatarParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoUpdateAvatarParams contains all the parameters to send to the API endpoint
+
+	for the repo update avatar operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoUpdateAvatarParams struct {
+
+	// Body.
+	Body *models.UpdateRepoAvatarOption
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo update avatar params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoUpdateAvatarParams) WithDefaults() *RepoUpdateAvatarParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo update avatar params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoUpdateAvatarParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo update avatar params
+func (o *RepoUpdateAvatarParams) WithTimeout(timeout time.Duration) *RepoUpdateAvatarParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo update avatar params
+func (o *RepoUpdateAvatarParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo update avatar params
+func (o *RepoUpdateAvatarParams) WithContext(ctx context.Context) *RepoUpdateAvatarParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo update avatar params
+func (o *RepoUpdateAvatarParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo update avatar params
+func (o *RepoUpdateAvatarParams) WithHTTPClient(client *http.Client) *RepoUpdateAvatarParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo update avatar params
+func (o *RepoUpdateAvatarParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the repo update avatar params
+func (o *RepoUpdateAvatarParams) WithBody(body *models.UpdateRepoAvatarOption) *RepoUpdateAvatarParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the repo update avatar params
+func (o *RepoUpdateAvatarParams) SetBody(body *models.UpdateRepoAvatarOption) {
+	o.Body = body
+}
+
+// WithOwner adds the owner to the repo update avatar params
+func (o *RepoUpdateAvatarParams) WithOwner(owner string) *RepoUpdateAvatarParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo update avatar params
+func (o *RepoUpdateAvatarParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo update avatar params
+func (o *RepoUpdateAvatarParams) WithRepo(repo string) *RepoUpdateAvatarParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo update avatar params
+func (o *RepoUpdateAvatarParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoUpdateAvatarParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_update_avatar_responses.go b/bots-common/gitea-generated/client/repository/repo_update_avatar_responses.go
new file mode 100644
index 0000000..eddae5f
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_update_avatar_responses.go
@@ -0,0 +1,150 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// RepoUpdateAvatarReader is a Reader for the RepoUpdateAvatar structure.
+type RepoUpdateAvatarReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoUpdateAvatarReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewRepoUpdateAvatarNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoUpdateAvatarNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[POST /repos/{owner}/{repo}/avatar] repoUpdateAvatar", response, response.Code())
+	}
+}
+
+// NewRepoUpdateAvatarNoContent creates a RepoUpdateAvatarNoContent with default headers values
+func NewRepoUpdateAvatarNoContent() *RepoUpdateAvatarNoContent {
+	return &RepoUpdateAvatarNoContent{}
+}
+
+/*
+RepoUpdateAvatarNoContent describes a response with status code 204, with default header values.
+
+APIEmpty is an empty response
+*/
+type RepoUpdateAvatarNoContent struct {
+}
+
+// IsSuccess returns true when this repo update avatar no content response has a 2xx status code
+func (o *RepoUpdateAvatarNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo update avatar no content response has a 3xx status code
+func (o *RepoUpdateAvatarNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo update avatar no content response has a 4xx status code
+func (o *RepoUpdateAvatarNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo update avatar no content response has a 5xx status code
+func (o *RepoUpdateAvatarNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo update avatar no content response a status code equal to that given
+func (o *RepoUpdateAvatarNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the repo update avatar no content response
+func (o *RepoUpdateAvatarNoContent) Code() int {
+	return 204
+}
+
+func (o *RepoUpdateAvatarNoContent) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/avatar][%d] repoUpdateAvatarNoContent", 204)
+}
+
+func (o *RepoUpdateAvatarNoContent) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/avatar][%d] repoUpdateAvatarNoContent", 204)
+}
+
+func (o *RepoUpdateAvatarNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewRepoUpdateAvatarNotFound creates a RepoUpdateAvatarNotFound with default headers values
+func NewRepoUpdateAvatarNotFound() *RepoUpdateAvatarNotFound {
+	return &RepoUpdateAvatarNotFound{}
+}
+
+/*
+RepoUpdateAvatarNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoUpdateAvatarNotFound struct {
+}
+
+// IsSuccess returns true when this repo update avatar not found response has a 2xx status code
+func (o *RepoUpdateAvatarNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo update avatar not found response has a 3xx status code
+func (o *RepoUpdateAvatarNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo update avatar not found response has a 4xx status code
+func (o *RepoUpdateAvatarNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo update avatar not found response has a 5xx status code
+func (o *RepoUpdateAvatarNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo update avatar not found response a status code equal to that given
+func (o *RepoUpdateAvatarNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo update avatar not found response
+func (o *RepoUpdateAvatarNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoUpdateAvatarNotFound) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/avatar][%d] repoUpdateAvatarNotFound", 404)
+}
+
+func (o *RepoUpdateAvatarNotFound) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/avatar][%d] repoUpdateAvatarNotFound", 404)
+}
+
+func (o *RepoUpdateAvatarNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_update_file_parameters.go b/bots-common/gitea-generated/client/repository/repo_update_file_parameters.go
new file mode 100644
index 0000000..41c49f8
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_update_file_parameters.go
@@ -0,0 +1,216 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewRepoUpdateFileParams creates a new RepoUpdateFileParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoUpdateFileParams() *RepoUpdateFileParams {
+	return &RepoUpdateFileParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoUpdateFileParamsWithTimeout creates a new RepoUpdateFileParams object
+// with the ability to set a timeout on a request.
+func NewRepoUpdateFileParamsWithTimeout(timeout time.Duration) *RepoUpdateFileParams {
+	return &RepoUpdateFileParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoUpdateFileParamsWithContext creates a new RepoUpdateFileParams object
+// with the ability to set a context for a request.
+func NewRepoUpdateFileParamsWithContext(ctx context.Context) *RepoUpdateFileParams {
+	return &RepoUpdateFileParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoUpdateFileParamsWithHTTPClient creates a new RepoUpdateFileParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoUpdateFileParamsWithHTTPClient(client *http.Client) *RepoUpdateFileParams {
+	return &RepoUpdateFileParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoUpdateFileParams contains all the parameters to send to the API endpoint
+
+	for the repo update file operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoUpdateFileParams struct {
+
+	// Body.
+	Body *models.UpdateFileOptions
+
+	/* Filepath.
+
+	   path of the file to update
+	*/
+	Filepath string
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo update file params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoUpdateFileParams) WithDefaults() *RepoUpdateFileParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo update file params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoUpdateFileParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo update file params
+func (o *RepoUpdateFileParams) WithTimeout(timeout time.Duration) *RepoUpdateFileParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo update file params
+func (o *RepoUpdateFileParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo update file params
+func (o *RepoUpdateFileParams) WithContext(ctx context.Context) *RepoUpdateFileParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo update file params
+func (o *RepoUpdateFileParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo update file params
+func (o *RepoUpdateFileParams) WithHTTPClient(client *http.Client) *RepoUpdateFileParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo update file params
+func (o *RepoUpdateFileParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the repo update file params
+func (o *RepoUpdateFileParams) WithBody(body *models.UpdateFileOptions) *RepoUpdateFileParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the repo update file params
+func (o *RepoUpdateFileParams) SetBody(body *models.UpdateFileOptions) {
+	o.Body = body
+}
+
+// WithFilepath adds the filepath to the repo update file params
+func (o *RepoUpdateFileParams) WithFilepath(filepath string) *RepoUpdateFileParams {
+	o.SetFilepath(filepath)
+	return o
+}
+
+// SetFilepath adds the filepath to the repo update file params
+func (o *RepoUpdateFileParams) SetFilepath(filepath string) {
+	o.Filepath = filepath
+}
+
+// WithOwner adds the owner to the repo update file params
+func (o *RepoUpdateFileParams) WithOwner(owner string) *RepoUpdateFileParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo update file params
+func (o *RepoUpdateFileParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo update file params
+func (o *RepoUpdateFileParams) WithRepo(repo string) *RepoUpdateFileParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo update file params
+func (o *RepoUpdateFileParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoUpdateFileParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	// path param filepath
+	if err := r.SetPathParam("filepath", o.Filepath); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_update_file_responses.go b/bots-common/gitea-generated/client/repository/repo_update_file_responses.go
new file mode 100644
index 0000000..0f651ad
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_update_file_responses.go
@@ -0,0 +1,402 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoUpdateFileReader is a Reader for the RepoUpdateFile structure.
+type RepoUpdateFileReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoUpdateFileReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoUpdateFileOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 403:
+		result := NewRepoUpdateFileForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewRepoUpdateFileNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 422:
+		result := NewRepoUpdateFileUnprocessableEntity()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 423:
+		result := NewRepoUpdateFileLocked()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[PUT /repos/{owner}/{repo}/contents/{filepath}] repoUpdateFile", response, response.Code())
+	}
+}
+
+// NewRepoUpdateFileOK creates a RepoUpdateFileOK with default headers values
+func NewRepoUpdateFileOK() *RepoUpdateFileOK {
+	return &RepoUpdateFileOK{}
+}
+
+/*
+RepoUpdateFileOK describes a response with status code 200, with default header values.
+
+FileResponse
+*/
+type RepoUpdateFileOK struct {
+	Payload *models.FileResponse
+}
+
+// IsSuccess returns true when this repo update file o k response has a 2xx status code
+func (o *RepoUpdateFileOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo update file o k response has a 3xx status code
+func (o *RepoUpdateFileOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo update file o k response has a 4xx status code
+func (o *RepoUpdateFileOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo update file o k response has a 5xx status code
+func (o *RepoUpdateFileOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo update file o k response a status code equal to that given
+func (o *RepoUpdateFileOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo update file o k response
+func (o *RepoUpdateFileOK) Code() int {
+	return 200
+}
+
+func (o *RepoUpdateFileOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[PUT /repos/{owner}/{repo}/contents/{filepath}][%d] repoUpdateFileOK %s", 200, payload)
+}
+
+func (o *RepoUpdateFileOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[PUT /repos/{owner}/{repo}/contents/{filepath}][%d] repoUpdateFileOK %s", 200, payload)
+}
+
+func (o *RepoUpdateFileOK) GetPayload() *models.FileResponse {
+	return o.Payload
+}
+
+func (o *RepoUpdateFileOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.FileResponse)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoUpdateFileForbidden creates a RepoUpdateFileForbidden with default headers values
+func NewRepoUpdateFileForbidden() *RepoUpdateFileForbidden {
+	return &RepoUpdateFileForbidden{}
+}
+
+/*
+RepoUpdateFileForbidden describes a response with status code 403, with default header values.
+
+APIError is error format response
+*/
+type RepoUpdateFileForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo update file forbidden response has a 2xx status code
+func (o *RepoUpdateFileForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo update file forbidden response has a 3xx status code
+func (o *RepoUpdateFileForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo update file forbidden response has a 4xx status code
+func (o *RepoUpdateFileForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo update file forbidden response has a 5xx status code
+func (o *RepoUpdateFileForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo update file forbidden response a status code equal to that given
+func (o *RepoUpdateFileForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the repo update file forbidden response
+func (o *RepoUpdateFileForbidden) Code() int {
+	return 403
+}
+
+func (o *RepoUpdateFileForbidden) Error() string {
+	return fmt.Sprintf("[PUT /repos/{owner}/{repo}/contents/{filepath}][%d] repoUpdateFileForbidden", 403)
+}
+
+func (o *RepoUpdateFileForbidden) String() string {
+	return fmt.Sprintf("[PUT /repos/{owner}/{repo}/contents/{filepath}][%d] repoUpdateFileForbidden", 403)
+}
+
+func (o *RepoUpdateFileForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewRepoUpdateFileNotFound creates a RepoUpdateFileNotFound with default headers values
+func NewRepoUpdateFileNotFound() *RepoUpdateFileNotFound {
+	return &RepoUpdateFileNotFound{}
+}
+
+/*
+RepoUpdateFileNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoUpdateFileNotFound struct {
+}
+
+// IsSuccess returns true when this repo update file not found response has a 2xx status code
+func (o *RepoUpdateFileNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo update file not found response has a 3xx status code
+func (o *RepoUpdateFileNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo update file not found response has a 4xx status code
+func (o *RepoUpdateFileNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo update file not found response has a 5xx status code
+func (o *RepoUpdateFileNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo update file not found response a status code equal to that given
+func (o *RepoUpdateFileNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo update file not found response
+func (o *RepoUpdateFileNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoUpdateFileNotFound) Error() string {
+	return fmt.Sprintf("[PUT /repos/{owner}/{repo}/contents/{filepath}][%d] repoUpdateFileNotFound", 404)
+}
+
+func (o *RepoUpdateFileNotFound) String() string {
+	return fmt.Sprintf("[PUT /repos/{owner}/{repo}/contents/{filepath}][%d] repoUpdateFileNotFound", 404)
+}
+
+func (o *RepoUpdateFileNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewRepoUpdateFileUnprocessableEntity creates a RepoUpdateFileUnprocessableEntity with default headers values
+func NewRepoUpdateFileUnprocessableEntity() *RepoUpdateFileUnprocessableEntity {
+	return &RepoUpdateFileUnprocessableEntity{}
+}
+
+/*
+RepoUpdateFileUnprocessableEntity describes a response with status code 422, with default header values.
+
+APIError is error format response
+*/
+type RepoUpdateFileUnprocessableEntity struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo update file unprocessable entity response has a 2xx status code
+func (o *RepoUpdateFileUnprocessableEntity) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo update file unprocessable entity response has a 3xx status code
+func (o *RepoUpdateFileUnprocessableEntity) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo update file unprocessable entity response has a 4xx status code
+func (o *RepoUpdateFileUnprocessableEntity) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo update file unprocessable entity response has a 5xx status code
+func (o *RepoUpdateFileUnprocessableEntity) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo update file unprocessable entity response a status code equal to that given
+func (o *RepoUpdateFileUnprocessableEntity) IsCode(code int) bool {
+	return code == 422
+}
+
+// Code gets the status code for the repo update file unprocessable entity response
+func (o *RepoUpdateFileUnprocessableEntity) Code() int {
+	return 422
+}
+
+func (o *RepoUpdateFileUnprocessableEntity) Error() string {
+	return fmt.Sprintf("[PUT /repos/{owner}/{repo}/contents/{filepath}][%d] repoUpdateFileUnprocessableEntity", 422)
+}
+
+func (o *RepoUpdateFileUnprocessableEntity) String() string {
+	return fmt.Sprintf("[PUT /repos/{owner}/{repo}/contents/{filepath}][%d] repoUpdateFileUnprocessableEntity", 422)
+}
+
+func (o *RepoUpdateFileUnprocessableEntity) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewRepoUpdateFileLocked creates a RepoUpdateFileLocked with default headers values
+func NewRepoUpdateFileLocked() *RepoUpdateFileLocked {
+	return &RepoUpdateFileLocked{}
+}
+
+/*
+RepoUpdateFileLocked describes a response with status code 423, with default header values.
+
+APIRepoArchivedError is an error that is raised when an archived repo should be modified
+*/
+type RepoUpdateFileLocked struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo update file locked response has a 2xx status code
+func (o *RepoUpdateFileLocked) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo update file locked response has a 3xx status code
+func (o *RepoUpdateFileLocked) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo update file locked response has a 4xx status code
+func (o *RepoUpdateFileLocked) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo update file locked response has a 5xx status code
+func (o *RepoUpdateFileLocked) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo update file locked response a status code equal to that given
+func (o *RepoUpdateFileLocked) IsCode(code int) bool {
+	return code == 423
+}
+
+// Code gets the status code for the repo update file locked response
+func (o *RepoUpdateFileLocked) Code() int {
+	return 423
+}
+
+func (o *RepoUpdateFileLocked) Error() string {
+	return fmt.Sprintf("[PUT /repos/{owner}/{repo}/contents/{filepath}][%d] repoUpdateFileLocked", 423)
+}
+
+func (o *RepoUpdateFileLocked) String() string {
+	return fmt.Sprintf("[PUT /repos/{owner}/{repo}/contents/{filepath}][%d] repoUpdateFileLocked", 423)
+}
+
+func (o *RepoUpdateFileLocked) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_update_pull_request_parameters.go b/bots-common/gitea-generated/client/repository/repo_update_pull_request_parameters.go
new file mode 100644
index 0000000..f3e9b16
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_update_pull_request_parameters.go
@@ -0,0 +1,232 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewRepoUpdatePullRequestParams creates a new RepoUpdatePullRequestParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoUpdatePullRequestParams() *RepoUpdatePullRequestParams {
+	return &RepoUpdatePullRequestParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoUpdatePullRequestParamsWithTimeout creates a new RepoUpdatePullRequestParams object
+// with the ability to set a timeout on a request.
+func NewRepoUpdatePullRequestParamsWithTimeout(timeout time.Duration) *RepoUpdatePullRequestParams {
+	return &RepoUpdatePullRequestParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoUpdatePullRequestParamsWithContext creates a new RepoUpdatePullRequestParams object
+// with the ability to set a context for a request.
+func NewRepoUpdatePullRequestParamsWithContext(ctx context.Context) *RepoUpdatePullRequestParams {
+	return &RepoUpdatePullRequestParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoUpdatePullRequestParamsWithHTTPClient creates a new RepoUpdatePullRequestParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoUpdatePullRequestParamsWithHTTPClient(client *http.Client) *RepoUpdatePullRequestParams {
+	return &RepoUpdatePullRequestParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoUpdatePullRequestParams contains all the parameters to send to the API endpoint
+
+	for the repo update pull request operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoUpdatePullRequestParams struct {
+
+	/* Index.
+
+	   index of the pull request to get
+
+	   Format: int64
+	*/
+	Index int64
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	/* Style.
+
+	   how to update pull request
+	*/
+	Style *string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo update pull request params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoUpdatePullRequestParams) WithDefaults() *RepoUpdatePullRequestParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo update pull request params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoUpdatePullRequestParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo update pull request params
+func (o *RepoUpdatePullRequestParams) WithTimeout(timeout time.Duration) *RepoUpdatePullRequestParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo update pull request params
+func (o *RepoUpdatePullRequestParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo update pull request params
+func (o *RepoUpdatePullRequestParams) WithContext(ctx context.Context) *RepoUpdatePullRequestParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo update pull request params
+func (o *RepoUpdatePullRequestParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo update pull request params
+func (o *RepoUpdatePullRequestParams) WithHTTPClient(client *http.Client) *RepoUpdatePullRequestParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo update pull request params
+func (o *RepoUpdatePullRequestParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithIndex adds the index to the repo update pull request params
+func (o *RepoUpdatePullRequestParams) WithIndex(index int64) *RepoUpdatePullRequestParams {
+	o.SetIndex(index)
+	return o
+}
+
+// SetIndex adds the index to the repo update pull request params
+func (o *RepoUpdatePullRequestParams) SetIndex(index int64) {
+	o.Index = index
+}
+
+// WithOwner adds the owner to the repo update pull request params
+func (o *RepoUpdatePullRequestParams) WithOwner(owner string) *RepoUpdatePullRequestParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo update pull request params
+func (o *RepoUpdatePullRequestParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo update pull request params
+func (o *RepoUpdatePullRequestParams) WithRepo(repo string) *RepoUpdatePullRequestParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo update pull request params
+func (o *RepoUpdatePullRequestParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WithStyle adds the style to the repo update pull request params
+func (o *RepoUpdatePullRequestParams) WithStyle(style *string) *RepoUpdatePullRequestParams {
+	o.SetStyle(style)
+	return o
+}
+
+// SetStyle adds the style to the repo update pull request params
+func (o *RepoUpdatePullRequestParams) SetStyle(style *string) {
+	o.Style = style
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoUpdatePullRequestParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param index
+	if err := r.SetPathParam("index", swag.FormatInt64(o.Index)); err != nil {
+		return err
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if o.Style != nil {
+
+		// query param style
+		var qrStyle string
+
+		if o.Style != nil {
+			qrStyle = *o.Style
+		}
+		qStyle := qrStyle
+		if qStyle != "" {
+
+			if err := r.SetQueryParam("style", qStyle); err != nil {
+				return err
+			}
+		}
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_update_pull_request_responses.go b/bots-common/gitea-generated/client/repository/repo_update_pull_request_responses.go
new file mode 100644
index 0000000..39fc9bd
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_update_pull_request_responses.go
@@ -0,0 +1,384 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// RepoUpdatePullRequestReader is a Reader for the RepoUpdatePullRequest structure.
+type RepoUpdatePullRequestReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoUpdatePullRequestReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoUpdatePullRequestOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 403:
+		result := NewRepoUpdatePullRequestForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewRepoUpdatePullRequestNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 409:
+		result := NewRepoUpdatePullRequestConflict()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 422:
+		result := NewRepoUpdatePullRequestUnprocessableEntity()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[POST /repos/{owner}/{repo}/pulls/{index}/update] repoUpdatePullRequest", response, response.Code())
+	}
+}
+
+// NewRepoUpdatePullRequestOK creates a RepoUpdatePullRequestOK with default headers values
+func NewRepoUpdatePullRequestOK() *RepoUpdatePullRequestOK {
+	return &RepoUpdatePullRequestOK{}
+}
+
+/*
+RepoUpdatePullRequestOK describes a response with status code 200, with default header values.
+
+APIEmpty is an empty response
+*/
+type RepoUpdatePullRequestOK struct {
+}
+
+// IsSuccess returns true when this repo update pull request o k response has a 2xx status code
+func (o *RepoUpdatePullRequestOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo update pull request o k response has a 3xx status code
+func (o *RepoUpdatePullRequestOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo update pull request o k response has a 4xx status code
+func (o *RepoUpdatePullRequestOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo update pull request o k response has a 5xx status code
+func (o *RepoUpdatePullRequestOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo update pull request o k response a status code equal to that given
+func (o *RepoUpdatePullRequestOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo update pull request o k response
+func (o *RepoUpdatePullRequestOK) Code() int {
+	return 200
+}
+
+func (o *RepoUpdatePullRequestOK) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/pulls/{index}/update][%d] repoUpdatePullRequestOK", 200)
+}
+
+func (o *RepoUpdatePullRequestOK) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/pulls/{index}/update][%d] repoUpdatePullRequestOK", 200)
+}
+
+func (o *RepoUpdatePullRequestOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewRepoUpdatePullRequestForbidden creates a RepoUpdatePullRequestForbidden with default headers values
+func NewRepoUpdatePullRequestForbidden() *RepoUpdatePullRequestForbidden {
+	return &RepoUpdatePullRequestForbidden{}
+}
+
+/*
+RepoUpdatePullRequestForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type RepoUpdatePullRequestForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo update pull request forbidden response has a 2xx status code
+func (o *RepoUpdatePullRequestForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo update pull request forbidden response has a 3xx status code
+func (o *RepoUpdatePullRequestForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo update pull request forbidden response has a 4xx status code
+func (o *RepoUpdatePullRequestForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo update pull request forbidden response has a 5xx status code
+func (o *RepoUpdatePullRequestForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo update pull request forbidden response a status code equal to that given
+func (o *RepoUpdatePullRequestForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the repo update pull request forbidden response
+func (o *RepoUpdatePullRequestForbidden) Code() int {
+	return 403
+}
+
+func (o *RepoUpdatePullRequestForbidden) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/pulls/{index}/update][%d] repoUpdatePullRequestForbidden", 403)
+}
+
+func (o *RepoUpdatePullRequestForbidden) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/pulls/{index}/update][%d] repoUpdatePullRequestForbidden", 403)
+}
+
+func (o *RepoUpdatePullRequestForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewRepoUpdatePullRequestNotFound creates a RepoUpdatePullRequestNotFound with default headers values
+func NewRepoUpdatePullRequestNotFound() *RepoUpdatePullRequestNotFound {
+	return &RepoUpdatePullRequestNotFound{}
+}
+
+/*
+RepoUpdatePullRequestNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoUpdatePullRequestNotFound struct {
+}
+
+// IsSuccess returns true when this repo update pull request not found response has a 2xx status code
+func (o *RepoUpdatePullRequestNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo update pull request not found response has a 3xx status code
+func (o *RepoUpdatePullRequestNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo update pull request not found response has a 4xx status code
+func (o *RepoUpdatePullRequestNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo update pull request not found response has a 5xx status code
+func (o *RepoUpdatePullRequestNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo update pull request not found response a status code equal to that given
+func (o *RepoUpdatePullRequestNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo update pull request not found response
+func (o *RepoUpdatePullRequestNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoUpdatePullRequestNotFound) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/pulls/{index}/update][%d] repoUpdatePullRequestNotFound", 404)
+}
+
+func (o *RepoUpdatePullRequestNotFound) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/pulls/{index}/update][%d] repoUpdatePullRequestNotFound", 404)
+}
+
+func (o *RepoUpdatePullRequestNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewRepoUpdatePullRequestConflict creates a RepoUpdatePullRequestConflict with default headers values
+func NewRepoUpdatePullRequestConflict() *RepoUpdatePullRequestConflict {
+	return &RepoUpdatePullRequestConflict{}
+}
+
+/*
+RepoUpdatePullRequestConflict describes a response with status code 409, with default header values.
+
+APIError is error format response
+*/
+type RepoUpdatePullRequestConflict struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo update pull request conflict response has a 2xx status code
+func (o *RepoUpdatePullRequestConflict) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo update pull request conflict response has a 3xx status code
+func (o *RepoUpdatePullRequestConflict) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo update pull request conflict response has a 4xx status code
+func (o *RepoUpdatePullRequestConflict) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo update pull request conflict response has a 5xx status code
+func (o *RepoUpdatePullRequestConflict) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo update pull request conflict response a status code equal to that given
+func (o *RepoUpdatePullRequestConflict) IsCode(code int) bool {
+	return code == 409
+}
+
+// Code gets the status code for the repo update pull request conflict response
+func (o *RepoUpdatePullRequestConflict) Code() int {
+	return 409
+}
+
+func (o *RepoUpdatePullRequestConflict) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/pulls/{index}/update][%d] repoUpdatePullRequestConflict", 409)
+}
+
+func (o *RepoUpdatePullRequestConflict) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/pulls/{index}/update][%d] repoUpdatePullRequestConflict", 409)
+}
+
+func (o *RepoUpdatePullRequestConflict) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewRepoUpdatePullRequestUnprocessableEntity creates a RepoUpdatePullRequestUnprocessableEntity with default headers values
+func NewRepoUpdatePullRequestUnprocessableEntity() *RepoUpdatePullRequestUnprocessableEntity {
+	return &RepoUpdatePullRequestUnprocessableEntity{}
+}
+
+/*
+RepoUpdatePullRequestUnprocessableEntity describes a response with status code 422, with default header values.
+
+APIValidationError is error format response related to input validation
+*/
+type RepoUpdatePullRequestUnprocessableEntity struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this repo update pull request unprocessable entity response has a 2xx status code
+func (o *RepoUpdatePullRequestUnprocessableEntity) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo update pull request unprocessable entity response has a 3xx status code
+func (o *RepoUpdatePullRequestUnprocessableEntity) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo update pull request unprocessable entity response has a 4xx status code
+func (o *RepoUpdatePullRequestUnprocessableEntity) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo update pull request unprocessable entity response has a 5xx status code
+func (o *RepoUpdatePullRequestUnprocessableEntity) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo update pull request unprocessable entity response a status code equal to that given
+func (o *RepoUpdatePullRequestUnprocessableEntity) IsCode(code int) bool {
+	return code == 422
+}
+
+// Code gets the status code for the repo update pull request unprocessable entity response
+func (o *RepoUpdatePullRequestUnprocessableEntity) Code() int {
+	return 422
+}
+
+func (o *RepoUpdatePullRequestUnprocessableEntity) Error() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/pulls/{index}/update][%d] repoUpdatePullRequestUnprocessableEntity", 422)
+}
+
+func (o *RepoUpdatePullRequestUnprocessableEntity) String() string {
+	return fmt.Sprintf("[POST /repos/{owner}/{repo}/pulls/{index}/update][%d] repoUpdatePullRequestUnprocessableEntity", 422)
+}
+
+func (o *RepoUpdatePullRequestUnprocessableEntity) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_update_topics_parameters.go b/bots-common/gitea-generated/client/repository/repo_update_topics_parameters.go
new file mode 100644
index 0000000..45690c7
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_update_topics_parameters.go
@@ -0,0 +1,194 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewRepoUpdateTopicsParams creates a new RepoUpdateTopicsParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoUpdateTopicsParams() *RepoUpdateTopicsParams {
+	return &RepoUpdateTopicsParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoUpdateTopicsParamsWithTimeout creates a new RepoUpdateTopicsParams object
+// with the ability to set a timeout on a request.
+func NewRepoUpdateTopicsParamsWithTimeout(timeout time.Duration) *RepoUpdateTopicsParams {
+	return &RepoUpdateTopicsParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoUpdateTopicsParamsWithContext creates a new RepoUpdateTopicsParams object
+// with the ability to set a context for a request.
+func NewRepoUpdateTopicsParamsWithContext(ctx context.Context) *RepoUpdateTopicsParams {
+	return &RepoUpdateTopicsParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoUpdateTopicsParamsWithHTTPClient creates a new RepoUpdateTopicsParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoUpdateTopicsParamsWithHTTPClient(client *http.Client) *RepoUpdateTopicsParams {
+	return &RepoUpdateTopicsParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoUpdateTopicsParams contains all the parameters to send to the API endpoint
+
+	for the repo update topics operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoUpdateTopicsParams struct {
+
+	// Body.
+	Body *models.RepoTopicOptions
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo update topics params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoUpdateTopicsParams) WithDefaults() *RepoUpdateTopicsParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo update topics params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoUpdateTopicsParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo update topics params
+func (o *RepoUpdateTopicsParams) WithTimeout(timeout time.Duration) *RepoUpdateTopicsParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo update topics params
+func (o *RepoUpdateTopicsParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo update topics params
+func (o *RepoUpdateTopicsParams) WithContext(ctx context.Context) *RepoUpdateTopicsParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo update topics params
+func (o *RepoUpdateTopicsParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo update topics params
+func (o *RepoUpdateTopicsParams) WithHTTPClient(client *http.Client) *RepoUpdateTopicsParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo update topics params
+func (o *RepoUpdateTopicsParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the repo update topics params
+func (o *RepoUpdateTopicsParams) WithBody(body *models.RepoTopicOptions) *RepoUpdateTopicsParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the repo update topics params
+func (o *RepoUpdateTopicsParams) SetBody(body *models.RepoTopicOptions) {
+	o.Body = body
+}
+
+// WithOwner adds the owner to the repo update topics params
+func (o *RepoUpdateTopicsParams) WithOwner(owner string) *RepoUpdateTopicsParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo update topics params
+func (o *RepoUpdateTopicsParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo update topics params
+func (o *RepoUpdateTopicsParams) WithRepo(repo string) *RepoUpdateTopicsParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo update topics params
+func (o *RepoUpdateTopicsParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoUpdateTopicsParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_update_topics_responses.go b/bots-common/gitea-generated/client/repository/repo_update_topics_responses.go
new file mode 100644
index 0000000..f5062d4
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_update_topics_responses.go
@@ -0,0 +1,256 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// RepoUpdateTopicsReader is a Reader for the RepoUpdateTopics structure.
+type RepoUpdateTopicsReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoUpdateTopicsReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewRepoUpdateTopicsNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoUpdateTopicsNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 422:
+		result := NewRepoUpdateTopicsUnprocessableEntity()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[PUT /repos/{owner}/{repo}/topics] repoUpdateTopics", response, response.Code())
+	}
+}
+
+// NewRepoUpdateTopicsNoContent creates a RepoUpdateTopicsNoContent with default headers values
+func NewRepoUpdateTopicsNoContent() *RepoUpdateTopicsNoContent {
+	return &RepoUpdateTopicsNoContent{}
+}
+
+/*
+RepoUpdateTopicsNoContent describes a response with status code 204, with default header values.
+
+APIEmpty is an empty response
+*/
+type RepoUpdateTopicsNoContent struct {
+}
+
+// IsSuccess returns true when this repo update topics no content response has a 2xx status code
+func (o *RepoUpdateTopicsNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo update topics no content response has a 3xx status code
+func (o *RepoUpdateTopicsNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo update topics no content response has a 4xx status code
+func (o *RepoUpdateTopicsNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo update topics no content response has a 5xx status code
+func (o *RepoUpdateTopicsNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo update topics no content response a status code equal to that given
+func (o *RepoUpdateTopicsNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the repo update topics no content response
+func (o *RepoUpdateTopicsNoContent) Code() int {
+	return 204
+}
+
+func (o *RepoUpdateTopicsNoContent) Error() string {
+	return fmt.Sprintf("[PUT /repos/{owner}/{repo}/topics][%d] repoUpdateTopicsNoContent", 204)
+}
+
+func (o *RepoUpdateTopicsNoContent) String() string {
+	return fmt.Sprintf("[PUT /repos/{owner}/{repo}/topics][%d] repoUpdateTopicsNoContent", 204)
+}
+
+func (o *RepoUpdateTopicsNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewRepoUpdateTopicsNotFound creates a RepoUpdateTopicsNotFound with default headers values
+func NewRepoUpdateTopicsNotFound() *RepoUpdateTopicsNotFound {
+	return &RepoUpdateTopicsNotFound{}
+}
+
+/*
+RepoUpdateTopicsNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoUpdateTopicsNotFound struct {
+}
+
+// IsSuccess returns true when this repo update topics not found response has a 2xx status code
+func (o *RepoUpdateTopicsNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo update topics not found response has a 3xx status code
+func (o *RepoUpdateTopicsNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo update topics not found response has a 4xx status code
+func (o *RepoUpdateTopicsNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo update topics not found response has a 5xx status code
+func (o *RepoUpdateTopicsNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo update topics not found response a status code equal to that given
+func (o *RepoUpdateTopicsNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo update topics not found response
+func (o *RepoUpdateTopicsNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoUpdateTopicsNotFound) Error() string {
+	return fmt.Sprintf("[PUT /repos/{owner}/{repo}/topics][%d] repoUpdateTopicsNotFound", 404)
+}
+
+func (o *RepoUpdateTopicsNotFound) String() string {
+	return fmt.Sprintf("[PUT /repos/{owner}/{repo}/topics][%d] repoUpdateTopicsNotFound", 404)
+}
+
+func (o *RepoUpdateTopicsNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewRepoUpdateTopicsUnprocessableEntity creates a RepoUpdateTopicsUnprocessableEntity with default headers values
+func NewRepoUpdateTopicsUnprocessableEntity() *RepoUpdateTopicsUnprocessableEntity {
+	return &RepoUpdateTopicsUnprocessableEntity{}
+}
+
+/*
+RepoUpdateTopicsUnprocessableEntity describes a response with status code 422, with default header values.
+
+APIInvalidTopicsError is error format response to invalid topics
+*/
+type RepoUpdateTopicsUnprocessableEntity struct {
+	InvalidTopics []string
+	Message       string
+}
+
+// IsSuccess returns true when this repo update topics unprocessable entity response has a 2xx status code
+func (o *RepoUpdateTopicsUnprocessableEntity) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo update topics unprocessable entity response has a 3xx status code
+func (o *RepoUpdateTopicsUnprocessableEntity) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo update topics unprocessable entity response has a 4xx status code
+func (o *RepoUpdateTopicsUnprocessableEntity) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo update topics unprocessable entity response has a 5xx status code
+func (o *RepoUpdateTopicsUnprocessableEntity) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo update topics unprocessable entity response a status code equal to that given
+func (o *RepoUpdateTopicsUnprocessableEntity) IsCode(code int) bool {
+	return code == 422
+}
+
+// Code gets the status code for the repo update topics unprocessable entity response
+func (o *RepoUpdateTopicsUnprocessableEntity) Code() int {
+	return 422
+}
+
+func (o *RepoUpdateTopicsUnprocessableEntity) Error() string {
+	return fmt.Sprintf("[PUT /repos/{owner}/{repo}/topics][%d] repoUpdateTopicsUnprocessableEntity", 422)
+}
+
+func (o *RepoUpdateTopicsUnprocessableEntity) String() string {
+	return fmt.Sprintf("[PUT /repos/{owner}/{repo}/topics][%d] repoUpdateTopicsUnprocessableEntity", 422)
+}
+
+func (o *RepoUpdateTopicsUnprocessableEntity) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header invalidTopics
+	hdrInvalidTopics := response.GetHeader("invalidTopics")
+
+	if hdrInvalidTopics != "" {
+
+		// binding header items for invalidTopics
+		valInvalidTopics, err := o.bindHeaderInvalidTopics(hdrInvalidTopics, formats)
+		if err != nil {
+			return err
+		}
+
+		o.InvalidTopics = valInvalidTopics
+	}
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	return nil
+}
+
+// bindHeaderRepoUpdateTopicsUnprocessableEntity binds the response header invalidTopics
+func (o *RepoUpdateTopicsUnprocessableEntity) bindHeaderInvalidTopics(hdr string, formats strfmt.Registry) ([]string, error) {
+	invalidTopicsIV := hdr
+
+	var (
+		invalidTopicsIC []string
+	)
+	// items.CollectionFormat: ""
+	invalidTopicsIR := swag.SplitByFormat(invalidTopicsIV, "")
+
+	for _, invalidTopicsIIV := range invalidTopicsIR {
+
+		// convert split string to string
+		invalidTopicsIIC := invalidTopicsIIV                        // string as string
+		invalidTopicsIC = append(invalidTopicsIC, invalidTopicsIIC) // roll-up string into []string
+	}
+
+	return invalidTopicsIC, nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_validate_issue_config_parameters.go b/bots-common/gitea-generated/client/repository/repo_validate_issue_config_parameters.go
new file mode 100644
index 0000000..6d66548
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_validate_issue_config_parameters.go
@@ -0,0 +1,173 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewRepoValidateIssueConfigParams creates a new RepoValidateIssueConfigParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewRepoValidateIssueConfigParams() *RepoValidateIssueConfigParams {
+	return &RepoValidateIssueConfigParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewRepoValidateIssueConfigParamsWithTimeout creates a new RepoValidateIssueConfigParams object
+// with the ability to set a timeout on a request.
+func NewRepoValidateIssueConfigParamsWithTimeout(timeout time.Duration) *RepoValidateIssueConfigParams {
+	return &RepoValidateIssueConfigParams{
+		timeout: timeout,
+	}
+}
+
+// NewRepoValidateIssueConfigParamsWithContext creates a new RepoValidateIssueConfigParams object
+// with the ability to set a context for a request.
+func NewRepoValidateIssueConfigParamsWithContext(ctx context.Context) *RepoValidateIssueConfigParams {
+	return &RepoValidateIssueConfigParams{
+		Context: ctx,
+	}
+}
+
+// NewRepoValidateIssueConfigParamsWithHTTPClient creates a new RepoValidateIssueConfigParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewRepoValidateIssueConfigParamsWithHTTPClient(client *http.Client) *RepoValidateIssueConfigParams {
+	return &RepoValidateIssueConfigParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+RepoValidateIssueConfigParams contains all the parameters to send to the API endpoint
+
+	for the repo validate issue config operation.
+
+	Typically these are written to a http.Request.
+*/
+type RepoValidateIssueConfigParams struct {
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the repo validate issue config params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoValidateIssueConfigParams) WithDefaults() *RepoValidateIssueConfigParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the repo validate issue config params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *RepoValidateIssueConfigParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the repo validate issue config params
+func (o *RepoValidateIssueConfigParams) WithTimeout(timeout time.Duration) *RepoValidateIssueConfigParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the repo validate issue config params
+func (o *RepoValidateIssueConfigParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the repo validate issue config params
+func (o *RepoValidateIssueConfigParams) WithContext(ctx context.Context) *RepoValidateIssueConfigParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the repo validate issue config params
+func (o *RepoValidateIssueConfigParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the repo validate issue config params
+func (o *RepoValidateIssueConfigParams) WithHTTPClient(client *http.Client) *RepoValidateIssueConfigParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the repo validate issue config params
+func (o *RepoValidateIssueConfigParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithOwner adds the owner to the repo validate issue config params
+func (o *RepoValidateIssueConfigParams) WithOwner(owner string) *RepoValidateIssueConfigParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the repo validate issue config params
+func (o *RepoValidateIssueConfigParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the repo validate issue config params
+func (o *RepoValidateIssueConfigParams) WithRepo(repo string) *RepoValidateIssueConfigParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the repo validate issue config params
+func (o *RepoValidateIssueConfigParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *RepoValidateIssueConfigParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repo_validate_issue_config_responses.go b/bots-common/gitea-generated/client/repository/repo_validate_issue_config_responses.go
new file mode 100644
index 0000000..f36e5ad
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repo_validate_issue_config_responses.go
@@ -0,0 +1,168 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// RepoValidateIssueConfigReader is a Reader for the RepoValidateIssueConfig structure.
+type RepoValidateIssueConfigReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *RepoValidateIssueConfigReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewRepoValidateIssueConfigOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewRepoValidateIssueConfigNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/issue_config/validate] repoValidateIssueConfig", response, response.Code())
+	}
+}
+
+// NewRepoValidateIssueConfigOK creates a RepoValidateIssueConfigOK with default headers values
+func NewRepoValidateIssueConfigOK() *RepoValidateIssueConfigOK {
+	return &RepoValidateIssueConfigOK{}
+}
+
+/*
+RepoValidateIssueConfigOK describes a response with status code 200, with default header values.
+
+RepoIssueConfigValidation
+*/
+type RepoValidateIssueConfigOK struct {
+	Payload *models.IssueConfigValidation
+}
+
+// IsSuccess returns true when this repo validate issue config o k response has a 2xx status code
+func (o *RepoValidateIssueConfigOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this repo validate issue config o k response has a 3xx status code
+func (o *RepoValidateIssueConfigOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo validate issue config o k response has a 4xx status code
+func (o *RepoValidateIssueConfigOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this repo validate issue config o k response has a 5xx status code
+func (o *RepoValidateIssueConfigOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo validate issue config o k response a status code equal to that given
+func (o *RepoValidateIssueConfigOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the repo validate issue config o k response
+func (o *RepoValidateIssueConfigOK) Code() int {
+	return 200
+}
+
+func (o *RepoValidateIssueConfigOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issue_config/validate][%d] repoValidateIssueConfigOK %s", 200, payload)
+}
+
+func (o *RepoValidateIssueConfigOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issue_config/validate][%d] repoValidateIssueConfigOK %s", 200, payload)
+}
+
+func (o *RepoValidateIssueConfigOK) GetPayload() *models.IssueConfigValidation {
+	return o.Payload
+}
+
+func (o *RepoValidateIssueConfigOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.IssueConfigValidation)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewRepoValidateIssueConfigNotFound creates a RepoValidateIssueConfigNotFound with default headers values
+func NewRepoValidateIssueConfigNotFound() *RepoValidateIssueConfigNotFound {
+	return &RepoValidateIssueConfigNotFound{}
+}
+
+/*
+RepoValidateIssueConfigNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type RepoValidateIssueConfigNotFound struct {
+}
+
+// IsSuccess returns true when this repo validate issue config not found response has a 2xx status code
+func (o *RepoValidateIssueConfigNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this repo validate issue config not found response has a 3xx status code
+func (o *RepoValidateIssueConfigNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this repo validate issue config not found response has a 4xx status code
+func (o *RepoValidateIssueConfigNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this repo validate issue config not found response has a 5xx status code
+func (o *RepoValidateIssueConfigNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this repo validate issue config not found response a status code equal to that given
+func (o *RepoValidateIssueConfigNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the repo validate issue config not found response
+func (o *RepoValidateIssueConfigNotFound) Code() int {
+	return 404
+}
+
+func (o *RepoValidateIssueConfigNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issue_config/validate][%d] repoValidateIssueConfigNotFound", 404)
+}
+
+func (o *RepoValidateIssueConfigNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/issue_config/validate][%d] repoValidateIssueConfigNotFound", 404)
+}
+
+func (o *RepoValidateIssueConfigNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/repository_client.go b/bots-common/gitea-generated/client/repository/repository_client.go
new file mode 100644
index 0000000..edfe463
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/repository_client.go
@@ -0,0 +1,6526 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	httptransport "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// New creates a new repository API client.
+func New(transport runtime.ClientTransport, formats strfmt.Registry) ClientService {
+	return &Client{transport: transport, formats: formats}
+}
+
+// New creates a new repository API client with basic auth credentials.
+// It takes the following parameters:
+// - host: http host (github.com).
+// - basePath: any base path for the API client ("/v1", "/v3").
+// - scheme: http scheme ("http", "https").
+// - user: user for basic authentication header.
+// - password: password for basic authentication header.
+func NewClientWithBasicAuth(host, basePath, scheme, user, password string) ClientService {
+	transport := httptransport.New(host, basePath, []string{scheme})
+	transport.DefaultAuthentication = httptransport.BasicAuth(user, password)
+	return &Client{transport: transport, formats: strfmt.Default}
+}
+
+// New creates a new repository API client with a bearer token for authentication.
+// It takes the following parameters:
+// - host: http host (github.com).
+// - basePath: any base path for the API client ("/v1", "/v3").
+// - scheme: http scheme ("http", "https").
+// - bearerToken: bearer token for Bearer authentication header.
+func NewClientWithBearerToken(host, basePath, scheme, bearerToken string) ClientService {
+	transport := httptransport.New(host, basePath, []string{scheme})
+	transport.DefaultAuthentication = httptransport.BearerToken(bearerToken)
+	return &Client{transport: transport, formats: strfmt.Default}
+}
+
+/*
+Client for repository API
+*/
+type Client struct {
+	transport runtime.ClientTransport
+	formats   strfmt.Registry
+}
+
+// ClientOption may be used to customize the behavior of Client methods.
+type ClientOption func(*runtime.ClientOperation)
+
+// This client is generated with a few options you might find useful for your swagger spec.
+//
+// Feel free to add you own set of options.
+
+// WithContentType allows the client to force the Content-Type header
+// to negotiate a specific Consumer from the server.
+//
+// You may use this option to set arbitrary extensions to your MIME media type.
+func WithContentType(mime string) ClientOption {
+	return func(r *runtime.ClientOperation) {
+		r.ConsumesMediaTypes = []string{mime}
+	}
+}
+
+// WithContentTypeApplicationJSON sets the Content-Type header to "application/json".
+func WithContentTypeApplicationJSON(r *runtime.ClientOperation) {
+	r.ConsumesMediaTypes = []string{"application/json"}
+}
+
+// WithContentTypeApplicationOctetStream sets the Content-Type header to "application/octet-stream".
+func WithContentTypeApplicationOctetStream(r *runtime.ClientOperation) {
+	r.ConsumesMediaTypes = []string{"application/octet-stream"}
+}
+
+// WithContentTypeMultipartFormData sets the Content-Type header to "multipart/form-data".
+func WithContentTypeMultipartFormData(r *runtime.ClientOperation) {
+	r.ConsumesMediaTypes = []string{"multipart/form-data"}
+}
+
+// WithContentTypeTextPlain sets the Content-Type header to "text/plain".
+func WithContentTypeTextPlain(r *runtime.ClientOperation) {
+	r.ConsumesMediaTypes = []string{"text/plain"}
+}
+
+// WithAccept allows the client to force the Accept header
+// to negotiate a specific Producer from the server.
+//
+// You may use this option to set arbitrary extensions to your MIME media type.
+func WithAccept(mime string) ClientOption {
+	return func(r *runtime.ClientOperation) {
+		r.ProducesMediaTypes = []string{mime}
+	}
+}
+
+// WithAcceptApplicationJSON sets the Accept header to "application/json".
+func WithAcceptApplicationJSON(r *runtime.ClientOperation) {
+	r.ProducesMediaTypes = []string{"application/json"}
+}
+
+// WithAcceptTextHTML sets the Accept header to "text/html".
+func WithAcceptTextHTML(r *runtime.ClientOperation) {
+	r.ProducesMediaTypes = []string{"text/html"}
+}
+
+// WithAcceptTextPlain sets the Accept header to "text/plain".
+func WithAcceptTextPlain(r *runtime.ClientOperation) {
+	r.ProducesMediaTypes = []string{"text/plain"}
+}
+
+// ClientService is the interface for Client methods
+type ClientService interface {
+	GetAnnotatedTag(params *GetAnnotatedTagParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*GetAnnotatedTagOK, error)
+
+	GetBlob(params *GetBlobParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*GetBlobOK, error)
+
+	GetTree(params *GetTreeParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*GetTreeOK, error)
+
+	AcceptRepoTransfer(params *AcceptRepoTransferParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*AcceptRepoTransferAccepted, error)
+
+	CreateCurrentUserRepo(params *CreateCurrentUserRepoParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*CreateCurrentUserRepoCreated, error)
+
+	CreateFork(params *CreateForkParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*CreateForkAccepted, error)
+
+	CreateRepoVariable(params *CreateRepoVariableParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*CreateRepoVariableCreated, *CreateRepoVariableNoContent, error)
+
+	DeleteRepoSecret(params *DeleteRepoSecretParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*DeleteRepoSecretNoContent, error)
+
+	DeleteRepoVariable(params *DeleteRepoVariableParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*DeleteRepoVariableOK, *DeleteRepoVariableCreated, *DeleteRepoVariableNoContent, error)
+
+	GenerateRepo(params *GenerateRepoParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*GenerateRepoCreated, error)
+
+	GetRepoVariable(params *GetRepoVariableParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*GetRepoVariableOK, error)
+
+	GetRepoVariablesList(params *GetRepoVariablesListParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*GetRepoVariablesListOK, error)
+
+	ListForks(params *ListForksParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*ListForksOK, error)
+
+	RejectRepoTransfer(params *RejectRepoTransferParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RejectRepoTransferOK, error)
+
+	RepoAddCollaborator(params *RepoAddCollaboratorParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoAddCollaboratorNoContent, error)
+
+	RepoAddPushMirror(params *RepoAddPushMirrorParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoAddPushMirrorOK, error)
+
+	RepoAddTeam(params *RepoAddTeamParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoAddTeamNoContent, error)
+
+	RepoAddTopic(params *RepoAddTopicParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoAddTopicNoContent, error)
+
+	RepoApplyDiffPatch(params *RepoApplyDiffPatchParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoApplyDiffPatchOK, error)
+
+	RepoCancelScheduledAutoMerge(params *RepoCancelScheduledAutoMergeParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoCancelScheduledAutoMergeNoContent, error)
+
+	RepoChangeFiles(params *RepoChangeFilesParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoChangeFilesCreated, error)
+
+	RepoCheckCollaborator(params *RepoCheckCollaboratorParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoCheckCollaboratorNoContent, error)
+
+	RepoCheckTeam(params *RepoCheckTeamParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoCheckTeamOK, error)
+
+	RepoCompareDiff(params *RepoCompareDiffParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoCompareDiffOK, error)
+
+	RepoCreateBranch(params *RepoCreateBranchParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoCreateBranchCreated, error)
+
+	RepoCreateBranchProtection(params *RepoCreateBranchProtectionParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoCreateBranchProtectionCreated, error)
+
+	RepoCreateFile(params *RepoCreateFileParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoCreateFileCreated, error)
+
+	RepoCreateHook(params *RepoCreateHookParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoCreateHookCreated, error)
+
+	RepoCreateKey(params *RepoCreateKeyParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoCreateKeyCreated, error)
+
+	RepoCreatePullRequest(params *RepoCreatePullRequestParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoCreatePullRequestCreated, error)
+
+	RepoCreatePullReview(params *RepoCreatePullReviewParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoCreatePullReviewOK, error)
+
+	RepoCreatePullReviewRequests(params *RepoCreatePullReviewRequestsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoCreatePullReviewRequestsCreated, error)
+
+	RepoCreateRelease(params *RepoCreateReleaseParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoCreateReleaseCreated, error)
+
+	RepoCreateReleaseAttachment(params *RepoCreateReleaseAttachmentParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoCreateReleaseAttachmentCreated, error)
+
+	RepoCreateStatus(params *RepoCreateStatusParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoCreateStatusCreated, error)
+
+	RepoCreateTag(params *RepoCreateTagParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoCreateTagOK, error)
+
+	RepoCreateWikiPage(params *RepoCreateWikiPageParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoCreateWikiPageCreated, error)
+
+	RepoDelete(params *RepoDeleteParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoDeleteNoContent, error)
+
+	RepoDeleteAvatar(params *RepoDeleteAvatarParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoDeleteAvatarNoContent, error)
+
+	RepoDeleteBranch(params *RepoDeleteBranchParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoDeleteBranchNoContent, error)
+
+	RepoDeleteBranchProtection(params *RepoDeleteBranchProtectionParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoDeleteBranchProtectionNoContent, error)
+
+	RepoDeleteCollaborator(params *RepoDeleteCollaboratorParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoDeleteCollaboratorNoContent, error)
+
+	RepoDeleteFile(params *RepoDeleteFileParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoDeleteFileOK, error)
+
+	RepoDeleteGitHook(params *RepoDeleteGitHookParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoDeleteGitHookNoContent, error)
+
+	RepoDeleteHook(params *RepoDeleteHookParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoDeleteHookNoContent, error)
+
+	RepoDeleteKey(params *RepoDeleteKeyParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoDeleteKeyNoContent, error)
+
+	RepoDeletePullReview(params *RepoDeletePullReviewParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoDeletePullReviewNoContent, error)
+
+	RepoDeletePullReviewRequests(params *RepoDeletePullReviewRequestsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoDeletePullReviewRequestsNoContent, error)
+
+	RepoDeletePushMirror(params *RepoDeletePushMirrorParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoDeletePushMirrorNoContent, error)
+
+	RepoDeleteRelease(params *RepoDeleteReleaseParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoDeleteReleaseNoContent, error)
+
+	RepoDeleteReleaseAttachment(params *RepoDeleteReleaseAttachmentParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoDeleteReleaseAttachmentNoContent, error)
+
+	RepoDeleteReleaseByTag(params *RepoDeleteReleaseByTagParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoDeleteReleaseByTagNoContent, error)
+
+	RepoDeleteTag(params *RepoDeleteTagParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoDeleteTagNoContent, error)
+
+	RepoDeleteTeam(params *RepoDeleteTeamParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoDeleteTeamNoContent, error)
+
+	RepoDeleteTopic(params *RepoDeleteTopicParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoDeleteTopicNoContent, error)
+
+	RepoDeleteWikiPage(params *RepoDeleteWikiPageParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoDeleteWikiPageNoContent, error)
+
+	RepoDismissPullReview(params *RepoDismissPullReviewParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoDismissPullReviewOK, error)
+
+	RepoDownloadCommitDiffOrPatch(params *RepoDownloadCommitDiffOrPatchParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoDownloadCommitDiffOrPatchOK, error)
+
+	RepoDownloadPullDiffOrPatch(params *RepoDownloadPullDiffOrPatchParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoDownloadPullDiffOrPatchOK, error)
+
+	RepoEdit(params *RepoEditParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoEditOK, error)
+
+	RepoEditBranchProtection(params *RepoEditBranchProtectionParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoEditBranchProtectionOK, error)
+
+	RepoEditGitHook(params *RepoEditGitHookParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoEditGitHookOK, error)
+
+	RepoEditHook(params *RepoEditHookParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoEditHookOK, error)
+
+	RepoEditPullRequest(params *RepoEditPullRequestParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoEditPullRequestCreated, error)
+
+	RepoEditRelease(params *RepoEditReleaseParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoEditReleaseOK, error)
+
+	RepoEditReleaseAttachment(params *RepoEditReleaseAttachmentParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoEditReleaseAttachmentCreated, error)
+
+	RepoEditWikiPage(params *RepoEditWikiPageParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoEditWikiPageOK, error)
+
+	RepoGet(params *RepoGetParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetOK, error)
+
+	RepoGetAllCommits(params *RepoGetAllCommitsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetAllCommitsOK, error)
+
+	RepoGetArchive(params *RepoGetArchiveParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetArchiveOK, error)
+
+	RepoGetAssignees(params *RepoGetAssigneesParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetAssigneesOK, error)
+
+	RepoGetBranch(params *RepoGetBranchParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetBranchOK, error)
+
+	RepoGetBranchProtection(params *RepoGetBranchProtectionParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetBranchProtectionOK, error)
+
+	RepoGetByID(params *RepoGetByIDParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetByIDOK, error)
+
+	RepoGetCombinedStatusByRef(params *RepoGetCombinedStatusByRefParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetCombinedStatusByRefOK, error)
+
+	RepoGetCommitPullRequest(params *RepoGetCommitPullRequestParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetCommitPullRequestOK, error)
+
+	RepoGetContents(params *RepoGetContentsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetContentsOK, error)
+
+	RepoGetContentsList(params *RepoGetContentsListParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetContentsListOK, error)
+
+	RepoGetEditorConfig(params *RepoGetEditorConfigParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetEditorConfigOK, error)
+
+	RepoGetGitHook(params *RepoGetGitHookParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetGitHookOK, error)
+
+	RepoGetHook(params *RepoGetHookParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetHookOK, error)
+
+	RepoGetIssueConfig(params *RepoGetIssueConfigParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetIssueConfigOK, error)
+
+	RepoGetIssueTemplates(params *RepoGetIssueTemplatesParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetIssueTemplatesOK, error)
+
+	RepoGetKey(params *RepoGetKeyParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetKeyOK, error)
+
+	RepoGetLanguages(params *RepoGetLanguagesParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetLanguagesOK, error)
+
+	RepoGetLatestRelease(params *RepoGetLatestReleaseParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetLatestReleaseOK, error)
+
+	RepoGetNote(params *RepoGetNoteParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetNoteOK, error)
+
+	RepoGetPullRequest(params *RepoGetPullRequestParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetPullRequestOK, error)
+
+	RepoGetPullRequestByBaseHead(params *RepoGetPullRequestByBaseHeadParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetPullRequestByBaseHeadOK, error)
+
+	RepoGetPullRequestCommits(params *RepoGetPullRequestCommitsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetPullRequestCommitsOK, error)
+
+	RepoGetPullRequestFiles(params *RepoGetPullRequestFilesParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetPullRequestFilesOK, error)
+
+	RepoGetPullReview(params *RepoGetPullReviewParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetPullReviewOK, error)
+
+	RepoGetPullReviewComments(params *RepoGetPullReviewCommentsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetPullReviewCommentsOK, error)
+
+	RepoGetPushMirrorByRemoteName(params *RepoGetPushMirrorByRemoteNameParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetPushMirrorByRemoteNameOK, error)
+
+	RepoGetRawFile(params *RepoGetRawFileParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetRawFileOK, error)
+
+	RepoGetRawFileOrLFS(params *RepoGetRawFileOrLFSParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetRawFileOrLFSOK, error)
+
+	RepoGetRelease(params *RepoGetReleaseParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetReleaseOK, error)
+
+	RepoGetReleaseAttachment(params *RepoGetReleaseAttachmentParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetReleaseAttachmentOK, error)
+
+	RepoGetReleaseByTag(params *RepoGetReleaseByTagParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetReleaseByTagOK, error)
+
+	RepoGetRepoPermissions(params *RepoGetRepoPermissionsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetRepoPermissionsOK, error)
+
+	RepoGetReviewers(params *RepoGetReviewersParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetReviewersOK, error)
+
+	RepoGetRunnerRegistrationToken(params *RepoGetRunnerRegistrationTokenParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetRunnerRegistrationTokenOK, error)
+
+	RepoGetSingleCommit(params *RepoGetSingleCommitParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetSingleCommitOK, error)
+
+	RepoGetTag(params *RepoGetTagParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetTagOK, error)
+
+	RepoGetWikiPage(params *RepoGetWikiPageParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetWikiPageOK, error)
+
+	RepoGetWikiPageRevisions(params *RepoGetWikiPageRevisionsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetWikiPageRevisionsOK, error)
+
+	RepoGetWikiPages(params *RepoGetWikiPagesParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetWikiPagesOK, error)
+
+	RepoListActionsSecrets(params *RepoListActionsSecretsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoListActionsSecretsOK, error)
+
+	RepoListActivityFeeds(params *RepoListActivityFeedsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoListActivityFeedsOK, error)
+
+	RepoListAllGitRefs(params *RepoListAllGitRefsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoListAllGitRefsOK, error)
+
+	RepoListBranchProtection(params *RepoListBranchProtectionParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoListBranchProtectionOK, error)
+
+	RepoListBranches(params *RepoListBranchesParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoListBranchesOK, error)
+
+	RepoListCollaborators(params *RepoListCollaboratorsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoListCollaboratorsOK, error)
+
+	RepoListGitHooks(params *RepoListGitHooksParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoListGitHooksOK, error)
+
+	RepoListGitRefs(params *RepoListGitRefsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoListGitRefsOK, error)
+
+	RepoListHooks(params *RepoListHooksParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoListHooksOK, error)
+
+	RepoListKeys(params *RepoListKeysParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoListKeysOK, error)
+
+	RepoListPinnedIssues(params *RepoListPinnedIssuesParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoListPinnedIssuesOK, error)
+
+	RepoListPinnedPullRequests(params *RepoListPinnedPullRequestsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoListPinnedPullRequestsOK, error)
+
+	RepoListPullRequests(params *RepoListPullRequestsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoListPullRequestsOK, error)
+
+	RepoListPullReviews(params *RepoListPullReviewsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoListPullReviewsOK, error)
+
+	RepoListPushMirrors(params *RepoListPushMirrorsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoListPushMirrorsOK, error)
+
+	RepoListReleaseAttachments(params *RepoListReleaseAttachmentsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoListReleaseAttachmentsOK, error)
+
+	RepoListReleases(params *RepoListReleasesParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoListReleasesOK, error)
+
+	RepoListStargazers(params *RepoListStargazersParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoListStargazersOK, error)
+
+	RepoListStatuses(params *RepoListStatusesParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoListStatusesOK, error)
+
+	RepoListStatusesByRef(params *RepoListStatusesByRefParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoListStatusesByRefOK, error)
+
+	RepoListSubscribers(params *RepoListSubscribersParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoListSubscribersOK, error)
+
+	RepoListTags(params *RepoListTagsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoListTagsOK, error)
+
+	RepoListTeams(params *RepoListTeamsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoListTeamsOK, error)
+
+	RepoListTopics(params *RepoListTopicsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoListTopicsOK, error)
+
+	RepoMergePullRequest(params *RepoMergePullRequestParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoMergePullRequestOK, error)
+
+	RepoMigrate(params *RepoMigrateParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoMigrateCreated, error)
+
+	RepoMirrorSync(params *RepoMirrorSyncParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoMirrorSyncOK, error)
+
+	RepoNewPinAllowed(params *RepoNewPinAllowedParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoNewPinAllowedOK, error)
+
+	RepoPullRequestIsMerged(params *RepoPullRequestIsMergedParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoPullRequestIsMergedNoContent, error)
+
+	RepoPushMirrorSync(params *RepoPushMirrorSyncParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoPushMirrorSyncOK, error)
+
+	RepoSearch(params *RepoSearchParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoSearchOK, error)
+
+	RepoSigningKey(params *RepoSigningKeyParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoSigningKeyOK, error)
+
+	RepoSubmitPullReview(params *RepoSubmitPullReviewParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoSubmitPullReviewOK, error)
+
+	RepoTestHook(params *RepoTestHookParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoTestHookNoContent, error)
+
+	RepoTrackedTimes(params *RepoTrackedTimesParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoTrackedTimesOK, error)
+
+	RepoTransfer(params *RepoTransferParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoTransferAccepted, error)
+
+	RepoUnDismissPullReview(params *RepoUnDismissPullReviewParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoUnDismissPullReviewOK, error)
+
+	RepoUpdateAvatar(params *RepoUpdateAvatarParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoUpdateAvatarNoContent, error)
+
+	RepoUpdateFile(params *RepoUpdateFileParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoUpdateFileOK, error)
+
+	RepoUpdatePullRequest(params *RepoUpdatePullRequestParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoUpdatePullRequestOK, error)
+
+	RepoUpdateTopics(params *RepoUpdateTopicsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoUpdateTopicsNoContent, error)
+
+	RepoValidateIssueConfig(params *RepoValidateIssueConfigParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoValidateIssueConfigOK, error)
+
+	TopicSearch(params *TopicSearchParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*TopicSearchOK, error)
+
+	UpdateRepoSecret(params *UpdateRepoSecretParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UpdateRepoSecretCreated, *UpdateRepoSecretNoContent, error)
+
+	UpdateRepoVariable(params *UpdateRepoVariableParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UpdateRepoVariableCreated, *UpdateRepoVariableNoContent, error)
+
+	UserCurrentCheckSubscription(params *UserCurrentCheckSubscriptionParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserCurrentCheckSubscriptionOK, error)
+
+	UserCurrentDeleteSubscription(params *UserCurrentDeleteSubscriptionParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserCurrentDeleteSubscriptionNoContent, error)
+
+	UserCurrentPutSubscription(params *UserCurrentPutSubscriptionParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserCurrentPutSubscriptionOK, error)
+
+	UserTrackedTimes(params *UserTrackedTimesParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserTrackedTimesOK, error)
+
+	SetTransport(transport runtime.ClientTransport)
+}
+
+/*
+GetAnnotatedTag gets the tag object of an annotated tag not lightweight tags
+*/
+func (a *Client) GetAnnotatedTag(params *GetAnnotatedTagParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*GetAnnotatedTagOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewGetAnnotatedTagParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "GetAnnotatedTag",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/git/tags/{sha}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &GetAnnotatedTagReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*GetAnnotatedTagOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for GetAnnotatedTag: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+GetBlob gets the blob of a repository
+*/
+func (a *Client) GetBlob(params *GetBlobParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*GetBlobOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewGetBlobParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "GetBlob",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/git/blobs/{sha}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &GetBlobReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*GetBlobOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for GetBlob: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+GetTree gets the tree of a repository
+*/
+func (a *Client) GetTree(params *GetTreeParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*GetTreeOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewGetTreeParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "GetTree",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/git/trees/{sha}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &GetTreeReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*GetTreeOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for GetTree: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+AcceptRepoTransfer accepts a repo transfer
+*/
+func (a *Client) AcceptRepoTransfer(params *AcceptRepoTransferParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*AcceptRepoTransferAccepted, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewAcceptRepoTransferParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "acceptRepoTransfer",
+		Method:             "POST",
+		PathPattern:        "/repos/{owner}/{repo}/transfer/accept",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &AcceptRepoTransferReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*AcceptRepoTransferAccepted)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for acceptRepoTransfer: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+CreateCurrentUserRepo creates a repository
+*/
+func (a *Client) CreateCurrentUserRepo(params *CreateCurrentUserRepoParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*CreateCurrentUserRepoCreated, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewCreateCurrentUserRepoParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "createCurrentUserRepo",
+		Method:             "POST",
+		PathPattern:        "/user/repos",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &CreateCurrentUserRepoReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*CreateCurrentUserRepoCreated)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for createCurrentUserRepo: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+CreateFork forks a repository
+*/
+func (a *Client) CreateFork(params *CreateForkParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*CreateForkAccepted, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewCreateForkParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "createFork",
+		Method:             "POST",
+		PathPattern:        "/repos/{owner}/{repo}/forks",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &CreateForkReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*CreateForkAccepted)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for createFork: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+CreateRepoVariable creates a repo level variable
+*/
+func (a *Client) CreateRepoVariable(params *CreateRepoVariableParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*CreateRepoVariableCreated, *CreateRepoVariableNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewCreateRepoVariableParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "createRepoVariable",
+		Method:             "POST",
+		PathPattern:        "/repos/{owner}/{repo}/actions/variables/{variablename}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &CreateRepoVariableReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, nil, err
+	}
+	switch value := result.(type) {
+	case *CreateRepoVariableCreated:
+		return value, nil, nil
+	case *CreateRepoVariableNoContent:
+		return nil, value, nil
+	}
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repository: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+DeleteRepoSecret deletes a secret in a repository
+*/
+func (a *Client) DeleteRepoSecret(params *DeleteRepoSecretParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*DeleteRepoSecretNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewDeleteRepoSecretParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "deleteRepoSecret",
+		Method:             "DELETE",
+		PathPattern:        "/repos/{owner}/{repo}/actions/secrets/{secretname}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &DeleteRepoSecretReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*DeleteRepoSecretNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for deleteRepoSecret: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+DeleteRepoVariable deletes a repo level variable
+*/
+func (a *Client) DeleteRepoVariable(params *DeleteRepoVariableParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*DeleteRepoVariableOK, *DeleteRepoVariableCreated, *DeleteRepoVariableNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewDeleteRepoVariableParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "deleteRepoVariable",
+		Method:             "DELETE",
+		PathPattern:        "/repos/{owner}/{repo}/actions/variables/{variablename}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &DeleteRepoVariableReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, nil, nil, err
+	}
+	switch value := result.(type) {
+	case *DeleteRepoVariableOK:
+		return value, nil, nil, nil
+	case *DeleteRepoVariableCreated:
+		return nil, value, nil, nil
+	case *DeleteRepoVariableNoContent:
+		return nil, nil, value, nil
+	}
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repository: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+GenerateRepo creates a repository using a template
+*/
+func (a *Client) GenerateRepo(params *GenerateRepoParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*GenerateRepoCreated, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewGenerateRepoParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "generateRepo",
+		Method:             "POST",
+		PathPattern:        "/repos/{template_owner}/{template_repo}/generate",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &GenerateRepoReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*GenerateRepoCreated)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for generateRepo: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+GetRepoVariable gets a repo level variable
+*/
+func (a *Client) GetRepoVariable(params *GetRepoVariableParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*GetRepoVariableOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewGetRepoVariableParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "getRepoVariable",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/actions/variables/{variablename}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &GetRepoVariableReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*GetRepoVariableOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for getRepoVariable: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+GetRepoVariablesList gets repo level variables list
+*/
+func (a *Client) GetRepoVariablesList(params *GetRepoVariablesListParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*GetRepoVariablesListOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewGetRepoVariablesListParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "getRepoVariablesList",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/actions/variables",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &GetRepoVariablesListReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*GetRepoVariablesListOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for getRepoVariablesList: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+ListForks lists a repository s forks
+*/
+func (a *Client) ListForks(params *ListForksParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*ListForksOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewListForksParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "listForks",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/forks",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &ListForksReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*ListForksOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for listForks: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RejectRepoTransfer rejects a repo transfer
+*/
+func (a *Client) RejectRepoTransfer(params *RejectRepoTransferParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RejectRepoTransferOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRejectRepoTransferParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "rejectRepoTransfer",
+		Method:             "POST",
+		PathPattern:        "/repos/{owner}/{repo}/transfer/reject",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RejectRepoTransferReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RejectRepoTransferOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for rejectRepoTransfer: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoAddCollaborator adds a collaborator to a repository
+*/
+func (a *Client) RepoAddCollaborator(params *RepoAddCollaboratorParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoAddCollaboratorNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoAddCollaboratorParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoAddCollaborator",
+		Method:             "PUT",
+		PathPattern:        "/repos/{owner}/{repo}/collaborators/{collaborator}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoAddCollaboratorReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoAddCollaboratorNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoAddCollaborator: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoAddPushMirror adds a push mirror to the repository
+*/
+func (a *Client) RepoAddPushMirror(params *RepoAddPushMirrorParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoAddPushMirrorOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoAddPushMirrorParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoAddPushMirror",
+		Method:             "POST",
+		PathPattern:        "/repos/{owner}/{repo}/push_mirrors",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoAddPushMirrorReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoAddPushMirrorOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoAddPushMirror: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoAddTeam adds a team to a repository
+*/
+func (a *Client) RepoAddTeam(params *RepoAddTeamParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoAddTeamNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoAddTeamParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoAddTeam",
+		Method:             "PUT",
+		PathPattern:        "/repos/{owner}/{repo}/teams/{team}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoAddTeamReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoAddTeamNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoAddTeam: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoAddTopic adds a topic to a repository
+*/
+func (a *Client) RepoAddTopic(params *RepoAddTopicParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoAddTopicNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoAddTopicParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoAddTopic",
+		Method:             "PUT",
+		PathPattern:        "/repos/{owner}/{repo}/topics/{topic}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoAddTopicReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoAddTopicNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoAddTopic: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoApplyDiffPatch applies diff patch to repository
+*/
+func (a *Client) RepoApplyDiffPatch(params *RepoApplyDiffPatchParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoApplyDiffPatchOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoApplyDiffPatchParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoApplyDiffPatch",
+		Method:             "POST",
+		PathPattern:        "/repos/{owner}/{repo}/diffpatch",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoApplyDiffPatchReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoApplyDiffPatchOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoApplyDiffPatch: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoCancelScheduledAutoMerge cancels the scheduled auto merge for the given pull request
+*/
+func (a *Client) RepoCancelScheduledAutoMerge(params *RepoCancelScheduledAutoMergeParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoCancelScheduledAutoMergeNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoCancelScheduledAutoMergeParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoCancelScheduledAutoMerge",
+		Method:             "DELETE",
+		PathPattern:        "/repos/{owner}/{repo}/pulls/{index}/merge",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoCancelScheduledAutoMergeReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoCancelScheduledAutoMergeNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoCancelScheduledAutoMerge: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoChangeFiles modifies multiple files in a repository
+*/
+func (a *Client) RepoChangeFiles(params *RepoChangeFilesParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoChangeFilesCreated, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoChangeFilesParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoChangeFiles",
+		Method:             "POST",
+		PathPattern:        "/repos/{owner}/{repo}/contents",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoChangeFilesReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoChangeFilesCreated)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoChangeFiles: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoCheckCollaborator checks if a user is a collaborator of a repository
+*/
+func (a *Client) RepoCheckCollaborator(params *RepoCheckCollaboratorParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoCheckCollaboratorNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoCheckCollaboratorParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoCheckCollaborator",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/collaborators/{collaborator}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoCheckCollaboratorReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoCheckCollaboratorNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoCheckCollaborator: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoCheckTeam checks if a team is assigned to a repository
+*/
+func (a *Client) RepoCheckTeam(params *RepoCheckTeamParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoCheckTeamOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoCheckTeamParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoCheckTeam",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/teams/{team}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoCheckTeamReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoCheckTeamOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoCheckTeam: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoCompareDiff gets commit comparison information
+*/
+func (a *Client) RepoCompareDiff(params *RepoCompareDiffParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoCompareDiffOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoCompareDiffParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoCompareDiff",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/compare/{basehead}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoCompareDiffReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoCompareDiffOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoCompareDiff: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoCreateBranch creates a branch
+*/
+func (a *Client) RepoCreateBranch(params *RepoCreateBranchParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoCreateBranchCreated, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoCreateBranchParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoCreateBranch",
+		Method:             "POST",
+		PathPattern:        "/repos/{owner}/{repo}/branches",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoCreateBranchReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoCreateBranchCreated)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoCreateBranch: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoCreateBranchProtection creates a branch protections for a repository
+*/
+func (a *Client) RepoCreateBranchProtection(params *RepoCreateBranchProtectionParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoCreateBranchProtectionCreated, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoCreateBranchProtectionParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoCreateBranchProtection",
+		Method:             "POST",
+		PathPattern:        "/repos/{owner}/{repo}/branch_protections",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoCreateBranchProtectionReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoCreateBranchProtectionCreated)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoCreateBranchProtection: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoCreateFile creates a file in a repository
+*/
+func (a *Client) RepoCreateFile(params *RepoCreateFileParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoCreateFileCreated, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoCreateFileParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoCreateFile",
+		Method:             "POST",
+		PathPattern:        "/repos/{owner}/{repo}/contents/{filepath}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoCreateFileReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoCreateFileCreated)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoCreateFile: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoCreateHook creates a hook
+*/
+func (a *Client) RepoCreateHook(params *RepoCreateHookParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoCreateHookCreated, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoCreateHookParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoCreateHook",
+		Method:             "POST",
+		PathPattern:        "/repos/{owner}/{repo}/hooks",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoCreateHookReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoCreateHookCreated)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoCreateHook: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoCreateKey adds a key to a repository
+*/
+func (a *Client) RepoCreateKey(params *RepoCreateKeyParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoCreateKeyCreated, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoCreateKeyParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoCreateKey",
+		Method:             "POST",
+		PathPattern:        "/repos/{owner}/{repo}/keys",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoCreateKeyReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoCreateKeyCreated)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoCreateKey: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoCreatePullRequest creates a pull request
+*/
+func (a *Client) RepoCreatePullRequest(params *RepoCreatePullRequestParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoCreatePullRequestCreated, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoCreatePullRequestParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoCreatePullRequest",
+		Method:             "POST",
+		PathPattern:        "/repos/{owner}/{repo}/pulls",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoCreatePullRequestReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoCreatePullRequestCreated)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoCreatePullRequest: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoCreatePullReview creates a review to an pull request
+*/
+func (a *Client) RepoCreatePullReview(params *RepoCreatePullReviewParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoCreatePullReviewOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoCreatePullReviewParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoCreatePullReview",
+		Method:             "POST",
+		PathPattern:        "/repos/{owner}/{repo}/pulls/{index}/reviews",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoCreatePullReviewReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoCreatePullReviewOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoCreatePullReview: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoCreatePullReviewRequests creates review requests for a pull request
+*/
+func (a *Client) RepoCreatePullReviewRequests(params *RepoCreatePullReviewRequestsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoCreatePullReviewRequestsCreated, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoCreatePullReviewRequestsParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoCreatePullReviewRequests",
+		Method:             "POST",
+		PathPattern:        "/repos/{owner}/{repo}/pulls/{index}/requested_reviewers",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoCreatePullReviewRequestsReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoCreatePullReviewRequestsCreated)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoCreatePullReviewRequests: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoCreateRelease creates a release
+*/
+func (a *Client) RepoCreateRelease(params *RepoCreateReleaseParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoCreateReleaseCreated, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoCreateReleaseParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoCreateRelease",
+		Method:             "POST",
+		PathPattern:        "/repos/{owner}/{repo}/releases",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoCreateReleaseReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoCreateReleaseCreated)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoCreateRelease: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoCreateReleaseAttachment creates a release attachment
+*/
+func (a *Client) RepoCreateReleaseAttachment(params *RepoCreateReleaseAttachmentParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoCreateReleaseAttachmentCreated, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoCreateReleaseAttachmentParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoCreateReleaseAttachment",
+		Method:             "POST",
+		PathPattern:        "/repos/{owner}/{repo}/releases/{id}/assets",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"multipart/form-data", "application/octet-stream"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoCreateReleaseAttachmentReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoCreateReleaseAttachmentCreated)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoCreateReleaseAttachment: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoCreateStatus creates a commit status
+*/
+func (a *Client) RepoCreateStatus(params *RepoCreateStatusParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoCreateStatusCreated, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoCreateStatusParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoCreateStatus",
+		Method:             "POST",
+		PathPattern:        "/repos/{owner}/{repo}/statuses/{sha}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoCreateStatusReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoCreateStatusCreated)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoCreateStatus: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoCreateTag creates a new git tag in a repository
+*/
+func (a *Client) RepoCreateTag(params *RepoCreateTagParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoCreateTagOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoCreateTagParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoCreateTag",
+		Method:             "POST",
+		PathPattern:        "/repos/{owner}/{repo}/tags",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoCreateTagReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoCreateTagOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoCreateTag: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoCreateWikiPage creates a wiki page
+*/
+func (a *Client) RepoCreateWikiPage(params *RepoCreateWikiPageParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoCreateWikiPageCreated, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoCreateWikiPageParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoCreateWikiPage",
+		Method:             "POST",
+		PathPattern:        "/repos/{owner}/{repo}/wiki/new",
+		ProducesMediaTypes: []string{"application/json", "text/html"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoCreateWikiPageReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoCreateWikiPageCreated)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoCreateWikiPage: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoDelete deletes a repository
+*/
+func (a *Client) RepoDelete(params *RepoDeleteParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoDeleteNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoDeleteParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoDelete",
+		Method:             "DELETE",
+		PathPattern:        "/repos/{owner}/{repo}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoDeleteReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoDeleteNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoDelete: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoDeleteAvatar deletes avatar
+*/
+func (a *Client) RepoDeleteAvatar(params *RepoDeleteAvatarParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoDeleteAvatarNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoDeleteAvatarParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoDeleteAvatar",
+		Method:             "DELETE",
+		PathPattern:        "/repos/{owner}/{repo}/avatar",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoDeleteAvatarReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoDeleteAvatarNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoDeleteAvatar: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoDeleteBranch deletes a specific branch from a repository
+*/
+func (a *Client) RepoDeleteBranch(params *RepoDeleteBranchParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoDeleteBranchNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoDeleteBranchParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoDeleteBranch",
+		Method:             "DELETE",
+		PathPattern:        "/repos/{owner}/{repo}/branches/{branch}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoDeleteBranchReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoDeleteBranchNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoDeleteBranch: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoDeleteBranchProtection deletes a specific branch protection for the repository
+*/
+func (a *Client) RepoDeleteBranchProtection(params *RepoDeleteBranchProtectionParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoDeleteBranchProtectionNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoDeleteBranchProtectionParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoDeleteBranchProtection",
+		Method:             "DELETE",
+		PathPattern:        "/repos/{owner}/{repo}/branch_protections/{name}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoDeleteBranchProtectionReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoDeleteBranchProtectionNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoDeleteBranchProtection: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoDeleteCollaborator deletes a collaborator from a repository
+*/
+func (a *Client) RepoDeleteCollaborator(params *RepoDeleteCollaboratorParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoDeleteCollaboratorNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoDeleteCollaboratorParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoDeleteCollaborator",
+		Method:             "DELETE",
+		PathPattern:        "/repos/{owner}/{repo}/collaborators/{collaborator}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoDeleteCollaboratorReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoDeleteCollaboratorNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoDeleteCollaborator: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoDeleteFile deletes a file in a repository
+*/
+func (a *Client) RepoDeleteFile(params *RepoDeleteFileParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoDeleteFileOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoDeleteFileParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoDeleteFile",
+		Method:             "DELETE",
+		PathPattern:        "/repos/{owner}/{repo}/contents/{filepath}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoDeleteFileReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoDeleteFileOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoDeleteFile: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoDeleteGitHook deletes a git hook in a repository
+*/
+func (a *Client) RepoDeleteGitHook(params *RepoDeleteGitHookParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoDeleteGitHookNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoDeleteGitHookParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoDeleteGitHook",
+		Method:             "DELETE",
+		PathPattern:        "/repos/{owner}/{repo}/hooks/git/{id}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoDeleteGitHookReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoDeleteGitHookNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoDeleteGitHook: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoDeleteHook deletes a hook in a repository
+*/
+func (a *Client) RepoDeleteHook(params *RepoDeleteHookParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoDeleteHookNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoDeleteHookParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoDeleteHook",
+		Method:             "DELETE",
+		PathPattern:        "/repos/{owner}/{repo}/hooks/{id}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoDeleteHookReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoDeleteHookNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoDeleteHook: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoDeleteKey deletes a key from a repository
+*/
+func (a *Client) RepoDeleteKey(params *RepoDeleteKeyParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoDeleteKeyNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoDeleteKeyParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoDeleteKey",
+		Method:             "DELETE",
+		PathPattern:        "/repos/{owner}/{repo}/keys/{id}",
+		ProducesMediaTypes: []string{"application/json", "text/html"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoDeleteKeyReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoDeleteKeyNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoDeleteKey: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoDeletePullReview deletes a specific review from a pull request
+*/
+func (a *Client) RepoDeletePullReview(params *RepoDeletePullReviewParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoDeletePullReviewNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoDeletePullReviewParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoDeletePullReview",
+		Method:             "DELETE",
+		PathPattern:        "/repos/{owner}/{repo}/pulls/{index}/reviews/{id}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoDeletePullReviewReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoDeletePullReviewNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoDeletePullReview: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoDeletePullReviewRequests cancels review requests for a pull request
+*/
+func (a *Client) RepoDeletePullReviewRequests(params *RepoDeletePullReviewRequestsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoDeletePullReviewRequestsNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoDeletePullReviewRequestsParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoDeletePullReviewRequests",
+		Method:             "DELETE",
+		PathPattern:        "/repos/{owner}/{repo}/pulls/{index}/requested_reviewers",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoDeletePullReviewRequestsReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoDeletePullReviewRequestsNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoDeletePullReviewRequests: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoDeletePushMirror deletes a push mirror from a repository by remote name
+*/
+func (a *Client) RepoDeletePushMirror(params *RepoDeletePushMirrorParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoDeletePushMirrorNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoDeletePushMirrorParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoDeletePushMirror",
+		Method:             "DELETE",
+		PathPattern:        "/repos/{owner}/{repo}/push_mirrors/{name}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoDeletePushMirrorReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoDeletePushMirrorNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoDeletePushMirror: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoDeleteRelease deletes a release
+*/
+func (a *Client) RepoDeleteRelease(params *RepoDeleteReleaseParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoDeleteReleaseNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoDeleteReleaseParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoDeleteRelease",
+		Method:             "DELETE",
+		PathPattern:        "/repos/{owner}/{repo}/releases/{id}",
+		ProducesMediaTypes: []string{"application/json", "text/html"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoDeleteReleaseReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoDeleteReleaseNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoDeleteRelease: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoDeleteReleaseAttachment deletes a release attachment
+*/
+func (a *Client) RepoDeleteReleaseAttachment(params *RepoDeleteReleaseAttachmentParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoDeleteReleaseAttachmentNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoDeleteReleaseAttachmentParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoDeleteReleaseAttachment",
+		Method:             "DELETE",
+		PathPattern:        "/repos/{owner}/{repo}/releases/{id}/assets/{attachment_id}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoDeleteReleaseAttachmentReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoDeleteReleaseAttachmentNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoDeleteReleaseAttachment: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoDeleteReleaseByTag deletes a release by tag name
+*/
+func (a *Client) RepoDeleteReleaseByTag(params *RepoDeleteReleaseByTagParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoDeleteReleaseByTagNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoDeleteReleaseByTagParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoDeleteReleaseByTag",
+		Method:             "DELETE",
+		PathPattern:        "/repos/{owner}/{repo}/releases/tags/{tag}",
+		ProducesMediaTypes: []string{"application/json", "text/html"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoDeleteReleaseByTagReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoDeleteReleaseByTagNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoDeleteReleaseByTag: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoDeleteTag deletes a repository s tag by name
+*/
+func (a *Client) RepoDeleteTag(params *RepoDeleteTagParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoDeleteTagNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoDeleteTagParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoDeleteTag",
+		Method:             "DELETE",
+		PathPattern:        "/repos/{owner}/{repo}/tags/{tag}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoDeleteTagReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoDeleteTagNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoDeleteTag: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoDeleteTeam deletes a team from a repository
+*/
+func (a *Client) RepoDeleteTeam(params *RepoDeleteTeamParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoDeleteTeamNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoDeleteTeamParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoDeleteTeam",
+		Method:             "DELETE",
+		PathPattern:        "/repos/{owner}/{repo}/teams/{team}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoDeleteTeamReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoDeleteTeamNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoDeleteTeam: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoDeleteTopic deletes a topic from a repository
+*/
+func (a *Client) RepoDeleteTopic(params *RepoDeleteTopicParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoDeleteTopicNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoDeleteTopicParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoDeleteTopic",
+		Method:             "DELETE",
+		PathPattern:        "/repos/{owner}/{repo}/topics/{topic}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoDeleteTopicReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoDeleteTopicNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoDeleteTopic: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoDeleteWikiPage deletes a wiki page
+*/
+func (a *Client) RepoDeleteWikiPage(params *RepoDeleteWikiPageParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoDeleteWikiPageNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoDeleteWikiPageParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoDeleteWikiPage",
+		Method:             "DELETE",
+		PathPattern:        "/repos/{owner}/{repo}/wiki/page/{pageName}",
+		ProducesMediaTypes: []string{"application/json", "text/html"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoDeleteWikiPageReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoDeleteWikiPageNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoDeleteWikiPage: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoDismissPullReview dismisses a review for a pull request
+*/
+func (a *Client) RepoDismissPullReview(params *RepoDismissPullReviewParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoDismissPullReviewOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoDismissPullReviewParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoDismissPullReview",
+		Method:             "POST",
+		PathPattern:        "/repos/{owner}/{repo}/pulls/{index}/reviews/{id}/dismissals",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoDismissPullReviewReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoDismissPullReviewOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoDismissPullReview: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoDownloadCommitDiffOrPatch gets a commit s diff or patch
+*/
+func (a *Client) RepoDownloadCommitDiffOrPatch(params *RepoDownloadCommitDiffOrPatchParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoDownloadCommitDiffOrPatchOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoDownloadCommitDiffOrPatchParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoDownloadCommitDiffOrPatch",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/git/commits/{sha}.{diffType}",
+		ProducesMediaTypes: []string{"text/plain"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoDownloadCommitDiffOrPatchReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoDownloadCommitDiffOrPatchOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoDownloadCommitDiffOrPatch: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoDownloadPullDiffOrPatch gets a pull request diff or patch
+*/
+func (a *Client) RepoDownloadPullDiffOrPatch(params *RepoDownloadPullDiffOrPatchParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoDownloadPullDiffOrPatchOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoDownloadPullDiffOrPatchParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoDownloadPullDiffOrPatch",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/pulls/{index}.{diffType}",
+		ProducesMediaTypes: []string{"text/plain"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoDownloadPullDiffOrPatchReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoDownloadPullDiffOrPatchOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoDownloadPullDiffOrPatch: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoEdit edits a repository s properties only fields that are set will be changed
+*/
+func (a *Client) RepoEdit(params *RepoEditParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoEditOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoEditParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoEdit",
+		Method:             "PATCH",
+		PathPattern:        "/repos/{owner}/{repo}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoEditReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoEditOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoEdit: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoEditBranchProtection edits a branch protections for a repository only fields that are set will be changed
+*/
+func (a *Client) RepoEditBranchProtection(params *RepoEditBranchProtectionParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoEditBranchProtectionOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoEditBranchProtectionParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoEditBranchProtection",
+		Method:             "PATCH",
+		PathPattern:        "/repos/{owner}/{repo}/branch_protections/{name}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoEditBranchProtectionReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoEditBranchProtectionOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoEditBranchProtection: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoEditGitHook edits a git hook in a repository
+*/
+func (a *Client) RepoEditGitHook(params *RepoEditGitHookParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoEditGitHookOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoEditGitHookParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoEditGitHook",
+		Method:             "PATCH",
+		PathPattern:        "/repos/{owner}/{repo}/hooks/git/{id}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoEditGitHookReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoEditGitHookOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoEditGitHook: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoEditHook edits a hook in a repository
+*/
+func (a *Client) RepoEditHook(params *RepoEditHookParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoEditHookOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoEditHookParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoEditHook",
+		Method:             "PATCH",
+		PathPattern:        "/repos/{owner}/{repo}/hooks/{id}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoEditHookReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoEditHookOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoEditHook: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoEditPullRequest updates a pull request if using deadline only the date will be taken into account and time of day ignored
+*/
+func (a *Client) RepoEditPullRequest(params *RepoEditPullRequestParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoEditPullRequestCreated, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoEditPullRequestParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoEditPullRequest",
+		Method:             "PATCH",
+		PathPattern:        "/repos/{owner}/{repo}/pulls/{index}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoEditPullRequestReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoEditPullRequestCreated)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoEditPullRequest: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoEditRelease updates a release
+*/
+func (a *Client) RepoEditRelease(params *RepoEditReleaseParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoEditReleaseOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoEditReleaseParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoEditRelease",
+		Method:             "PATCH",
+		PathPattern:        "/repos/{owner}/{repo}/releases/{id}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoEditReleaseReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoEditReleaseOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoEditRelease: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoEditReleaseAttachment edits a release attachment
+*/
+func (a *Client) RepoEditReleaseAttachment(params *RepoEditReleaseAttachmentParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoEditReleaseAttachmentCreated, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoEditReleaseAttachmentParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoEditReleaseAttachment",
+		Method:             "PATCH",
+		PathPattern:        "/repos/{owner}/{repo}/releases/{id}/assets/{attachment_id}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoEditReleaseAttachmentReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoEditReleaseAttachmentCreated)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoEditReleaseAttachment: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoEditWikiPage edits a wiki page
+*/
+func (a *Client) RepoEditWikiPage(params *RepoEditWikiPageParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoEditWikiPageOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoEditWikiPageParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoEditWikiPage",
+		Method:             "PATCH",
+		PathPattern:        "/repos/{owner}/{repo}/wiki/page/{pageName}",
+		ProducesMediaTypes: []string{"application/json", "text/html"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoEditWikiPageReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoEditWikiPageOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoEditWikiPage: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoGet gets a repository
+*/
+func (a *Client) RepoGet(params *RepoGetParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoGetParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoGet",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoGetReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoGetOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoGet: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoGetAllCommits gets a list of all commits from a repository
+*/
+func (a *Client) RepoGetAllCommits(params *RepoGetAllCommitsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetAllCommitsOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoGetAllCommitsParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoGetAllCommits",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/commits",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoGetAllCommitsReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoGetAllCommitsOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoGetAllCommits: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoGetArchive gets an archive of a repository
+*/
+func (a *Client) RepoGetArchive(params *RepoGetArchiveParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetArchiveOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoGetArchiveParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoGetArchive",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/archive/{archive}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoGetArchiveReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoGetArchiveOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoGetArchive: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoGetAssignees returns all users that have write access and can be assigned to issues
+*/
+func (a *Client) RepoGetAssignees(params *RepoGetAssigneesParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetAssigneesOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoGetAssigneesParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoGetAssignees",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/assignees",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoGetAssigneesReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoGetAssigneesOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoGetAssignees: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoGetBranch retrieves a specific branch from a repository including its effective branch protection
+*/
+func (a *Client) RepoGetBranch(params *RepoGetBranchParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetBranchOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoGetBranchParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoGetBranch",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/branches/{branch}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoGetBranchReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoGetBranchOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoGetBranch: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoGetBranchProtection gets a specific branch protection for the repository
+*/
+func (a *Client) RepoGetBranchProtection(params *RepoGetBranchProtectionParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetBranchProtectionOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoGetBranchProtectionParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoGetBranchProtection",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/branch_protections/{name}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoGetBranchProtectionReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoGetBranchProtectionOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoGetBranchProtection: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoGetByID gets a repository by id
+*/
+func (a *Client) RepoGetByID(params *RepoGetByIDParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetByIDOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoGetByIDParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoGetByID",
+		Method:             "GET",
+		PathPattern:        "/repositories/{id}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoGetByIDReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoGetByIDOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoGetByID: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoGetCombinedStatusByRef gets a commit s combined status by branch tag commit reference
+*/
+func (a *Client) RepoGetCombinedStatusByRef(params *RepoGetCombinedStatusByRefParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetCombinedStatusByRefOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoGetCombinedStatusByRefParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoGetCombinedStatusByRef",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/commits/{ref}/status",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoGetCombinedStatusByRefReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoGetCombinedStatusByRefOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoGetCombinedStatusByRef: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoGetCommitPullRequest gets the pull request of the commit
+*/
+func (a *Client) RepoGetCommitPullRequest(params *RepoGetCommitPullRequestParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetCommitPullRequestOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoGetCommitPullRequestParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoGetCommitPullRequest",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/commits/{sha}/pull",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoGetCommitPullRequestReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoGetCommitPullRequestOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoGetCommitPullRequest: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoGetContents gets the metadata and contents if a file of an entry in a repository or a list of entries if a dir
+*/
+func (a *Client) RepoGetContents(params *RepoGetContentsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetContentsOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoGetContentsParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoGetContents",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/contents/{filepath}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoGetContentsReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoGetContentsOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoGetContents: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoGetContentsList gets the metadata of all the entries of the root dir
+*/
+func (a *Client) RepoGetContentsList(params *RepoGetContentsListParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetContentsListOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoGetContentsListParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoGetContentsList",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/contents",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoGetContentsListReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoGetContentsListOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoGetContentsList: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoGetEditorConfig gets the editor config definitions of a file in a repository
+*/
+func (a *Client) RepoGetEditorConfig(params *RepoGetEditorConfigParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetEditorConfigOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoGetEditorConfigParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoGetEditorConfig",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/editorconfig/{filepath}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoGetEditorConfigReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoGetEditorConfigOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoGetEditorConfig: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoGetGitHook gets a git hook
+*/
+func (a *Client) RepoGetGitHook(params *RepoGetGitHookParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetGitHookOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoGetGitHookParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoGetGitHook",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/hooks/git/{id}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoGetGitHookReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoGetGitHookOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoGetGitHook: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoGetHook gets a hook
+*/
+func (a *Client) RepoGetHook(params *RepoGetHookParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetHookOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoGetHookParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoGetHook",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/hooks/{id}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoGetHookReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoGetHookOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoGetHook: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoGetIssueConfig returns the issue config for a repo
+*/
+func (a *Client) RepoGetIssueConfig(params *RepoGetIssueConfigParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetIssueConfigOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoGetIssueConfigParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoGetIssueConfig",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/issue_config",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoGetIssueConfigReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoGetIssueConfigOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoGetIssueConfig: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoGetIssueTemplates gets available issue templates for a repository
+*/
+func (a *Client) RepoGetIssueTemplates(params *RepoGetIssueTemplatesParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetIssueTemplatesOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoGetIssueTemplatesParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoGetIssueTemplates",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/issue_templates",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoGetIssueTemplatesReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoGetIssueTemplatesOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoGetIssueTemplates: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoGetKey gets a repository s key by id
+*/
+func (a *Client) RepoGetKey(params *RepoGetKeyParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetKeyOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoGetKeyParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoGetKey",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/keys/{id}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoGetKeyReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoGetKeyOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoGetKey: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoGetLanguages gets languages and number of bytes of code written
+*/
+func (a *Client) RepoGetLanguages(params *RepoGetLanguagesParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetLanguagesOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoGetLanguagesParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoGetLanguages",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/languages",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoGetLanguagesReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoGetLanguagesOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoGetLanguages: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoGetLatestRelease gets the most recent non prerelease non draft release of a repository sorted by created at
+*/
+func (a *Client) RepoGetLatestRelease(params *RepoGetLatestReleaseParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetLatestReleaseOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoGetLatestReleaseParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoGetLatestRelease",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/releases/latest",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoGetLatestReleaseReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoGetLatestReleaseOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoGetLatestRelease: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoGetNote gets a note corresponding to a single commit from a repository
+*/
+func (a *Client) RepoGetNote(params *RepoGetNoteParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetNoteOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoGetNoteParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoGetNote",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/git/notes/{sha}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoGetNoteReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoGetNoteOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoGetNote: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoGetPullRequest gets a pull request
+*/
+func (a *Client) RepoGetPullRequest(params *RepoGetPullRequestParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetPullRequestOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoGetPullRequestParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoGetPullRequest",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/pulls/{index}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoGetPullRequestReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoGetPullRequestOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoGetPullRequest: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoGetPullRequestByBaseHead gets a pull request by base and head
+*/
+func (a *Client) RepoGetPullRequestByBaseHead(params *RepoGetPullRequestByBaseHeadParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetPullRequestByBaseHeadOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoGetPullRequestByBaseHeadParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoGetPullRequestByBaseHead",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/pulls/{base}/{head}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoGetPullRequestByBaseHeadReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoGetPullRequestByBaseHeadOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoGetPullRequestByBaseHead: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoGetPullRequestCommits gets commits for a pull request
+*/
+func (a *Client) RepoGetPullRequestCommits(params *RepoGetPullRequestCommitsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetPullRequestCommitsOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoGetPullRequestCommitsParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoGetPullRequestCommits",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/pulls/{index}/commits",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoGetPullRequestCommitsReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoGetPullRequestCommitsOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoGetPullRequestCommits: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoGetPullRequestFiles gets changed files for a pull request
+*/
+func (a *Client) RepoGetPullRequestFiles(params *RepoGetPullRequestFilesParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetPullRequestFilesOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoGetPullRequestFilesParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoGetPullRequestFiles",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/pulls/{index}/files",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoGetPullRequestFilesReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoGetPullRequestFilesOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoGetPullRequestFiles: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoGetPullReview gets a specific review for a pull request
+*/
+func (a *Client) RepoGetPullReview(params *RepoGetPullReviewParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetPullReviewOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoGetPullReviewParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoGetPullReview",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/pulls/{index}/reviews/{id}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoGetPullReviewReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoGetPullReviewOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoGetPullReview: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoGetPullReviewComments gets a specific review for a pull request
+*/
+func (a *Client) RepoGetPullReviewComments(params *RepoGetPullReviewCommentsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetPullReviewCommentsOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoGetPullReviewCommentsParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoGetPullReviewComments",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/pulls/{index}/reviews/{id}/comments",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoGetPullReviewCommentsReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoGetPullReviewCommentsOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoGetPullReviewComments: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoGetPushMirrorByRemoteName gets push mirror of the repository by remote name
+*/
+func (a *Client) RepoGetPushMirrorByRemoteName(params *RepoGetPushMirrorByRemoteNameParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetPushMirrorByRemoteNameOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoGetPushMirrorByRemoteNameParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoGetPushMirrorByRemoteName",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/push_mirrors/{name}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoGetPushMirrorByRemoteNameReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoGetPushMirrorByRemoteNameOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoGetPushMirrorByRemoteName: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoGetRawFile gets a file from a repository
+*/
+func (a *Client) RepoGetRawFile(params *RepoGetRawFileParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetRawFileOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoGetRawFileParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoGetRawFile",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/raw/{filepath}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoGetRawFileReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoGetRawFileOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoGetRawFile: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoGetRawFileOrLFS gets a file or it s l f s object from a repository
+*/
+func (a *Client) RepoGetRawFileOrLFS(params *RepoGetRawFileOrLFSParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetRawFileOrLFSOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoGetRawFileOrLFSParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoGetRawFileOrLFS",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/media/{filepath}",
+		ProducesMediaTypes: []string{"application/json", "text/html"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoGetRawFileOrLFSReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoGetRawFileOrLFSOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoGetRawFileOrLFS: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoGetRelease gets a release
+*/
+func (a *Client) RepoGetRelease(params *RepoGetReleaseParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetReleaseOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoGetReleaseParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoGetRelease",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/releases/{id}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoGetReleaseReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoGetReleaseOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoGetRelease: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoGetReleaseAttachment gets a release attachment
+*/
+func (a *Client) RepoGetReleaseAttachment(params *RepoGetReleaseAttachmentParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetReleaseAttachmentOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoGetReleaseAttachmentParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoGetReleaseAttachment",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/releases/{id}/assets/{attachment_id}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoGetReleaseAttachmentReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoGetReleaseAttachmentOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoGetReleaseAttachment: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoGetReleaseByTag gets a release by tag name
+*/
+func (a *Client) RepoGetReleaseByTag(params *RepoGetReleaseByTagParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetReleaseByTagOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoGetReleaseByTagParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoGetReleaseByTag",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/releases/tags/{tag}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoGetReleaseByTagReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoGetReleaseByTagOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoGetReleaseByTag: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoGetRepoPermissions gets repository permissions for a user
+*/
+func (a *Client) RepoGetRepoPermissions(params *RepoGetRepoPermissionsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetRepoPermissionsOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoGetRepoPermissionsParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoGetRepoPermissions",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/collaborators/{collaborator}/permission",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoGetRepoPermissionsReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoGetRepoPermissionsOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoGetRepoPermissions: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoGetReviewers returns all users that can be requested to review in this repo
+*/
+func (a *Client) RepoGetReviewers(params *RepoGetReviewersParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetReviewersOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoGetReviewersParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoGetReviewers",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/reviewers",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoGetReviewersReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoGetReviewersOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoGetReviewers: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoGetRunnerRegistrationToken gets a repository s actions runner registration token
+*/
+func (a *Client) RepoGetRunnerRegistrationToken(params *RepoGetRunnerRegistrationTokenParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetRunnerRegistrationTokenOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoGetRunnerRegistrationTokenParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoGetRunnerRegistrationToken",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/runners/registration-token",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoGetRunnerRegistrationTokenReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoGetRunnerRegistrationTokenOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoGetRunnerRegistrationToken: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoGetSingleCommit gets a single commit from a repository
+*/
+func (a *Client) RepoGetSingleCommit(params *RepoGetSingleCommitParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetSingleCommitOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoGetSingleCommitParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoGetSingleCommit",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/git/commits/{sha}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoGetSingleCommitReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoGetSingleCommitOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoGetSingleCommit: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoGetTag gets the tag of a repository by tag name
+*/
+func (a *Client) RepoGetTag(params *RepoGetTagParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetTagOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoGetTagParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoGetTag",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/tags/{tag}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoGetTagReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoGetTagOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoGetTag: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoGetWikiPage gets a wiki page
+*/
+func (a *Client) RepoGetWikiPage(params *RepoGetWikiPageParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetWikiPageOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoGetWikiPageParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoGetWikiPage",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/wiki/page/{pageName}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoGetWikiPageReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoGetWikiPageOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoGetWikiPage: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoGetWikiPageRevisions gets revisions of a wiki page
+*/
+func (a *Client) RepoGetWikiPageRevisions(params *RepoGetWikiPageRevisionsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetWikiPageRevisionsOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoGetWikiPageRevisionsParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoGetWikiPageRevisions",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/wiki/revisions/{pageName}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoGetWikiPageRevisionsReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoGetWikiPageRevisionsOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoGetWikiPageRevisions: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoGetWikiPages gets all wiki pages
+*/
+func (a *Client) RepoGetWikiPages(params *RepoGetWikiPagesParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetWikiPagesOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoGetWikiPagesParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoGetWikiPages",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/wiki/pages",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoGetWikiPagesReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoGetWikiPagesOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoGetWikiPages: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoListActionsSecrets lists an repo s actions secrets
+*/
+func (a *Client) RepoListActionsSecrets(params *RepoListActionsSecretsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoListActionsSecretsOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoListActionsSecretsParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoListActionsSecrets",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/actions/secrets",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoListActionsSecretsReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoListActionsSecretsOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoListActionsSecrets: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoListActivityFeeds lists a repository s activity feeds
+*/
+func (a *Client) RepoListActivityFeeds(params *RepoListActivityFeedsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoListActivityFeedsOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoListActivityFeedsParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoListActivityFeeds",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/activities/feeds",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoListActivityFeedsReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoListActivityFeedsOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoListActivityFeeds: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoListAllGitRefs gets specified ref or filtered repository s refs
+*/
+func (a *Client) RepoListAllGitRefs(params *RepoListAllGitRefsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoListAllGitRefsOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoListAllGitRefsParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoListAllGitRefs",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/git/refs",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoListAllGitRefsReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoListAllGitRefsOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoListAllGitRefs: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoListBranchProtection lists branch protections for a repository
+*/
+func (a *Client) RepoListBranchProtection(params *RepoListBranchProtectionParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoListBranchProtectionOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoListBranchProtectionParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoListBranchProtection",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/branch_protections",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoListBranchProtectionReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoListBranchProtectionOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoListBranchProtection: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoListBranches lists a repository s branches
+*/
+func (a *Client) RepoListBranches(params *RepoListBranchesParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoListBranchesOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoListBranchesParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoListBranches",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/branches",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoListBranchesReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoListBranchesOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoListBranches: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoListCollaborators lists a repository s collaborators
+*/
+func (a *Client) RepoListCollaborators(params *RepoListCollaboratorsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoListCollaboratorsOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoListCollaboratorsParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoListCollaborators",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/collaborators",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoListCollaboratorsReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoListCollaboratorsOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoListCollaborators: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoListGitHooks lists the git hooks in a repository
+*/
+func (a *Client) RepoListGitHooks(params *RepoListGitHooksParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoListGitHooksOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoListGitHooksParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoListGitHooks",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/hooks/git",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoListGitHooksReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoListGitHooksOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoListGitHooks: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoListGitRefs gets specified ref or filtered repository s refs
+*/
+func (a *Client) RepoListGitRefs(params *RepoListGitRefsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoListGitRefsOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoListGitRefsParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoListGitRefs",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/git/refs/{ref}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoListGitRefsReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoListGitRefsOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoListGitRefs: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoListHooks lists the hooks in a repository
+*/
+func (a *Client) RepoListHooks(params *RepoListHooksParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoListHooksOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoListHooksParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoListHooks",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/hooks",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoListHooksReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoListHooksOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoListHooks: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoListKeys lists a repository s keys
+*/
+func (a *Client) RepoListKeys(params *RepoListKeysParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoListKeysOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoListKeysParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoListKeys",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/keys",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoListKeysReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoListKeysOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoListKeys: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoListPinnedIssues lists a repo s pinned issues
+*/
+func (a *Client) RepoListPinnedIssues(params *RepoListPinnedIssuesParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoListPinnedIssuesOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoListPinnedIssuesParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoListPinnedIssues",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/issues/pinned",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoListPinnedIssuesReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoListPinnedIssuesOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoListPinnedIssues: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoListPinnedPullRequests lists a repo s pinned pull requests
+*/
+func (a *Client) RepoListPinnedPullRequests(params *RepoListPinnedPullRequestsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoListPinnedPullRequestsOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoListPinnedPullRequestsParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoListPinnedPullRequests",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/pulls/pinned",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoListPinnedPullRequestsReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoListPinnedPullRequestsOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoListPinnedPullRequests: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoListPullRequests lists a repo s pull requests
+*/
+func (a *Client) RepoListPullRequests(params *RepoListPullRequestsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoListPullRequestsOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoListPullRequestsParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoListPullRequests",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/pulls",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoListPullRequestsReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoListPullRequestsOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoListPullRequests: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoListPullReviews lists all reviews for a pull request
+*/
+func (a *Client) RepoListPullReviews(params *RepoListPullReviewsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoListPullReviewsOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoListPullReviewsParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoListPullReviews",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/pulls/{index}/reviews",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoListPullReviewsReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoListPullReviewsOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoListPullReviews: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoListPushMirrors gets all push mirrors of the repository
+*/
+func (a *Client) RepoListPushMirrors(params *RepoListPushMirrorsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoListPushMirrorsOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoListPushMirrorsParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoListPushMirrors",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/push_mirrors",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoListPushMirrorsReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoListPushMirrorsOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoListPushMirrors: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoListReleaseAttachments lists release s attachments
+*/
+func (a *Client) RepoListReleaseAttachments(params *RepoListReleaseAttachmentsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoListReleaseAttachmentsOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoListReleaseAttachmentsParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoListReleaseAttachments",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/releases/{id}/assets",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoListReleaseAttachmentsReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoListReleaseAttachmentsOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoListReleaseAttachments: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoListReleases lists a repo s releases
+*/
+func (a *Client) RepoListReleases(params *RepoListReleasesParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoListReleasesOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoListReleasesParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoListReleases",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/releases",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoListReleasesReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoListReleasesOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoListReleases: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoListStargazers lists a repo s stargazers
+*/
+func (a *Client) RepoListStargazers(params *RepoListStargazersParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoListStargazersOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoListStargazersParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoListStargazers",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/stargazers",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoListStargazersReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoListStargazersOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoListStargazers: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoListStatuses gets a commit s statuses
+*/
+func (a *Client) RepoListStatuses(params *RepoListStatusesParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoListStatusesOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoListStatusesParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoListStatuses",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/statuses/{sha}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoListStatusesReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoListStatusesOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoListStatuses: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoListStatusesByRef gets a commit s statuses by branch tag commit reference
+*/
+func (a *Client) RepoListStatusesByRef(params *RepoListStatusesByRefParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoListStatusesByRefOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoListStatusesByRefParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoListStatusesByRef",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/commits/{ref}/statuses",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoListStatusesByRefReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoListStatusesByRefOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoListStatusesByRef: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoListSubscribers lists a repo s watchers
+*/
+func (a *Client) RepoListSubscribers(params *RepoListSubscribersParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoListSubscribersOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoListSubscribersParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoListSubscribers",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/subscribers",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoListSubscribersReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoListSubscribersOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoListSubscribers: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoListTags lists a repository s tags
+*/
+func (a *Client) RepoListTags(params *RepoListTagsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoListTagsOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoListTagsParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoListTags",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/tags",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoListTagsReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoListTagsOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoListTags: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoListTeams lists a repository s teams
+*/
+func (a *Client) RepoListTeams(params *RepoListTeamsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoListTeamsOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoListTeamsParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoListTeams",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/teams",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoListTeamsReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoListTeamsOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoListTeams: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoListTopics gets list of topics that a repository has
+*/
+func (a *Client) RepoListTopics(params *RepoListTopicsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoListTopicsOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoListTopicsParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoListTopics",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/topics",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoListTopicsReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoListTopicsOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoListTopics: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoMergePullRequest merges a pull request
+*/
+func (a *Client) RepoMergePullRequest(params *RepoMergePullRequestParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoMergePullRequestOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoMergePullRequestParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoMergePullRequest",
+		Method:             "POST",
+		PathPattern:        "/repos/{owner}/{repo}/pulls/{index}/merge",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoMergePullRequestReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoMergePullRequestOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoMergePullRequest: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoMigrate migrates a remote git repository
+*/
+func (a *Client) RepoMigrate(params *RepoMigrateParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoMigrateCreated, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoMigrateParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoMigrate",
+		Method:             "POST",
+		PathPattern:        "/repos/migrate",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoMigrateReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoMigrateCreated)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoMigrate: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoMirrorSync syncs a mirrored repository
+*/
+func (a *Client) RepoMirrorSync(params *RepoMirrorSyncParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoMirrorSyncOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoMirrorSyncParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoMirrorSync",
+		Method:             "POST",
+		PathPattern:        "/repos/{owner}/{repo}/mirror-sync",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoMirrorSyncReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoMirrorSyncOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoMirrorSync: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoNewPinAllowed returns if new issue pins are allowed
+*/
+func (a *Client) RepoNewPinAllowed(params *RepoNewPinAllowedParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoNewPinAllowedOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoNewPinAllowedParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoNewPinAllowed",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/new_pin_allowed",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoNewPinAllowedReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoNewPinAllowedOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoNewPinAllowed: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoPullRequestIsMerged checks if a pull request has been merged
+*/
+func (a *Client) RepoPullRequestIsMerged(params *RepoPullRequestIsMergedParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoPullRequestIsMergedNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoPullRequestIsMergedParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoPullRequestIsMerged",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/pulls/{index}/merge",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoPullRequestIsMergedReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoPullRequestIsMergedNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoPullRequestIsMerged: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoPushMirrorSync syncs all push mirrored repository
+*/
+func (a *Client) RepoPushMirrorSync(params *RepoPushMirrorSyncParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoPushMirrorSyncOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoPushMirrorSyncParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoPushMirrorSync",
+		Method:             "POST",
+		PathPattern:        "/repos/{owner}/{repo}/push_mirrors-sync",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoPushMirrorSyncReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoPushMirrorSyncOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoPushMirrorSync: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoSearch searches for repositories
+*/
+func (a *Client) RepoSearch(params *RepoSearchParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoSearchOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoSearchParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoSearch",
+		Method:             "GET",
+		PathPattern:        "/repos/search",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoSearchReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoSearchOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoSearch: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoSigningKey gets signing key gpg for given repository
+*/
+func (a *Client) RepoSigningKey(params *RepoSigningKeyParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoSigningKeyOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoSigningKeyParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoSigningKey",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/signing-key.gpg",
+		ProducesMediaTypes: []string{"text/plain"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoSigningKeyReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoSigningKeyOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoSigningKey: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoSubmitPullReview submits a pending review to an pull request
+*/
+func (a *Client) RepoSubmitPullReview(params *RepoSubmitPullReviewParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoSubmitPullReviewOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoSubmitPullReviewParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoSubmitPullReview",
+		Method:             "POST",
+		PathPattern:        "/repos/{owner}/{repo}/pulls/{index}/reviews/{id}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoSubmitPullReviewReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoSubmitPullReviewOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoSubmitPullReview: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoTestHook tests a push webhook
+*/
+func (a *Client) RepoTestHook(params *RepoTestHookParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoTestHookNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoTestHookParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoTestHook",
+		Method:             "POST",
+		PathPattern:        "/repos/{owner}/{repo}/hooks/{id}/tests",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoTestHookReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoTestHookNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoTestHook: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoTrackedTimes lists a repo s tracked times
+*/
+func (a *Client) RepoTrackedTimes(params *RepoTrackedTimesParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoTrackedTimesOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoTrackedTimesParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoTrackedTimes",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/times",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoTrackedTimesReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoTrackedTimesOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoTrackedTimes: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoTransfer transfers a repo ownership
+*/
+func (a *Client) RepoTransfer(params *RepoTransferParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoTransferAccepted, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoTransferParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoTransfer",
+		Method:             "POST",
+		PathPattern:        "/repos/{owner}/{repo}/transfer",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoTransferReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoTransferAccepted)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoTransfer: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoUnDismissPullReview cancels to dismiss a review for a pull request
+*/
+func (a *Client) RepoUnDismissPullReview(params *RepoUnDismissPullReviewParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoUnDismissPullReviewOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoUnDismissPullReviewParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoUnDismissPullReview",
+		Method:             "POST",
+		PathPattern:        "/repos/{owner}/{repo}/pulls/{index}/reviews/{id}/undismissals",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoUnDismissPullReviewReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoUnDismissPullReviewOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoUnDismissPullReview: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoUpdateAvatar updates avatar
+*/
+func (a *Client) RepoUpdateAvatar(params *RepoUpdateAvatarParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoUpdateAvatarNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoUpdateAvatarParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoUpdateAvatar",
+		Method:             "POST",
+		PathPattern:        "/repos/{owner}/{repo}/avatar",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoUpdateAvatarReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoUpdateAvatarNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoUpdateAvatar: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoUpdateFile updates a file in a repository
+*/
+func (a *Client) RepoUpdateFile(params *RepoUpdateFileParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoUpdateFileOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoUpdateFileParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoUpdateFile",
+		Method:             "PUT",
+		PathPattern:        "/repos/{owner}/{repo}/contents/{filepath}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoUpdateFileReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoUpdateFileOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoUpdateFile: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoUpdatePullRequest merges p r s base branch into head branch
+*/
+func (a *Client) RepoUpdatePullRequest(params *RepoUpdatePullRequestParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoUpdatePullRequestOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoUpdatePullRequestParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoUpdatePullRequest",
+		Method:             "POST",
+		PathPattern:        "/repos/{owner}/{repo}/pulls/{index}/update",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoUpdatePullRequestReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoUpdatePullRequestOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoUpdatePullRequest: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoUpdateTopics replaces list of topics for a repository
+*/
+func (a *Client) RepoUpdateTopics(params *RepoUpdateTopicsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoUpdateTopicsNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoUpdateTopicsParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoUpdateTopics",
+		Method:             "PUT",
+		PathPattern:        "/repos/{owner}/{repo}/topics",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoUpdateTopicsReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoUpdateTopicsNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoUpdateTopics: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+RepoValidateIssueConfig returns the validation information for a issue config
+*/
+func (a *Client) RepoValidateIssueConfig(params *RepoValidateIssueConfigParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoValidateIssueConfigOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewRepoValidateIssueConfigParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "repoValidateIssueConfig",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/issue_config/validate",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &RepoValidateIssueConfigReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*RepoValidateIssueConfigOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repoValidateIssueConfig: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+TopicSearch searches topics via keyword
+*/
+func (a *Client) TopicSearch(params *TopicSearchParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*TopicSearchOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewTopicSearchParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "topicSearch",
+		Method:             "GET",
+		PathPattern:        "/topics/search",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &TopicSearchReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*TopicSearchOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for topicSearch: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+UpdateRepoSecret creates or update a secret value in a repository
+*/
+func (a *Client) UpdateRepoSecret(params *UpdateRepoSecretParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UpdateRepoSecretCreated, *UpdateRepoSecretNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewUpdateRepoSecretParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "updateRepoSecret",
+		Method:             "PUT",
+		PathPattern:        "/repos/{owner}/{repo}/actions/secrets/{secretname}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &UpdateRepoSecretReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, nil, err
+	}
+	switch value := result.(type) {
+	case *UpdateRepoSecretCreated:
+		return value, nil, nil
+	case *UpdateRepoSecretNoContent:
+		return nil, value, nil
+	}
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repository: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+UpdateRepoVariable updates a repo level variable
+*/
+func (a *Client) UpdateRepoVariable(params *UpdateRepoVariableParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UpdateRepoVariableCreated, *UpdateRepoVariableNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewUpdateRepoVariableParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "updateRepoVariable",
+		Method:             "PUT",
+		PathPattern:        "/repos/{owner}/{repo}/actions/variables/{variablename}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &UpdateRepoVariableReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, nil, err
+	}
+	switch value := result.(type) {
+	case *UpdateRepoVariableCreated:
+		return value, nil, nil
+	case *UpdateRepoVariableNoContent:
+		return nil, value, nil
+	}
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for repository: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+UserCurrentCheckSubscription checks if the current user is watching a repo
+*/
+func (a *Client) UserCurrentCheckSubscription(params *UserCurrentCheckSubscriptionParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserCurrentCheckSubscriptionOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewUserCurrentCheckSubscriptionParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "userCurrentCheckSubscription",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/subscription",
+		ProducesMediaTypes: []string{"application/json", "text/html"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &UserCurrentCheckSubscriptionReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*UserCurrentCheckSubscriptionOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for userCurrentCheckSubscription: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+UserCurrentDeleteSubscription unwatches a repo
+*/
+func (a *Client) UserCurrentDeleteSubscription(params *UserCurrentDeleteSubscriptionParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserCurrentDeleteSubscriptionNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewUserCurrentDeleteSubscriptionParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "userCurrentDeleteSubscription",
+		Method:             "DELETE",
+		PathPattern:        "/repos/{owner}/{repo}/subscription",
+		ProducesMediaTypes: []string{"application/json", "text/html"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &UserCurrentDeleteSubscriptionReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*UserCurrentDeleteSubscriptionNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for userCurrentDeleteSubscription: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+UserCurrentPutSubscription watches a repo
+*/
+func (a *Client) UserCurrentPutSubscription(params *UserCurrentPutSubscriptionParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserCurrentPutSubscriptionOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewUserCurrentPutSubscriptionParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "userCurrentPutSubscription",
+		Method:             "PUT",
+		PathPattern:        "/repos/{owner}/{repo}/subscription",
+		ProducesMediaTypes: []string{"application/json", "text/html"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &UserCurrentPutSubscriptionReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*UserCurrentPutSubscriptionOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for userCurrentPutSubscription: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+UserTrackedTimes lists a user s tracked times in a repo
+*/
+func (a *Client) UserTrackedTimes(params *UserTrackedTimesParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserTrackedTimesOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewUserTrackedTimesParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "userTrackedTimes",
+		Method:             "GET",
+		PathPattern:        "/repos/{owner}/{repo}/times/{user}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &UserTrackedTimesReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*UserTrackedTimesOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for userTrackedTimes: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+// SetTransport changes the transport on the client
+func (a *Client) SetTransport(transport runtime.ClientTransport) {
+	a.transport = transport
+}
diff --git a/bots-common/gitea-generated/client/repository/topic_search_parameters.go b/bots-common/gitea-generated/client/repository/topic_search_parameters.go
new file mode 100644
index 0000000..8ff8967
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/topic_search_parameters.go
@@ -0,0 +1,225 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewTopicSearchParams creates a new TopicSearchParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewTopicSearchParams() *TopicSearchParams {
+	return &TopicSearchParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewTopicSearchParamsWithTimeout creates a new TopicSearchParams object
+// with the ability to set a timeout on a request.
+func NewTopicSearchParamsWithTimeout(timeout time.Duration) *TopicSearchParams {
+	return &TopicSearchParams{
+		timeout: timeout,
+	}
+}
+
+// NewTopicSearchParamsWithContext creates a new TopicSearchParams object
+// with the ability to set a context for a request.
+func NewTopicSearchParamsWithContext(ctx context.Context) *TopicSearchParams {
+	return &TopicSearchParams{
+		Context: ctx,
+	}
+}
+
+// NewTopicSearchParamsWithHTTPClient creates a new TopicSearchParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewTopicSearchParamsWithHTTPClient(client *http.Client) *TopicSearchParams {
+	return &TopicSearchParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+TopicSearchParams contains all the parameters to send to the API endpoint
+
+	for the topic search operation.
+
+	Typically these are written to a http.Request.
+*/
+type TopicSearchParams struct {
+
+	/* Limit.
+
+	   page size of results
+	*/
+	Limit *int64
+
+	/* Page.
+
+	   page number of results to return (1-based)
+	*/
+	Page *int64
+
+	/* Q.
+
+	   keywords to search
+	*/
+	Q string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the topic search params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *TopicSearchParams) WithDefaults() *TopicSearchParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the topic search params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *TopicSearchParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the topic search params
+func (o *TopicSearchParams) WithTimeout(timeout time.Duration) *TopicSearchParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the topic search params
+func (o *TopicSearchParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the topic search params
+func (o *TopicSearchParams) WithContext(ctx context.Context) *TopicSearchParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the topic search params
+func (o *TopicSearchParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the topic search params
+func (o *TopicSearchParams) WithHTTPClient(client *http.Client) *TopicSearchParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the topic search params
+func (o *TopicSearchParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithLimit adds the limit to the topic search params
+func (o *TopicSearchParams) WithLimit(limit *int64) *TopicSearchParams {
+	o.SetLimit(limit)
+	return o
+}
+
+// SetLimit adds the limit to the topic search params
+func (o *TopicSearchParams) SetLimit(limit *int64) {
+	o.Limit = limit
+}
+
+// WithPage adds the page to the topic search params
+func (o *TopicSearchParams) WithPage(page *int64) *TopicSearchParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the topic search params
+func (o *TopicSearchParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WithQ adds the q to the topic search params
+func (o *TopicSearchParams) WithQ(q string) *TopicSearchParams {
+	o.SetQ(q)
+	return o
+}
+
+// SetQ adds the q to the topic search params
+func (o *TopicSearchParams) SetQ(q string) {
+	o.Q = q
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *TopicSearchParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.Limit != nil {
+
+		// query param limit
+		var qrLimit int64
+
+		if o.Limit != nil {
+			qrLimit = *o.Limit
+		}
+		qLimit := swag.FormatInt64(qrLimit)
+		if qLimit != "" {
+
+			if err := r.SetQueryParam("limit", qLimit); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	// query param q
+	qrQ := o.Q
+	qQ := qrQ
+	if qQ != "" {
+
+		if err := r.SetQueryParam("q", qQ); err != nil {
+			return err
+		}
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/topic_search_responses.go b/bots-common/gitea-generated/client/repository/topic_search_responses.go
new file mode 100644
index 0000000..9f693b9
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/topic_search_responses.go
@@ -0,0 +1,244 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// TopicSearchReader is a Reader for the TopicSearch structure.
+type TopicSearchReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *TopicSearchReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewTopicSearchOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 403:
+		result := NewTopicSearchForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewTopicSearchNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /topics/search] topicSearch", response, response.Code())
+	}
+}
+
+// NewTopicSearchOK creates a TopicSearchOK with default headers values
+func NewTopicSearchOK() *TopicSearchOK {
+	return &TopicSearchOK{}
+}
+
+/*
+TopicSearchOK describes a response with status code 200, with default header values.
+
+TopicListResponse
+*/
+type TopicSearchOK struct {
+	Payload []*models.TopicResponse
+}
+
+// IsSuccess returns true when this topic search o k response has a 2xx status code
+func (o *TopicSearchOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this topic search o k response has a 3xx status code
+func (o *TopicSearchOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this topic search o k response has a 4xx status code
+func (o *TopicSearchOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this topic search o k response has a 5xx status code
+func (o *TopicSearchOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this topic search o k response a status code equal to that given
+func (o *TopicSearchOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the topic search o k response
+func (o *TopicSearchOK) Code() int {
+	return 200
+}
+
+func (o *TopicSearchOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /topics/search][%d] topicSearchOK %s", 200, payload)
+}
+
+func (o *TopicSearchOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /topics/search][%d] topicSearchOK %s", 200, payload)
+}
+
+func (o *TopicSearchOK) GetPayload() []*models.TopicResponse {
+	return o.Payload
+}
+
+func (o *TopicSearchOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewTopicSearchForbidden creates a TopicSearchForbidden with default headers values
+func NewTopicSearchForbidden() *TopicSearchForbidden {
+	return &TopicSearchForbidden{}
+}
+
+/*
+TopicSearchForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type TopicSearchForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this topic search forbidden response has a 2xx status code
+func (o *TopicSearchForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this topic search forbidden response has a 3xx status code
+func (o *TopicSearchForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this topic search forbidden response has a 4xx status code
+func (o *TopicSearchForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this topic search forbidden response has a 5xx status code
+func (o *TopicSearchForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this topic search forbidden response a status code equal to that given
+func (o *TopicSearchForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the topic search forbidden response
+func (o *TopicSearchForbidden) Code() int {
+	return 403
+}
+
+func (o *TopicSearchForbidden) Error() string {
+	return fmt.Sprintf("[GET /topics/search][%d] topicSearchForbidden", 403)
+}
+
+func (o *TopicSearchForbidden) String() string {
+	return fmt.Sprintf("[GET /topics/search][%d] topicSearchForbidden", 403)
+}
+
+func (o *TopicSearchForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewTopicSearchNotFound creates a TopicSearchNotFound with default headers values
+func NewTopicSearchNotFound() *TopicSearchNotFound {
+	return &TopicSearchNotFound{}
+}
+
+/*
+TopicSearchNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type TopicSearchNotFound struct {
+}
+
+// IsSuccess returns true when this topic search not found response has a 2xx status code
+func (o *TopicSearchNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this topic search not found response has a 3xx status code
+func (o *TopicSearchNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this topic search not found response has a 4xx status code
+func (o *TopicSearchNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this topic search not found response has a 5xx status code
+func (o *TopicSearchNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this topic search not found response a status code equal to that given
+func (o *TopicSearchNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the topic search not found response
+func (o *TopicSearchNotFound) Code() int {
+	return 404
+}
+
+func (o *TopicSearchNotFound) Error() string {
+	return fmt.Sprintf("[GET /topics/search][%d] topicSearchNotFound", 404)
+}
+
+func (o *TopicSearchNotFound) String() string {
+	return fmt.Sprintf("[GET /topics/search][%d] topicSearchNotFound", 404)
+}
+
+func (o *TopicSearchNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/update_repo_secret_parameters.go b/bots-common/gitea-generated/client/repository/update_repo_secret_parameters.go
new file mode 100644
index 0000000..820f725
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/update_repo_secret_parameters.go
@@ -0,0 +1,216 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewUpdateRepoSecretParams creates a new UpdateRepoSecretParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewUpdateRepoSecretParams() *UpdateRepoSecretParams {
+	return &UpdateRepoSecretParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewUpdateRepoSecretParamsWithTimeout creates a new UpdateRepoSecretParams object
+// with the ability to set a timeout on a request.
+func NewUpdateRepoSecretParamsWithTimeout(timeout time.Duration) *UpdateRepoSecretParams {
+	return &UpdateRepoSecretParams{
+		timeout: timeout,
+	}
+}
+
+// NewUpdateRepoSecretParamsWithContext creates a new UpdateRepoSecretParams object
+// with the ability to set a context for a request.
+func NewUpdateRepoSecretParamsWithContext(ctx context.Context) *UpdateRepoSecretParams {
+	return &UpdateRepoSecretParams{
+		Context: ctx,
+	}
+}
+
+// NewUpdateRepoSecretParamsWithHTTPClient creates a new UpdateRepoSecretParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewUpdateRepoSecretParamsWithHTTPClient(client *http.Client) *UpdateRepoSecretParams {
+	return &UpdateRepoSecretParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+UpdateRepoSecretParams contains all the parameters to send to the API endpoint
+
+	for the update repo secret operation.
+
+	Typically these are written to a http.Request.
+*/
+type UpdateRepoSecretParams struct {
+
+	// Body.
+	Body *models.CreateOrUpdateSecretOption
+
+	/* Owner.
+
+	   owner of the repository
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repository
+	*/
+	Repo string
+
+	/* Secretname.
+
+	   name of the secret
+	*/
+	Secretname string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the update repo secret params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UpdateRepoSecretParams) WithDefaults() *UpdateRepoSecretParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the update repo secret params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UpdateRepoSecretParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the update repo secret params
+func (o *UpdateRepoSecretParams) WithTimeout(timeout time.Duration) *UpdateRepoSecretParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the update repo secret params
+func (o *UpdateRepoSecretParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the update repo secret params
+func (o *UpdateRepoSecretParams) WithContext(ctx context.Context) *UpdateRepoSecretParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the update repo secret params
+func (o *UpdateRepoSecretParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the update repo secret params
+func (o *UpdateRepoSecretParams) WithHTTPClient(client *http.Client) *UpdateRepoSecretParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the update repo secret params
+func (o *UpdateRepoSecretParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the update repo secret params
+func (o *UpdateRepoSecretParams) WithBody(body *models.CreateOrUpdateSecretOption) *UpdateRepoSecretParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the update repo secret params
+func (o *UpdateRepoSecretParams) SetBody(body *models.CreateOrUpdateSecretOption) {
+	o.Body = body
+}
+
+// WithOwner adds the owner to the update repo secret params
+func (o *UpdateRepoSecretParams) WithOwner(owner string) *UpdateRepoSecretParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the update repo secret params
+func (o *UpdateRepoSecretParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the update repo secret params
+func (o *UpdateRepoSecretParams) WithRepo(repo string) *UpdateRepoSecretParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the update repo secret params
+func (o *UpdateRepoSecretParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WithSecretname adds the secretname to the update repo secret params
+func (o *UpdateRepoSecretParams) WithSecretname(secretname string) *UpdateRepoSecretParams {
+	o.SetSecretname(secretname)
+	return o
+}
+
+// SetSecretname adds the secretname to the update repo secret params
+func (o *UpdateRepoSecretParams) SetSecretname(secretname string) {
+	o.Secretname = secretname
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *UpdateRepoSecretParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	// path param secretname
+	if err := r.SetPathParam("secretname", o.Secretname); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/update_repo_secret_responses.go b/bots-common/gitea-generated/client/repository/update_repo_secret_responses.go
new file mode 100644
index 0000000..3f65ff6
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/update_repo_secret_responses.go
@@ -0,0 +1,290 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// UpdateRepoSecretReader is a Reader for the UpdateRepoSecret structure.
+type UpdateRepoSecretReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *UpdateRepoSecretReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 201:
+		result := NewUpdateRepoSecretCreated()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 204:
+		result := NewUpdateRepoSecretNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 400:
+		result := NewUpdateRepoSecretBadRequest()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewUpdateRepoSecretNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[PUT /repos/{owner}/{repo}/actions/secrets/{secretname}] updateRepoSecret", response, response.Code())
+	}
+}
+
+// NewUpdateRepoSecretCreated creates a UpdateRepoSecretCreated with default headers values
+func NewUpdateRepoSecretCreated() *UpdateRepoSecretCreated {
+	return &UpdateRepoSecretCreated{}
+}
+
+/*
+UpdateRepoSecretCreated describes a response with status code 201, with default header values.
+
+response when creating a secret
+*/
+type UpdateRepoSecretCreated struct {
+}
+
+// IsSuccess returns true when this update repo secret created response has a 2xx status code
+func (o *UpdateRepoSecretCreated) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this update repo secret created response has a 3xx status code
+func (o *UpdateRepoSecretCreated) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this update repo secret created response has a 4xx status code
+func (o *UpdateRepoSecretCreated) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this update repo secret created response has a 5xx status code
+func (o *UpdateRepoSecretCreated) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this update repo secret created response a status code equal to that given
+func (o *UpdateRepoSecretCreated) IsCode(code int) bool {
+	return code == 201
+}
+
+// Code gets the status code for the update repo secret created response
+func (o *UpdateRepoSecretCreated) Code() int {
+	return 201
+}
+
+func (o *UpdateRepoSecretCreated) Error() string {
+	return fmt.Sprintf("[PUT /repos/{owner}/{repo}/actions/secrets/{secretname}][%d] updateRepoSecretCreated", 201)
+}
+
+func (o *UpdateRepoSecretCreated) String() string {
+	return fmt.Sprintf("[PUT /repos/{owner}/{repo}/actions/secrets/{secretname}][%d] updateRepoSecretCreated", 201)
+}
+
+func (o *UpdateRepoSecretCreated) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewUpdateRepoSecretNoContent creates a UpdateRepoSecretNoContent with default headers values
+func NewUpdateRepoSecretNoContent() *UpdateRepoSecretNoContent {
+	return &UpdateRepoSecretNoContent{}
+}
+
+/*
+UpdateRepoSecretNoContent describes a response with status code 204, with default header values.
+
+response when updating a secret
+*/
+type UpdateRepoSecretNoContent struct {
+}
+
+// IsSuccess returns true when this update repo secret no content response has a 2xx status code
+func (o *UpdateRepoSecretNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this update repo secret no content response has a 3xx status code
+func (o *UpdateRepoSecretNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this update repo secret no content response has a 4xx status code
+func (o *UpdateRepoSecretNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this update repo secret no content response has a 5xx status code
+func (o *UpdateRepoSecretNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this update repo secret no content response a status code equal to that given
+func (o *UpdateRepoSecretNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the update repo secret no content response
+func (o *UpdateRepoSecretNoContent) Code() int {
+	return 204
+}
+
+func (o *UpdateRepoSecretNoContent) Error() string {
+	return fmt.Sprintf("[PUT /repos/{owner}/{repo}/actions/secrets/{secretname}][%d] updateRepoSecretNoContent", 204)
+}
+
+func (o *UpdateRepoSecretNoContent) String() string {
+	return fmt.Sprintf("[PUT /repos/{owner}/{repo}/actions/secrets/{secretname}][%d] updateRepoSecretNoContent", 204)
+}
+
+func (o *UpdateRepoSecretNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewUpdateRepoSecretBadRequest creates a UpdateRepoSecretBadRequest with default headers values
+func NewUpdateRepoSecretBadRequest() *UpdateRepoSecretBadRequest {
+	return &UpdateRepoSecretBadRequest{}
+}
+
+/*
+UpdateRepoSecretBadRequest describes a response with status code 400, with default header values.
+
+APIError is error format response
+*/
+type UpdateRepoSecretBadRequest struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this update repo secret bad request response has a 2xx status code
+func (o *UpdateRepoSecretBadRequest) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this update repo secret bad request response has a 3xx status code
+func (o *UpdateRepoSecretBadRequest) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this update repo secret bad request response has a 4xx status code
+func (o *UpdateRepoSecretBadRequest) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this update repo secret bad request response has a 5xx status code
+func (o *UpdateRepoSecretBadRequest) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this update repo secret bad request response a status code equal to that given
+func (o *UpdateRepoSecretBadRequest) IsCode(code int) bool {
+	return code == 400
+}
+
+// Code gets the status code for the update repo secret bad request response
+func (o *UpdateRepoSecretBadRequest) Code() int {
+	return 400
+}
+
+func (o *UpdateRepoSecretBadRequest) Error() string {
+	return fmt.Sprintf("[PUT /repos/{owner}/{repo}/actions/secrets/{secretname}][%d] updateRepoSecretBadRequest", 400)
+}
+
+func (o *UpdateRepoSecretBadRequest) String() string {
+	return fmt.Sprintf("[PUT /repos/{owner}/{repo}/actions/secrets/{secretname}][%d] updateRepoSecretBadRequest", 400)
+}
+
+func (o *UpdateRepoSecretBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewUpdateRepoSecretNotFound creates a UpdateRepoSecretNotFound with default headers values
+func NewUpdateRepoSecretNotFound() *UpdateRepoSecretNotFound {
+	return &UpdateRepoSecretNotFound{}
+}
+
+/*
+UpdateRepoSecretNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type UpdateRepoSecretNotFound struct {
+}
+
+// IsSuccess returns true when this update repo secret not found response has a 2xx status code
+func (o *UpdateRepoSecretNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this update repo secret not found response has a 3xx status code
+func (o *UpdateRepoSecretNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this update repo secret not found response has a 4xx status code
+func (o *UpdateRepoSecretNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this update repo secret not found response has a 5xx status code
+func (o *UpdateRepoSecretNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this update repo secret not found response a status code equal to that given
+func (o *UpdateRepoSecretNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the update repo secret not found response
+func (o *UpdateRepoSecretNotFound) Code() int {
+	return 404
+}
+
+func (o *UpdateRepoSecretNotFound) Error() string {
+	return fmt.Sprintf("[PUT /repos/{owner}/{repo}/actions/secrets/{secretname}][%d] updateRepoSecretNotFound", 404)
+}
+
+func (o *UpdateRepoSecretNotFound) String() string {
+	return fmt.Sprintf("[PUT /repos/{owner}/{repo}/actions/secrets/{secretname}][%d] updateRepoSecretNotFound", 404)
+}
+
+func (o *UpdateRepoSecretNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/update_repo_variable_parameters.go b/bots-common/gitea-generated/client/repository/update_repo_variable_parameters.go
new file mode 100644
index 0000000..71d677a
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/update_repo_variable_parameters.go
@@ -0,0 +1,216 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewUpdateRepoVariableParams creates a new UpdateRepoVariableParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewUpdateRepoVariableParams() *UpdateRepoVariableParams {
+	return &UpdateRepoVariableParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewUpdateRepoVariableParamsWithTimeout creates a new UpdateRepoVariableParams object
+// with the ability to set a timeout on a request.
+func NewUpdateRepoVariableParamsWithTimeout(timeout time.Duration) *UpdateRepoVariableParams {
+	return &UpdateRepoVariableParams{
+		timeout: timeout,
+	}
+}
+
+// NewUpdateRepoVariableParamsWithContext creates a new UpdateRepoVariableParams object
+// with the ability to set a context for a request.
+func NewUpdateRepoVariableParamsWithContext(ctx context.Context) *UpdateRepoVariableParams {
+	return &UpdateRepoVariableParams{
+		Context: ctx,
+	}
+}
+
+// NewUpdateRepoVariableParamsWithHTTPClient creates a new UpdateRepoVariableParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewUpdateRepoVariableParamsWithHTTPClient(client *http.Client) *UpdateRepoVariableParams {
+	return &UpdateRepoVariableParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+UpdateRepoVariableParams contains all the parameters to send to the API endpoint
+
+	for the update repo variable operation.
+
+	Typically these are written to a http.Request.
+*/
+type UpdateRepoVariableParams struct {
+
+	// Body.
+	Body *models.UpdateVariableOption
+
+	/* Owner.
+
+	   name of the owner
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repository
+	*/
+	Repo string
+
+	/* Variablename.
+
+	   name of the variable
+	*/
+	Variablename string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the update repo variable params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UpdateRepoVariableParams) WithDefaults() *UpdateRepoVariableParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the update repo variable params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UpdateRepoVariableParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the update repo variable params
+func (o *UpdateRepoVariableParams) WithTimeout(timeout time.Duration) *UpdateRepoVariableParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the update repo variable params
+func (o *UpdateRepoVariableParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the update repo variable params
+func (o *UpdateRepoVariableParams) WithContext(ctx context.Context) *UpdateRepoVariableParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the update repo variable params
+func (o *UpdateRepoVariableParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the update repo variable params
+func (o *UpdateRepoVariableParams) WithHTTPClient(client *http.Client) *UpdateRepoVariableParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the update repo variable params
+func (o *UpdateRepoVariableParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the update repo variable params
+func (o *UpdateRepoVariableParams) WithBody(body *models.UpdateVariableOption) *UpdateRepoVariableParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the update repo variable params
+func (o *UpdateRepoVariableParams) SetBody(body *models.UpdateVariableOption) {
+	o.Body = body
+}
+
+// WithOwner adds the owner to the update repo variable params
+func (o *UpdateRepoVariableParams) WithOwner(owner string) *UpdateRepoVariableParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the update repo variable params
+func (o *UpdateRepoVariableParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the update repo variable params
+func (o *UpdateRepoVariableParams) WithRepo(repo string) *UpdateRepoVariableParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the update repo variable params
+func (o *UpdateRepoVariableParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WithVariablename adds the variablename to the update repo variable params
+func (o *UpdateRepoVariableParams) WithVariablename(variablename string) *UpdateRepoVariableParams {
+	o.SetVariablename(variablename)
+	return o
+}
+
+// SetVariablename adds the variablename to the update repo variable params
+func (o *UpdateRepoVariableParams) SetVariablename(variablename string) {
+	o.Variablename = variablename
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *UpdateRepoVariableParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	// path param variablename
+	if err := r.SetPathParam("variablename", o.Variablename); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/update_repo_variable_responses.go b/bots-common/gitea-generated/client/repository/update_repo_variable_responses.go
new file mode 100644
index 0000000..57140fa
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/update_repo_variable_responses.go
@@ -0,0 +1,290 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// UpdateRepoVariableReader is a Reader for the UpdateRepoVariable structure.
+type UpdateRepoVariableReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *UpdateRepoVariableReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 201:
+		result := NewUpdateRepoVariableCreated()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 204:
+		result := NewUpdateRepoVariableNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 400:
+		result := NewUpdateRepoVariableBadRequest()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewUpdateRepoVariableNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[PUT /repos/{owner}/{repo}/actions/variables/{variablename}] updateRepoVariable", response, response.Code())
+	}
+}
+
+// NewUpdateRepoVariableCreated creates a UpdateRepoVariableCreated with default headers values
+func NewUpdateRepoVariableCreated() *UpdateRepoVariableCreated {
+	return &UpdateRepoVariableCreated{}
+}
+
+/*
+UpdateRepoVariableCreated describes a response with status code 201, with default header values.
+
+response when updating a repo-level variable
+*/
+type UpdateRepoVariableCreated struct {
+}
+
+// IsSuccess returns true when this update repo variable created response has a 2xx status code
+func (o *UpdateRepoVariableCreated) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this update repo variable created response has a 3xx status code
+func (o *UpdateRepoVariableCreated) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this update repo variable created response has a 4xx status code
+func (o *UpdateRepoVariableCreated) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this update repo variable created response has a 5xx status code
+func (o *UpdateRepoVariableCreated) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this update repo variable created response a status code equal to that given
+func (o *UpdateRepoVariableCreated) IsCode(code int) bool {
+	return code == 201
+}
+
+// Code gets the status code for the update repo variable created response
+func (o *UpdateRepoVariableCreated) Code() int {
+	return 201
+}
+
+func (o *UpdateRepoVariableCreated) Error() string {
+	return fmt.Sprintf("[PUT /repos/{owner}/{repo}/actions/variables/{variablename}][%d] updateRepoVariableCreated", 201)
+}
+
+func (o *UpdateRepoVariableCreated) String() string {
+	return fmt.Sprintf("[PUT /repos/{owner}/{repo}/actions/variables/{variablename}][%d] updateRepoVariableCreated", 201)
+}
+
+func (o *UpdateRepoVariableCreated) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewUpdateRepoVariableNoContent creates a UpdateRepoVariableNoContent with default headers values
+func NewUpdateRepoVariableNoContent() *UpdateRepoVariableNoContent {
+	return &UpdateRepoVariableNoContent{}
+}
+
+/*
+UpdateRepoVariableNoContent describes a response with status code 204, with default header values.
+
+response when updating a repo-level variable
+*/
+type UpdateRepoVariableNoContent struct {
+}
+
+// IsSuccess returns true when this update repo variable no content response has a 2xx status code
+func (o *UpdateRepoVariableNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this update repo variable no content response has a 3xx status code
+func (o *UpdateRepoVariableNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this update repo variable no content response has a 4xx status code
+func (o *UpdateRepoVariableNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this update repo variable no content response has a 5xx status code
+func (o *UpdateRepoVariableNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this update repo variable no content response a status code equal to that given
+func (o *UpdateRepoVariableNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the update repo variable no content response
+func (o *UpdateRepoVariableNoContent) Code() int {
+	return 204
+}
+
+func (o *UpdateRepoVariableNoContent) Error() string {
+	return fmt.Sprintf("[PUT /repos/{owner}/{repo}/actions/variables/{variablename}][%d] updateRepoVariableNoContent", 204)
+}
+
+func (o *UpdateRepoVariableNoContent) String() string {
+	return fmt.Sprintf("[PUT /repos/{owner}/{repo}/actions/variables/{variablename}][%d] updateRepoVariableNoContent", 204)
+}
+
+func (o *UpdateRepoVariableNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewUpdateRepoVariableBadRequest creates a UpdateRepoVariableBadRequest with default headers values
+func NewUpdateRepoVariableBadRequest() *UpdateRepoVariableBadRequest {
+	return &UpdateRepoVariableBadRequest{}
+}
+
+/*
+UpdateRepoVariableBadRequest describes a response with status code 400, with default header values.
+
+APIError is error format response
+*/
+type UpdateRepoVariableBadRequest struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this update repo variable bad request response has a 2xx status code
+func (o *UpdateRepoVariableBadRequest) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this update repo variable bad request response has a 3xx status code
+func (o *UpdateRepoVariableBadRequest) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this update repo variable bad request response has a 4xx status code
+func (o *UpdateRepoVariableBadRequest) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this update repo variable bad request response has a 5xx status code
+func (o *UpdateRepoVariableBadRequest) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this update repo variable bad request response a status code equal to that given
+func (o *UpdateRepoVariableBadRequest) IsCode(code int) bool {
+	return code == 400
+}
+
+// Code gets the status code for the update repo variable bad request response
+func (o *UpdateRepoVariableBadRequest) Code() int {
+	return 400
+}
+
+func (o *UpdateRepoVariableBadRequest) Error() string {
+	return fmt.Sprintf("[PUT /repos/{owner}/{repo}/actions/variables/{variablename}][%d] updateRepoVariableBadRequest", 400)
+}
+
+func (o *UpdateRepoVariableBadRequest) String() string {
+	return fmt.Sprintf("[PUT /repos/{owner}/{repo}/actions/variables/{variablename}][%d] updateRepoVariableBadRequest", 400)
+}
+
+func (o *UpdateRepoVariableBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewUpdateRepoVariableNotFound creates a UpdateRepoVariableNotFound with default headers values
+func NewUpdateRepoVariableNotFound() *UpdateRepoVariableNotFound {
+	return &UpdateRepoVariableNotFound{}
+}
+
+/*
+UpdateRepoVariableNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type UpdateRepoVariableNotFound struct {
+}
+
+// IsSuccess returns true when this update repo variable not found response has a 2xx status code
+func (o *UpdateRepoVariableNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this update repo variable not found response has a 3xx status code
+func (o *UpdateRepoVariableNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this update repo variable not found response has a 4xx status code
+func (o *UpdateRepoVariableNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this update repo variable not found response has a 5xx status code
+func (o *UpdateRepoVariableNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this update repo variable not found response a status code equal to that given
+func (o *UpdateRepoVariableNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the update repo variable not found response
+func (o *UpdateRepoVariableNotFound) Code() int {
+	return 404
+}
+
+func (o *UpdateRepoVariableNotFound) Error() string {
+	return fmt.Sprintf("[PUT /repos/{owner}/{repo}/actions/variables/{variablename}][%d] updateRepoVariableNotFound", 404)
+}
+
+func (o *UpdateRepoVariableNotFound) String() string {
+	return fmt.Sprintf("[PUT /repos/{owner}/{repo}/actions/variables/{variablename}][%d] updateRepoVariableNotFound", 404)
+}
+
+func (o *UpdateRepoVariableNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/user_current_check_subscription_parameters.go b/bots-common/gitea-generated/client/repository/user_current_check_subscription_parameters.go
new file mode 100644
index 0000000..2323f54
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/user_current_check_subscription_parameters.go
@@ -0,0 +1,173 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewUserCurrentCheckSubscriptionParams creates a new UserCurrentCheckSubscriptionParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewUserCurrentCheckSubscriptionParams() *UserCurrentCheckSubscriptionParams {
+	return &UserCurrentCheckSubscriptionParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewUserCurrentCheckSubscriptionParamsWithTimeout creates a new UserCurrentCheckSubscriptionParams object
+// with the ability to set a timeout on a request.
+func NewUserCurrentCheckSubscriptionParamsWithTimeout(timeout time.Duration) *UserCurrentCheckSubscriptionParams {
+	return &UserCurrentCheckSubscriptionParams{
+		timeout: timeout,
+	}
+}
+
+// NewUserCurrentCheckSubscriptionParamsWithContext creates a new UserCurrentCheckSubscriptionParams object
+// with the ability to set a context for a request.
+func NewUserCurrentCheckSubscriptionParamsWithContext(ctx context.Context) *UserCurrentCheckSubscriptionParams {
+	return &UserCurrentCheckSubscriptionParams{
+		Context: ctx,
+	}
+}
+
+// NewUserCurrentCheckSubscriptionParamsWithHTTPClient creates a new UserCurrentCheckSubscriptionParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewUserCurrentCheckSubscriptionParamsWithHTTPClient(client *http.Client) *UserCurrentCheckSubscriptionParams {
+	return &UserCurrentCheckSubscriptionParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+UserCurrentCheckSubscriptionParams contains all the parameters to send to the API endpoint
+
+	for the user current check subscription operation.
+
+	Typically these are written to a http.Request.
+*/
+type UserCurrentCheckSubscriptionParams struct {
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the user current check subscription params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserCurrentCheckSubscriptionParams) WithDefaults() *UserCurrentCheckSubscriptionParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the user current check subscription params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserCurrentCheckSubscriptionParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the user current check subscription params
+func (o *UserCurrentCheckSubscriptionParams) WithTimeout(timeout time.Duration) *UserCurrentCheckSubscriptionParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the user current check subscription params
+func (o *UserCurrentCheckSubscriptionParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the user current check subscription params
+func (o *UserCurrentCheckSubscriptionParams) WithContext(ctx context.Context) *UserCurrentCheckSubscriptionParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the user current check subscription params
+func (o *UserCurrentCheckSubscriptionParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the user current check subscription params
+func (o *UserCurrentCheckSubscriptionParams) WithHTTPClient(client *http.Client) *UserCurrentCheckSubscriptionParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the user current check subscription params
+func (o *UserCurrentCheckSubscriptionParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithOwner adds the owner to the user current check subscription params
+func (o *UserCurrentCheckSubscriptionParams) WithOwner(owner string) *UserCurrentCheckSubscriptionParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the user current check subscription params
+func (o *UserCurrentCheckSubscriptionParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the user current check subscription params
+func (o *UserCurrentCheckSubscriptionParams) WithRepo(repo string) *UserCurrentCheckSubscriptionParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the user current check subscription params
+func (o *UserCurrentCheckSubscriptionParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *UserCurrentCheckSubscriptionParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/user_current_check_subscription_responses.go b/bots-common/gitea-generated/client/repository/user_current_check_subscription_responses.go
new file mode 100644
index 0000000..36fad0c
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/user_current_check_subscription_responses.go
@@ -0,0 +1,168 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// UserCurrentCheckSubscriptionReader is a Reader for the UserCurrentCheckSubscription structure.
+type UserCurrentCheckSubscriptionReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *UserCurrentCheckSubscriptionReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewUserCurrentCheckSubscriptionOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewUserCurrentCheckSubscriptionNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/subscription] userCurrentCheckSubscription", response, response.Code())
+	}
+}
+
+// NewUserCurrentCheckSubscriptionOK creates a UserCurrentCheckSubscriptionOK with default headers values
+func NewUserCurrentCheckSubscriptionOK() *UserCurrentCheckSubscriptionOK {
+	return &UserCurrentCheckSubscriptionOK{}
+}
+
+/*
+UserCurrentCheckSubscriptionOK describes a response with status code 200, with default header values.
+
+WatchInfo
+*/
+type UserCurrentCheckSubscriptionOK struct {
+	Payload *models.WatchInfo
+}
+
+// IsSuccess returns true when this user current check subscription o k response has a 2xx status code
+func (o *UserCurrentCheckSubscriptionOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this user current check subscription o k response has a 3xx status code
+func (o *UserCurrentCheckSubscriptionOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user current check subscription o k response has a 4xx status code
+func (o *UserCurrentCheckSubscriptionOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this user current check subscription o k response has a 5xx status code
+func (o *UserCurrentCheckSubscriptionOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user current check subscription o k response a status code equal to that given
+func (o *UserCurrentCheckSubscriptionOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the user current check subscription o k response
+func (o *UserCurrentCheckSubscriptionOK) Code() int {
+	return 200
+}
+
+func (o *UserCurrentCheckSubscriptionOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/subscription][%d] userCurrentCheckSubscriptionOK %s", 200, payload)
+}
+
+func (o *UserCurrentCheckSubscriptionOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/subscription][%d] userCurrentCheckSubscriptionOK %s", 200, payload)
+}
+
+func (o *UserCurrentCheckSubscriptionOK) GetPayload() *models.WatchInfo {
+	return o.Payload
+}
+
+func (o *UserCurrentCheckSubscriptionOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.WatchInfo)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewUserCurrentCheckSubscriptionNotFound creates a UserCurrentCheckSubscriptionNotFound with default headers values
+func NewUserCurrentCheckSubscriptionNotFound() *UserCurrentCheckSubscriptionNotFound {
+	return &UserCurrentCheckSubscriptionNotFound{}
+}
+
+/*
+UserCurrentCheckSubscriptionNotFound describes a response with status code 404, with default header values.
+
+User is not watching this repo or repo do not exist
+*/
+type UserCurrentCheckSubscriptionNotFound struct {
+}
+
+// IsSuccess returns true when this user current check subscription not found response has a 2xx status code
+func (o *UserCurrentCheckSubscriptionNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this user current check subscription not found response has a 3xx status code
+func (o *UserCurrentCheckSubscriptionNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user current check subscription not found response has a 4xx status code
+func (o *UserCurrentCheckSubscriptionNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this user current check subscription not found response has a 5xx status code
+func (o *UserCurrentCheckSubscriptionNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user current check subscription not found response a status code equal to that given
+func (o *UserCurrentCheckSubscriptionNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the user current check subscription not found response
+func (o *UserCurrentCheckSubscriptionNotFound) Code() int {
+	return 404
+}
+
+func (o *UserCurrentCheckSubscriptionNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/subscription][%d] userCurrentCheckSubscriptionNotFound", 404)
+}
+
+func (o *UserCurrentCheckSubscriptionNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/subscription][%d] userCurrentCheckSubscriptionNotFound", 404)
+}
+
+func (o *UserCurrentCheckSubscriptionNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/user_current_delete_subscription_parameters.go b/bots-common/gitea-generated/client/repository/user_current_delete_subscription_parameters.go
new file mode 100644
index 0000000..c084462
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/user_current_delete_subscription_parameters.go
@@ -0,0 +1,173 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewUserCurrentDeleteSubscriptionParams creates a new UserCurrentDeleteSubscriptionParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewUserCurrentDeleteSubscriptionParams() *UserCurrentDeleteSubscriptionParams {
+	return &UserCurrentDeleteSubscriptionParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewUserCurrentDeleteSubscriptionParamsWithTimeout creates a new UserCurrentDeleteSubscriptionParams object
+// with the ability to set a timeout on a request.
+func NewUserCurrentDeleteSubscriptionParamsWithTimeout(timeout time.Duration) *UserCurrentDeleteSubscriptionParams {
+	return &UserCurrentDeleteSubscriptionParams{
+		timeout: timeout,
+	}
+}
+
+// NewUserCurrentDeleteSubscriptionParamsWithContext creates a new UserCurrentDeleteSubscriptionParams object
+// with the ability to set a context for a request.
+func NewUserCurrentDeleteSubscriptionParamsWithContext(ctx context.Context) *UserCurrentDeleteSubscriptionParams {
+	return &UserCurrentDeleteSubscriptionParams{
+		Context: ctx,
+	}
+}
+
+// NewUserCurrentDeleteSubscriptionParamsWithHTTPClient creates a new UserCurrentDeleteSubscriptionParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewUserCurrentDeleteSubscriptionParamsWithHTTPClient(client *http.Client) *UserCurrentDeleteSubscriptionParams {
+	return &UserCurrentDeleteSubscriptionParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+UserCurrentDeleteSubscriptionParams contains all the parameters to send to the API endpoint
+
+	for the user current delete subscription operation.
+
+	Typically these are written to a http.Request.
+*/
+type UserCurrentDeleteSubscriptionParams struct {
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the user current delete subscription params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserCurrentDeleteSubscriptionParams) WithDefaults() *UserCurrentDeleteSubscriptionParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the user current delete subscription params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserCurrentDeleteSubscriptionParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the user current delete subscription params
+func (o *UserCurrentDeleteSubscriptionParams) WithTimeout(timeout time.Duration) *UserCurrentDeleteSubscriptionParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the user current delete subscription params
+func (o *UserCurrentDeleteSubscriptionParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the user current delete subscription params
+func (o *UserCurrentDeleteSubscriptionParams) WithContext(ctx context.Context) *UserCurrentDeleteSubscriptionParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the user current delete subscription params
+func (o *UserCurrentDeleteSubscriptionParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the user current delete subscription params
+func (o *UserCurrentDeleteSubscriptionParams) WithHTTPClient(client *http.Client) *UserCurrentDeleteSubscriptionParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the user current delete subscription params
+func (o *UserCurrentDeleteSubscriptionParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithOwner adds the owner to the user current delete subscription params
+func (o *UserCurrentDeleteSubscriptionParams) WithOwner(owner string) *UserCurrentDeleteSubscriptionParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the user current delete subscription params
+func (o *UserCurrentDeleteSubscriptionParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the user current delete subscription params
+func (o *UserCurrentDeleteSubscriptionParams) WithRepo(repo string) *UserCurrentDeleteSubscriptionParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the user current delete subscription params
+func (o *UserCurrentDeleteSubscriptionParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *UserCurrentDeleteSubscriptionParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/user_current_delete_subscription_responses.go b/bots-common/gitea-generated/client/repository/user_current_delete_subscription_responses.go
new file mode 100644
index 0000000..24f5090
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/user_current_delete_subscription_responses.go
@@ -0,0 +1,150 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// UserCurrentDeleteSubscriptionReader is a Reader for the UserCurrentDeleteSubscription structure.
+type UserCurrentDeleteSubscriptionReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *UserCurrentDeleteSubscriptionReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewUserCurrentDeleteSubscriptionNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewUserCurrentDeleteSubscriptionNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[DELETE /repos/{owner}/{repo}/subscription] userCurrentDeleteSubscription", response, response.Code())
+	}
+}
+
+// NewUserCurrentDeleteSubscriptionNoContent creates a UserCurrentDeleteSubscriptionNoContent with default headers values
+func NewUserCurrentDeleteSubscriptionNoContent() *UserCurrentDeleteSubscriptionNoContent {
+	return &UserCurrentDeleteSubscriptionNoContent{}
+}
+
+/*
+UserCurrentDeleteSubscriptionNoContent describes a response with status code 204, with default header values.
+
+APIEmpty is an empty response
+*/
+type UserCurrentDeleteSubscriptionNoContent struct {
+}
+
+// IsSuccess returns true when this user current delete subscription no content response has a 2xx status code
+func (o *UserCurrentDeleteSubscriptionNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this user current delete subscription no content response has a 3xx status code
+func (o *UserCurrentDeleteSubscriptionNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user current delete subscription no content response has a 4xx status code
+func (o *UserCurrentDeleteSubscriptionNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this user current delete subscription no content response has a 5xx status code
+func (o *UserCurrentDeleteSubscriptionNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user current delete subscription no content response a status code equal to that given
+func (o *UserCurrentDeleteSubscriptionNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the user current delete subscription no content response
+func (o *UserCurrentDeleteSubscriptionNoContent) Code() int {
+	return 204
+}
+
+func (o *UserCurrentDeleteSubscriptionNoContent) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/subscription][%d] userCurrentDeleteSubscriptionNoContent", 204)
+}
+
+func (o *UserCurrentDeleteSubscriptionNoContent) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/subscription][%d] userCurrentDeleteSubscriptionNoContent", 204)
+}
+
+func (o *UserCurrentDeleteSubscriptionNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewUserCurrentDeleteSubscriptionNotFound creates a UserCurrentDeleteSubscriptionNotFound with default headers values
+func NewUserCurrentDeleteSubscriptionNotFound() *UserCurrentDeleteSubscriptionNotFound {
+	return &UserCurrentDeleteSubscriptionNotFound{}
+}
+
+/*
+UserCurrentDeleteSubscriptionNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type UserCurrentDeleteSubscriptionNotFound struct {
+}
+
+// IsSuccess returns true when this user current delete subscription not found response has a 2xx status code
+func (o *UserCurrentDeleteSubscriptionNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this user current delete subscription not found response has a 3xx status code
+func (o *UserCurrentDeleteSubscriptionNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user current delete subscription not found response has a 4xx status code
+func (o *UserCurrentDeleteSubscriptionNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this user current delete subscription not found response has a 5xx status code
+func (o *UserCurrentDeleteSubscriptionNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user current delete subscription not found response a status code equal to that given
+func (o *UserCurrentDeleteSubscriptionNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the user current delete subscription not found response
+func (o *UserCurrentDeleteSubscriptionNotFound) Code() int {
+	return 404
+}
+
+func (o *UserCurrentDeleteSubscriptionNotFound) Error() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/subscription][%d] userCurrentDeleteSubscriptionNotFound", 404)
+}
+
+func (o *UserCurrentDeleteSubscriptionNotFound) String() string {
+	return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/subscription][%d] userCurrentDeleteSubscriptionNotFound", 404)
+}
+
+func (o *UserCurrentDeleteSubscriptionNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/user_current_put_subscription_parameters.go b/bots-common/gitea-generated/client/repository/user_current_put_subscription_parameters.go
new file mode 100644
index 0000000..c41f033
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/user_current_put_subscription_parameters.go
@@ -0,0 +1,173 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewUserCurrentPutSubscriptionParams creates a new UserCurrentPutSubscriptionParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewUserCurrentPutSubscriptionParams() *UserCurrentPutSubscriptionParams {
+	return &UserCurrentPutSubscriptionParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewUserCurrentPutSubscriptionParamsWithTimeout creates a new UserCurrentPutSubscriptionParams object
+// with the ability to set a timeout on a request.
+func NewUserCurrentPutSubscriptionParamsWithTimeout(timeout time.Duration) *UserCurrentPutSubscriptionParams {
+	return &UserCurrentPutSubscriptionParams{
+		timeout: timeout,
+	}
+}
+
+// NewUserCurrentPutSubscriptionParamsWithContext creates a new UserCurrentPutSubscriptionParams object
+// with the ability to set a context for a request.
+func NewUserCurrentPutSubscriptionParamsWithContext(ctx context.Context) *UserCurrentPutSubscriptionParams {
+	return &UserCurrentPutSubscriptionParams{
+		Context: ctx,
+	}
+}
+
+// NewUserCurrentPutSubscriptionParamsWithHTTPClient creates a new UserCurrentPutSubscriptionParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewUserCurrentPutSubscriptionParamsWithHTTPClient(client *http.Client) *UserCurrentPutSubscriptionParams {
+	return &UserCurrentPutSubscriptionParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+UserCurrentPutSubscriptionParams contains all the parameters to send to the API endpoint
+
+	for the user current put subscription operation.
+
+	Typically these are written to a http.Request.
+*/
+type UserCurrentPutSubscriptionParams struct {
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the user current put subscription params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserCurrentPutSubscriptionParams) WithDefaults() *UserCurrentPutSubscriptionParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the user current put subscription params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserCurrentPutSubscriptionParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the user current put subscription params
+func (o *UserCurrentPutSubscriptionParams) WithTimeout(timeout time.Duration) *UserCurrentPutSubscriptionParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the user current put subscription params
+func (o *UserCurrentPutSubscriptionParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the user current put subscription params
+func (o *UserCurrentPutSubscriptionParams) WithContext(ctx context.Context) *UserCurrentPutSubscriptionParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the user current put subscription params
+func (o *UserCurrentPutSubscriptionParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the user current put subscription params
+func (o *UserCurrentPutSubscriptionParams) WithHTTPClient(client *http.Client) *UserCurrentPutSubscriptionParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the user current put subscription params
+func (o *UserCurrentPutSubscriptionParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithOwner adds the owner to the user current put subscription params
+func (o *UserCurrentPutSubscriptionParams) WithOwner(owner string) *UserCurrentPutSubscriptionParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the user current put subscription params
+func (o *UserCurrentPutSubscriptionParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the user current put subscription params
+func (o *UserCurrentPutSubscriptionParams) WithRepo(repo string) *UserCurrentPutSubscriptionParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the user current put subscription params
+func (o *UserCurrentPutSubscriptionParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *UserCurrentPutSubscriptionParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/user_current_put_subscription_responses.go b/bots-common/gitea-generated/client/repository/user_current_put_subscription_responses.go
new file mode 100644
index 0000000..9c2e699
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/user_current_put_subscription_responses.go
@@ -0,0 +1,246 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// UserCurrentPutSubscriptionReader is a Reader for the UserCurrentPutSubscription structure.
+type UserCurrentPutSubscriptionReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *UserCurrentPutSubscriptionReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewUserCurrentPutSubscriptionOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 403:
+		result := NewUserCurrentPutSubscriptionForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewUserCurrentPutSubscriptionNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[PUT /repos/{owner}/{repo}/subscription] userCurrentPutSubscription", response, response.Code())
+	}
+}
+
+// NewUserCurrentPutSubscriptionOK creates a UserCurrentPutSubscriptionOK with default headers values
+func NewUserCurrentPutSubscriptionOK() *UserCurrentPutSubscriptionOK {
+	return &UserCurrentPutSubscriptionOK{}
+}
+
+/*
+UserCurrentPutSubscriptionOK describes a response with status code 200, with default header values.
+
+WatchInfo
+*/
+type UserCurrentPutSubscriptionOK struct {
+	Payload *models.WatchInfo
+}
+
+// IsSuccess returns true when this user current put subscription o k response has a 2xx status code
+func (o *UserCurrentPutSubscriptionOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this user current put subscription o k response has a 3xx status code
+func (o *UserCurrentPutSubscriptionOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user current put subscription o k response has a 4xx status code
+func (o *UserCurrentPutSubscriptionOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this user current put subscription o k response has a 5xx status code
+func (o *UserCurrentPutSubscriptionOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user current put subscription o k response a status code equal to that given
+func (o *UserCurrentPutSubscriptionOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the user current put subscription o k response
+func (o *UserCurrentPutSubscriptionOK) Code() int {
+	return 200
+}
+
+func (o *UserCurrentPutSubscriptionOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[PUT /repos/{owner}/{repo}/subscription][%d] userCurrentPutSubscriptionOK %s", 200, payload)
+}
+
+func (o *UserCurrentPutSubscriptionOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[PUT /repos/{owner}/{repo}/subscription][%d] userCurrentPutSubscriptionOK %s", 200, payload)
+}
+
+func (o *UserCurrentPutSubscriptionOK) GetPayload() *models.WatchInfo {
+	return o.Payload
+}
+
+func (o *UserCurrentPutSubscriptionOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.WatchInfo)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewUserCurrentPutSubscriptionForbidden creates a UserCurrentPutSubscriptionForbidden with default headers values
+func NewUserCurrentPutSubscriptionForbidden() *UserCurrentPutSubscriptionForbidden {
+	return &UserCurrentPutSubscriptionForbidden{}
+}
+
+/*
+UserCurrentPutSubscriptionForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type UserCurrentPutSubscriptionForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this user current put subscription forbidden response has a 2xx status code
+func (o *UserCurrentPutSubscriptionForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this user current put subscription forbidden response has a 3xx status code
+func (o *UserCurrentPutSubscriptionForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user current put subscription forbidden response has a 4xx status code
+func (o *UserCurrentPutSubscriptionForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this user current put subscription forbidden response has a 5xx status code
+func (o *UserCurrentPutSubscriptionForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user current put subscription forbidden response a status code equal to that given
+func (o *UserCurrentPutSubscriptionForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the user current put subscription forbidden response
+func (o *UserCurrentPutSubscriptionForbidden) Code() int {
+	return 403
+}
+
+func (o *UserCurrentPutSubscriptionForbidden) Error() string {
+	return fmt.Sprintf("[PUT /repos/{owner}/{repo}/subscription][%d] userCurrentPutSubscriptionForbidden", 403)
+}
+
+func (o *UserCurrentPutSubscriptionForbidden) String() string {
+	return fmt.Sprintf("[PUT /repos/{owner}/{repo}/subscription][%d] userCurrentPutSubscriptionForbidden", 403)
+}
+
+func (o *UserCurrentPutSubscriptionForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewUserCurrentPutSubscriptionNotFound creates a UserCurrentPutSubscriptionNotFound with default headers values
+func NewUserCurrentPutSubscriptionNotFound() *UserCurrentPutSubscriptionNotFound {
+	return &UserCurrentPutSubscriptionNotFound{}
+}
+
+/*
+UserCurrentPutSubscriptionNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type UserCurrentPutSubscriptionNotFound struct {
+}
+
+// IsSuccess returns true when this user current put subscription not found response has a 2xx status code
+func (o *UserCurrentPutSubscriptionNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this user current put subscription not found response has a 3xx status code
+func (o *UserCurrentPutSubscriptionNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user current put subscription not found response has a 4xx status code
+func (o *UserCurrentPutSubscriptionNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this user current put subscription not found response has a 5xx status code
+func (o *UserCurrentPutSubscriptionNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user current put subscription not found response a status code equal to that given
+func (o *UserCurrentPutSubscriptionNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the user current put subscription not found response
+func (o *UserCurrentPutSubscriptionNotFound) Code() int {
+	return 404
+}
+
+func (o *UserCurrentPutSubscriptionNotFound) Error() string {
+	return fmt.Sprintf("[PUT /repos/{owner}/{repo}/subscription][%d] userCurrentPutSubscriptionNotFound", 404)
+}
+
+func (o *UserCurrentPutSubscriptionNotFound) String() string {
+	return fmt.Sprintf("[PUT /repos/{owner}/{repo}/subscription][%d] userCurrentPutSubscriptionNotFound", 404)
+}
+
+func (o *UserCurrentPutSubscriptionNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/user_tracked_times_parameters.go b/bots-common/gitea-generated/client/repository/user_tracked_times_parameters.go
new file mode 100644
index 0000000..1520b99
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/user_tracked_times_parameters.go
@@ -0,0 +1,195 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewUserTrackedTimesParams creates a new UserTrackedTimesParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewUserTrackedTimesParams() *UserTrackedTimesParams {
+	return &UserTrackedTimesParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewUserTrackedTimesParamsWithTimeout creates a new UserTrackedTimesParams object
+// with the ability to set a timeout on a request.
+func NewUserTrackedTimesParamsWithTimeout(timeout time.Duration) *UserTrackedTimesParams {
+	return &UserTrackedTimesParams{
+		timeout: timeout,
+	}
+}
+
+// NewUserTrackedTimesParamsWithContext creates a new UserTrackedTimesParams object
+// with the ability to set a context for a request.
+func NewUserTrackedTimesParamsWithContext(ctx context.Context) *UserTrackedTimesParams {
+	return &UserTrackedTimesParams{
+		Context: ctx,
+	}
+}
+
+// NewUserTrackedTimesParamsWithHTTPClient creates a new UserTrackedTimesParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewUserTrackedTimesParamsWithHTTPClient(client *http.Client) *UserTrackedTimesParams {
+	return &UserTrackedTimesParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+UserTrackedTimesParams contains all the parameters to send to the API endpoint
+
+	for the user tracked times operation.
+
+	Typically these are written to a http.Request.
+*/
+type UserTrackedTimesParams struct {
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	/* User.
+
+	   username of user
+	*/
+	User string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the user tracked times params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserTrackedTimesParams) WithDefaults() *UserTrackedTimesParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the user tracked times params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserTrackedTimesParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the user tracked times params
+func (o *UserTrackedTimesParams) WithTimeout(timeout time.Duration) *UserTrackedTimesParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the user tracked times params
+func (o *UserTrackedTimesParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the user tracked times params
+func (o *UserTrackedTimesParams) WithContext(ctx context.Context) *UserTrackedTimesParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the user tracked times params
+func (o *UserTrackedTimesParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the user tracked times params
+func (o *UserTrackedTimesParams) WithHTTPClient(client *http.Client) *UserTrackedTimesParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the user tracked times params
+func (o *UserTrackedTimesParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithOwner adds the owner to the user tracked times params
+func (o *UserTrackedTimesParams) WithOwner(owner string) *UserTrackedTimesParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the user tracked times params
+func (o *UserTrackedTimesParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the user tracked times params
+func (o *UserTrackedTimesParams) WithRepo(repo string) *UserTrackedTimesParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the user tracked times params
+func (o *UserTrackedTimesParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WithUser adds the user to the user tracked times params
+func (o *UserTrackedTimesParams) WithUser(user string) *UserTrackedTimesParams {
+	o.SetUser(user)
+	return o
+}
+
+// SetUser adds the user to the user tracked times params
+func (o *UserTrackedTimesParams) SetUser(user string) {
+	o.User = user
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *UserTrackedTimesParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	// path param user
+	if err := r.SetPathParam("user", o.User); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/repository/user_tracked_times_responses.go b/bots-common/gitea-generated/client/repository/user_tracked_times_responses.go
new file mode 100644
index 0000000..cf32ea1
--- /dev/null
+++ b/bots-common/gitea-generated/client/repository/user_tracked_times_responses.go
@@ -0,0 +1,322 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package repository
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// UserTrackedTimesReader is a Reader for the UserTrackedTimes structure.
+type UserTrackedTimesReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *UserTrackedTimesReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewUserTrackedTimesOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 400:
+		result := NewUserTrackedTimesBadRequest()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 403:
+		result := NewUserTrackedTimesForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewUserTrackedTimesNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/times/{user}] userTrackedTimes", response, response.Code())
+	}
+}
+
+// NewUserTrackedTimesOK creates a UserTrackedTimesOK with default headers values
+func NewUserTrackedTimesOK() *UserTrackedTimesOK {
+	return &UserTrackedTimesOK{}
+}
+
+/*
+UserTrackedTimesOK describes a response with status code 200, with default header values.
+
+TrackedTimeList
+*/
+type UserTrackedTimesOK struct {
+	Payload []*models.TrackedTime
+}
+
+// IsSuccess returns true when this user tracked times o k response has a 2xx status code
+func (o *UserTrackedTimesOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this user tracked times o k response has a 3xx status code
+func (o *UserTrackedTimesOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user tracked times o k response has a 4xx status code
+func (o *UserTrackedTimesOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this user tracked times o k response has a 5xx status code
+func (o *UserTrackedTimesOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user tracked times o k response a status code equal to that given
+func (o *UserTrackedTimesOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the user tracked times o k response
+func (o *UserTrackedTimesOK) Code() int {
+	return 200
+}
+
+func (o *UserTrackedTimesOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/times/{user}][%d] userTrackedTimesOK %s", 200, payload)
+}
+
+func (o *UserTrackedTimesOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/times/{user}][%d] userTrackedTimesOK %s", 200, payload)
+}
+
+func (o *UserTrackedTimesOK) GetPayload() []*models.TrackedTime {
+	return o.Payload
+}
+
+func (o *UserTrackedTimesOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewUserTrackedTimesBadRequest creates a UserTrackedTimesBadRequest with default headers values
+func NewUserTrackedTimesBadRequest() *UserTrackedTimesBadRequest {
+	return &UserTrackedTimesBadRequest{}
+}
+
+/*
+UserTrackedTimesBadRequest describes a response with status code 400, with default header values.
+
+APIError is error format response
+*/
+type UserTrackedTimesBadRequest struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this user tracked times bad request response has a 2xx status code
+func (o *UserTrackedTimesBadRequest) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this user tracked times bad request response has a 3xx status code
+func (o *UserTrackedTimesBadRequest) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user tracked times bad request response has a 4xx status code
+func (o *UserTrackedTimesBadRequest) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this user tracked times bad request response has a 5xx status code
+func (o *UserTrackedTimesBadRequest) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user tracked times bad request response a status code equal to that given
+func (o *UserTrackedTimesBadRequest) IsCode(code int) bool {
+	return code == 400
+}
+
+// Code gets the status code for the user tracked times bad request response
+func (o *UserTrackedTimesBadRequest) Code() int {
+	return 400
+}
+
+func (o *UserTrackedTimesBadRequest) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/times/{user}][%d] userTrackedTimesBadRequest", 400)
+}
+
+func (o *UserTrackedTimesBadRequest) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/times/{user}][%d] userTrackedTimesBadRequest", 400)
+}
+
+func (o *UserTrackedTimesBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewUserTrackedTimesForbidden creates a UserTrackedTimesForbidden with default headers values
+func NewUserTrackedTimesForbidden() *UserTrackedTimesForbidden {
+	return &UserTrackedTimesForbidden{}
+}
+
+/*
+UserTrackedTimesForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type UserTrackedTimesForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this user tracked times forbidden response has a 2xx status code
+func (o *UserTrackedTimesForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this user tracked times forbidden response has a 3xx status code
+func (o *UserTrackedTimesForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user tracked times forbidden response has a 4xx status code
+func (o *UserTrackedTimesForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this user tracked times forbidden response has a 5xx status code
+func (o *UserTrackedTimesForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user tracked times forbidden response a status code equal to that given
+func (o *UserTrackedTimesForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the user tracked times forbidden response
+func (o *UserTrackedTimesForbidden) Code() int {
+	return 403
+}
+
+func (o *UserTrackedTimesForbidden) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/times/{user}][%d] userTrackedTimesForbidden", 403)
+}
+
+func (o *UserTrackedTimesForbidden) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/times/{user}][%d] userTrackedTimesForbidden", 403)
+}
+
+func (o *UserTrackedTimesForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewUserTrackedTimesNotFound creates a UserTrackedTimesNotFound with default headers values
+func NewUserTrackedTimesNotFound() *UserTrackedTimesNotFound {
+	return &UserTrackedTimesNotFound{}
+}
+
+/*
+UserTrackedTimesNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type UserTrackedTimesNotFound struct {
+}
+
+// IsSuccess returns true when this user tracked times not found response has a 2xx status code
+func (o *UserTrackedTimesNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this user tracked times not found response has a 3xx status code
+func (o *UserTrackedTimesNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user tracked times not found response has a 4xx status code
+func (o *UserTrackedTimesNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this user tracked times not found response has a 5xx status code
+func (o *UserTrackedTimesNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user tracked times not found response a status code equal to that given
+func (o *UserTrackedTimesNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the user tracked times not found response
+func (o *UserTrackedTimesNotFound) Code() int {
+	return 404
+}
+
+func (o *UserTrackedTimesNotFound) Error() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/times/{user}][%d] userTrackedTimesNotFound", 404)
+}
+
+func (o *UserTrackedTimesNotFound) String() string {
+	return fmt.Sprintf("[GET /repos/{owner}/{repo}/times/{user}][%d] userTrackedTimesNotFound", 404)
+}
+
+func (o *UserTrackedTimesNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/settings/get_general_api_settings_parameters.go b/bots-common/gitea-generated/client/settings/get_general_api_settings_parameters.go
new file mode 100644
index 0000000..f3de0af
--- /dev/null
+++ b/bots-common/gitea-generated/client/settings/get_general_api_settings_parameters.go
@@ -0,0 +1,128 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package settings
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewGetGeneralAPISettingsParams creates a new GetGeneralAPISettingsParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewGetGeneralAPISettingsParams() *GetGeneralAPISettingsParams {
+	return &GetGeneralAPISettingsParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewGetGeneralAPISettingsParamsWithTimeout creates a new GetGeneralAPISettingsParams object
+// with the ability to set a timeout on a request.
+func NewGetGeneralAPISettingsParamsWithTimeout(timeout time.Duration) *GetGeneralAPISettingsParams {
+	return &GetGeneralAPISettingsParams{
+		timeout: timeout,
+	}
+}
+
+// NewGetGeneralAPISettingsParamsWithContext creates a new GetGeneralAPISettingsParams object
+// with the ability to set a context for a request.
+func NewGetGeneralAPISettingsParamsWithContext(ctx context.Context) *GetGeneralAPISettingsParams {
+	return &GetGeneralAPISettingsParams{
+		Context: ctx,
+	}
+}
+
+// NewGetGeneralAPISettingsParamsWithHTTPClient creates a new GetGeneralAPISettingsParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewGetGeneralAPISettingsParamsWithHTTPClient(client *http.Client) *GetGeneralAPISettingsParams {
+	return &GetGeneralAPISettingsParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+GetGeneralAPISettingsParams contains all the parameters to send to the API endpoint
+
+	for the get general API settings operation.
+
+	Typically these are written to a http.Request.
+*/
+type GetGeneralAPISettingsParams struct {
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the get general API settings params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *GetGeneralAPISettingsParams) WithDefaults() *GetGeneralAPISettingsParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the get general API settings params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *GetGeneralAPISettingsParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the get general API settings params
+func (o *GetGeneralAPISettingsParams) WithTimeout(timeout time.Duration) *GetGeneralAPISettingsParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the get general API settings params
+func (o *GetGeneralAPISettingsParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the get general API settings params
+func (o *GetGeneralAPISettingsParams) WithContext(ctx context.Context) *GetGeneralAPISettingsParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the get general API settings params
+func (o *GetGeneralAPISettingsParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the get general API settings params
+func (o *GetGeneralAPISettingsParams) WithHTTPClient(client *http.Client) *GetGeneralAPISettingsParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the get general API settings params
+func (o *GetGeneralAPISettingsParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *GetGeneralAPISettingsParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/settings/get_general_api_settings_responses.go b/bots-common/gitea-generated/client/settings/get_general_api_settings_responses.go
new file mode 100644
index 0000000..4c1fe25
--- /dev/null
+++ b/bots-common/gitea-generated/client/settings/get_general_api_settings_responses.go
@@ -0,0 +1,106 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package settings
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// GetGeneralAPISettingsReader is a Reader for the GetGeneralAPISettings structure.
+type GetGeneralAPISettingsReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *GetGeneralAPISettingsReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewGetGeneralAPISettingsOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	default:
+		return nil, runtime.NewAPIError("[GET /settings/api] getGeneralAPISettings", response, response.Code())
+	}
+}
+
+// NewGetGeneralAPISettingsOK creates a GetGeneralAPISettingsOK with default headers values
+func NewGetGeneralAPISettingsOK() *GetGeneralAPISettingsOK {
+	return &GetGeneralAPISettingsOK{}
+}
+
+/*
+GetGeneralAPISettingsOK describes a response with status code 200, with default header values.
+
+GeneralAPISettings
+*/
+type GetGeneralAPISettingsOK struct {
+	Payload *models.GeneralAPISettings
+}
+
+// IsSuccess returns true when this get general Api settings o k response has a 2xx status code
+func (o *GetGeneralAPISettingsOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this get general Api settings o k response has a 3xx status code
+func (o *GetGeneralAPISettingsOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this get general Api settings o k response has a 4xx status code
+func (o *GetGeneralAPISettingsOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this get general Api settings o k response has a 5xx status code
+func (o *GetGeneralAPISettingsOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this get general Api settings o k response a status code equal to that given
+func (o *GetGeneralAPISettingsOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the get general Api settings o k response
+func (o *GetGeneralAPISettingsOK) Code() int {
+	return 200
+}
+
+func (o *GetGeneralAPISettingsOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /settings/api][%d] getGeneralApiSettingsOK %s", 200, payload)
+}
+
+func (o *GetGeneralAPISettingsOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /settings/api][%d] getGeneralApiSettingsOK %s", 200, payload)
+}
+
+func (o *GetGeneralAPISettingsOK) GetPayload() *models.GeneralAPISettings {
+	return o.Payload
+}
+
+func (o *GetGeneralAPISettingsOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.GeneralAPISettings)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/settings/get_general_attachment_settings_parameters.go b/bots-common/gitea-generated/client/settings/get_general_attachment_settings_parameters.go
new file mode 100644
index 0000000..e181c73
--- /dev/null
+++ b/bots-common/gitea-generated/client/settings/get_general_attachment_settings_parameters.go
@@ -0,0 +1,128 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package settings
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewGetGeneralAttachmentSettingsParams creates a new GetGeneralAttachmentSettingsParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewGetGeneralAttachmentSettingsParams() *GetGeneralAttachmentSettingsParams {
+	return &GetGeneralAttachmentSettingsParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewGetGeneralAttachmentSettingsParamsWithTimeout creates a new GetGeneralAttachmentSettingsParams object
+// with the ability to set a timeout on a request.
+func NewGetGeneralAttachmentSettingsParamsWithTimeout(timeout time.Duration) *GetGeneralAttachmentSettingsParams {
+	return &GetGeneralAttachmentSettingsParams{
+		timeout: timeout,
+	}
+}
+
+// NewGetGeneralAttachmentSettingsParamsWithContext creates a new GetGeneralAttachmentSettingsParams object
+// with the ability to set a context for a request.
+func NewGetGeneralAttachmentSettingsParamsWithContext(ctx context.Context) *GetGeneralAttachmentSettingsParams {
+	return &GetGeneralAttachmentSettingsParams{
+		Context: ctx,
+	}
+}
+
+// NewGetGeneralAttachmentSettingsParamsWithHTTPClient creates a new GetGeneralAttachmentSettingsParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewGetGeneralAttachmentSettingsParamsWithHTTPClient(client *http.Client) *GetGeneralAttachmentSettingsParams {
+	return &GetGeneralAttachmentSettingsParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+GetGeneralAttachmentSettingsParams contains all the parameters to send to the API endpoint
+
+	for the get general attachment settings operation.
+
+	Typically these are written to a http.Request.
+*/
+type GetGeneralAttachmentSettingsParams struct {
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the get general attachment settings params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *GetGeneralAttachmentSettingsParams) WithDefaults() *GetGeneralAttachmentSettingsParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the get general attachment settings params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *GetGeneralAttachmentSettingsParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the get general attachment settings params
+func (o *GetGeneralAttachmentSettingsParams) WithTimeout(timeout time.Duration) *GetGeneralAttachmentSettingsParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the get general attachment settings params
+func (o *GetGeneralAttachmentSettingsParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the get general attachment settings params
+func (o *GetGeneralAttachmentSettingsParams) WithContext(ctx context.Context) *GetGeneralAttachmentSettingsParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the get general attachment settings params
+func (o *GetGeneralAttachmentSettingsParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the get general attachment settings params
+func (o *GetGeneralAttachmentSettingsParams) WithHTTPClient(client *http.Client) *GetGeneralAttachmentSettingsParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the get general attachment settings params
+func (o *GetGeneralAttachmentSettingsParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *GetGeneralAttachmentSettingsParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/settings/get_general_attachment_settings_responses.go b/bots-common/gitea-generated/client/settings/get_general_attachment_settings_responses.go
new file mode 100644
index 0000000..4673500
--- /dev/null
+++ b/bots-common/gitea-generated/client/settings/get_general_attachment_settings_responses.go
@@ -0,0 +1,106 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package settings
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// GetGeneralAttachmentSettingsReader is a Reader for the GetGeneralAttachmentSettings structure.
+type GetGeneralAttachmentSettingsReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *GetGeneralAttachmentSettingsReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewGetGeneralAttachmentSettingsOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	default:
+		return nil, runtime.NewAPIError("[GET /settings/attachment] getGeneralAttachmentSettings", response, response.Code())
+	}
+}
+
+// NewGetGeneralAttachmentSettingsOK creates a GetGeneralAttachmentSettingsOK with default headers values
+func NewGetGeneralAttachmentSettingsOK() *GetGeneralAttachmentSettingsOK {
+	return &GetGeneralAttachmentSettingsOK{}
+}
+
+/*
+GetGeneralAttachmentSettingsOK describes a response with status code 200, with default header values.
+
+GeneralAttachmentSettings
+*/
+type GetGeneralAttachmentSettingsOK struct {
+	Payload *models.GeneralAttachmentSettings
+}
+
+// IsSuccess returns true when this get general attachment settings o k response has a 2xx status code
+func (o *GetGeneralAttachmentSettingsOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this get general attachment settings o k response has a 3xx status code
+func (o *GetGeneralAttachmentSettingsOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this get general attachment settings o k response has a 4xx status code
+func (o *GetGeneralAttachmentSettingsOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this get general attachment settings o k response has a 5xx status code
+func (o *GetGeneralAttachmentSettingsOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this get general attachment settings o k response a status code equal to that given
+func (o *GetGeneralAttachmentSettingsOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the get general attachment settings o k response
+func (o *GetGeneralAttachmentSettingsOK) Code() int {
+	return 200
+}
+
+func (o *GetGeneralAttachmentSettingsOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /settings/attachment][%d] getGeneralAttachmentSettingsOK %s", 200, payload)
+}
+
+func (o *GetGeneralAttachmentSettingsOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /settings/attachment][%d] getGeneralAttachmentSettingsOK %s", 200, payload)
+}
+
+func (o *GetGeneralAttachmentSettingsOK) GetPayload() *models.GeneralAttachmentSettings {
+	return o.Payload
+}
+
+func (o *GetGeneralAttachmentSettingsOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.GeneralAttachmentSettings)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/settings/get_general_repository_settings_parameters.go b/bots-common/gitea-generated/client/settings/get_general_repository_settings_parameters.go
new file mode 100644
index 0000000..fc2d91e
--- /dev/null
+++ b/bots-common/gitea-generated/client/settings/get_general_repository_settings_parameters.go
@@ -0,0 +1,128 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package settings
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewGetGeneralRepositorySettingsParams creates a new GetGeneralRepositorySettingsParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewGetGeneralRepositorySettingsParams() *GetGeneralRepositorySettingsParams {
+	return &GetGeneralRepositorySettingsParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewGetGeneralRepositorySettingsParamsWithTimeout creates a new GetGeneralRepositorySettingsParams object
+// with the ability to set a timeout on a request.
+func NewGetGeneralRepositorySettingsParamsWithTimeout(timeout time.Duration) *GetGeneralRepositorySettingsParams {
+	return &GetGeneralRepositorySettingsParams{
+		timeout: timeout,
+	}
+}
+
+// NewGetGeneralRepositorySettingsParamsWithContext creates a new GetGeneralRepositorySettingsParams object
+// with the ability to set a context for a request.
+func NewGetGeneralRepositorySettingsParamsWithContext(ctx context.Context) *GetGeneralRepositorySettingsParams {
+	return &GetGeneralRepositorySettingsParams{
+		Context: ctx,
+	}
+}
+
+// NewGetGeneralRepositorySettingsParamsWithHTTPClient creates a new GetGeneralRepositorySettingsParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewGetGeneralRepositorySettingsParamsWithHTTPClient(client *http.Client) *GetGeneralRepositorySettingsParams {
+	return &GetGeneralRepositorySettingsParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+GetGeneralRepositorySettingsParams contains all the parameters to send to the API endpoint
+
+	for the get general repository settings operation.
+
+	Typically these are written to a http.Request.
+*/
+type GetGeneralRepositorySettingsParams struct {
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the get general repository settings params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *GetGeneralRepositorySettingsParams) WithDefaults() *GetGeneralRepositorySettingsParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the get general repository settings params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *GetGeneralRepositorySettingsParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the get general repository settings params
+func (o *GetGeneralRepositorySettingsParams) WithTimeout(timeout time.Duration) *GetGeneralRepositorySettingsParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the get general repository settings params
+func (o *GetGeneralRepositorySettingsParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the get general repository settings params
+func (o *GetGeneralRepositorySettingsParams) WithContext(ctx context.Context) *GetGeneralRepositorySettingsParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the get general repository settings params
+func (o *GetGeneralRepositorySettingsParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the get general repository settings params
+func (o *GetGeneralRepositorySettingsParams) WithHTTPClient(client *http.Client) *GetGeneralRepositorySettingsParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the get general repository settings params
+func (o *GetGeneralRepositorySettingsParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *GetGeneralRepositorySettingsParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/settings/get_general_repository_settings_responses.go b/bots-common/gitea-generated/client/settings/get_general_repository_settings_responses.go
new file mode 100644
index 0000000..691e186
--- /dev/null
+++ b/bots-common/gitea-generated/client/settings/get_general_repository_settings_responses.go
@@ -0,0 +1,106 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package settings
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// GetGeneralRepositorySettingsReader is a Reader for the GetGeneralRepositorySettings structure.
+type GetGeneralRepositorySettingsReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *GetGeneralRepositorySettingsReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewGetGeneralRepositorySettingsOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	default:
+		return nil, runtime.NewAPIError("[GET /settings/repository] getGeneralRepositorySettings", response, response.Code())
+	}
+}
+
+// NewGetGeneralRepositorySettingsOK creates a GetGeneralRepositorySettingsOK with default headers values
+func NewGetGeneralRepositorySettingsOK() *GetGeneralRepositorySettingsOK {
+	return &GetGeneralRepositorySettingsOK{}
+}
+
+/*
+GetGeneralRepositorySettingsOK describes a response with status code 200, with default header values.
+
+GeneralRepoSettings
+*/
+type GetGeneralRepositorySettingsOK struct {
+	Payload *models.GeneralRepoSettings
+}
+
+// IsSuccess returns true when this get general repository settings o k response has a 2xx status code
+func (o *GetGeneralRepositorySettingsOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this get general repository settings o k response has a 3xx status code
+func (o *GetGeneralRepositorySettingsOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this get general repository settings o k response has a 4xx status code
+func (o *GetGeneralRepositorySettingsOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this get general repository settings o k response has a 5xx status code
+func (o *GetGeneralRepositorySettingsOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this get general repository settings o k response a status code equal to that given
+func (o *GetGeneralRepositorySettingsOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the get general repository settings o k response
+func (o *GetGeneralRepositorySettingsOK) Code() int {
+	return 200
+}
+
+func (o *GetGeneralRepositorySettingsOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /settings/repository][%d] getGeneralRepositorySettingsOK %s", 200, payload)
+}
+
+func (o *GetGeneralRepositorySettingsOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /settings/repository][%d] getGeneralRepositorySettingsOK %s", 200, payload)
+}
+
+func (o *GetGeneralRepositorySettingsOK) GetPayload() *models.GeneralRepoSettings {
+	return o.Payload
+}
+
+func (o *GetGeneralRepositorySettingsOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.GeneralRepoSettings)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/settings/get_general_ui_settings_parameters.go b/bots-common/gitea-generated/client/settings/get_general_ui_settings_parameters.go
new file mode 100644
index 0000000..187e527
--- /dev/null
+++ b/bots-common/gitea-generated/client/settings/get_general_ui_settings_parameters.go
@@ -0,0 +1,128 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package settings
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewGetGeneralUISettingsParams creates a new GetGeneralUISettingsParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewGetGeneralUISettingsParams() *GetGeneralUISettingsParams {
+	return &GetGeneralUISettingsParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewGetGeneralUISettingsParamsWithTimeout creates a new GetGeneralUISettingsParams object
+// with the ability to set a timeout on a request.
+func NewGetGeneralUISettingsParamsWithTimeout(timeout time.Duration) *GetGeneralUISettingsParams {
+	return &GetGeneralUISettingsParams{
+		timeout: timeout,
+	}
+}
+
+// NewGetGeneralUISettingsParamsWithContext creates a new GetGeneralUISettingsParams object
+// with the ability to set a context for a request.
+func NewGetGeneralUISettingsParamsWithContext(ctx context.Context) *GetGeneralUISettingsParams {
+	return &GetGeneralUISettingsParams{
+		Context: ctx,
+	}
+}
+
+// NewGetGeneralUISettingsParamsWithHTTPClient creates a new GetGeneralUISettingsParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewGetGeneralUISettingsParamsWithHTTPClient(client *http.Client) *GetGeneralUISettingsParams {
+	return &GetGeneralUISettingsParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+GetGeneralUISettingsParams contains all the parameters to send to the API endpoint
+
+	for the get general UI settings operation.
+
+	Typically these are written to a http.Request.
+*/
+type GetGeneralUISettingsParams struct {
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the get general UI settings params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *GetGeneralUISettingsParams) WithDefaults() *GetGeneralUISettingsParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the get general UI settings params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *GetGeneralUISettingsParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the get general UI settings params
+func (o *GetGeneralUISettingsParams) WithTimeout(timeout time.Duration) *GetGeneralUISettingsParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the get general UI settings params
+func (o *GetGeneralUISettingsParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the get general UI settings params
+func (o *GetGeneralUISettingsParams) WithContext(ctx context.Context) *GetGeneralUISettingsParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the get general UI settings params
+func (o *GetGeneralUISettingsParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the get general UI settings params
+func (o *GetGeneralUISettingsParams) WithHTTPClient(client *http.Client) *GetGeneralUISettingsParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the get general UI settings params
+func (o *GetGeneralUISettingsParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *GetGeneralUISettingsParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/settings/get_general_ui_settings_responses.go b/bots-common/gitea-generated/client/settings/get_general_ui_settings_responses.go
new file mode 100644
index 0000000..2343986
--- /dev/null
+++ b/bots-common/gitea-generated/client/settings/get_general_ui_settings_responses.go
@@ -0,0 +1,106 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package settings
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// GetGeneralUISettingsReader is a Reader for the GetGeneralUISettings structure.
+type GetGeneralUISettingsReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *GetGeneralUISettingsReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewGetGeneralUISettingsOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	default:
+		return nil, runtime.NewAPIError("[GET /settings/ui] getGeneralUISettings", response, response.Code())
+	}
+}
+
+// NewGetGeneralUISettingsOK creates a GetGeneralUISettingsOK with default headers values
+func NewGetGeneralUISettingsOK() *GetGeneralUISettingsOK {
+	return &GetGeneralUISettingsOK{}
+}
+
+/*
+GetGeneralUISettingsOK describes a response with status code 200, with default header values.
+
+GeneralUISettings
+*/
+type GetGeneralUISettingsOK struct {
+	Payload *models.GeneralUISettings
+}
+
+// IsSuccess returns true when this get general Ui settings o k response has a 2xx status code
+func (o *GetGeneralUISettingsOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this get general Ui settings o k response has a 3xx status code
+func (o *GetGeneralUISettingsOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this get general Ui settings o k response has a 4xx status code
+func (o *GetGeneralUISettingsOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this get general Ui settings o k response has a 5xx status code
+func (o *GetGeneralUISettingsOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this get general Ui settings o k response a status code equal to that given
+func (o *GetGeneralUISettingsOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the get general Ui settings o k response
+func (o *GetGeneralUISettingsOK) Code() int {
+	return 200
+}
+
+func (o *GetGeneralUISettingsOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /settings/ui][%d] getGeneralUiSettingsOK %s", 200, payload)
+}
+
+func (o *GetGeneralUISettingsOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /settings/ui][%d] getGeneralUiSettingsOK %s", 200, payload)
+}
+
+func (o *GetGeneralUISettingsOK) GetPayload() *models.GeneralUISettings {
+	return o.Payload
+}
+
+func (o *GetGeneralUISettingsOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.GeneralUISettings)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/settings/settings_client.go b/bots-common/gitea-generated/client/settings/settings_client.go
new file mode 100644
index 0000000..399217d
--- /dev/null
+++ b/bots-common/gitea-generated/client/settings/settings_client.go
@@ -0,0 +1,253 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package settings
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	httptransport "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// New creates a new settings API client.
+func New(transport runtime.ClientTransport, formats strfmt.Registry) ClientService {
+	return &Client{transport: transport, formats: formats}
+}
+
+// New creates a new settings API client with basic auth credentials.
+// It takes the following parameters:
+// - host: http host (github.com).
+// - basePath: any base path for the API client ("/v1", "/v3").
+// - scheme: http scheme ("http", "https").
+// - user: user for basic authentication header.
+// - password: password for basic authentication header.
+func NewClientWithBasicAuth(host, basePath, scheme, user, password string) ClientService {
+	transport := httptransport.New(host, basePath, []string{scheme})
+	transport.DefaultAuthentication = httptransport.BasicAuth(user, password)
+	return &Client{transport: transport, formats: strfmt.Default}
+}
+
+// New creates a new settings API client with a bearer token for authentication.
+// It takes the following parameters:
+// - host: http host (github.com).
+// - basePath: any base path for the API client ("/v1", "/v3").
+// - scheme: http scheme ("http", "https").
+// - bearerToken: bearer token for Bearer authentication header.
+func NewClientWithBearerToken(host, basePath, scheme, bearerToken string) ClientService {
+	transport := httptransport.New(host, basePath, []string{scheme})
+	transport.DefaultAuthentication = httptransport.BearerToken(bearerToken)
+	return &Client{transport: transport, formats: strfmt.Default}
+}
+
+/*
+Client for settings API
+*/
+type Client struct {
+	transport runtime.ClientTransport
+	formats   strfmt.Registry
+}
+
+// ClientOption may be used to customize the behavior of Client methods.
+type ClientOption func(*runtime.ClientOperation)
+
+// This client is generated with a few options you might find useful for your swagger spec.
+//
+// Feel free to add you own set of options.
+
+// WithContentType allows the client to force the Content-Type header
+// to negotiate a specific Consumer from the server.
+//
+// You may use this option to set arbitrary extensions to your MIME media type.
+func WithContentType(mime string) ClientOption {
+	return func(r *runtime.ClientOperation) {
+		r.ConsumesMediaTypes = []string{mime}
+	}
+}
+
+// WithContentTypeApplicationJSON sets the Content-Type header to "application/json".
+func WithContentTypeApplicationJSON(r *runtime.ClientOperation) {
+	r.ConsumesMediaTypes = []string{"application/json"}
+}
+
+// WithContentTypeTextPlain sets the Content-Type header to "text/plain".
+func WithContentTypeTextPlain(r *runtime.ClientOperation) {
+	r.ConsumesMediaTypes = []string{"text/plain"}
+}
+
+// ClientService is the interface for Client methods
+type ClientService interface {
+	GetGeneralAPISettings(params *GetGeneralAPISettingsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*GetGeneralAPISettingsOK, error)
+
+	GetGeneralAttachmentSettings(params *GetGeneralAttachmentSettingsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*GetGeneralAttachmentSettingsOK, error)
+
+	GetGeneralRepositorySettings(params *GetGeneralRepositorySettingsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*GetGeneralRepositorySettingsOK, error)
+
+	GetGeneralUISettings(params *GetGeneralUISettingsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*GetGeneralUISettingsOK, error)
+
+	SetTransport(transport runtime.ClientTransport)
+}
+
+/*
+GetGeneralAPISettings gets instance s global settings for api
+*/
+func (a *Client) GetGeneralAPISettings(params *GetGeneralAPISettingsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*GetGeneralAPISettingsOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewGetGeneralAPISettingsParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "getGeneralAPISettings",
+		Method:             "GET",
+		PathPattern:        "/settings/api",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &GetGeneralAPISettingsReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*GetGeneralAPISettingsOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for getGeneralAPISettings: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+GetGeneralAttachmentSettings gets instance s global settings for attachment
+*/
+func (a *Client) GetGeneralAttachmentSettings(params *GetGeneralAttachmentSettingsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*GetGeneralAttachmentSettingsOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewGetGeneralAttachmentSettingsParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "getGeneralAttachmentSettings",
+		Method:             "GET",
+		PathPattern:        "/settings/attachment",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &GetGeneralAttachmentSettingsReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*GetGeneralAttachmentSettingsOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for getGeneralAttachmentSettings: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+GetGeneralRepositorySettings gets instance s global settings for repositories
+*/
+func (a *Client) GetGeneralRepositorySettings(params *GetGeneralRepositorySettingsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*GetGeneralRepositorySettingsOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewGetGeneralRepositorySettingsParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "getGeneralRepositorySettings",
+		Method:             "GET",
+		PathPattern:        "/settings/repository",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &GetGeneralRepositorySettingsReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*GetGeneralRepositorySettingsOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for getGeneralRepositorySettings: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+GetGeneralUISettings gets instance s global settings for ui
+*/
+func (a *Client) GetGeneralUISettings(params *GetGeneralUISettingsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*GetGeneralUISettingsOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewGetGeneralUISettingsParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "getGeneralUISettings",
+		Method:             "GET",
+		PathPattern:        "/settings/ui",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &GetGeneralUISettingsReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*GetGeneralUISettingsOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for getGeneralUISettings: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+// SetTransport changes the transport on the client
+func (a *Client) SetTransport(transport runtime.ClientTransport) {
+	a.transport = transport
+}
diff --git a/bots-common/gitea-generated/client/user/create_user_variable_parameters.go b/bots-common/gitea-generated/client/user/create_user_variable_parameters.go
new file mode 100644
index 0000000..dd1d001
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/create_user_variable_parameters.go
@@ -0,0 +1,172 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewCreateUserVariableParams creates a new CreateUserVariableParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewCreateUserVariableParams() *CreateUserVariableParams {
+	return &CreateUserVariableParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewCreateUserVariableParamsWithTimeout creates a new CreateUserVariableParams object
+// with the ability to set a timeout on a request.
+func NewCreateUserVariableParamsWithTimeout(timeout time.Duration) *CreateUserVariableParams {
+	return &CreateUserVariableParams{
+		timeout: timeout,
+	}
+}
+
+// NewCreateUserVariableParamsWithContext creates a new CreateUserVariableParams object
+// with the ability to set a context for a request.
+func NewCreateUserVariableParamsWithContext(ctx context.Context) *CreateUserVariableParams {
+	return &CreateUserVariableParams{
+		Context: ctx,
+	}
+}
+
+// NewCreateUserVariableParamsWithHTTPClient creates a new CreateUserVariableParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewCreateUserVariableParamsWithHTTPClient(client *http.Client) *CreateUserVariableParams {
+	return &CreateUserVariableParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+CreateUserVariableParams contains all the parameters to send to the API endpoint
+
+	for the create user variable operation.
+
+	Typically these are written to a http.Request.
+*/
+type CreateUserVariableParams struct {
+
+	// Body.
+	Body *models.CreateVariableOption
+
+	/* Variablename.
+
+	   name of the variable
+	*/
+	Variablename string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the create user variable params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *CreateUserVariableParams) WithDefaults() *CreateUserVariableParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the create user variable params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *CreateUserVariableParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the create user variable params
+func (o *CreateUserVariableParams) WithTimeout(timeout time.Duration) *CreateUserVariableParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the create user variable params
+func (o *CreateUserVariableParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the create user variable params
+func (o *CreateUserVariableParams) WithContext(ctx context.Context) *CreateUserVariableParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the create user variable params
+func (o *CreateUserVariableParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the create user variable params
+func (o *CreateUserVariableParams) WithHTTPClient(client *http.Client) *CreateUserVariableParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the create user variable params
+func (o *CreateUserVariableParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the create user variable params
+func (o *CreateUserVariableParams) WithBody(body *models.CreateVariableOption) *CreateUserVariableParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the create user variable params
+func (o *CreateUserVariableParams) SetBody(body *models.CreateVariableOption) {
+	o.Body = body
+}
+
+// WithVariablename adds the variablename to the create user variable params
+func (o *CreateUserVariableParams) WithVariablename(variablename string) *CreateUserVariableParams {
+	o.SetVariablename(variablename)
+	return o
+}
+
+// SetVariablename adds the variablename to the create user variable params
+func (o *CreateUserVariableParams) SetVariablename(variablename string) {
+	o.Variablename = variablename
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *CreateUserVariableParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	// path param variablename
+	if err := r.SetPathParam("variablename", o.Variablename); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/create_user_variable_responses.go b/bots-common/gitea-generated/client/user/create_user_variable_responses.go
new file mode 100644
index 0000000..b3a6d9d
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/create_user_variable_responses.go
@@ -0,0 +1,290 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// CreateUserVariableReader is a Reader for the CreateUserVariable structure.
+type CreateUserVariableReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *CreateUserVariableReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 201:
+		result := NewCreateUserVariableCreated()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 204:
+		result := NewCreateUserVariableNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 400:
+		result := NewCreateUserVariableBadRequest()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewCreateUserVariableNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[POST /user/actions/variables/{variablename}] createUserVariable", response, response.Code())
+	}
+}
+
+// NewCreateUserVariableCreated creates a CreateUserVariableCreated with default headers values
+func NewCreateUserVariableCreated() *CreateUserVariableCreated {
+	return &CreateUserVariableCreated{}
+}
+
+/*
+CreateUserVariableCreated describes a response with status code 201, with default header values.
+
+response when creating a variable
+*/
+type CreateUserVariableCreated struct {
+}
+
+// IsSuccess returns true when this create user variable created response has a 2xx status code
+func (o *CreateUserVariableCreated) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this create user variable created response has a 3xx status code
+func (o *CreateUserVariableCreated) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this create user variable created response has a 4xx status code
+func (o *CreateUserVariableCreated) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this create user variable created response has a 5xx status code
+func (o *CreateUserVariableCreated) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this create user variable created response a status code equal to that given
+func (o *CreateUserVariableCreated) IsCode(code int) bool {
+	return code == 201
+}
+
+// Code gets the status code for the create user variable created response
+func (o *CreateUserVariableCreated) Code() int {
+	return 201
+}
+
+func (o *CreateUserVariableCreated) Error() string {
+	return fmt.Sprintf("[POST /user/actions/variables/{variablename}][%d] createUserVariableCreated", 201)
+}
+
+func (o *CreateUserVariableCreated) String() string {
+	return fmt.Sprintf("[POST /user/actions/variables/{variablename}][%d] createUserVariableCreated", 201)
+}
+
+func (o *CreateUserVariableCreated) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewCreateUserVariableNoContent creates a CreateUserVariableNoContent with default headers values
+func NewCreateUserVariableNoContent() *CreateUserVariableNoContent {
+	return &CreateUserVariableNoContent{}
+}
+
+/*
+CreateUserVariableNoContent describes a response with status code 204, with default header values.
+
+response when creating a variable
+*/
+type CreateUserVariableNoContent struct {
+}
+
+// IsSuccess returns true when this create user variable no content response has a 2xx status code
+func (o *CreateUserVariableNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this create user variable no content response has a 3xx status code
+func (o *CreateUserVariableNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this create user variable no content response has a 4xx status code
+func (o *CreateUserVariableNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this create user variable no content response has a 5xx status code
+func (o *CreateUserVariableNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this create user variable no content response a status code equal to that given
+func (o *CreateUserVariableNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the create user variable no content response
+func (o *CreateUserVariableNoContent) Code() int {
+	return 204
+}
+
+func (o *CreateUserVariableNoContent) Error() string {
+	return fmt.Sprintf("[POST /user/actions/variables/{variablename}][%d] createUserVariableNoContent", 204)
+}
+
+func (o *CreateUserVariableNoContent) String() string {
+	return fmt.Sprintf("[POST /user/actions/variables/{variablename}][%d] createUserVariableNoContent", 204)
+}
+
+func (o *CreateUserVariableNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewCreateUserVariableBadRequest creates a CreateUserVariableBadRequest with default headers values
+func NewCreateUserVariableBadRequest() *CreateUserVariableBadRequest {
+	return &CreateUserVariableBadRequest{}
+}
+
+/*
+CreateUserVariableBadRequest describes a response with status code 400, with default header values.
+
+APIError is error format response
+*/
+type CreateUserVariableBadRequest struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this create user variable bad request response has a 2xx status code
+func (o *CreateUserVariableBadRequest) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this create user variable bad request response has a 3xx status code
+func (o *CreateUserVariableBadRequest) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this create user variable bad request response has a 4xx status code
+func (o *CreateUserVariableBadRequest) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this create user variable bad request response has a 5xx status code
+func (o *CreateUserVariableBadRequest) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this create user variable bad request response a status code equal to that given
+func (o *CreateUserVariableBadRequest) IsCode(code int) bool {
+	return code == 400
+}
+
+// Code gets the status code for the create user variable bad request response
+func (o *CreateUserVariableBadRequest) Code() int {
+	return 400
+}
+
+func (o *CreateUserVariableBadRequest) Error() string {
+	return fmt.Sprintf("[POST /user/actions/variables/{variablename}][%d] createUserVariableBadRequest", 400)
+}
+
+func (o *CreateUserVariableBadRequest) String() string {
+	return fmt.Sprintf("[POST /user/actions/variables/{variablename}][%d] createUserVariableBadRequest", 400)
+}
+
+func (o *CreateUserVariableBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewCreateUserVariableNotFound creates a CreateUserVariableNotFound with default headers values
+func NewCreateUserVariableNotFound() *CreateUserVariableNotFound {
+	return &CreateUserVariableNotFound{}
+}
+
+/*
+CreateUserVariableNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type CreateUserVariableNotFound struct {
+}
+
+// IsSuccess returns true when this create user variable not found response has a 2xx status code
+func (o *CreateUserVariableNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this create user variable not found response has a 3xx status code
+func (o *CreateUserVariableNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this create user variable not found response has a 4xx status code
+func (o *CreateUserVariableNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this create user variable not found response has a 5xx status code
+func (o *CreateUserVariableNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this create user variable not found response a status code equal to that given
+func (o *CreateUserVariableNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the create user variable not found response
+func (o *CreateUserVariableNotFound) Code() int {
+	return 404
+}
+
+func (o *CreateUserVariableNotFound) Error() string {
+	return fmt.Sprintf("[POST /user/actions/variables/{variablename}][%d] createUserVariableNotFound", 404)
+}
+
+func (o *CreateUserVariableNotFound) String() string {
+	return fmt.Sprintf("[POST /user/actions/variables/{variablename}][%d] createUserVariableNotFound", 404)
+}
+
+func (o *CreateUserVariableNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/delete_user_secret_parameters.go b/bots-common/gitea-generated/client/user/delete_user_secret_parameters.go
new file mode 100644
index 0000000..fcb28fc
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/delete_user_secret_parameters.go
@@ -0,0 +1,151 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewDeleteUserSecretParams creates a new DeleteUserSecretParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewDeleteUserSecretParams() *DeleteUserSecretParams {
+	return &DeleteUserSecretParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewDeleteUserSecretParamsWithTimeout creates a new DeleteUserSecretParams object
+// with the ability to set a timeout on a request.
+func NewDeleteUserSecretParamsWithTimeout(timeout time.Duration) *DeleteUserSecretParams {
+	return &DeleteUserSecretParams{
+		timeout: timeout,
+	}
+}
+
+// NewDeleteUserSecretParamsWithContext creates a new DeleteUserSecretParams object
+// with the ability to set a context for a request.
+func NewDeleteUserSecretParamsWithContext(ctx context.Context) *DeleteUserSecretParams {
+	return &DeleteUserSecretParams{
+		Context: ctx,
+	}
+}
+
+// NewDeleteUserSecretParamsWithHTTPClient creates a new DeleteUserSecretParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewDeleteUserSecretParamsWithHTTPClient(client *http.Client) *DeleteUserSecretParams {
+	return &DeleteUserSecretParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+DeleteUserSecretParams contains all the parameters to send to the API endpoint
+
+	for the delete user secret operation.
+
+	Typically these are written to a http.Request.
+*/
+type DeleteUserSecretParams struct {
+
+	/* Secretname.
+
+	   name of the secret
+	*/
+	Secretname string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the delete user secret params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *DeleteUserSecretParams) WithDefaults() *DeleteUserSecretParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the delete user secret params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *DeleteUserSecretParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the delete user secret params
+func (o *DeleteUserSecretParams) WithTimeout(timeout time.Duration) *DeleteUserSecretParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the delete user secret params
+func (o *DeleteUserSecretParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the delete user secret params
+func (o *DeleteUserSecretParams) WithContext(ctx context.Context) *DeleteUserSecretParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the delete user secret params
+func (o *DeleteUserSecretParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the delete user secret params
+func (o *DeleteUserSecretParams) WithHTTPClient(client *http.Client) *DeleteUserSecretParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the delete user secret params
+func (o *DeleteUserSecretParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithSecretname adds the secretname to the delete user secret params
+func (o *DeleteUserSecretParams) WithSecretname(secretname string) *DeleteUserSecretParams {
+	o.SetSecretname(secretname)
+	return o
+}
+
+// SetSecretname adds the secretname to the delete user secret params
+func (o *DeleteUserSecretParams) SetSecretname(secretname string) {
+	o.Secretname = secretname
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *DeleteUserSecretParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param secretname
+	if err := r.SetPathParam("secretname", o.Secretname); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/delete_user_secret_responses.go b/bots-common/gitea-generated/client/user/delete_user_secret_responses.go
new file mode 100644
index 0000000..3f7044f
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/delete_user_secret_responses.go
@@ -0,0 +1,228 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// DeleteUserSecretReader is a Reader for the DeleteUserSecret structure.
+type DeleteUserSecretReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *DeleteUserSecretReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewDeleteUserSecretNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 400:
+		result := NewDeleteUserSecretBadRequest()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewDeleteUserSecretNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[DELETE /user/actions/secrets/{secretname}] deleteUserSecret", response, response.Code())
+	}
+}
+
+// NewDeleteUserSecretNoContent creates a DeleteUserSecretNoContent with default headers values
+func NewDeleteUserSecretNoContent() *DeleteUserSecretNoContent {
+	return &DeleteUserSecretNoContent{}
+}
+
+/*
+DeleteUserSecretNoContent describes a response with status code 204, with default header values.
+
+delete one secret of the user
+*/
+type DeleteUserSecretNoContent struct {
+}
+
+// IsSuccess returns true when this delete user secret no content response has a 2xx status code
+func (o *DeleteUserSecretNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this delete user secret no content response has a 3xx status code
+func (o *DeleteUserSecretNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this delete user secret no content response has a 4xx status code
+func (o *DeleteUserSecretNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this delete user secret no content response has a 5xx status code
+func (o *DeleteUserSecretNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this delete user secret no content response a status code equal to that given
+func (o *DeleteUserSecretNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the delete user secret no content response
+func (o *DeleteUserSecretNoContent) Code() int {
+	return 204
+}
+
+func (o *DeleteUserSecretNoContent) Error() string {
+	return fmt.Sprintf("[DELETE /user/actions/secrets/{secretname}][%d] deleteUserSecretNoContent", 204)
+}
+
+func (o *DeleteUserSecretNoContent) String() string {
+	return fmt.Sprintf("[DELETE /user/actions/secrets/{secretname}][%d] deleteUserSecretNoContent", 204)
+}
+
+func (o *DeleteUserSecretNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewDeleteUserSecretBadRequest creates a DeleteUserSecretBadRequest with default headers values
+func NewDeleteUserSecretBadRequest() *DeleteUserSecretBadRequest {
+	return &DeleteUserSecretBadRequest{}
+}
+
+/*
+DeleteUserSecretBadRequest describes a response with status code 400, with default header values.
+
+APIError is error format response
+*/
+type DeleteUserSecretBadRequest struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this delete user secret bad request response has a 2xx status code
+func (o *DeleteUserSecretBadRequest) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this delete user secret bad request response has a 3xx status code
+func (o *DeleteUserSecretBadRequest) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this delete user secret bad request response has a 4xx status code
+func (o *DeleteUserSecretBadRequest) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this delete user secret bad request response has a 5xx status code
+func (o *DeleteUserSecretBadRequest) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this delete user secret bad request response a status code equal to that given
+func (o *DeleteUserSecretBadRequest) IsCode(code int) bool {
+	return code == 400
+}
+
+// Code gets the status code for the delete user secret bad request response
+func (o *DeleteUserSecretBadRequest) Code() int {
+	return 400
+}
+
+func (o *DeleteUserSecretBadRequest) Error() string {
+	return fmt.Sprintf("[DELETE /user/actions/secrets/{secretname}][%d] deleteUserSecretBadRequest", 400)
+}
+
+func (o *DeleteUserSecretBadRequest) String() string {
+	return fmt.Sprintf("[DELETE /user/actions/secrets/{secretname}][%d] deleteUserSecretBadRequest", 400)
+}
+
+func (o *DeleteUserSecretBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewDeleteUserSecretNotFound creates a DeleteUserSecretNotFound with default headers values
+func NewDeleteUserSecretNotFound() *DeleteUserSecretNotFound {
+	return &DeleteUserSecretNotFound{}
+}
+
+/*
+DeleteUserSecretNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type DeleteUserSecretNotFound struct {
+}
+
+// IsSuccess returns true when this delete user secret not found response has a 2xx status code
+func (o *DeleteUserSecretNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this delete user secret not found response has a 3xx status code
+func (o *DeleteUserSecretNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this delete user secret not found response has a 4xx status code
+func (o *DeleteUserSecretNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this delete user secret not found response has a 5xx status code
+func (o *DeleteUserSecretNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this delete user secret not found response a status code equal to that given
+func (o *DeleteUserSecretNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the delete user secret not found response
+func (o *DeleteUserSecretNotFound) Code() int {
+	return 404
+}
+
+func (o *DeleteUserSecretNotFound) Error() string {
+	return fmt.Sprintf("[DELETE /user/actions/secrets/{secretname}][%d] deleteUserSecretNotFound", 404)
+}
+
+func (o *DeleteUserSecretNotFound) String() string {
+	return fmt.Sprintf("[DELETE /user/actions/secrets/{secretname}][%d] deleteUserSecretNotFound", 404)
+}
+
+func (o *DeleteUserSecretNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/delete_user_variable_parameters.go b/bots-common/gitea-generated/client/user/delete_user_variable_parameters.go
new file mode 100644
index 0000000..c7955f6
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/delete_user_variable_parameters.go
@@ -0,0 +1,151 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewDeleteUserVariableParams creates a new DeleteUserVariableParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewDeleteUserVariableParams() *DeleteUserVariableParams {
+	return &DeleteUserVariableParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewDeleteUserVariableParamsWithTimeout creates a new DeleteUserVariableParams object
+// with the ability to set a timeout on a request.
+func NewDeleteUserVariableParamsWithTimeout(timeout time.Duration) *DeleteUserVariableParams {
+	return &DeleteUserVariableParams{
+		timeout: timeout,
+	}
+}
+
+// NewDeleteUserVariableParamsWithContext creates a new DeleteUserVariableParams object
+// with the ability to set a context for a request.
+func NewDeleteUserVariableParamsWithContext(ctx context.Context) *DeleteUserVariableParams {
+	return &DeleteUserVariableParams{
+		Context: ctx,
+	}
+}
+
+// NewDeleteUserVariableParamsWithHTTPClient creates a new DeleteUserVariableParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewDeleteUserVariableParamsWithHTTPClient(client *http.Client) *DeleteUserVariableParams {
+	return &DeleteUserVariableParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+DeleteUserVariableParams contains all the parameters to send to the API endpoint
+
+	for the delete user variable operation.
+
+	Typically these are written to a http.Request.
+*/
+type DeleteUserVariableParams struct {
+
+	/* Variablename.
+
+	   name of the variable
+	*/
+	Variablename string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the delete user variable params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *DeleteUserVariableParams) WithDefaults() *DeleteUserVariableParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the delete user variable params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *DeleteUserVariableParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the delete user variable params
+func (o *DeleteUserVariableParams) WithTimeout(timeout time.Duration) *DeleteUserVariableParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the delete user variable params
+func (o *DeleteUserVariableParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the delete user variable params
+func (o *DeleteUserVariableParams) WithContext(ctx context.Context) *DeleteUserVariableParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the delete user variable params
+func (o *DeleteUserVariableParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the delete user variable params
+func (o *DeleteUserVariableParams) WithHTTPClient(client *http.Client) *DeleteUserVariableParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the delete user variable params
+func (o *DeleteUserVariableParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithVariablename adds the variablename to the delete user variable params
+func (o *DeleteUserVariableParams) WithVariablename(variablename string) *DeleteUserVariableParams {
+	o.SetVariablename(variablename)
+	return o
+}
+
+// SetVariablename adds the variablename to the delete user variable params
+func (o *DeleteUserVariableParams) SetVariablename(variablename string) {
+	o.Variablename = variablename
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *DeleteUserVariableParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param variablename
+	if err := r.SetPathParam("variablename", o.Variablename); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/delete_user_variable_responses.go b/bots-common/gitea-generated/client/user/delete_user_variable_responses.go
new file mode 100644
index 0000000..248c417
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/delete_user_variable_responses.go
@@ -0,0 +1,290 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// DeleteUserVariableReader is a Reader for the DeleteUserVariable structure.
+type DeleteUserVariableReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *DeleteUserVariableReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 201:
+		result := NewDeleteUserVariableCreated()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 204:
+		result := NewDeleteUserVariableNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 400:
+		result := NewDeleteUserVariableBadRequest()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewDeleteUserVariableNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[DELETE /user/actions/variables/{variablename}] deleteUserVariable", response, response.Code())
+	}
+}
+
+// NewDeleteUserVariableCreated creates a DeleteUserVariableCreated with default headers values
+func NewDeleteUserVariableCreated() *DeleteUserVariableCreated {
+	return &DeleteUserVariableCreated{}
+}
+
+/*
+DeleteUserVariableCreated describes a response with status code 201, with default header values.
+
+response when deleting a variable
+*/
+type DeleteUserVariableCreated struct {
+}
+
+// IsSuccess returns true when this delete user variable created response has a 2xx status code
+func (o *DeleteUserVariableCreated) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this delete user variable created response has a 3xx status code
+func (o *DeleteUserVariableCreated) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this delete user variable created response has a 4xx status code
+func (o *DeleteUserVariableCreated) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this delete user variable created response has a 5xx status code
+func (o *DeleteUserVariableCreated) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this delete user variable created response a status code equal to that given
+func (o *DeleteUserVariableCreated) IsCode(code int) bool {
+	return code == 201
+}
+
+// Code gets the status code for the delete user variable created response
+func (o *DeleteUserVariableCreated) Code() int {
+	return 201
+}
+
+func (o *DeleteUserVariableCreated) Error() string {
+	return fmt.Sprintf("[DELETE /user/actions/variables/{variablename}][%d] deleteUserVariableCreated", 201)
+}
+
+func (o *DeleteUserVariableCreated) String() string {
+	return fmt.Sprintf("[DELETE /user/actions/variables/{variablename}][%d] deleteUserVariableCreated", 201)
+}
+
+func (o *DeleteUserVariableCreated) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewDeleteUserVariableNoContent creates a DeleteUserVariableNoContent with default headers values
+func NewDeleteUserVariableNoContent() *DeleteUserVariableNoContent {
+	return &DeleteUserVariableNoContent{}
+}
+
+/*
+DeleteUserVariableNoContent describes a response with status code 204, with default header values.
+
+response when deleting a variable
+*/
+type DeleteUserVariableNoContent struct {
+}
+
+// IsSuccess returns true when this delete user variable no content response has a 2xx status code
+func (o *DeleteUserVariableNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this delete user variable no content response has a 3xx status code
+func (o *DeleteUserVariableNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this delete user variable no content response has a 4xx status code
+func (o *DeleteUserVariableNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this delete user variable no content response has a 5xx status code
+func (o *DeleteUserVariableNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this delete user variable no content response a status code equal to that given
+func (o *DeleteUserVariableNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the delete user variable no content response
+func (o *DeleteUserVariableNoContent) Code() int {
+	return 204
+}
+
+func (o *DeleteUserVariableNoContent) Error() string {
+	return fmt.Sprintf("[DELETE /user/actions/variables/{variablename}][%d] deleteUserVariableNoContent", 204)
+}
+
+func (o *DeleteUserVariableNoContent) String() string {
+	return fmt.Sprintf("[DELETE /user/actions/variables/{variablename}][%d] deleteUserVariableNoContent", 204)
+}
+
+func (o *DeleteUserVariableNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewDeleteUserVariableBadRequest creates a DeleteUserVariableBadRequest with default headers values
+func NewDeleteUserVariableBadRequest() *DeleteUserVariableBadRequest {
+	return &DeleteUserVariableBadRequest{}
+}
+
+/*
+DeleteUserVariableBadRequest describes a response with status code 400, with default header values.
+
+APIError is error format response
+*/
+type DeleteUserVariableBadRequest struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this delete user variable bad request response has a 2xx status code
+func (o *DeleteUserVariableBadRequest) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this delete user variable bad request response has a 3xx status code
+func (o *DeleteUserVariableBadRequest) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this delete user variable bad request response has a 4xx status code
+func (o *DeleteUserVariableBadRequest) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this delete user variable bad request response has a 5xx status code
+func (o *DeleteUserVariableBadRequest) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this delete user variable bad request response a status code equal to that given
+func (o *DeleteUserVariableBadRequest) IsCode(code int) bool {
+	return code == 400
+}
+
+// Code gets the status code for the delete user variable bad request response
+func (o *DeleteUserVariableBadRequest) Code() int {
+	return 400
+}
+
+func (o *DeleteUserVariableBadRequest) Error() string {
+	return fmt.Sprintf("[DELETE /user/actions/variables/{variablename}][%d] deleteUserVariableBadRequest", 400)
+}
+
+func (o *DeleteUserVariableBadRequest) String() string {
+	return fmt.Sprintf("[DELETE /user/actions/variables/{variablename}][%d] deleteUserVariableBadRequest", 400)
+}
+
+func (o *DeleteUserVariableBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewDeleteUserVariableNotFound creates a DeleteUserVariableNotFound with default headers values
+func NewDeleteUserVariableNotFound() *DeleteUserVariableNotFound {
+	return &DeleteUserVariableNotFound{}
+}
+
+/*
+DeleteUserVariableNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type DeleteUserVariableNotFound struct {
+}
+
+// IsSuccess returns true when this delete user variable not found response has a 2xx status code
+func (o *DeleteUserVariableNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this delete user variable not found response has a 3xx status code
+func (o *DeleteUserVariableNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this delete user variable not found response has a 4xx status code
+func (o *DeleteUserVariableNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this delete user variable not found response has a 5xx status code
+func (o *DeleteUserVariableNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this delete user variable not found response a status code equal to that given
+func (o *DeleteUserVariableNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the delete user variable not found response
+func (o *DeleteUserVariableNotFound) Code() int {
+	return 404
+}
+
+func (o *DeleteUserVariableNotFound) Error() string {
+	return fmt.Sprintf("[DELETE /user/actions/variables/{variablename}][%d] deleteUserVariableNotFound", 404)
+}
+
+func (o *DeleteUserVariableNotFound) String() string {
+	return fmt.Sprintf("[DELETE /user/actions/variables/{variablename}][%d] deleteUserVariableNotFound", 404)
+}
+
+func (o *DeleteUserVariableNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/get_user_settings_parameters.go b/bots-common/gitea-generated/client/user/get_user_settings_parameters.go
new file mode 100644
index 0000000..19bcc1e
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/get_user_settings_parameters.go
@@ -0,0 +1,128 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewGetUserSettingsParams creates a new GetUserSettingsParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewGetUserSettingsParams() *GetUserSettingsParams {
+	return &GetUserSettingsParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewGetUserSettingsParamsWithTimeout creates a new GetUserSettingsParams object
+// with the ability to set a timeout on a request.
+func NewGetUserSettingsParamsWithTimeout(timeout time.Duration) *GetUserSettingsParams {
+	return &GetUserSettingsParams{
+		timeout: timeout,
+	}
+}
+
+// NewGetUserSettingsParamsWithContext creates a new GetUserSettingsParams object
+// with the ability to set a context for a request.
+func NewGetUserSettingsParamsWithContext(ctx context.Context) *GetUserSettingsParams {
+	return &GetUserSettingsParams{
+		Context: ctx,
+	}
+}
+
+// NewGetUserSettingsParamsWithHTTPClient creates a new GetUserSettingsParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewGetUserSettingsParamsWithHTTPClient(client *http.Client) *GetUserSettingsParams {
+	return &GetUserSettingsParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+GetUserSettingsParams contains all the parameters to send to the API endpoint
+
+	for the get user settings operation.
+
+	Typically these are written to a http.Request.
+*/
+type GetUserSettingsParams struct {
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the get user settings params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *GetUserSettingsParams) WithDefaults() *GetUserSettingsParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the get user settings params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *GetUserSettingsParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the get user settings params
+func (o *GetUserSettingsParams) WithTimeout(timeout time.Duration) *GetUserSettingsParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the get user settings params
+func (o *GetUserSettingsParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the get user settings params
+func (o *GetUserSettingsParams) WithContext(ctx context.Context) *GetUserSettingsParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the get user settings params
+func (o *GetUserSettingsParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the get user settings params
+func (o *GetUserSettingsParams) WithHTTPClient(client *http.Client) *GetUserSettingsParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the get user settings params
+func (o *GetUserSettingsParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *GetUserSettingsParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/get_user_settings_responses.go b/bots-common/gitea-generated/client/user/get_user_settings_responses.go
new file mode 100644
index 0000000..c839c35
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/get_user_settings_responses.go
@@ -0,0 +1,104 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// GetUserSettingsReader is a Reader for the GetUserSettings structure.
+type GetUserSettingsReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *GetUserSettingsReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewGetUserSettingsOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	default:
+		return nil, runtime.NewAPIError("[GET /user/settings] getUserSettings", response, response.Code())
+	}
+}
+
+// NewGetUserSettingsOK creates a GetUserSettingsOK with default headers values
+func NewGetUserSettingsOK() *GetUserSettingsOK {
+	return &GetUserSettingsOK{}
+}
+
+/*
+GetUserSettingsOK describes a response with status code 200, with default header values.
+
+UserSettings
+*/
+type GetUserSettingsOK struct {
+	Payload []*models.UserSettings
+}
+
+// IsSuccess returns true when this get user settings o k response has a 2xx status code
+func (o *GetUserSettingsOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this get user settings o k response has a 3xx status code
+func (o *GetUserSettingsOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this get user settings o k response has a 4xx status code
+func (o *GetUserSettingsOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this get user settings o k response has a 5xx status code
+func (o *GetUserSettingsOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this get user settings o k response a status code equal to that given
+func (o *GetUserSettingsOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the get user settings o k response
+func (o *GetUserSettingsOK) Code() int {
+	return 200
+}
+
+func (o *GetUserSettingsOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /user/settings][%d] getUserSettingsOK %s", 200, payload)
+}
+
+func (o *GetUserSettingsOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /user/settings][%d] getUserSettingsOK %s", 200, payload)
+}
+
+func (o *GetUserSettingsOK) GetPayload() []*models.UserSettings {
+	return o.Payload
+}
+
+func (o *GetUserSettingsOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/get_user_variable_parameters.go b/bots-common/gitea-generated/client/user/get_user_variable_parameters.go
new file mode 100644
index 0000000..e57a76d
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/get_user_variable_parameters.go
@@ -0,0 +1,151 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewGetUserVariableParams creates a new GetUserVariableParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewGetUserVariableParams() *GetUserVariableParams {
+	return &GetUserVariableParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewGetUserVariableParamsWithTimeout creates a new GetUserVariableParams object
+// with the ability to set a timeout on a request.
+func NewGetUserVariableParamsWithTimeout(timeout time.Duration) *GetUserVariableParams {
+	return &GetUserVariableParams{
+		timeout: timeout,
+	}
+}
+
+// NewGetUserVariableParamsWithContext creates a new GetUserVariableParams object
+// with the ability to set a context for a request.
+func NewGetUserVariableParamsWithContext(ctx context.Context) *GetUserVariableParams {
+	return &GetUserVariableParams{
+		Context: ctx,
+	}
+}
+
+// NewGetUserVariableParamsWithHTTPClient creates a new GetUserVariableParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewGetUserVariableParamsWithHTTPClient(client *http.Client) *GetUserVariableParams {
+	return &GetUserVariableParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+GetUserVariableParams contains all the parameters to send to the API endpoint
+
+	for the get user variable operation.
+
+	Typically these are written to a http.Request.
+*/
+type GetUserVariableParams struct {
+
+	/* Variablename.
+
+	   name of the variable
+	*/
+	Variablename string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the get user variable params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *GetUserVariableParams) WithDefaults() *GetUserVariableParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the get user variable params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *GetUserVariableParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the get user variable params
+func (o *GetUserVariableParams) WithTimeout(timeout time.Duration) *GetUserVariableParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the get user variable params
+func (o *GetUserVariableParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the get user variable params
+func (o *GetUserVariableParams) WithContext(ctx context.Context) *GetUserVariableParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the get user variable params
+func (o *GetUserVariableParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the get user variable params
+func (o *GetUserVariableParams) WithHTTPClient(client *http.Client) *GetUserVariableParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the get user variable params
+func (o *GetUserVariableParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithVariablename adds the variablename to the get user variable params
+func (o *GetUserVariableParams) WithVariablename(variablename string) *GetUserVariableParams {
+	o.SetVariablename(variablename)
+	return o
+}
+
+// SetVariablename adds the variablename to the get user variable params
+func (o *GetUserVariableParams) SetVariablename(variablename string) {
+	o.Variablename = variablename
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *GetUserVariableParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param variablename
+	if err := r.SetPathParam("variablename", o.Variablename); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/get_user_variable_responses.go b/bots-common/gitea-generated/client/user/get_user_variable_responses.go
new file mode 100644
index 0000000..90b17fc
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/get_user_variable_responses.go
@@ -0,0 +1,246 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// GetUserVariableReader is a Reader for the GetUserVariable structure.
+type GetUserVariableReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *GetUserVariableReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewGetUserVariableOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 400:
+		result := NewGetUserVariableBadRequest()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewGetUserVariableNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /user/actions/variables/{variablename}] getUserVariable", response, response.Code())
+	}
+}
+
+// NewGetUserVariableOK creates a GetUserVariableOK with default headers values
+func NewGetUserVariableOK() *GetUserVariableOK {
+	return &GetUserVariableOK{}
+}
+
+/*
+GetUserVariableOK describes a response with status code 200, with default header values.
+
+ActionVariable
+*/
+type GetUserVariableOK struct {
+	Payload *models.ActionVariable
+}
+
+// IsSuccess returns true when this get user variable o k response has a 2xx status code
+func (o *GetUserVariableOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this get user variable o k response has a 3xx status code
+func (o *GetUserVariableOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this get user variable o k response has a 4xx status code
+func (o *GetUserVariableOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this get user variable o k response has a 5xx status code
+func (o *GetUserVariableOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this get user variable o k response a status code equal to that given
+func (o *GetUserVariableOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the get user variable o k response
+func (o *GetUserVariableOK) Code() int {
+	return 200
+}
+
+func (o *GetUserVariableOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /user/actions/variables/{variablename}][%d] getUserVariableOK %s", 200, payload)
+}
+
+func (o *GetUserVariableOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /user/actions/variables/{variablename}][%d] getUserVariableOK %s", 200, payload)
+}
+
+func (o *GetUserVariableOK) GetPayload() *models.ActionVariable {
+	return o.Payload
+}
+
+func (o *GetUserVariableOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.ActionVariable)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewGetUserVariableBadRequest creates a GetUserVariableBadRequest with default headers values
+func NewGetUserVariableBadRequest() *GetUserVariableBadRequest {
+	return &GetUserVariableBadRequest{}
+}
+
+/*
+GetUserVariableBadRequest describes a response with status code 400, with default header values.
+
+APIError is error format response
+*/
+type GetUserVariableBadRequest struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this get user variable bad request response has a 2xx status code
+func (o *GetUserVariableBadRequest) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this get user variable bad request response has a 3xx status code
+func (o *GetUserVariableBadRequest) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this get user variable bad request response has a 4xx status code
+func (o *GetUserVariableBadRequest) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this get user variable bad request response has a 5xx status code
+func (o *GetUserVariableBadRequest) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this get user variable bad request response a status code equal to that given
+func (o *GetUserVariableBadRequest) IsCode(code int) bool {
+	return code == 400
+}
+
+// Code gets the status code for the get user variable bad request response
+func (o *GetUserVariableBadRequest) Code() int {
+	return 400
+}
+
+func (o *GetUserVariableBadRequest) Error() string {
+	return fmt.Sprintf("[GET /user/actions/variables/{variablename}][%d] getUserVariableBadRequest", 400)
+}
+
+func (o *GetUserVariableBadRequest) String() string {
+	return fmt.Sprintf("[GET /user/actions/variables/{variablename}][%d] getUserVariableBadRequest", 400)
+}
+
+func (o *GetUserVariableBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewGetUserVariableNotFound creates a GetUserVariableNotFound with default headers values
+func NewGetUserVariableNotFound() *GetUserVariableNotFound {
+	return &GetUserVariableNotFound{}
+}
+
+/*
+GetUserVariableNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type GetUserVariableNotFound struct {
+}
+
+// IsSuccess returns true when this get user variable not found response has a 2xx status code
+func (o *GetUserVariableNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this get user variable not found response has a 3xx status code
+func (o *GetUserVariableNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this get user variable not found response has a 4xx status code
+func (o *GetUserVariableNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this get user variable not found response has a 5xx status code
+func (o *GetUserVariableNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this get user variable not found response a status code equal to that given
+func (o *GetUserVariableNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the get user variable not found response
+func (o *GetUserVariableNotFound) Code() int {
+	return 404
+}
+
+func (o *GetUserVariableNotFound) Error() string {
+	return fmt.Sprintf("[GET /user/actions/variables/{variablename}][%d] getUserVariableNotFound", 404)
+}
+
+func (o *GetUserVariableNotFound) String() string {
+	return fmt.Sprintf("[GET /user/actions/variables/{variablename}][%d] getUserVariableNotFound", 404)
+}
+
+func (o *GetUserVariableNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/get_user_variables_list_parameters.go b/bots-common/gitea-generated/client/user/get_user_variables_list_parameters.go
new file mode 100644
index 0000000..0b7d5ce
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/get_user_variables_list_parameters.go
@@ -0,0 +1,198 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewGetUserVariablesListParams creates a new GetUserVariablesListParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewGetUserVariablesListParams() *GetUserVariablesListParams {
+	return &GetUserVariablesListParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewGetUserVariablesListParamsWithTimeout creates a new GetUserVariablesListParams object
+// with the ability to set a timeout on a request.
+func NewGetUserVariablesListParamsWithTimeout(timeout time.Duration) *GetUserVariablesListParams {
+	return &GetUserVariablesListParams{
+		timeout: timeout,
+	}
+}
+
+// NewGetUserVariablesListParamsWithContext creates a new GetUserVariablesListParams object
+// with the ability to set a context for a request.
+func NewGetUserVariablesListParamsWithContext(ctx context.Context) *GetUserVariablesListParams {
+	return &GetUserVariablesListParams{
+		Context: ctx,
+	}
+}
+
+// NewGetUserVariablesListParamsWithHTTPClient creates a new GetUserVariablesListParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewGetUserVariablesListParamsWithHTTPClient(client *http.Client) *GetUserVariablesListParams {
+	return &GetUserVariablesListParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+GetUserVariablesListParams contains all the parameters to send to the API endpoint
+
+	for the get user variables list operation.
+
+	Typically these are written to a http.Request.
+*/
+type GetUserVariablesListParams struct {
+
+	/* Limit.
+
+	   page size of results
+	*/
+	Limit *int64
+
+	/* Page.
+
+	   page number of results to return (1-based)
+	*/
+	Page *int64
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the get user variables list params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *GetUserVariablesListParams) WithDefaults() *GetUserVariablesListParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the get user variables list params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *GetUserVariablesListParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the get user variables list params
+func (o *GetUserVariablesListParams) WithTimeout(timeout time.Duration) *GetUserVariablesListParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the get user variables list params
+func (o *GetUserVariablesListParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the get user variables list params
+func (o *GetUserVariablesListParams) WithContext(ctx context.Context) *GetUserVariablesListParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the get user variables list params
+func (o *GetUserVariablesListParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the get user variables list params
+func (o *GetUserVariablesListParams) WithHTTPClient(client *http.Client) *GetUserVariablesListParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the get user variables list params
+func (o *GetUserVariablesListParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithLimit adds the limit to the get user variables list params
+func (o *GetUserVariablesListParams) WithLimit(limit *int64) *GetUserVariablesListParams {
+	o.SetLimit(limit)
+	return o
+}
+
+// SetLimit adds the limit to the get user variables list params
+func (o *GetUserVariablesListParams) SetLimit(limit *int64) {
+	o.Limit = limit
+}
+
+// WithPage adds the page to the get user variables list params
+func (o *GetUserVariablesListParams) WithPage(page *int64) *GetUserVariablesListParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the get user variables list params
+func (o *GetUserVariablesListParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *GetUserVariablesListParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.Limit != nil {
+
+		// query param limit
+		var qrLimit int64
+
+		if o.Limit != nil {
+			qrLimit = *o.Limit
+		}
+		qLimit := swag.FormatInt64(qrLimit)
+		if qLimit != "" {
+
+			if err := r.SetQueryParam("limit", qLimit); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/get_user_variables_list_responses.go b/bots-common/gitea-generated/client/user/get_user_variables_list_responses.go
new file mode 100644
index 0000000..abcbae3
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/get_user_variables_list_responses.go
@@ -0,0 +1,244 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// GetUserVariablesListReader is a Reader for the GetUserVariablesList structure.
+type GetUserVariablesListReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *GetUserVariablesListReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewGetUserVariablesListOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 400:
+		result := NewGetUserVariablesListBadRequest()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewGetUserVariablesListNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /user/actions/variables] getUserVariablesList", response, response.Code())
+	}
+}
+
+// NewGetUserVariablesListOK creates a GetUserVariablesListOK with default headers values
+func NewGetUserVariablesListOK() *GetUserVariablesListOK {
+	return &GetUserVariablesListOK{}
+}
+
+/*
+GetUserVariablesListOK describes a response with status code 200, with default header values.
+
+VariableList
+*/
+type GetUserVariablesListOK struct {
+	Payload []*models.ActionVariable
+}
+
+// IsSuccess returns true when this get user variables list o k response has a 2xx status code
+func (o *GetUserVariablesListOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this get user variables list o k response has a 3xx status code
+func (o *GetUserVariablesListOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this get user variables list o k response has a 4xx status code
+func (o *GetUserVariablesListOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this get user variables list o k response has a 5xx status code
+func (o *GetUserVariablesListOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this get user variables list o k response a status code equal to that given
+func (o *GetUserVariablesListOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the get user variables list o k response
+func (o *GetUserVariablesListOK) Code() int {
+	return 200
+}
+
+func (o *GetUserVariablesListOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /user/actions/variables][%d] getUserVariablesListOK %s", 200, payload)
+}
+
+func (o *GetUserVariablesListOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /user/actions/variables][%d] getUserVariablesListOK %s", 200, payload)
+}
+
+func (o *GetUserVariablesListOK) GetPayload() []*models.ActionVariable {
+	return o.Payload
+}
+
+func (o *GetUserVariablesListOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewGetUserVariablesListBadRequest creates a GetUserVariablesListBadRequest with default headers values
+func NewGetUserVariablesListBadRequest() *GetUserVariablesListBadRequest {
+	return &GetUserVariablesListBadRequest{}
+}
+
+/*
+GetUserVariablesListBadRequest describes a response with status code 400, with default header values.
+
+APIError is error format response
+*/
+type GetUserVariablesListBadRequest struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this get user variables list bad request response has a 2xx status code
+func (o *GetUserVariablesListBadRequest) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this get user variables list bad request response has a 3xx status code
+func (o *GetUserVariablesListBadRequest) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this get user variables list bad request response has a 4xx status code
+func (o *GetUserVariablesListBadRequest) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this get user variables list bad request response has a 5xx status code
+func (o *GetUserVariablesListBadRequest) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this get user variables list bad request response a status code equal to that given
+func (o *GetUserVariablesListBadRequest) IsCode(code int) bool {
+	return code == 400
+}
+
+// Code gets the status code for the get user variables list bad request response
+func (o *GetUserVariablesListBadRequest) Code() int {
+	return 400
+}
+
+func (o *GetUserVariablesListBadRequest) Error() string {
+	return fmt.Sprintf("[GET /user/actions/variables][%d] getUserVariablesListBadRequest", 400)
+}
+
+func (o *GetUserVariablesListBadRequest) String() string {
+	return fmt.Sprintf("[GET /user/actions/variables][%d] getUserVariablesListBadRequest", 400)
+}
+
+func (o *GetUserVariablesListBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewGetUserVariablesListNotFound creates a GetUserVariablesListNotFound with default headers values
+func NewGetUserVariablesListNotFound() *GetUserVariablesListNotFound {
+	return &GetUserVariablesListNotFound{}
+}
+
+/*
+GetUserVariablesListNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type GetUserVariablesListNotFound struct {
+}
+
+// IsSuccess returns true when this get user variables list not found response has a 2xx status code
+func (o *GetUserVariablesListNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this get user variables list not found response has a 3xx status code
+func (o *GetUserVariablesListNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this get user variables list not found response has a 4xx status code
+func (o *GetUserVariablesListNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this get user variables list not found response has a 5xx status code
+func (o *GetUserVariablesListNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this get user variables list not found response a status code equal to that given
+func (o *GetUserVariablesListNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the get user variables list not found response
+func (o *GetUserVariablesListNotFound) Code() int {
+	return 404
+}
+
+func (o *GetUserVariablesListNotFound) Error() string {
+	return fmt.Sprintf("[GET /user/actions/variables][%d] getUserVariablesListNotFound", 404)
+}
+
+func (o *GetUserVariablesListNotFound) String() string {
+	return fmt.Sprintf("[GET /user/actions/variables][%d] getUserVariablesListNotFound", 404)
+}
+
+func (o *GetUserVariablesListNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/get_verification_token_parameters.go b/bots-common/gitea-generated/client/user/get_verification_token_parameters.go
new file mode 100644
index 0000000..33ea006
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/get_verification_token_parameters.go
@@ -0,0 +1,128 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewGetVerificationTokenParams creates a new GetVerificationTokenParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewGetVerificationTokenParams() *GetVerificationTokenParams {
+	return &GetVerificationTokenParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewGetVerificationTokenParamsWithTimeout creates a new GetVerificationTokenParams object
+// with the ability to set a timeout on a request.
+func NewGetVerificationTokenParamsWithTimeout(timeout time.Duration) *GetVerificationTokenParams {
+	return &GetVerificationTokenParams{
+		timeout: timeout,
+	}
+}
+
+// NewGetVerificationTokenParamsWithContext creates a new GetVerificationTokenParams object
+// with the ability to set a context for a request.
+func NewGetVerificationTokenParamsWithContext(ctx context.Context) *GetVerificationTokenParams {
+	return &GetVerificationTokenParams{
+		Context: ctx,
+	}
+}
+
+// NewGetVerificationTokenParamsWithHTTPClient creates a new GetVerificationTokenParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewGetVerificationTokenParamsWithHTTPClient(client *http.Client) *GetVerificationTokenParams {
+	return &GetVerificationTokenParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+GetVerificationTokenParams contains all the parameters to send to the API endpoint
+
+	for the get verification token operation.
+
+	Typically these are written to a http.Request.
+*/
+type GetVerificationTokenParams struct {
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the get verification token params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *GetVerificationTokenParams) WithDefaults() *GetVerificationTokenParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the get verification token params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *GetVerificationTokenParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the get verification token params
+func (o *GetVerificationTokenParams) WithTimeout(timeout time.Duration) *GetVerificationTokenParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the get verification token params
+func (o *GetVerificationTokenParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the get verification token params
+func (o *GetVerificationTokenParams) WithContext(ctx context.Context) *GetVerificationTokenParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the get verification token params
+func (o *GetVerificationTokenParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the get verification token params
+func (o *GetVerificationTokenParams) WithHTTPClient(client *http.Client) *GetVerificationTokenParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the get verification token params
+func (o *GetVerificationTokenParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *GetVerificationTokenParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/get_verification_token_responses.go b/bots-common/gitea-generated/client/user/get_verification_token_responses.go
new file mode 100644
index 0000000..3c8b371
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/get_verification_token_responses.go
@@ -0,0 +1,164 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// GetVerificationTokenReader is a Reader for the GetVerificationToken structure.
+type GetVerificationTokenReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *GetVerificationTokenReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewGetVerificationTokenOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewGetVerificationTokenNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /user/gpg_key_token] getVerificationToken", response, response.Code())
+	}
+}
+
+// NewGetVerificationTokenOK creates a GetVerificationTokenOK with default headers values
+func NewGetVerificationTokenOK() *GetVerificationTokenOK {
+	return &GetVerificationTokenOK{}
+}
+
+/*
+GetVerificationTokenOK describes a response with status code 200, with default header values.
+
+APIString is a string response
+*/
+type GetVerificationTokenOK struct {
+	Payload string
+}
+
+// IsSuccess returns true when this get verification token o k response has a 2xx status code
+func (o *GetVerificationTokenOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this get verification token o k response has a 3xx status code
+func (o *GetVerificationTokenOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this get verification token o k response has a 4xx status code
+func (o *GetVerificationTokenOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this get verification token o k response has a 5xx status code
+func (o *GetVerificationTokenOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this get verification token o k response a status code equal to that given
+func (o *GetVerificationTokenOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the get verification token o k response
+func (o *GetVerificationTokenOK) Code() int {
+	return 200
+}
+
+func (o *GetVerificationTokenOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /user/gpg_key_token][%d] getVerificationTokenOK %s", 200, payload)
+}
+
+func (o *GetVerificationTokenOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /user/gpg_key_token][%d] getVerificationTokenOK %s", 200, payload)
+}
+
+func (o *GetVerificationTokenOK) GetPayload() string {
+	return o.Payload
+}
+
+func (o *GetVerificationTokenOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewGetVerificationTokenNotFound creates a GetVerificationTokenNotFound with default headers values
+func NewGetVerificationTokenNotFound() *GetVerificationTokenNotFound {
+	return &GetVerificationTokenNotFound{}
+}
+
+/*
+GetVerificationTokenNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type GetVerificationTokenNotFound struct {
+}
+
+// IsSuccess returns true when this get verification token not found response has a 2xx status code
+func (o *GetVerificationTokenNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this get verification token not found response has a 3xx status code
+func (o *GetVerificationTokenNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this get verification token not found response has a 4xx status code
+func (o *GetVerificationTokenNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this get verification token not found response has a 5xx status code
+func (o *GetVerificationTokenNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this get verification token not found response a status code equal to that given
+func (o *GetVerificationTokenNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the get verification token not found response
+func (o *GetVerificationTokenNotFound) Code() int {
+	return 404
+}
+
+func (o *GetVerificationTokenNotFound) Error() string {
+	return fmt.Sprintf("[GET /user/gpg_key_token][%d] getVerificationTokenNotFound", 404)
+}
+
+func (o *GetVerificationTokenNotFound) String() string {
+	return fmt.Sprintf("[GET /user/gpg_key_token][%d] getVerificationTokenNotFound", 404)
+}
+
+func (o *GetVerificationTokenNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/update_user_secret_parameters.go b/bots-common/gitea-generated/client/user/update_user_secret_parameters.go
new file mode 100644
index 0000000..f7c5523
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/update_user_secret_parameters.go
@@ -0,0 +1,172 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewUpdateUserSecretParams creates a new UpdateUserSecretParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewUpdateUserSecretParams() *UpdateUserSecretParams {
+	return &UpdateUserSecretParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewUpdateUserSecretParamsWithTimeout creates a new UpdateUserSecretParams object
+// with the ability to set a timeout on a request.
+func NewUpdateUserSecretParamsWithTimeout(timeout time.Duration) *UpdateUserSecretParams {
+	return &UpdateUserSecretParams{
+		timeout: timeout,
+	}
+}
+
+// NewUpdateUserSecretParamsWithContext creates a new UpdateUserSecretParams object
+// with the ability to set a context for a request.
+func NewUpdateUserSecretParamsWithContext(ctx context.Context) *UpdateUserSecretParams {
+	return &UpdateUserSecretParams{
+		Context: ctx,
+	}
+}
+
+// NewUpdateUserSecretParamsWithHTTPClient creates a new UpdateUserSecretParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewUpdateUserSecretParamsWithHTTPClient(client *http.Client) *UpdateUserSecretParams {
+	return &UpdateUserSecretParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+UpdateUserSecretParams contains all the parameters to send to the API endpoint
+
+	for the update user secret operation.
+
+	Typically these are written to a http.Request.
+*/
+type UpdateUserSecretParams struct {
+
+	// Body.
+	Body *models.CreateOrUpdateSecretOption
+
+	/* Secretname.
+
+	   name of the secret
+	*/
+	Secretname string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the update user secret params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UpdateUserSecretParams) WithDefaults() *UpdateUserSecretParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the update user secret params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UpdateUserSecretParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the update user secret params
+func (o *UpdateUserSecretParams) WithTimeout(timeout time.Duration) *UpdateUserSecretParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the update user secret params
+func (o *UpdateUserSecretParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the update user secret params
+func (o *UpdateUserSecretParams) WithContext(ctx context.Context) *UpdateUserSecretParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the update user secret params
+func (o *UpdateUserSecretParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the update user secret params
+func (o *UpdateUserSecretParams) WithHTTPClient(client *http.Client) *UpdateUserSecretParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the update user secret params
+func (o *UpdateUserSecretParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the update user secret params
+func (o *UpdateUserSecretParams) WithBody(body *models.CreateOrUpdateSecretOption) *UpdateUserSecretParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the update user secret params
+func (o *UpdateUserSecretParams) SetBody(body *models.CreateOrUpdateSecretOption) {
+	o.Body = body
+}
+
+// WithSecretname adds the secretname to the update user secret params
+func (o *UpdateUserSecretParams) WithSecretname(secretname string) *UpdateUserSecretParams {
+	o.SetSecretname(secretname)
+	return o
+}
+
+// SetSecretname adds the secretname to the update user secret params
+func (o *UpdateUserSecretParams) SetSecretname(secretname string) {
+	o.Secretname = secretname
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *UpdateUserSecretParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	// path param secretname
+	if err := r.SetPathParam("secretname", o.Secretname); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/update_user_secret_responses.go b/bots-common/gitea-generated/client/user/update_user_secret_responses.go
new file mode 100644
index 0000000..41f6d12
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/update_user_secret_responses.go
@@ -0,0 +1,290 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// UpdateUserSecretReader is a Reader for the UpdateUserSecret structure.
+type UpdateUserSecretReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *UpdateUserSecretReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 201:
+		result := NewUpdateUserSecretCreated()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 204:
+		result := NewUpdateUserSecretNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 400:
+		result := NewUpdateUserSecretBadRequest()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewUpdateUserSecretNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[PUT /user/actions/secrets/{secretname}] updateUserSecret", response, response.Code())
+	}
+}
+
+// NewUpdateUserSecretCreated creates a UpdateUserSecretCreated with default headers values
+func NewUpdateUserSecretCreated() *UpdateUserSecretCreated {
+	return &UpdateUserSecretCreated{}
+}
+
+/*
+UpdateUserSecretCreated describes a response with status code 201, with default header values.
+
+response when creating a secret
+*/
+type UpdateUserSecretCreated struct {
+}
+
+// IsSuccess returns true when this update user secret created response has a 2xx status code
+func (o *UpdateUserSecretCreated) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this update user secret created response has a 3xx status code
+func (o *UpdateUserSecretCreated) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this update user secret created response has a 4xx status code
+func (o *UpdateUserSecretCreated) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this update user secret created response has a 5xx status code
+func (o *UpdateUserSecretCreated) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this update user secret created response a status code equal to that given
+func (o *UpdateUserSecretCreated) IsCode(code int) bool {
+	return code == 201
+}
+
+// Code gets the status code for the update user secret created response
+func (o *UpdateUserSecretCreated) Code() int {
+	return 201
+}
+
+func (o *UpdateUserSecretCreated) Error() string {
+	return fmt.Sprintf("[PUT /user/actions/secrets/{secretname}][%d] updateUserSecretCreated", 201)
+}
+
+func (o *UpdateUserSecretCreated) String() string {
+	return fmt.Sprintf("[PUT /user/actions/secrets/{secretname}][%d] updateUserSecretCreated", 201)
+}
+
+func (o *UpdateUserSecretCreated) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewUpdateUserSecretNoContent creates a UpdateUserSecretNoContent with default headers values
+func NewUpdateUserSecretNoContent() *UpdateUserSecretNoContent {
+	return &UpdateUserSecretNoContent{}
+}
+
+/*
+UpdateUserSecretNoContent describes a response with status code 204, with default header values.
+
+response when updating a secret
+*/
+type UpdateUserSecretNoContent struct {
+}
+
+// IsSuccess returns true when this update user secret no content response has a 2xx status code
+func (o *UpdateUserSecretNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this update user secret no content response has a 3xx status code
+func (o *UpdateUserSecretNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this update user secret no content response has a 4xx status code
+func (o *UpdateUserSecretNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this update user secret no content response has a 5xx status code
+func (o *UpdateUserSecretNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this update user secret no content response a status code equal to that given
+func (o *UpdateUserSecretNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the update user secret no content response
+func (o *UpdateUserSecretNoContent) Code() int {
+	return 204
+}
+
+func (o *UpdateUserSecretNoContent) Error() string {
+	return fmt.Sprintf("[PUT /user/actions/secrets/{secretname}][%d] updateUserSecretNoContent", 204)
+}
+
+func (o *UpdateUserSecretNoContent) String() string {
+	return fmt.Sprintf("[PUT /user/actions/secrets/{secretname}][%d] updateUserSecretNoContent", 204)
+}
+
+func (o *UpdateUserSecretNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewUpdateUserSecretBadRequest creates a UpdateUserSecretBadRequest with default headers values
+func NewUpdateUserSecretBadRequest() *UpdateUserSecretBadRequest {
+	return &UpdateUserSecretBadRequest{}
+}
+
+/*
+UpdateUserSecretBadRequest describes a response with status code 400, with default header values.
+
+APIError is error format response
+*/
+type UpdateUserSecretBadRequest struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this update user secret bad request response has a 2xx status code
+func (o *UpdateUserSecretBadRequest) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this update user secret bad request response has a 3xx status code
+func (o *UpdateUserSecretBadRequest) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this update user secret bad request response has a 4xx status code
+func (o *UpdateUserSecretBadRequest) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this update user secret bad request response has a 5xx status code
+func (o *UpdateUserSecretBadRequest) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this update user secret bad request response a status code equal to that given
+func (o *UpdateUserSecretBadRequest) IsCode(code int) bool {
+	return code == 400
+}
+
+// Code gets the status code for the update user secret bad request response
+func (o *UpdateUserSecretBadRequest) Code() int {
+	return 400
+}
+
+func (o *UpdateUserSecretBadRequest) Error() string {
+	return fmt.Sprintf("[PUT /user/actions/secrets/{secretname}][%d] updateUserSecretBadRequest", 400)
+}
+
+func (o *UpdateUserSecretBadRequest) String() string {
+	return fmt.Sprintf("[PUT /user/actions/secrets/{secretname}][%d] updateUserSecretBadRequest", 400)
+}
+
+func (o *UpdateUserSecretBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewUpdateUserSecretNotFound creates a UpdateUserSecretNotFound with default headers values
+func NewUpdateUserSecretNotFound() *UpdateUserSecretNotFound {
+	return &UpdateUserSecretNotFound{}
+}
+
+/*
+UpdateUserSecretNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type UpdateUserSecretNotFound struct {
+}
+
+// IsSuccess returns true when this update user secret not found response has a 2xx status code
+func (o *UpdateUserSecretNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this update user secret not found response has a 3xx status code
+func (o *UpdateUserSecretNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this update user secret not found response has a 4xx status code
+func (o *UpdateUserSecretNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this update user secret not found response has a 5xx status code
+func (o *UpdateUserSecretNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this update user secret not found response a status code equal to that given
+func (o *UpdateUserSecretNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the update user secret not found response
+func (o *UpdateUserSecretNotFound) Code() int {
+	return 404
+}
+
+func (o *UpdateUserSecretNotFound) Error() string {
+	return fmt.Sprintf("[PUT /user/actions/secrets/{secretname}][%d] updateUserSecretNotFound", 404)
+}
+
+func (o *UpdateUserSecretNotFound) String() string {
+	return fmt.Sprintf("[PUT /user/actions/secrets/{secretname}][%d] updateUserSecretNotFound", 404)
+}
+
+func (o *UpdateUserSecretNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/update_user_settings_parameters.go b/bots-common/gitea-generated/client/user/update_user_settings_parameters.go
new file mode 100644
index 0000000..79ab1ba
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/update_user_settings_parameters.go
@@ -0,0 +1,150 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewUpdateUserSettingsParams creates a new UpdateUserSettingsParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewUpdateUserSettingsParams() *UpdateUserSettingsParams {
+	return &UpdateUserSettingsParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewUpdateUserSettingsParamsWithTimeout creates a new UpdateUserSettingsParams object
+// with the ability to set a timeout on a request.
+func NewUpdateUserSettingsParamsWithTimeout(timeout time.Duration) *UpdateUserSettingsParams {
+	return &UpdateUserSettingsParams{
+		timeout: timeout,
+	}
+}
+
+// NewUpdateUserSettingsParamsWithContext creates a new UpdateUserSettingsParams object
+// with the ability to set a context for a request.
+func NewUpdateUserSettingsParamsWithContext(ctx context.Context) *UpdateUserSettingsParams {
+	return &UpdateUserSettingsParams{
+		Context: ctx,
+	}
+}
+
+// NewUpdateUserSettingsParamsWithHTTPClient creates a new UpdateUserSettingsParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewUpdateUserSettingsParamsWithHTTPClient(client *http.Client) *UpdateUserSettingsParams {
+	return &UpdateUserSettingsParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+UpdateUserSettingsParams contains all the parameters to send to the API endpoint
+
+	for the update user settings operation.
+
+	Typically these are written to a http.Request.
+*/
+type UpdateUserSettingsParams struct {
+
+	// Body.
+	Body *models.UserSettingsOptions
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the update user settings params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UpdateUserSettingsParams) WithDefaults() *UpdateUserSettingsParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the update user settings params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UpdateUserSettingsParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the update user settings params
+func (o *UpdateUserSettingsParams) WithTimeout(timeout time.Duration) *UpdateUserSettingsParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the update user settings params
+func (o *UpdateUserSettingsParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the update user settings params
+func (o *UpdateUserSettingsParams) WithContext(ctx context.Context) *UpdateUserSettingsParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the update user settings params
+func (o *UpdateUserSettingsParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the update user settings params
+func (o *UpdateUserSettingsParams) WithHTTPClient(client *http.Client) *UpdateUserSettingsParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the update user settings params
+func (o *UpdateUserSettingsParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the update user settings params
+func (o *UpdateUserSettingsParams) WithBody(body *models.UserSettingsOptions) *UpdateUserSettingsParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the update user settings params
+func (o *UpdateUserSettingsParams) SetBody(body *models.UserSettingsOptions) {
+	o.Body = body
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *UpdateUserSettingsParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/update_user_settings_responses.go b/bots-common/gitea-generated/client/user/update_user_settings_responses.go
new file mode 100644
index 0000000..b28224f
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/update_user_settings_responses.go
@@ -0,0 +1,104 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// UpdateUserSettingsReader is a Reader for the UpdateUserSettings structure.
+type UpdateUserSettingsReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *UpdateUserSettingsReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewUpdateUserSettingsOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	default:
+		return nil, runtime.NewAPIError("[PATCH /user/settings] updateUserSettings", response, response.Code())
+	}
+}
+
+// NewUpdateUserSettingsOK creates a UpdateUserSettingsOK with default headers values
+func NewUpdateUserSettingsOK() *UpdateUserSettingsOK {
+	return &UpdateUserSettingsOK{}
+}
+
+/*
+UpdateUserSettingsOK describes a response with status code 200, with default header values.
+
+UserSettings
+*/
+type UpdateUserSettingsOK struct {
+	Payload []*models.UserSettings
+}
+
+// IsSuccess returns true when this update user settings o k response has a 2xx status code
+func (o *UpdateUserSettingsOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this update user settings o k response has a 3xx status code
+func (o *UpdateUserSettingsOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this update user settings o k response has a 4xx status code
+func (o *UpdateUserSettingsOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this update user settings o k response has a 5xx status code
+func (o *UpdateUserSettingsOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this update user settings o k response a status code equal to that given
+func (o *UpdateUserSettingsOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the update user settings o k response
+func (o *UpdateUserSettingsOK) Code() int {
+	return 200
+}
+
+func (o *UpdateUserSettingsOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[PATCH /user/settings][%d] updateUserSettingsOK %s", 200, payload)
+}
+
+func (o *UpdateUserSettingsOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[PATCH /user/settings][%d] updateUserSettingsOK %s", 200, payload)
+}
+
+func (o *UpdateUserSettingsOK) GetPayload() []*models.UserSettings {
+	return o.Payload
+}
+
+func (o *UpdateUserSettingsOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/update_user_variable_parameters.go b/bots-common/gitea-generated/client/user/update_user_variable_parameters.go
new file mode 100644
index 0000000..1c91010
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/update_user_variable_parameters.go
@@ -0,0 +1,172 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewUpdateUserVariableParams creates a new UpdateUserVariableParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewUpdateUserVariableParams() *UpdateUserVariableParams {
+	return &UpdateUserVariableParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewUpdateUserVariableParamsWithTimeout creates a new UpdateUserVariableParams object
+// with the ability to set a timeout on a request.
+func NewUpdateUserVariableParamsWithTimeout(timeout time.Duration) *UpdateUserVariableParams {
+	return &UpdateUserVariableParams{
+		timeout: timeout,
+	}
+}
+
+// NewUpdateUserVariableParamsWithContext creates a new UpdateUserVariableParams object
+// with the ability to set a context for a request.
+func NewUpdateUserVariableParamsWithContext(ctx context.Context) *UpdateUserVariableParams {
+	return &UpdateUserVariableParams{
+		Context: ctx,
+	}
+}
+
+// NewUpdateUserVariableParamsWithHTTPClient creates a new UpdateUserVariableParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewUpdateUserVariableParamsWithHTTPClient(client *http.Client) *UpdateUserVariableParams {
+	return &UpdateUserVariableParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+UpdateUserVariableParams contains all the parameters to send to the API endpoint
+
+	for the update user variable operation.
+
+	Typically these are written to a http.Request.
+*/
+type UpdateUserVariableParams struct {
+
+	// Body.
+	Body *models.UpdateVariableOption
+
+	/* Variablename.
+
+	   name of the variable
+	*/
+	Variablename string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the update user variable params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UpdateUserVariableParams) WithDefaults() *UpdateUserVariableParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the update user variable params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UpdateUserVariableParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the update user variable params
+func (o *UpdateUserVariableParams) WithTimeout(timeout time.Duration) *UpdateUserVariableParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the update user variable params
+func (o *UpdateUserVariableParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the update user variable params
+func (o *UpdateUserVariableParams) WithContext(ctx context.Context) *UpdateUserVariableParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the update user variable params
+func (o *UpdateUserVariableParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the update user variable params
+func (o *UpdateUserVariableParams) WithHTTPClient(client *http.Client) *UpdateUserVariableParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the update user variable params
+func (o *UpdateUserVariableParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the update user variable params
+func (o *UpdateUserVariableParams) WithBody(body *models.UpdateVariableOption) *UpdateUserVariableParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the update user variable params
+func (o *UpdateUserVariableParams) SetBody(body *models.UpdateVariableOption) {
+	o.Body = body
+}
+
+// WithVariablename adds the variablename to the update user variable params
+func (o *UpdateUserVariableParams) WithVariablename(variablename string) *UpdateUserVariableParams {
+	o.SetVariablename(variablename)
+	return o
+}
+
+// SetVariablename adds the variablename to the update user variable params
+func (o *UpdateUserVariableParams) SetVariablename(variablename string) {
+	o.Variablename = variablename
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *UpdateUserVariableParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	// path param variablename
+	if err := r.SetPathParam("variablename", o.Variablename); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/update_user_variable_responses.go b/bots-common/gitea-generated/client/user/update_user_variable_responses.go
new file mode 100644
index 0000000..3bc3be9
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/update_user_variable_responses.go
@@ -0,0 +1,290 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// UpdateUserVariableReader is a Reader for the UpdateUserVariable structure.
+type UpdateUserVariableReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *UpdateUserVariableReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 201:
+		result := NewUpdateUserVariableCreated()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 204:
+		result := NewUpdateUserVariableNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 400:
+		result := NewUpdateUserVariableBadRequest()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewUpdateUserVariableNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[PUT /user/actions/variables/{variablename}] updateUserVariable", response, response.Code())
+	}
+}
+
+// NewUpdateUserVariableCreated creates a UpdateUserVariableCreated with default headers values
+func NewUpdateUserVariableCreated() *UpdateUserVariableCreated {
+	return &UpdateUserVariableCreated{}
+}
+
+/*
+UpdateUserVariableCreated describes a response with status code 201, with default header values.
+
+response when updating a variable
+*/
+type UpdateUserVariableCreated struct {
+}
+
+// IsSuccess returns true when this update user variable created response has a 2xx status code
+func (o *UpdateUserVariableCreated) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this update user variable created response has a 3xx status code
+func (o *UpdateUserVariableCreated) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this update user variable created response has a 4xx status code
+func (o *UpdateUserVariableCreated) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this update user variable created response has a 5xx status code
+func (o *UpdateUserVariableCreated) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this update user variable created response a status code equal to that given
+func (o *UpdateUserVariableCreated) IsCode(code int) bool {
+	return code == 201
+}
+
+// Code gets the status code for the update user variable created response
+func (o *UpdateUserVariableCreated) Code() int {
+	return 201
+}
+
+func (o *UpdateUserVariableCreated) Error() string {
+	return fmt.Sprintf("[PUT /user/actions/variables/{variablename}][%d] updateUserVariableCreated", 201)
+}
+
+func (o *UpdateUserVariableCreated) String() string {
+	return fmt.Sprintf("[PUT /user/actions/variables/{variablename}][%d] updateUserVariableCreated", 201)
+}
+
+func (o *UpdateUserVariableCreated) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewUpdateUserVariableNoContent creates a UpdateUserVariableNoContent with default headers values
+func NewUpdateUserVariableNoContent() *UpdateUserVariableNoContent {
+	return &UpdateUserVariableNoContent{}
+}
+
+/*
+UpdateUserVariableNoContent describes a response with status code 204, with default header values.
+
+response when updating a variable
+*/
+type UpdateUserVariableNoContent struct {
+}
+
+// IsSuccess returns true when this update user variable no content response has a 2xx status code
+func (o *UpdateUserVariableNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this update user variable no content response has a 3xx status code
+func (o *UpdateUserVariableNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this update user variable no content response has a 4xx status code
+func (o *UpdateUserVariableNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this update user variable no content response has a 5xx status code
+func (o *UpdateUserVariableNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this update user variable no content response a status code equal to that given
+func (o *UpdateUserVariableNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the update user variable no content response
+func (o *UpdateUserVariableNoContent) Code() int {
+	return 204
+}
+
+func (o *UpdateUserVariableNoContent) Error() string {
+	return fmt.Sprintf("[PUT /user/actions/variables/{variablename}][%d] updateUserVariableNoContent", 204)
+}
+
+func (o *UpdateUserVariableNoContent) String() string {
+	return fmt.Sprintf("[PUT /user/actions/variables/{variablename}][%d] updateUserVariableNoContent", 204)
+}
+
+func (o *UpdateUserVariableNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewUpdateUserVariableBadRequest creates a UpdateUserVariableBadRequest with default headers values
+func NewUpdateUserVariableBadRequest() *UpdateUserVariableBadRequest {
+	return &UpdateUserVariableBadRequest{}
+}
+
+/*
+UpdateUserVariableBadRequest describes a response with status code 400, with default header values.
+
+APIError is error format response
+*/
+type UpdateUserVariableBadRequest struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this update user variable bad request response has a 2xx status code
+func (o *UpdateUserVariableBadRequest) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this update user variable bad request response has a 3xx status code
+func (o *UpdateUserVariableBadRequest) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this update user variable bad request response has a 4xx status code
+func (o *UpdateUserVariableBadRequest) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this update user variable bad request response has a 5xx status code
+func (o *UpdateUserVariableBadRequest) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this update user variable bad request response a status code equal to that given
+func (o *UpdateUserVariableBadRequest) IsCode(code int) bool {
+	return code == 400
+}
+
+// Code gets the status code for the update user variable bad request response
+func (o *UpdateUserVariableBadRequest) Code() int {
+	return 400
+}
+
+func (o *UpdateUserVariableBadRequest) Error() string {
+	return fmt.Sprintf("[PUT /user/actions/variables/{variablename}][%d] updateUserVariableBadRequest", 400)
+}
+
+func (o *UpdateUserVariableBadRequest) String() string {
+	return fmt.Sprintf("[PUT /user/actions/variables/{variablename}][%d] updateUserVariableBadRequest", 400)
+}
+
+func (o *UpdateUserVariableBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewUpdateUserVariableNotFound creates a UpdateUserVariableNotFound with default headers values
+func NewUpdateUserVariableNotFound() *UpdateUserVariableNotFound {
+	return &UpdateUserVariableNotFound{}
+}
+
+/*
+UpdateUserVariableNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type UpdateUserVariableNotFound struct {
+}
+
+// IsSuccess returns true when this update user variable not found response has a 2xx status code
+func (o *UpdateUserVariableNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this update user variable not found response has a 3xx status code
+func (o *UpdateUserVariableNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this update user variable not found response has a 4xx status code
+func (o *UpdateUserVariableNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this update user variable not found response has a 5xx status code
+func (o *UpdateUserVariableNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this update user variable not found response a status code equal to that given
+func (o *UpdateUserVariableNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the update user variable not found response
+func (o *UpdateUserVariableNotFound) Code() int {
+	return 404
+}
+
+func (o *UpdateUserVariableNotFound) Error() string {
+	return fmt.Sprintf("[PUT /user/actions/variables/{variablename}][%d] updateUserVariableNotFound", 404)
+}
+
+func (o *UpdateUserVariableNotFound) String() string {
+	return fmt.Sprintf("[PUT /user/actions/variables/{variablename}][%d] updateUserVariableNotFound", 404)
+}
+
+func (o *UpdateUserVariableNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_add_email_parameters.go b/bots-common/gitea-generated/client/user/user_add_email_parameters.go
new file mode 100644
index 0000000..2b209d9
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_add_email_parameters.go
@@ -0,0 +1,150 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewUserAddEmailParams creates a new UserAddEmailParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewUserAddEmailParams() *UserAddEmailParams {
+	return &UserAddEmailParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewUserAddEmailParamsWithTimeout creates a new UserAddEmailParams object
+// with the ability to set a timeout on a request.
+func NewUserAddEmailParamsWithTimeout(timeout time.Duration) *UserAddEmailParams {
+	return &UserAddEmailParams{
+		timeout: timeout,
+	}
+}
+
+// NewUserAddEmailParamsWithContext creates a new UserAddEmailParams object
+// with the ability to set a context for a request.
+func NewUserAddEmailParamsWithContext(ctx context.Context) *UserAddEmailParams {
+	return &UserAddEmailParams{
+		Context: ctx,
+	}
+}
+
+// NewUserAddEmailParamsWithHTTPClient creates a new UserAddEmailParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewUserAddEmailParamsWithHTTPClient(client *http.Client) *UserAddEmailParams {
+	return &UserAddEmailParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+UserAddEmailParams contains all the parameters to send to the API endpoint
+
+	for the user add email operation.
+
+	Typically these are written to a http.Request.
+*/
+type UserAddEmailParams struct {
+
+	// Body.
+	Body *models.CreateEmailOption
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the user add email params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserAddEmailParams) WithDefaults() *UserAddEmailParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the user add email params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserAddEmailParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the user add email params
+func (o *UserAddEmailParams) WithTimeout(timeout time.Duration) *UserAddEmailParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the user add email params
+func (o *UserAddEmailParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the user add email params
+func (o *UserAddEmailParams) WithContext(ctx context.Context) *UserAddEmailParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the user add email params
+func (o *UserAddEmailParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the user add email params
+func (o *UserAddEmailParams) WithHTTPClient(client *http.Client) *UserAddEmailParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the user add email params
+func (o *UserAddEmailParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the user add email params
+func (o *UserAddEmailParams) WithBody(body *models.CreateEmailOption) *UserAddEmailParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the user add email params
+func (o *UserAddEmailParams) SetBody(body *models.CreateEmailOption) {
+	o.Body = body
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *UserAddEmailParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_add_email_responses.go b/bots-common/gitea-generated/client/user/user_add_email_responses.go
new file mode 100644
index 0000000..dadf0c2
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_add_email_responses.go
@@ -0,0 +1,182 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// UserAddEmailReader is a Reader for the UserAddEmail structure.
+type UserAddEmailReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *UserAddEmailReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 201:
+		result := NewUserAddEmailCreated()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 422:
+		result := NewUserAddEmailUnprocessableEntity()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[POST /user/emails] userAddEmail", response, response.Code())
+	}
+}
+
+// NewUserAddEmailCreated creates a UserAddEmailCreated with default headers values
+func NewUserAddEmailCreated() *UserAddEmailCreated {
+	return &UserAddEmailCreated{}
+}
+
+/*
+UserAddEmailCreated describes a response with status code 201, with default header values.
+
+EmailList
+*/
+type UserAddEmailCreated struct {
+	Payload []*models.Email
+}
+
+// IsSuccess returns true when this user add email created response has a 2xx status code
+func (o *UserAddEmailCreated) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this user add email created response has a 3xx status code
+func (o *UserAddEmailCreated) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user add email created response has a 4xx status code
+func (o *UserAddEmailCreated) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this user add email created response has a 5xx status code
+func (o *UserAddEmailCreated) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user add email created response a status code equal to that given
+func (o *UserAddEmailCreated) IsCode(code int) bool {
+	return code == 201
+}
+
+// Code gets the status code for the user add email created response
+func (o *UserAddEmailCreated) Code() int {
+	return 201
+}
+
+func (o *UserAddEmailCreated) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /user/emails][%d] userAddEmailCreated %s", 201, payload)
+}
+
+func (o *UserAddEmailCreated) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /user/emails][%d] userAddEmailCreated %s", 201, payload)
+}
+
+func (o *UserAddEmailCreated) GetPayload() []*models.Email {
+	return o.Payload
+}
+
+func (o *UserAddEmailCreated) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewUserAddEmailUnprocessableEntity creates a UserAddEmailUnprocessableEntity with default headers values
+func NewUserAddEmailUnprocessableEntity() *UserAddEmailUnprocessableEntity {
+	return &UserAddEmailUnprocessableEntity{}
+}
+
+/*
+UserAddEmailUnprocessableEntity describes a response with status code 422, with default header values.
+
+APIValidationError is error format response related to input validation
+*/
+type UserAddEmailUnprocessableEntity struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this user add email unprocessable entity response has a 2xx status code
+func (o *UserAddEmailUnprocessableEntity) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this user add email unprocessable entity response has a 3xx status code
+func (o *UserAddEmailUnprocessableEntity) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user add email unprocessable entity response has a 4xx status code
+func (o *UserAddEmailUnprocessableEntity) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this user add email unprocessable entity response has a 5xx status code
+func (o *UserAddEmailUnprocessableEntity) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user add email unprocessable entity response a status code equal to that given
+func (o *UserAddEmailUnprocessableEntity) IsCode(code int) bool {
+	return code == 422
+}
+
+// Code gets the status code for the user add email unprocessable entity response
+func (o *UserAddEmailUnprocessableEntity) Code() int {
+	return 422
+}
+
+func (o *UserAddEmailUnprocessableEntity) Error() string {
+	return fmt.Sprintf("[POST /user/emails][%d] userAddEmailUnprocessableEntity", 422)
+}
+
+func (o *UserAddEmailUnprocessableEntity) String() string {
+	return fmt.Sprintf("[POST /user/emails][%d] userAddEmailUnprocessableEntity", 422)
+}
+
+func (o *UserAddEmailUnprocessableEntity) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_block_user_parameters.go b/bots-common/gitea-generated/client/user/user_block_user_parameters.go
new file mode 100644
index 0000000..2b03cc4
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_block_user_parameters.go
@@ -0,0 +1,185 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewUserBlockUserParams creates a new UserBlockUserParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewUserBlockUserParams() *UserBlockUserParams {
+	return &UserBlockUserParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewUserBlockUserParamsWithTimeout creates a new UserBlockUserParams object
+// with the ability to set a timeout on a request.
+func NewUserBlockUserParamsWithTimeout(timeout time.Duration) *UserBlockUserParams {
+	return &UserBlockUserParams{
+		timeout: timeout,
+	}
+}
+
+// NewUserBlockUserParamsWithContext creates a new UserBlockUserParams object
+// with the ability to set a context for a request.
+func NewUserBlockUserParamsWithContext(ctx context.Context) *UserBlockUserParams {
+	return &UserBlockUserParams{
+		Context: ctx,
+	}
+}
+
+// NewUserBlockUserParamsWithHTTPClient creates a new UserBlockUserParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewUserBlockUserParamsWithHTTPClient(client *http.Client) *UserBlockUserParams {
+	return &UserBlockUserParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+UserBlockUserParams contains all the parameters to send to the API endpoint
+
+	for the user block user operation.
+
+	Typically these are written to a http.Request.
+*/
+type UserBlockUserParams struct {
+
+	/* Note.
+
+	   optional note for the block
+	*/
+	Note *string
+
+	/* Username.
+
+	   user to block
+	*/
+	Username string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the user block user params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserBlockUserParams) WithDefaults() *UserBlockUserParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the user block user params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserBlockUserParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the user block user params
+func (o *UserBlockUserParams) WithTimeout(timeout time.Duration) *UserBlockUserParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the user block user params
+func (o *UserBlockUserParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the user block user params
+func (o *UserBlockUserParams) WithContext(ctx context.Context) *UserBlockUserParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the user block user params
+func (o *UserBlockUserParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the user block user params
+func (o *UserBlockUserParams) WithHTTPClient(client *http.Client) *UserBlockUserParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the user block user params
+func (o *UserBlockUserParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithNote adds the note to the user block user params
+func (o *UserBlockUserParams) WithNote(note *string) *UserBlockUserParams {
+	o.SetNote(note)
+	return o
+}
+
+// SetNote adds the note to the user block user params
+func (o *UserBlockUserParams) SetNote(note *string) {
+	o.Note = note
+}
+
+// WithUsername adds the username to the user block user params
+func (o *UserBlockUserParams) WithUsername(username string) *UserBlockUserParams {
+	o.SetUsername(username)
+	return o
+}
+
+// SetUsername adds the username to the user block user params
+func (o *UserBlockUserParams) SetUsername(username string) {
+	o.Username = username
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *UserBlockUserParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.Note != nil {
+
+		// query param note
+		var qrNote string
+
+		if o.Note != nil {
+			qrNote = *o.Note
+		}
+		qNote := qrNote
+		if qNote != "" {
+
+			if err := r.SetQueryParam("note", qNote); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param username
+	if err := r.SetPathParam("username", o.Username); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_block_user_responses.go b/bots-common/gitea-generated/client/user/user_block_user_responses.go
new file mode 100644
index 0000000..262cc88
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_block_user_responses.go
@@ -0,0 +1,228 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// UserBlockUserReader is a Reader for the UserBlockUser structure.
+type UserBlockUserReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *UserBlockUserReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewUserBlockUserNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewUserBlockUserNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 422:
+		result := NewUserBlockUserUnprocessableEntity()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[PUT /user/blocks/{username}] userBlockUser", response, response.Code())
+	}
+}
+
+// NewUserBlockUserNoContent creates a UserBlockUserNoContent with default headers values
+func NewUserBlockUserNoContent() *UserBlockUserNoContent {
+	return &UserBlockUserNoContent{}
+}
+
+/*
+UserBlockUserNoContent describes a response with status code 204, with default header values.
+
+APIEmpty is an empty response
+*/
+type UserBlockUserNoContent struct {
+}
+
+// IsSuccess returns true when this user block user no content response has a 2xx status code
+func (o *UserBlockUserNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this user block user no content response has a 3xx status code
+func (o *UserBlockUserNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user block user no content response has a 4xx status code
+func (o *UserBlockUserNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this user block user no content response has a 5xx status code
+func (o *UserBlockUserNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user block user no content response a status code equal to that given
+func (o *UserBlockUserNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the user block user no content response
+func (o *UserBlockUserNoContent) Code() int {
+	return 204
+}
+
+func (o *UserBlockUserNoContent) Error() string {
+	return fmt.Sprintf("[PUT /user/blocks/{username}][%d] userBlockUserNoContent", 204)
+}
+
+func (o *UserBlockUserNoContent) String() string {
+	return fmt.Sprintf("[PUT /user/blocks/{username}][%d] userBlockUserNoContent", 204)
+}
+
+func (o *UserBlockUserNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewUserBlockUserNotFound creates a UserBlockUserNotFound with default headers values
+func NewUserBlockUserNotFound() *UserBlockUserNotFound {
+	return &UserBlockUserNotFound{}
+}
+
+/*
+UserBlockUserNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type UserBlockUserNotFound struct {
+}
+
+// IsSuccess returns true when this user block user not found response has a 2xx status code
+func (o *UserBlockUserNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this user block user not found response has a 3xx status code
+func (o *UserBlockUserNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user block user not found response has a 4xx status code
+func (o *UserBlockUserNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this user block user not found response has a 5xx status code
+func (o *UserBlockUserNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user block user not found response a status code equal to that given
+func (o *UserBlockUserNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the user block user not found response
+func (o *UserBlockUserNotFound) Code() int {
+	return 404
+}
+
+func (o *UserBlockUserNotFound) Error() string {
+	return fmt.Sprintf("[PUT /user/blocks/{username}][%d] userBlockUserNotFound", 404)
+}
+
+func (o *UserBlockUserNotFound) String() string {
+	return fmt.Sprintf("[PUT /user/blocks/{username}][%d] userBlockUserNotFound", 404)
+}
+
+func (o *UserBlockUserNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewUserBlockUserUnprocessableEntity creates a UserBlockUserUnprocessableEntity with default headers values
+func NewUserBlockUserUnprocessableEntity() *UserBlockUserUnprocessableEntity {
+	return &UserBlockUserUnprocessableEntity{}
+}
+
+/*
+UserBlockUserUnprocessableEntity describes a response with status code 422, with default header values.
+
+APIValidationError is error format response related to input validation
+*/
+type UserBlockUserUnprocessableEntity struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this user block user unprocessable entity response has a 2xx status code
+func (o *UserBlockUserUnprocessableEntity) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this user block user unprocessable entity response has a 3xx status code
+func (o *UserBlockUserUnprocessableEntity) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user block user unprocessable entity response has a 4xx status code
+func (o *UserBlockUserUnprocessableEntity) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this user block user unprocessable entity response has a 5xx status code
+func (o *UserBlockUserUnprocessableEntity) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user block user unprocessable entity response a status code equal to that given
+func (o *UserBlockUserUnprocessableEntity) IsCode(code int) bool {
+	return code == 422
+}
+
+// Code gets the status code for the user block user unprocessable entity response
+func (o *UserBlockUserUnprocessableEntity) Code() int {
+	return 422
+}
+
+func (o *UserBlockUserUnprocessableEntity) Error() string {
+	return fmt.Sprintf("[PUT /user/blocks/{username}][%d] userBlockUserUnprocessableEntity", 422)
+}
+
+func (o *UserBlockUserUnprocessableEntity) String() string {
+	return fmt.Sprintf("[PUT /user/blocks/{username}][%d] userBlockUserUnprocessableEntity", 422)
+}
+
+func (o *UserBlockUserUnprocessableEntity) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_check_following_parameters.go b/bots-common/gitea-generated/client/user/user_check_following_parameters.go
new file mode 100644
index 0000000..10191d1
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_check_following_parameters.go
@@ -0,0 +1,173 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewUserCheckFollowingParams creates a new UserCheckFollowingParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewUserCheckFollowingParams() *UserCheckFollowingParams {
+	return &UserCheckFollowingParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewUserCheckFollowingParamsWithTimeout creates a new UserCheckFollowingParams object
+// with the ability to set a timeout on a request.
+func NewUserCheckFollowingParamsWithTimeout(timeout time.Duration) *UserCheckFollowingParams {
+	return &UserCheckFollowingParams{
+		timeout: timeout,
+	}
+}
+
+// NewUserCheckFollowingParamsWithContext creates a new UserCheckFollowingParams object
+// with the ability to set a context for a request.
+func NewUserCheckFollowingParamsWithContext(ctx context.Context) *UserCheckFollowingParams {
+	return &UserCheckFollowingParams{
+		Context: ctx,
+	}
+}
+
+// NewUserCheckFollowingParamsWithHTTPClient creates a new UserCheckFollowingParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewUserCheckFollowingParamsWithHTTPClient(client *http.Client) *UserCheckFollowingParams {
+	return &UserCheckFollowingParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+UserCheckFollowingParams contains all the parameters to send to the API endpoint
+
+	for the user check following operation.
+
+	Typically these are written to a http.Request.
+*/
+type UserCheckFollowingParams struct {
+
+	/* Target.
+
+	   username of followed user
+	*/
+	Target string
+
+	/* Username.
+
+	   username of following user
+	*/
+	Username string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the user check following params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserCheckFollowingParams) WithDefaults() *UserCheckFollowingParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the user check following params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserCheckFollowingParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the user check following params
+func (o *UserCheckFollowingParams) WithTimeout(timeout time.Duration) *UserCheckFollowingParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the user check following params
+func (o *UserCheckFollowingParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the user check following params
+func (o *UserCheckFollowingParams) WithContext(ctx context.Context) *UserCheckFollowingParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the user check following params
+func (o *UserCheckFollowingParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the user check following params
+func (o *UserCheckFollowingParams) WithHTTPClient(client *http.Client) *UserCheckFollowingParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the user check following params
+func (o *UserCheckFollowingParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithTarget adds the target to the user check following params
+func (o *UserCheckFollowingParams) WithTarget(target string) *UserCheckFollowingParams {
+	o.SetTarget(target)
+	return o
+}
+
+// SetTarget adds the target to the user check following params
+func (o *UserCheckFollowingParams) SetTarget(target string) {
+	o.Target = target
+}
+
+// WithUsername adds the username to the user check following params
+func (o *UserCheckFollowingParams) WithUsername(username string) *UserCheckFollowingParams {
+	o.SetUsername(username)
+	return o
+}
+
+// SetUsername adds the username to the user check following params
+func (o *UserCheckFollowingParams) SetUsername(username string) {
+	o.Username = username
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *UserCheckFollowingParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param target
+	if err := r.SetPathParam("target", o.Target); err != nil {
+		return err
+	}
+
+	// path param username
+	if err := r.SetPathParam("username", o.Username); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_check_following_responses.go b/bots-common/gitea-generated/client/user/user_check_following_responses.go
new file mode 100644
index 0000000..c3e2abb
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_check_following_responses.go
@@ -0,0 +1,150 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// UserCheckFollowingReader is a Reader for the UserCheckFollowing structure.
+type UserCheckFollowingReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *UserCheckFollowingReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewUserCheckFollowingNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewUserCheckFollowingNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /users/{username}/following/{target}] userCheckFollowing", response, response.Code())
+	}
+}
+
+// NewUserCheckFollowingNoContent creates a UserCheckFollowingNoContent with default headers values
+func NewUserCheckFollowingNoContent() *UserCheckFollowingNoContent {
+	return &UserCheckFollowingNoContent{}
+}
+
+/*
+UserCheckFollowingNoContent describes a response with status code 204, with default header values.
+
+APIEmpty is an empty response
+*/
+type UserCheckFollowingNoContent struct {
+}
+
+// IsSuccess returns true when this user check following no content response has a 2xx status code
+func (o *UserCheckFollowingNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this user check following no content response has a 3xx status code
+func (o *UserCheckFollowingNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user check following no content response has a 4xx status code
+func (o *UserCheckFollowingNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this user check following no content response has a 5xx status code
+func (o *UserCheckFollowingNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user check following no content response a status code equal to that given
+func (o *UserCheckFollowingNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the user check following no content response
+func (o *UserCheckFollowingNoContent) Code() int {
+	return 204
+}
+
+func (o *UserCheckFollowingNoContent) Error() string {
+	return fmt.Sprintf("[GET /users/{username}/following/{target}][%d] userCheckFollowingNoContent", 204)
+}
+
+func (o *UserCheckFollowingNoContent) String() string {
+	return fmt.Sprintf("[GET /users/{username}/following/{target}][%d] userCheckFollowingNoContent", 204)
+}
+
+func (o *UserCheckFollowingNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewUserCheckFollowingNotFound creates a UserCheckFollowingNotFound with default headers values
+func NewUserCheckFollowingNotFound() *UserCheckFollowingNotFound {
+	return &UserCheckFollowingNotFound{}
+}
+
+/*
+UserCheckFollowingNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type UserCheckFollowingNotFound struct {
+}
+
+// IsSuccess returns true when this user check following not found response has a 2xx status code
+func (o *UserCheckFollowingNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this user check following not found response has a 3xx status code
+func (o *UserCheckFollowingNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user check following not found response has a 4xx status code
+func (o *UserCheckFollowingNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this user check following not found response has a 5xx status code
+func (o *UserCheckFollowingNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user check following not found response a status code equal to that given
+func (o *UserCheckFollowingNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the user check following not found response
+func (o *UserCheckFollowingNotFound) Code() int {
+	return 404
+}
+
+func (o *UserCheckFollowingNotFound) Error() string {
+	return fmt.Sprintf("[GET /users/{username}/following/{target}][%d] userCheckFollowingNotFound", 404)
+}
+
+func (o *UserCheckFollowingNotFound) String() string {
+	return fmt.Sprintf("[GET /users/{username}/following/{target}][%d] userCheckFollowingNotFound", 404)
+}
+
+func (o *UserCheckFollowingNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_check_user_block_parameters.go b/bots-common/gitea-generated/client/user/user_check_user_block_parameters.go
new file mode 100644
index 0000000..e06b5dc
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_check_user_block_parameters.go
@@ -0,0 +1,151 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewUserCheckUserBlockParams creates a new UserCheckUserBlockParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewUserCheckUserBlockParams() *UserCheckUserBlockParams {
+	return &UserCheckUserBlockParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewUserCheckUserBlockParamsWithTimeout creates a new UserCheckUserBlockParams object
+// with the ability to set a timeout on a request.
+func NewUserCheckUserBlockParamsWithTimeout(timeout time.Duration) *UserCheckUserBlockParams {
+	return &UserCheckUserBlockParams{
+		timeout: timeout,
+	}
+}
+
+// NewUserCheckUserBlockParamsWithContext creates a new UserCheckUserBlockParams object
+// with the ability to set a context for a request.
+func NewUserCheckUserBlockParamsWithContext(ctx context.Context) *UserCheckUserBlockParams {
+	return &UserCheckUserBlockParams{
+		Context: ctx,
+	}
+}
+
+// NewUserCheckUserBlockParamsWithHTTPClient creates a new UserCheckUserBlockParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewUserCheckUserBlockParamsWithHTTPClient(client *http.Client) *UserCheckUserBlockParams {
+	return &UserCheckUserBlockParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+UserCheckUserBlockParams contains all the parameters to send to the API endpoint
+
+	for the user check user block operation.
+
+	Typically these are written to a http.Request.
+*/
+type UserCheckUserBlockParams struct {
+
+	/* Username.
+
+	   user to check
+	*/
+	Username string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the user check user block params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserCheckUserBlockParams) WithDefaults() *UserCheckUserBlockParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the user check user block params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserCheckUserBlockParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the user check user block params
+func (o *UserCheckUserBlockParams) WithTimeout(timeout time.Duration) *UserCheckUserBlockParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the user check user block params
+func (o *UserCheckUserBlockParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the user check user block params
+func (o *UserCheckUserBlockParams) WithContext(ctx context.Context) *UserCheckUserBlockParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the user check user block params
+func (o *UserCheckUserBlockParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the user check user block params
+func (o *UserCheckUserBlockParams) WithHTTPClient(client *http.Client) *UserCheckUserBlockParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the user check user block params
+func (o *UserCheckUserBlockParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithUsername adds the username to the user check user block params
+func (o *UserCheckUserBlockParams) WithUsername(username string) *UserCheckUserBlockParams {
+	o.SetUsername(username)
+	return o
+}
+
+// SetUsername adds the username to the user check user block params
+func (o *UserCheckUserBlockParams) SetUsername(username string) {
+	o.Username = username
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *UserCheckUserBlockParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param username
+	if err := r.SetPathParam("username", o.Username); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_check_user_block_responses.go b/bots-common/gitea-generated/client/user/user_check_user_block_responses.go
new file mode 100644
index 0000000..2f9f003
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_check_user_block_responses.go
@@ -0,0 +1,150 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// UserCheckUserBlockReader is a Reader for the UserCheckUserBlock structure.
+type UserCheckUserBlockReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *UserCheckUserBlockReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewUserCheckUserBlockNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewUserCheckUserBlockNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /user/blocks/{username}] userCheckUserBlock", response, response.Code())
+	}
+}
+
+// NewUserCheckUserBlockNoContent creates a UserCheckUserBlockNoContent with default headers values
+func NewUserCheckUserBlockNoContent() *UserCheckUserBlockNoContent {
+	return &UserCheckUserBlockNoContent{}
+}
+
+/*
+UserCheckUserBlockNoContent describes a response with status code 204, with default header values.
+
+APIEmpty is an empty response
+*/
+type UserCheckUserBlockNoContent struct {
+}
+
+// IsSuccess returns true when this user check user block no content response has a 2xx status code
+func (o *UserCheckUserBlockNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this user check user block no content response has a 3xx status code
+func (o *UserCheckUserBlockNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user check user block no content response has a 4xx status code
+func (o *UserCheckUserBlockNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this user check user block no content response has a 5xx status code
+func (o *UserCheckUserBlockNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user check user block no content response a status code equal to that given
+func (o *UserCheckUserBlockNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the user check user block no content response
+func (o *UserCheckUserBlockNoContent) Code() int {
+	return 204
+}
+
+func (o *UserCheckUserBlockNoContent) Error() string {
+	return fmt.Sprintf("[GET /user/blocks/{username}][%d] userCheckUserBlockNoContent", 204)
+}
+
+func (o *UserCheckUserBlockNoContent) String() string {
+	return fmt.Sprintf("[GET /user/blocks/{username}][%d] userCheckUserBlockNoContent", 204)
+}
+
+func (o *UserCheckUserBlockNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewUserCheckUserBlockNotFound creates a UserCheckUserBlockNotFound with default headers values
+func NewUserCheckUserBlockNotFound() *UserCheckUserBlockNotFound {
+	return &UserCheckUserBlockNotFound{}
+}
+
+/*
+UserCheckUserBlockNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type UserCheckUserBlockNotFound struct {
+}
+
+// IsSuccess returns true when this user check user block not found response has a 2xx status code
+func (o *UserCheckUserBlockNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this user check user block not found response has a 3xx status code
+func (o *UserCheckUserBlockNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user check user block not found response has a 4xx status code
+func (o *UserCheckUserBlockNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this user check user block not found response has a 5xx status code
+func (o *UserCheckUserBlockNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user check user block not found response a status code equal to that given
+func (o *UserCheckUserBlockNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the user check user block not found response
+func (o *UserCheckUserBlockNotFound) Code() int {
+	return 404
+}
+
+func (o *UserCheckUserBlockNotFound) Error() string {
+	return fmt.Sprintf("[GET /user/blocks/{username}][%d] userCheckUserBlockNotFound", 404)
+}
+
+func (o *UserCheckUserBlockNotFound) String() string {
+	return fmt.Sprintf("[GET /user/blocks/{username}][%d] userCheckUserBlockNotFound", 404)
+}
+
+func (o *UserCheckUserBlockNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_client.go b/bots-common/gitea-generated/client/user/user_client.go
new file mode 100644
index 0000000..2f53be7
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_client.go
@@ -0,0 +1,2947 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	httptransport "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// New creates a new user API client.
+func New(transport runtime.ClientTransport, formats strfmt.Registry) ClientService {
+	return &Client{transport: transport, formats: formats}
+}
+
+// New creates a new user API client with basic auth credentials.
+// It takes the following parameters:
+// - host: http host (github.com).
+// - basePath: any base path for the API client ("/v1", "/v3").
+// - scheme: http scheme ("http", "https").
+// - user: user for basic authentication header.
+// - password: password for basic authentication header.
+func NewClientWithBasicAuth(host, basePath, scheme, user, password string) ClientService {
+	transport := httptransport.New(host, basePath, []string{scheme})
+	transport.DefaultAuthentication = httptransport.BasicAuth(user, password)
+	return &Client{transport: transport, formats: strfmt.Default}
+}
+
+// New creates a new user API client with a bearer token for authentication.
+// It takes the following parameters:
+// - host: http host (github.com).
+// - basePath: any base path for the API client ("/v1", "/v3").
+// - scheme: http scheme ("http", "https").
+// - bearerToken: bearer token for Bearer authentication header.
+func NewClientWithBearerToken(host, basePath, scheme, bearerToken string) ClientService {
+	transport := httptransport.New(host, basePath, []string{scheme})
+	transport.DefaultAuthentication = httptransport.BearerToken(bearerToken)
+	return &Client{transport: transport, formats: strfmt.Default}
+}
+
+/*
+Client for user API
+*/
+type Client struct {
+	transport runtime.ClientTransport
+	formats   strfmt.Registry
+}
+
+// ClientOption may be used to customize the behavior of Client methods.
+type ClientOption func(*runtime.ClientOperation)
+
+// This client is generated with a few options you might find useful for your swagger spec.
+//
+// Feel free to add you own set of options.
+
+// WithContentType allows the client to force the Content-Type header
+// to negotiate a specific Consumer from the server.
+//
+// You may use this option to set arbitrary extensions to your MIME media type.
+func WithContentType(mime string) ClientOption {
+	return func(r *runtime.ClientOperation) {
+		r.ConsumesMediaTypes = []string{mime}
+	}
+}
+
+// WithContentTypeApplicationJSON sets the Content-Type header to "application/json".
+func WithContentTypeApplicationJSON(r *runtime.ClientOperation) {
+	r.ConsumesMediaTypes = []string{"application/json"}
+}
+
+// WithContentTypeTextPlain sets the Content-Type header to "text/plain".
+func WithContentTypeTextPlain(r *runtime.ClientOperation) {
+	r.ConsumesMediaTypes = []string{"text/plain"}
+}
+
+// WithAccept allows the client to force the Accept header
+// to negotiate a specific Producer from the server.
+//
+// You may use this option to set arbitrary extensions to your MIME media type.
+func WithAccept(mime string) ClientOption {
+	return func(r *runtime.ClientOperation) {
+		r.ProducesMediaTypes = []string{mime}
+	}
+}
+
+// WithAcceptApplicationJSON sets the Accept header to "application/json".
+func WithAcceptApplicationJSON(r *runtime.ClientOperation) {
+	r.ProducesMediaTypes = []string{"application/json"}
+}
+
+// WithAcceptTextHTML sets the Accept header to "text/html".
+func WithAcceptTextHTML(r *runtime.ClientOperation) {
+	r.ProducesMediaTypes = []string{"text/html"}
+}
+
+// WithAcceptTextPlain sets the Accept header to "text/plain".
+func WithAcceptTextPlain(r *runtime.ClientOperation) {
+	r.ProducesMediaTypes = []string{"text/plain"}
+}
+
+// ClientService is the interface for Client methods
+type ClientService interface {
+	CreateUserVariable(params *CreateUserVariableParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*CreateUserVariableCreated, *CreateUserVariableNoContent, error)
+
+	DeleteUserSecret(params *DeleteUserSecretParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*DeleteUserSecretNoContent, error)
+
+	DeleteUserVariable(params *DeleteUserVariableParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*DeleteUserVariableCreated, *DeleteUserVariableNoContent, error)
+
+	GetUserSettings(params *GetUserSettingsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*GetUserSettingsOK, error)
+
+	GetUserVariable(params *GetUserVariableParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*GetUserVariableOK, error)
+
+	GetUserVariablesList(params *GetUserVariablesListParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*GetUserVariablesListOK, error)
+
+	GetVerificationToken(params *GetVerificationTokenParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*GetVerificationTokenOK, error)
+
+	UpdateUserSecret(params *UpdateUserSecretParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UpdateUserSecretCreated, *UpdateUserSecretNoContent, error)
+
+	UpdateUserSettings(params *UpdateUserSettingsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UpdateUserSettingsOK, error)
+
+	UpdateUserVariable(params *UpdateUserVariableParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UpdateUserVariableCreated, *UpdateUserVariableNoContent, error)
+
+	UserAddEmail(params *UserAddEmailParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserAddEmailCreated, error)
+
+	UserBlockUser(params *UserBlockUserParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserBlockUserNoContent, error)
+
+	UserCheckFollowing(params *UserCheckFollowingParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserCheckFollowingNoContent, error)
+
+	UserCheckUserBlock(params *UserCheckUserBlockParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserCheckUserBlockNoContent, error)
+
+	UserCreateHook(params *UserCreateHookParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserCreateHookCreated, error)
+
+	UserCreateOAuth2Application(params *UserCreateOAuth2ApplicationParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserCreateOAuth2ApplicationCreated, error)
+
+	UserCreateToken(params *UserCreateTokenParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserCreateTokenCreated, error)
+
+	UserCurrentCheckFollowing(params *UserCurrentCheckFollowingParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserCurrentCheckFollowingNoContent, error)
+
+	UserCurrentCheckStarring(params *UserCurrentCheckStarringParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserCurrentCheckStarringNoContent, error)
+
+	UserCurrentDeleteFollow(params *UserCurrentDeleteFollowParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserCurrentDeleteFollowNoContent, error)
+
+	UserCurrentDeleteGPGKey(params *UserCurrentDeleteGPGKeyParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserCurrentDeleteGPGKeyNoContent, error)
+
+	UserCurrentDeleteKey(params *UserCurrentDeleteKeyParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserCurrentDeleteKeyNoContent, error)
+
+	UserCurrentDeleteStar(params *UserCurrentDeleteStarParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserCurrentDeleteStarNoContent, error)
+
+	UserCurrentGetGPGKey(params *UserCurrentGetGPGKeyParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserCurrentGetGPGKeyOK, error)
+
+	UserCurrentGetKey(params *UserCurrentGetKeyParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserCurrentGetKeyOK, error)
+
+	UserCurrentListFollowers(params *UserCurrentListFollowersParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserCurrentListFollowersOK, error)
+
+	UserCurrentListFollowing(params *UserCurrentListFollowingParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserCurrentListFollowingOK, error)
+
+	UserCurrentListGPGKeys(params *UserCurrentListGPGKeysParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserCurrentListGPGKeysOK, error)
+
+	UserCurrentListKeys(params *UserCurrentListKeysParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserCurrentListKeysOK, error)
+
+	UserCurrentListRepos(params *UserCurrentListReposParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserCurrentListReposOK, error)
+
+	UserCurrentListStarred(params *UserCurrentListStarredParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserCurrentListStarredOK, error)
+
+	UserCurrentListSubscriptions(params *UserCurrentListSubscriptionsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserCurrentListSubscriptionsOK, error)
+
+	UserCurrentPostGPGKey(params *UserCurrentPostGPGKeyParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserCurrentPostGPGKeyCreated, error)
+
+	UserCurrentPostKey(params *UserCurrentPostKeyParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserCurrentPostKeyCreated, error)
+
+	UserCurrentPutFollow(params *UserCurrentPutFollowParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserCurrentPutFollowNoContent, error)
+
+	UserCurrentPutStar(params *UserCurrentPutStarParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserCurrentPutStarNoContent, error)
+
+	UserCurrentTrackedTimes(params *UserCurrentTrackedTimesParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserCurrentTrackedTimesOK, error)
+
+	UserDeleteAccessToken(params *UserDeleteAccessTokenParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserDeleteAccessTokenNoContent, error)
+
+	UserDeleteAvatar(params *UserDeleteAvatarParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserDeleteAvatarNoContent, error)
+
+	UserDeleteEmail(params *UserDeleteEmailParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserDeleteEmailNoContent, error)
+
+	UserDeleteHook(params *UserDeleteHookParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserDeleteHookNoContent, error)
+
+	UserDeleteOAuth2Application(params *UserDeleteOAuth2ApplicationParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserDeleteOAuth2ApplicationNoContent, error)
+
+	UserEditHook(params *UserEditHookParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserEditHookOK, error)
+
+	UserGet(params *UserGetParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserGetOK, error)
+
+	UserGetCurrent(params *UserGetCurrentParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserGetCurrentOK, error)
+
+	UserGetHeatmapData(params *UserGetHeatmapDataParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserGetHeatmapDataOK, error)
+
+	UserGetHook(params *UserGetHookParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserGetHookOK, error)
+
+	UserGetOAuth2Application(params *UserGetOAuth2ApplicationParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserGetOAuth2ApplicationOK, error)
+
+	UserGetOauth2Application(params *UserGetOauth2ApplicationParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserGetOauth2ApplicationOK, error)
+
+	UserGetRunnerRegistrationToken(params *UserGetRunnerRegistrationTokenParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserGetRunnerRegistrationTokenOK, error)
+
+	UserGetStopWatches(params *UserGetStopWatchesParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserGetStopWatchesOK, error)
+
+	UserGetTokens(params *UserGetTokensParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserGetTokensOK, error)
+
+	UserListActivityFeeds(params *UserListActivityFeedsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserListActivityFeedsOK, error)
+
+	UserListBlocks(params *UserListBlocksParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserListBlocksOK, error)
+
+	UserListEmails(params *UserListEmailsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserListEmailsOK, error)
+
+	UserListFollowers(params *UserListFollowersParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserListFollowersOK, error)
+
+	UserListFollowing(params *UserListFollowingParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserListFollowingOK, error)
+
+	UserListGPGKeys(params *UserListGPGKeysParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserListGPGKeysOK, error)
+
+	UserListHooks(params *UserListHooksParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserListHooksOK, error)
+
+	UserListKeys(params *UserListKeysParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserListKeysOK, error)
+
+	UserListRepos(params *UserListReposParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserListReposOK, error)
+
+	UserListStarred(params *UserListStarredParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserListStarredOK, error)
+
+	UserListSubscriptions(params *UserListSubscriptionsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserListSubscriptionsOK, error)
+
+	UserListTeams(params *UserListTeamsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserListTeamsOK, error)
+
+	UserSearch(params *UserSearchParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserSearchOK, error)
+
+	UserUnblockUser(params *UserUnblockUserParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserUnblockUserNoContent, error)
+
+	UserUpdateAvatar(params *UserUpdateAvatarParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserUpdateAvatarNoContent, error)
+
+	UserUpdateOAuth2Application(params *UserUpdateOAuth2ApplicationParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserUpdateOAuth2ApplicationOK, error)
+
+	UserVerifyGPGKey(params *UserVerifyGPGKeyParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserVerifyGPGKeyCreated, error)
+
+	SetTransport(transport runtime.ClientTransport)
+}
+
+/*
+CreateUserVariable creates a user level variable
+*/
+func (a *Client) CreateUserVariable(params *CreateUserVariableParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*CreateUserVariableCreated, *CreateUserVariableNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewCreateUserVariableParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "createUserVariable",
+		Method:             "POST",
+		PathPattern:        "/user/actions/variables/{variablename}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &CreateUserVariableReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, nil, err
+	}
+	switch value := result.(type) {
+	case *CreateUserVariableCreated:
+		return value, nil, nil
+	case *CreateUserVariableNoContent:
+		return nil, value, nil
+	}
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for user: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+DeleteUserSecret deletes a secret in a user scope
+*/
+func (a *Client) DeleteUserSecret(params *DeleteUserSecretParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*DeleteUserSecretNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewDeleteUserSecretParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "deleteUserSecret",
+		Method:             "DELETE",
+		PathPattern:        "/user/actions/secrets/{secretname}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &DeleteUserSecretReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*DeleteUserSecretNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for deleteUserSecret: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+DeleteUserVariable deletes a user level variable which is created by current doer
+*/
+func (a *Client) DeleteUserVariable(params *DeleteUserVariableParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*DeleteUserVariableCreated, *DeleteUserVariableNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewDeleteUserVariableParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "deleteUserVariable",
+		Method:             "DELETE",
+		PathPattern:        "/user/actions/variables/{variablename}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &DeleteUserVariableReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, nil, err
+	}
+	switch value := result.(type) {
+	case *DeleteUserVariableCreated:
+		return value, nil, nil
+	case *DeleteUserVariableNoContent:
+		return nil, value, nil
+	}
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for user: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+GetUserSettings gets user settings
+*/
+func (a *Client) GetUserSettings(params *GetUserSettingsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*GetUserSettingsOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewGetUserSettingsParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "getUserSettings",
+		Method:             "GET",
+		PathPattern:        "/user/settings",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &GetUserSettingsReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*GetUserSettingsOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for getUserSettings: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+GetUserVariable gets a user level variable which is created by current doer
+*/
+func (a *Client) GetUserVariable(params *GetUserVariableParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*GetUserVariableOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewGetUserVariableParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "getUserVariable",
+		Method:             "GET",
+		PathPattern:        "/user/actions/variables/{variablename}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &GetUserVariableReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*GetUserVariableOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for getUserVariable: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+GetUserVariablesList gets the user level list of variables which is created by current doer
+*/
+func (a *Client) GetUserVariablesList(params *GetUserVariablesListParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*GetUserVariablesListOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewGetUserVariablesListParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "getUserVariablesList",
+		Method:             "GET",
+		PathPattern:        "/user/actions/variables",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &GetUserVariablesListReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*GetUserVariablesListOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for getUserVariablesList: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+GetVerificationToken gets a token to verify
+*/
+func (a *Client) GetVerificationToken(params *GetVerificationTokenParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*GetVerificationTokenOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewGetVerificationTokenParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "getVerificationToken",
+		Method:             "GET",
+		PathPattern:        "/user/gpg_key_token",
+		ProducesMediaTypes: []string{"text/plain"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &GetVerificationTokenReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*GetVerificationTokenOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for getVerificationToken: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+UpdateUserSecret creates or update a secret value in a user scope
+*/
+func (a *Client) UpdateUserSecret(params *UpdateUserSecretParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UpdateUserSecretCreated, *UpdateUserSecretNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewUpdateUserSecretParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "updateUserSecret",
+		Method:             "PUT",
+		PathPattern:        "/user/actions/secrets/{secretname}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &UpdateUserSecretReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, nil, err
+	}
+	switch value := result.(type) {
+	case *UpdateUserSecretCreated:
+		return value, nil, nil
+	case *UpdateUserSecretNoContent:
+		return nil, value, nil
+	}
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for user: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+UpdateUserSettings updates user settings
+*/
+func (a *Client) UpdateUserSettings(params *UpdateUserSettingsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UpdateUserSettingsOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewUpdateUserSettingsParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "updateUserSettings",
+		Method:             "PATCH",
+		PathPattern:        "/user/settings",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &UpdateUserSettingsReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*UpdateUserSettingsOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for updateUserSettings: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+UpdateUserVariable updates a user level variable which is created by current doer
+*/
+func (a *Client) UpdateUserVariable(params *UpdateUserVariableParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UpdateUserVariableCreated, *UpdateUserVariableNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewUpdateUserVariableParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "updateUserVariable",
+		Method:             "PUT",
+		PathPattern:        "/user/actions/variables/{variablename}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &UpdateUserVariableReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, nil, err
+	}
+	switch value := result.(type) {
+	case *UpdateUserVariableCreated:
+		return value, nil, nil
+	case *UpdateUserVariableNoContent:
+		return nil, value, nil
+	}
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for user: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+UserAddEmail adds email addresses
+*/
+func (a *Client) UserAddEmail(params *UserAddEmailParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserAddEmailCreated, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewUserAddEmailParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "userAddEmail",
+		Method:             "POST",
+		PathPattern:        "/user/emails",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &UserAddEmailReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*UserAddEmailCreated)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for userAddEmail: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+UserBlockUser blocks a user
+*/
+func (a *Client) UserBlockUser(params *UserBlockUserParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserBlockUserNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewUserBlockUserParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "userBlockUser",
+		Method:             "PUT",
+		PathPattern:        "/user/blocks/{username}",
+		ProducesMediaTypes: []string{"application/json", "text/html"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &UserBlockUserReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*UserBlockUserNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for userBlockUser: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+UserCheckFollowing checks if one user is following another user
+*/
+func (a *Client) UserCheckFollowing(params *UserCheckFollowingParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserCheckFollowingNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewUserCheckFollowingParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "userCheckFollowing",
+		Method:             "GET",
+		PathPattern:        "/users/{username}/following/{target}",
+		ProducesMediaTypes: []string{"application/json", "text/html"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &UserCheckFollowingReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*UserCheckFollowingNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for userCheckFollowing: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+UserCheckUserBlock checks if a user is blocked by the authenticated user
+*/
+func (a *Client) UserCheckUserBlock(params *UserCheckUserBlockParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserCheckUserBlockNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewUserCheckUserBlockParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "userCheckUserBlock",
+		Method:             "GET",
+		PathPattern:        "/user/blocks/{username}",
+		ProducesMediaTypes: []string{"application/json", "text/html"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &UserCheckUserBlockReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*UserCheckUserBlockNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for userCheckUserBlock: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+UserCreateHook creates a hook
+*/
+func (a *Client) UserCreateHook(params *UserCreateHookParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserCreateHookCreated, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewUserCreateHookParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "userCreateHook",
+		Method:             "POST",
+		PathPattern:        "/user/hooks",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &UserCreateHookReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*UserCreateHookCreated)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for userCreateHook: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+UserCreateOAuth2Application creates a new o auth2 application
+*/
+func (a *Client) UserCreateOAuth2Application(params *UserCreateOAuth2ApplicationParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserCreateOAuth2ApplicationCreated, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewUserCreateOAuth2ApplicationParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "userCreateOAuth2Application",
+		Method:             "POST",
+		PathPattern:        "/user/applications/oauth2",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &UserCreateOAuth2ApplicationReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*UserCreateOAuth2ApplicationCreated)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for userCreateOAuth2Application: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+UserCreateToken creates an access token
+*/
+func (a *Client) UserCreateToken(params *UserCreateTokenParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserCreateTokenCreated, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewUserCreateTokenParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "userCreateToken",
+		Method:             "POST",
+		PathPattern:        "/users/{username}/tokens",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &UserCreateTokenReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*UserCreateTokenCreated)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for userCreateToken: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+UserCurrentCheckFollowing checks whether a user is followed by the authenticated user
+*/
+func (a *Client) UserCurrentCheckFollowing(params *UserCurrentCheckFollowingParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserCurrentCheckFollowingNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewUserCurrentCheckFollowingParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "userCurrentCheckFollowing",
+		Method:             "GET",
+		PathPattern:        "/user/following/{username}",
+		ProducesMediaTypes: []string{"application/json", "text/html"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &UserCurrentCheckFollowingReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*UserCurrentCheckFollowingNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for userCurrentCheckFollowing: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+UserCurrentCheckStarring whethers the authenticated is starring the repo
+*/
+func (a *Client) UserCurrentCheckStarring(params *UserCurrentCheckStarringParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserCurrentCheckStarringNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewUserCurrentCheckStarringParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "userCurrentCheckStarring",
+		Method:             "GET",
+		PathPattern:        "/user/starred/{owner}/{repo}",
+		ProducesMediaTypes: []string{"application/json", "text/html"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &UserCurrentCheckStarringReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*UserCurrentCheckStarringNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for userCurrentCheckStarring: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+UserCurrentDeleteFollow unfollows a user
+*/
+func (a *Client) UserCurrentDeleteFollow(params *UserCurrentDeleteFollowParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserCurrentDeleteFollowNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewUserCurrentDeleteFollowParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "userCurrentDeleteFollow",
+		Method:             "DELETE",
+		PathPattern:        "/user/following/{username}",
+		ProducesMediaTypes: []string{"application/json", "text/html"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &UserCurrentDeleteFollowReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*UserCurrentDeleteFollowNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for userCurrentDeleteFollow: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+UserCurrentDeleteGPGKey removes a g p g key
+*/
+func (a *Client) UserCurrentDeleteGPGKey(params *UserCurrentDeleteGPGKeyParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserCurrentDeleteGPGKeyNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewUserCurrentDeleteGPGKeyParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "userCurrentDeleteGPGKey",
+		Method:             "DELETE",
+		PathPattern:        "/user/gpg_keys/{id}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &UserCurrentDeleteGPGKeyReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*UserCurrentDeleteGPGKeyNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for userCurrentDeleteGPGKey: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+UserCurrentDeleteKey deletes a public key
+*/
+func (a *Client) UserCurrentDeleteKey(params *UserCurrentDeleteKeyParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserCurrentDeleteKeyNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewUserCurrentDeleteKeyParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "userCurrentDeleteKey",
+		Method:             "DELETE",
+		PathPattern:        "/user/keys/{id}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &UserCurrentDeleteKeyReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*UserCurrentDeleteKeyNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for userCurrentDeleteKey: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+UserCurrentDeleteStar unstars the given repo
+*/
+func (a *Client) UserCurrentDeleteStar(params *UserCurrentDeleteStarParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserCurrentDeleteStarNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewUserCurrentDeleteStarParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "userCurrentDeleteStar",
+		Method:             "DELETE",
+		PathPattern:        "/user/starred/{owner}/{repo}",
+		ProducesMediaTypes: []string{"application/json", "text/html"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &UserCurrentDeleteStarReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*UserCurrentDeleteStarNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for userCurrentDeleteStar: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+UserCurrentGetGPGKey gets a g p g key
+*/
+func (a *Client) UserCurrentGetGPGKey(params *UserCurrentGetGPGKeyParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserCurrentGetGPGKeyOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewUserCurrentGetGPGKeyParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "userCurrentGetGPGKey",
+		Method:             "GET",
+		PathPattern:        "/user/gpg_keys/{id}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &UserCurrentGetGPGKeyReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*UserCurrentGetGPGKeyOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for userCurrentGetGPGKey: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+UserCurrentGetKey gets a public key
+*/
+func (a *Client) UserCurrentGetKey(params *UserCurrentGetKeyParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserCurrentGetKeyOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewUserCurrentGetKeyParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "userCurrentGetKey",
+		Method:             "GET",
+		PathPattern:        "/user/keys/{id}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &UserCurrentGetKeyReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*UserCurrentGetKeyOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for userCurrentGetKey: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+UserCurrentListFollowers lists the authenticated user s followers
+*/
+func (a *Client) UserCurrentListFollowers(params *UserCurrentListFollowersParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserCurrentListFollowersOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewUserCurrentListFollowersParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "userCurrentListFollowers",
+		Method:             "GET",
+		PathPattern:        "/user/followers",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &UserCurrentListFollowersReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*UserCurrentListFollowersOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for userCurrentListFollowers: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+UserCurrentListFollowing lists the users that the authenticated user is following
+*/
+func (a *Client) UserCurrentListFollowing(params *UserCurrentListFollowingParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserCurrentListFollowingOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewUserCurrentListFollowingParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "userCurrentListFollowing",
+		Method:             "GET",
+		PathPattern:        "/user/following",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &UserCurrentListFollowingReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*UserCurrentListFollowingOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for userCurrentListFollowing: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+UserCurrentListGPGKeys lists the authenticated user s g p g keys
+*/
+func (a *Client) UserCurrentListGPGKeys(params *UserCurrentListGPGKeysParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserCurrentListGPGKeysOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewUserCurrentListGPGKeysParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "userCurrentListGPGKeys",
+		Method:             "GET",
+		PathPattern:        "/user/gpg_keys",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &UserCurrentListGPGKeysReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*UserCurrentListGPGKeysOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for userCurrentListGPGKeys: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+UserCurrentListKeys lists the authenticated user s public keys
+*/
+func (a *Client) UserCurrentListKeys(params *UserCurrentListKeysParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserCurrentListKeysOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewUserCurrentListKeysParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "userCurrentListKeys",
+		Method:             "GET",
+		PathPattern:        "/user/keys",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &UserCurrentListKeysReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*UserCurrentListKeysOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for userCurrentListKeys: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+UserCurrentListRepos lists the repos that the authenticated user owns
+*/
+func (a *Client) UserCurrentListRepos(params *UserCurrentListReposParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserCurrentListReposOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewUserCurrentListReposParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "userCurrentListRepos",
+		Method:             "GET",
+		PathPattern:        "/user/repos",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &UserCurrentListReposReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*UserCurrentListReposOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for userCurrentListRepos: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+UserCurrentListStarred thes repos that the authenticated user has starred
+*/
+func (a *Client) UserCurrentListStarred(params *UserCurrentListStarredParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserCurrentListStarredOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewUserCurrentListStarredParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "userCurrentListStarred",
+		Method:             "GET",
+		PathPattern:        "/user/starred",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &UserCurrentListStarredReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*UserCurrentListStarredOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for userCurrentListStarred: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+UserCurrentListSubscriptions lists repositories watched by the authenticated user
+*/
+func (a *Client) UserCurrentListSubscriptions(params *UserCurrentListSubscriptionsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserCurrentListSubscriptionsOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewUserCurrentListSubscriptionsParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "userCurrentListSubscriptions",
+		Method:             "GET",
+		PathPattern:        "/user/subscriptions",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &UserCurrentListSubscriptionsReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*UserCurrentListSubscriptionsOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for userCurrentListSubscriptions: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+UserCurrentPostGPGKey creates a g p g key
+*/
+func (a *Client) UserCurrentPostGPGKey(params *UserCurrentPostGPGKeyParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserCurrentPostGPGKeyCreated, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewUserCurrentPostGPGKeyParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "userCurrentPostGPGKey",
+		Method:             "POST",
+		PathPattern:        "/user/gpg_keys",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &UserCurrentPostGPGKeyReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*UserCurrentPostGPGKeyCreated)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for userCurrentPostGPGKey: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+UserCurrentPostKey creates a public key
+*/
+func (a *Client) UserCurrentPostKey(params *UserCurrentPostKeyParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserCurrentPostKeyCreated, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewUserCurrentPostKeyParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "userCurrentPostKey",
+		Method:             "POST",
+		PathPattern:        "/user/keys",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &UserCurrentPostKeyReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*UserCurrentPostKeyCreated)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for userCurrentPostKey: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+UserCurrentPutFollow follows a user
+*/
+func (a *Client) UserCurrentPutFollow(params *UserCurrentPutFollowParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserCurrentPutFollowNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewUserCurrentPutFollowParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "userCurrentPutFollow",
+		Method:             "PUT",
+		PathPattern:        "/user/following/{username}",
+		ProducesMediaTypes: []string{"application/json", "text/html"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &UserCurrentPutFollowReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*UserCurrentPutFollowNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for userCurrentPutFollow: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+UserCurrentPutStar stars the given repo
+*/
+func (a *Client) UserCurrentPutStar(params *UserCurrentPutStarParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserCurrentPutStarNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewUserCurrentPutStarParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "userCurrentPutStar",
+		Method:             "PUT",
+		PathPattern:        "/user/starred/{owner}/{repo}",
+		ProducesMediaTypes: []string{"application/json", "text/html"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &UserCurrentPutStarReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*UserCurrentPutStarNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for userCurrentPutStar: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+UserCurrentTrackedTimes lists the current user s tracked times
+*/
+func (a *Client) UserCurrentTrackedTimes(params *UserCurrentTrackedTimesParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserCurrentTrackedTimesOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewUserCurrentTrackedTimesParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "userCurrentTrackedTimes",
+		Method:             "GET",
+		PathPattern:        "/user/times",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &UserCurrentTrackedTimesReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*UserCurrentTrackedTimesOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for userCurrentTrackedTimes: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+UserDeleteAccessToken deletes an access token
+*/
+func (a *Client) UserDeleteAccessToken(params *UserDeleteAccessTokenParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserDeleteAccessTokenNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewUserDeleteAccessTokenParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "userDeleteAccessToken",
+		Method:             "DELETE",
+		PathPattern:        "/users/{username}/tokens/{token}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &UserDeleteAccessTokenReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*UserDeleteAccessTokenNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for userDeleteAccessToken: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+UserDeleteAvatar deletes avatar
+*/
+func (a *Client) UserDeleteAvatar(params *UserDeleteAvatarParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserDeleteAvatarNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewUserDeleteAvatarParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "userDeleteAvatar",
+		Method:             "DELETE",
+		PathPattern:        "/user/avatar",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &UserDeleteAvatarReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*UserDeleteAvatarNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for userDeleteAvatar: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+UserDeleteEmail deletes email addresses
+*/
+func (a *Client) UserDeleteEmail(params *UserDeleteEmailParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserDeleteEmailNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewUserDeleteEmailParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "userDeleteEmail",
+		Method:             "DELETE",
+		PathPattern:        "/user/emails",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &UserDeleteEmailReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*UserDeleteEmailNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for userDeleteEmail: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+UserDeleteHook deletes a hook
+*/
+func (a *Client) UserDeleteHook(params *UserDeleteHookParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserDeleteHookNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewUserDeleteHookParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "userDeleteHook",
+		Method:             "DELETE",
+		PathPattern:        "/user/hooks/{id}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &UserDeleteHookReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*UserDeleteHookNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for userDeleteHook: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+UserDeleteOAuth2Application deletes an o auth2 application
+*/
+func (a *Client) UserDeleteOAuth2Application(params *UserDeleteOAuth2ApplicationParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserDeleteOAuth2ApplicationNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewUserDeleteOAuth2ApplicationParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "userDeleteOAuth2Application",
+		Method:             "DELETE",
+		PathPattern:        "/user/applications/oauth2/{id}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &UserDeleteOAuth2ApplicationReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*UserDeleteOAuth2ApplicationNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for userDeleteOAuth2Application: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+UserEditHook updates a hook
+*/
+func (a *Client) UserEditHook(params *UserEditHookParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserEditHookOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewUserEditHookParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "userEditHook",
+		Method:             "PATCH",
+		PathPattern:        "/user/hooks/{id}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &UserEditHookReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*UserEditHookOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for userEditHook: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+UserGet gets a user
+*/
+func (a *Client) UserGet(params *UserGetParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserGetOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewUserGetParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "userGet",
+		Method:             "GET",
+		PathPattern:        "/users/{username}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &UserGetReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*UserGetOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for userGet: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+UserGetCurrent gets the authenticated user
+*/
+func (a *Client) UserGetCurrent(params *UserGetCurrentParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserGetCurrentOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewUserGetCurrentParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "userGetCurrent",
+		Method:             "GET",
+		PathPattern:        "/user",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &UserGetCurrentReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*UserGetCurrentOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for userGetCurrent: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+UserGetHeatmapData gets a user s heatmap
+*/
+func (a *Client) UserGetHeatmapData(params *UserGetHeatmapDataParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserGetHeatmapDataOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewUserGetHeatmapDataParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "userGetHeatmapData",
+		Method:             "GET",
+		PathPattern:        "/users/{username}/heatmap",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &UserGetHeatmapDataReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*UserGetHeatmapDataOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for userGetHeatmapData: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+UserGetHook gets a hook
+*/
+func (a *Client) UserGetHook(params *UserGetHookParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserGetHookOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewUserGetHookParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "userGetHook",
+		Method:             "GET",
+		PathPattern:        "/user/hooks/{id}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &UserGetHookReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*UserGetHookOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for userGetHook: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+UserGetOAuth2Application gets an o auth2 application
+*/
+func (a *Client) UserGetOAuth2Application(params *UserGetOAuth2ApplicationParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserGetOAuth2ApplicationOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewUserGetOAuth2ApplicationParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "userGetOAuth2Application",
+		Method:             "GET",
+		PathPattern:        "/user/applications/oauth2/{id}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &UserGetOAuth2ApplicationReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*UserGetOAuth2ApplicationOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for userGetOAuth2Application: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+UserGetOauth2Application lists the authenticated user s oauth2 applications
+*/
+func (a *Client) UserGetOauth2Application(params *UserGetOauth2ApplicationParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserGetOauth2ApplicationOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewUserGetOauth2ApplicationParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "userGetOauth2Application",
+		Method:             "GET",
+		PathPattern:        "/user/applications/oauth2",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &UserGetOauth2ApplicationReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*UserGetOauth2ApplicationOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for userGetOauth2Application: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+UserGetRunnerRegistrationToken gets an user s actions runner registration token
+*/
+func (a *Client) UserGetRunnerRegistrationToken(params *UserGetRunnerRegistrationTokenParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserGetRunnerRegistrationTokenOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewUserGetRunnerRegistrationTokenParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "userGetRunnerRegistrationToken",
+		Method:             "GET",
+		PathPattern:        "/user/actions/runners/registration-token",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &UserGetRunnerRegistrationTokenReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*UserGetRunnerRegistrationTokenOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for userGetRunnerRegistrationToken: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+UserGetStopWatches gets list of all existing stopwatches
+*/
+func (a *Client) UserGetStopWatches(params *UserGetStopWatchesParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserGetStopWatchesOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewUserGetStopWatchesParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "userGetStopWatches",
+		Method:             "GET",
+		PathPattern:        "/user/stopwatches",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &UserGetStopWatchesReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*UserGetStopWatchesOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for userGetStopWatches: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+UserGetTokens lists the authenticated user s access tokens
+*/
+func (a *Client) UserGetTokens(params *UserGetTokensParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserGetTokensOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewUserGetTokensParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "userGetTokens",
+		Method:             "GET",
+		PathPattern:        "/users/{username}/tokens",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &UserGetTokensReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*UserGetTokensOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for userGetTokens: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+UserListActivityFeeds lists a user s activity feeds
+*/
+func (a *Client) UserListActivityFeeds(params *UserListActivityFeedsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserListActivityFeedsOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewUserListActivityFeedsParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "userListActivityFeeds",
+		Method:             "GET",
+		PathPattern:        "/users/{username}/activities/feeds",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &UserListActivityFeedsReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*UserListActivityFeedsOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for userListActivityFeeds: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+UserListBlocks lists users blocked by the authenticated user
+*/
+func (a *Client) UserListBlocks(params *UserListBlocksParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserListBlocksOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewUserListBlocksParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "userListBlocks",
+		Method:             "GET",
+		PathPattern:        "/user/blocks",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &UserListBlocksReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*UserListBlocksOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for userListBlocks: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+UserListEmails lists the authenticated user s email addresses
+*/
+func (a *Client) UserListEmails(params *UserListEmailsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserListEmailsOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewUserListEmailsParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "userListEmails",
+		Method:             "GET",
+		PathPattern:        "/user/emails",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &UserListEmailsReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*UserListEmailsOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for userListEmails: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+UserListFollowers lists the given user s followers
+*/
+func (a *Client) UserListFollowers(params *UserListFollowersParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserListFollowersOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewUserListFollowersParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "userListFollowers",
+		Method:             "GET",
+		PathPattern:        "/users/{username}/followers",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &UserListFollowersReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*UserListFollowersOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for userListFollowers: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+UserListFollowing lists the users that the given user is following
+*/
+func (a *Client) UserListFollowing(params *UserListFollowingParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserListFollowingOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewUserListFollowingParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "userListFollowing",
+		Method:             "GET",
+		PathPattern:        "/users/{username}/following",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &UserListFollowingReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*UserListFollowingOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for userListFollowing: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+UserListGPGKeys lists the given user s g p g keys
+*/
+func (a *Client) UserListGPGKeys(params *UserListGPGKeysParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserListGPGKeysOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewUserListGPGKeysParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "userListGPGKeys",
+		Method:             "GET",
+		PathPattern:        "/users/{username}/gpg_keys",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &UserListGPGKeysReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*UserListGPGKeysOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for userListGPGKeys: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+UserListHooks lists the authenticated user s webhooks
+*/
+func (a *Client) UserListHooks(params *UserListHooksParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserListHooksOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewUserListHooksParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "userListHooks",
+		Method:             "GET",
+		PathPattern:        "/user/hooks",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &UserListHooksReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*UserListHooksOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for userListHooks: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+UserListKeys lists the given user s public keys
+*/
+func (a *Client) UserListKeys(params *UserListKeysParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserListKeysOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewUserListKeysParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "userListKeys",
+		Method:             "GET",
+		PathPattern:        "/users/{username}/keys",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &UserListKeysReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*UserListKeysOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for userListKeys: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+UserListRepos lists the repos owned by the given user
+*/
+func (a *Client) UserListRepos(params *UserListReposParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserListReposOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewUserListReposParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "userListRepos",
+		Method:             "GET",
+		PathPattern:        "/users/{username}/repos",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &UserListReposReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*UserListReposOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for userListRepos: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+UserListStarred thes repos that the given user has starred
+*/
+func (a *Client) UserListStarred(params *UserListStarredParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserListStarredOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewUserListStarredParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "userListStarred",
+		Method:             "GET",
+		PathPattern:        "/users/{username}/starred",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &UserListStarredReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*UserListStarredOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for userListStarred: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+UserListSubscriptions lists the repositories watched by a user
+*/
+func (a *Client) UserListSubscriptions(params *UserListSubscriptionsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserListSubscriptionsOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewUserListSubscriptionsParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "userListSubscriptions",
+		Method:             "GET",
+		PathPattern:        "/users/{username}/subscriptions",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &UserListSubscriptionsReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*UserListSubscriptionsOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for userListSubscriptions: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+UserListTeams lists all the teams a user belongs to
+*/
+func (a *Client) UserListTeams(params *UserListTeamsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserListTeamsOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewUserListTeamsParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "userListTeams",
+		Method:             "GET",
+		PathPattern:        "/user/teams",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &UserListTeamsReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*UserListTeamsOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for userListTeams: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+UserSearch searches for users
+*/
+func (a *Client) UserSearch(params *UserSearchParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserSearchOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewUserSearchParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "userSearch",
+		Method:             "GET",
+		PathPattern:        "/users/search",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &UserSearchReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*UserSearchOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for userSearch: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+UserUnblockUser unblocks a user
+*/
+func (a *Client) UserUnblockUser(params *UserUnblockUserParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserUnblockUserNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewUserUnblockUserParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "userUnblockUser",
+		Method:             "DELETE",
+		PathPattern:        "/user/blocks/{username}",
+		ProducesMediaTypes: []string{"application/json", "text/html"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &UserUnblockUserReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*UserUnblockUserNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for userUnblockUser: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+UserUpdateAvatar updates avatar
+*/
+func (a *Client) UserUpdateAvatar(params *UserUpdateAvatarParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserUpdateAvatarNoContent, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewUserUpdateAvatarParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "userUpdateAvatar",
+		Method:             "POST",
+		PathPattern:        "/user/avatar",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &UserUpdateAvatarReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*UserUpdateAvatarNoContent)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for userUpdateAvatar: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+UserUpdateOAuth2Application updates an o auth2 application this includes regenerating the client secret
+*/
+func (a *Client) UserUpdateOAuth2Application(params *UserUpdateOAuth2ApplicationParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserUpdateOAuth2ApplicationOK, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewUserUpdateOAuth2ApplicationParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "userUpdateOAuth2Application",
+		Method:             "PATCH",
+		PathPattern:        "/user/applications/oauth2/{id}",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json", "text/plain"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &UserUpdateOAuth2ApplicationReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*UserUpdateOAuth2ApplicationOK)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for userUpdateOAuth2Application: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+/*
+UserVerifyGPGKey verifies a g p g key
+*/
+func (a *Client) UserVerifyGPGKey(params *UserVerifyGPGKeyParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*UserVerifyGPGKeyCreated, error) {
+	// TODO: Validate the params before sending
+	if params == nil {
+		params = NewUserVerifyGPGKeyParams()
+	}
+	op := &runtime.ClientOperation{
+		ID:                 "userVerifyGPGKey",
+		Method:             "POST",
+		PathPattern:        "/user/gpg_key_verify",
+		ProducesMediaTypes: []string{"application/json"},
+		ConsumesMediaTypes: []string{"application/json"},
+		Schemes:            []string{"http", "https"},
+		Params:             params,
+		Reader:             &UserVerifyGPGKeyReader{formats: a.formats},
+		AuthInfo:           authInfo,
+		Context:            params.Context,
+		Client:             params.HTTPClient,
+	}
+	for _, opt := range opts {
+		opt(op)
+	}
+
+	result, err := a.transport.Submit(op)
+	if err != nil {
+		return nil, err
+	}
+	success, ok := result.(*UserVerifyGPGKeyCreated)
+	if ok {
+		return success, nil
+	}
+	// unexpected success response
+	// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
+	msg := fmt.Sprintf("unexpected success response for userVerifyGPGKey: API contract not enforced by server. Client expected to get an error, but got: %T", result)
+	panic(msg)
+}
+
+// SetTransport changes the transport on the client
+func (a *Client) SetTransport(transport runtime.ClientTransport) {
+	a.transport = transport
+}
diff --git a/bots-common/gitea-generated/client/user/user_create_hook_parameters.go b/bots-common/gitea-generated/client/user/user_create_hook_parameters.go
new file mode 100644
index 0000000..2a71cf5
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_create_hook_parameters.go
@@ -0,0 +1,150 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewUserCreateHookParams creates a new UserCreateHookParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewUserCreateHookParams() *UserCreateHookParams {
+	return &UserCreateHookParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewUserCreateHookParamsWithTimeout creates a new UserCreateHookParams object
+// with the ability to set a timeout on a request.
+func NewUserCreateHookParamsWithTimeout(timeout time.Duration) *UserCreateHookParams {
+	return &UserCreateHookParams{
+		timeout: timeout,
+	}
+}
+
+// NewUserCreateHookParamsWithContext creates a new UserCreateHookParams object
+// with the ability to set a context for a request.
+func NewUserCreateHookParamsWithContext(ctx context.Context) *UserCreateHookParams {
+	return &UserCreateHookParams{
+		Context: ctx,
+	}
+}
+
+// NewUserCreateHookParamsWithHTTPClient creates a new UserCreateHookParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewUserCreateHookParamsWithHTTPClient(client *http.Client) *UserCreateHookParams {
+	return &UserCreateHookParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+UserCreateHookParams contains all the parameters to send to the API endpoint
+
+	for the user create hook operation.
+
+	Typically these are written to a http.Request.
+*/
+type UserCreateHookParams struct {
+
+	// Body.
+	Body *models.CreateHookOption
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the user create hook params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserCreateHookParams) WithDefaults() *UserCreateHookParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the user create hook params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserCreateHookParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the user create hook params
+func (o *UserCreateHookParams) WithTimeout(timeout time.Duration) *UserCreateHookParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the user create hook params
+func (o *UserCreateHookParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the user create hook params
+func (o *UserCreateHookParams) WithContext(ctx context.Context) *UserCreateHookParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the user create hook params
+func (o *UserCreateHookParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the user create hook params
+func (o *UserCreateHookParams) WithHTTPClient(client *http.Client) *UserCreateHookParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the user create hook params
+func (o *UserCreateHookParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the user create hook params
+func (o *UserCreateHookParams) WithBody(body *models.CreateHookOption) *UserCreateHookParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the user create hook params
+func (o *UserCreateHookParams) SetBody(body *models.CreateHookOption) {
+	o.Body = body
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *UserCreateHookParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_create_hook_responses.go b/bots-common/gitea-generated/client/user/user_create_hook_responses.go
new file mode 100644
index 0000000..7d3ab80
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_create_hook_responses.go
@@ -0,0 +1,106 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// UserCreateHookReader is a Reader for the UserCreateHook structure.
+type UserCreateHookReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *UserCreateHookReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 201:
+		result := NewUserCreateHookCreated()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	default:
+		return nil, runtime.NewAPIError("[POST /user/hooks] userCreateHook", response, response.Code())
+	}
+}
+
+// NewUserCreateHookCreated creates a UserCreateHookCreated with default headers values
+func NewUserCreateHookCreated() *UserCreateHookCreated {
+	return &UserCreateHookCreated{}
+}
+
+/*
+UserCreateHookCreated describes a response with status code 201, with default header values.
+
+Hook
+*/
+type UserCreateHookCreated struct {
+	Payload *models.Hook
+}
+
+// IsSuccess returns true when this user create hook created response has a 2xx status code
+func (o *UserCreateHookCreated) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this user create hook created response has a 3xx status code
+func (o *UserCreateHookCreated) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user create hook created response has a 4xx status code
+func (o *UserCreateHookCreated) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this user create hook created response has a 5xx status code
+func (o *UserCreateHookCreated) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user create hook created response a status code equal to that given
+func (o *UserCreateHookCreated) IsCode(code int) bool {
+	return code == 201
+}
+
+// Code gets the status code for the user create hook created response
+func (o *UserCreateHookCreated) Code() int {
+	return 201
+}
+
+func (o *UserCreateHookCreated) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /user/hooks][%d] userCreateHookCreated %s", 201, payload)
+}
+
+func (o *UserCreateHookCreated) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /user/hooks][%d] userCreateHookCreated %s", 201, payload)
+}
+
+func (o *UserCreateHookCreated) GetPayload() *models.Hook {
+	return o.Payload
+}
+
+func (o *UserCreateHookCreated) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.Hook)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_create_o_auth2_application_parameters.go b/bots-common/gitea-generated/client/user/user_create_o_auth2_application_parameters.go
new file mode 100644
index 0000000..b419c94
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_create_o_auth2_application_parameters.go
@@ -0,0 +1,150 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewUserCreateOAuth2ApplicationParams creates a new UserCreateOAuth2ApplicationParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewUserCreateOAuth2ApplicationParams() *UserCreateOAuth2ApplicationParams {
+	return &UserCreateOAuth2ApplicationParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewUserCreateOAuth2ApplicationParamsWithTimeout creates a new UserCreateOAuth2ApplicationParams object
+// with the ability to set a timeout on a request.
+func NewUserCreateOAuth2ApplicationParamsWithTimeout(timeout time.Duration) *UserCreateOAuth2ApplicationParams {
+	return &UserCreateOAuth2ApplicationParams{
+		timeout: timeout,
+	}
+}
+
+// NewUserCreateOAuth2ApplicationParamsWithContext creates a new UserCreateOAuth2ApplicationParams object
+// with the ability to set a context for a request.
+func NewUserCreateOAuth2ApplicationParamsWithContext(ctx context.Context) *UserCreateOAuth2ApplicationParams {
+	return &UserCreateOAuth2ApplicationParams{
+		Context: ctx,
+	}
+}
+
+// NewUserCreateOAuth2ApplicationParamsWithHTTPClient creates a new UserCreateOAuth2ApplicationParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewUserCreateOAuth2ApplicationParamsWithHTTPClient(client *http.Client) *UserCreateOAuth2ApplicationParams {
+	return &UserCreateOAuth2ApplicationParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+UserCreateOAuth2ApplicationParams contains all the parameters to send to the API endpoint
+
+	for the user create o auth2 application operation.
+
+	Typically these are written to a http.Request.
+*/
+type UserCreateOAuth2ApplicationParams struct {
+
+	// Body.
+	Body *models.CreateOAuth2ApplicationOptions
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the user create o auth2 application params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserCreateOAuth2ApplicationParams) WithDefaults() *UserCreateOAuth2ApplicationParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the user create o auth2 application params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserCreateOAuth2ApplicationParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the user create o auth2 application params
+func (o *UserCreateOAuth2ApplicationParams) WithTimeout(timeout time.Duration) *UserCreateOAuth2ApplicationParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the user create o auth2 application params
+func (o *UserCreateOAuth2ApplicationParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the user create o auth2 application params
+func (o *UserCreateOAuth2ApplicationParams) WithContext(ctx context.Context) *UserCreateOAuth2ApplicationParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the user create o auth2 application params
+func (o *UserCreateOAuth2ApplicationParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the user create o auth2 application params
+func (o *UserCreateOAuth2ApplicationParams) WithHTTPClient(client *http.Client) *UserCreateOAuth2ApplicationParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the user create o auth2 application params
+func (o *UserCreateOAuth2ApplicationParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the user create o auth2 application params
+func (o *UserCreateOAuth2ApplicationParams) WithBody(body *models.CreateOAuth2ApplicationOptions) *UserCreateOAuth2ApplicationParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the user create o auth2 application params
+func (o *UserCreateOAuth2ApplicationParams) SetBody(body *models.CreateOAuth2ApplicationOptions) {
+	o.Body = body
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *UserCreateOAuth2ApplicationParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_create_o_auth2_application_responses.go b/bots-common/gitea-generated/client/user/user_create_o_auth2_application_responses.go
new file mode 100644
index 0000000..438f2de
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_create_o_auth2_application_responses.go
@@ -0,0 +1,184 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// UserCreateOAuth2ApplicationReader is a Reader for the UserCreateOAuth2Application structure.
+type UserCreateOAuth2ApplicationReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *UserCreateOAuth2ApplicationReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 201:
+		result := NewUserCreateOAuth2ApplicationCreated()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 400:
+		result := NewUserCreateOAuth2ApplicationBadRequest()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[POST /user/applications/oauth2] userCreateOAuth2Application", response, response.Code())
+	}
+}
+
+// NewUserCreateOAuth2ApplicationCreated creates a UserCreateOAuth2ApplicationCreated with default headers values
+func NewUserCreateOAuth2ApplicationCreated() *UserCreateOAuth2ApplicationCreated {
+	return &UserCreateOAuth2ApplicationCreated{}
+}
+
+/*
+UserCreateOAuth2ApplicationCreated describes a response with status code 201, with default header values.
+
+OAuth2Application
+*/
+type UserCreateOAuth2ApplicationCreated struct {
+	Payload *models.OAuth2Application
+}
+
+// IsSuccess returns true when this user create o auth2 application created response has a 2xx status code
+func (o *UserCreateOAuth2ApplicationCreated) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this user create o auth2 application created response has a 3xx status code
+func (o *UserCreateOAuth2ApplicationCreated) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user create o auth2 application created response has a 4xx status code
+func (o *UserCreateOAuth2ApplicationCreated) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this user create o auth2 application created response has a 5xx status code
+func (o *UserCreateOAuth2ApplicationCreated) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user create o auth2 application created response a status code equal to that given
+func (o *UserCreateOAuth2ApplicationCreated) IsCode(code int) bool {
+	return code == 201
+}
+
+// Code gets the status code for the user create o auth2 application created response
+func (o *UserCreateOAuth2ApplicationCreated) Code() int {
+	return 201
+}
+
+func (o *UserCreateOAuth2ApplicationCreated) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /user/applications/oauth2][%d] userCreateOAuth2ApplicationCreated %s", 201, payload)
+}
+
+func (o *UserCreateOAuth2ApplicationCreated) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /user/applications/oauth2][%d] userCreateOAuth2ApplicationCreated %s", 201, payload)
+}
+
+func (o *UserCreateOAuth2ApplicationCreated) GetPayload() *models.OAuth2Application {
+	return o.Payload
+}
+
+func (o *UserCreateOAuth2ApplicationCreated) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.OAuth2Application)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewUserCreateOAuth2ApplicationBadRequest creates a UserCreateOAuth2ApplicationBadRequest with default headers values
+func NewUserCreateOAuth2ApplicationBadRequest() *UserCreateOAuth2ApplicationBadRequest {
+	return &UserCreateOAuth2ApplicationBadRequest{}
+}
+
+/*
+UserCreateOAuth2ApplicationBadRequest describes a response with status code 400, with default header values.
+
+APIError is error format response
+*/
+type UserCreateOAuth2ApplicationBadRequest struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this user create o auth2 application bad request response has a 2xx status code
+func (o *UserCreateOAuth2ApplicationBadRequest) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this user create o auth2 application bad request response has a 3xx status code
+func (o *UserCreateOAuth2ApplicationBadRequest) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user create o auth2 application bad request response has a 4xx status code
+func (o *UserCreateOAuth2ApplicationBadRequest) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this user create o auth2 application bad request response has a 5xx status code
+func (o *UserCreateOAuth2ApplicationBadRequest) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user create o auth2 application bad request response a status code equal to that given
+func (o *UserCreateOAuth2ApplicationBadRequest) IsCode(code int) bool {
+	return code == 400
+}
+
+// Code gets the status code for the user create o auth2 application bad request response
+func (o *UserCreateOAuth2ApplicationBadRequest) Code() int {
+	return 400
+}
+
+func (o *UserCreateOAuth2ApplicationBadRequest) Error() string {
+	return fmt.Sprintf("[POST /user/applications/oauth2][%d] userCreateOAuth2ApplicationBadRequest", 400)
+}
+
+func (o *UserCreateOAuth2ApplicationBadRequest) String() string {
+	return fmt.Sprintf("[POST /user/applications/oauth2][%d] userCreateOAuth2ApplicationBadRequest", 400)
+}
+
+func (o *UserCreateOAuth2ApplicationBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_create_token_parameters.go b/bots-common/gitea-generated/client/user/user_create_token_parameters.go
new file mode 100644
index 0000000..6df1a52
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_create_token_parameters.go
@@ -0,0 +1,172 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewUserCreateTokenParams creates a new UserCreateTokenParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewUserCreateTokenParams() *UserCreateTokenParams {
+	return &UserCreateTokenParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewUserCreateTokenParamsWithTimeout creates a new UserCreateTokenParams object
+// with the ability to set a timeout on a request.
+func NewUserCreateTokenParamsWithTimeout(timeout time.Duration) *UserCreateTokenParams {
+	return &UserCreateTokenParams{
+		timeout: timeout,
+	}
+}
+
+// NewUserCreateTokenParamsWithContext creates a new UserCreateTokenParams object
+// with the ability to set a context for a request.
+func NewUserCreateTokenParamsWithContext(ctx context.Context) *UserCreateTokenParams {
+	return &UserCreateTokenParams{
+		Context: ctx,
+	}
+}
+
+// NewUserCreateTokenParamsWithHTTPClient creates a new UserCreateTokenParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewUserCreateTokenParamsWithHTTPClient(client *http.Client) *UserCreateTokenParams {
+	return &UserCreateTokenParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+UserCreateTokenParams contains all the parameters to send to the API endpoint
+
+	for the user create token operation.
+
+	Typically these are written to a http.Request.
+*/
+type UserCreateTokenParams struct {
+
+	// Body.
+	Body *models.CreateAccessTokenOption
+
+	/* Username.
+
+	   username of user
+	*/
+	Username string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the user create token params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserCreateTokenParams) WithDefaults() *UserCreateTokenParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the user create token params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserCreateTokenParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the user create token params
+func (o *UserCreateTokenParams) WithTimeout(timeout time.Duration) *UserCreateTokenParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the user create token params
+func (o *UserCreateTokenParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the user create token params
+func (o *UserCreateTokenParams) WithContext(ctx context.Context) *UserCreateTokenParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the user create token params
+func (o *UserCreateTokenParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the user create token params
+func (o *UserCreateTokenParams) WithHTTPClient(client *http.Client) *UserCreateTokenParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the user create token params
+func (o *UserCreateTokenParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the user create token params
+func (o *UserCreateTokenParams) WithBody(body *models.CreateAccessTokenOption) *UserCreateTokenParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the user create token params
+func (o *UserCreateTokenParams) SetBody(body *models.CreateAccessTokenOption) {
+	o.Body = body
+}
+
+// WithUsername adds the username to the user create token params
+func (o *UserCreateTokenParams) WithUsername(username string) *UserCreateTokenParams {
+	o.SetUsername(username)
+	return o
+}
+
+// SetUsername adds the username to the user create token params
+func (o *UserCreateTokenParams) SetUsername(username string) {
+	o.Username = username
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *UserCreateTokenParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	// path param username
+	if err := r.SetPathParam("username", o.Username); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_create_token_responses.go b/bots-common/gitea-generated/client/user/user_create_token_responses.go
new file mode 100644
index 0000000..7ec7763
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_create_token_responses.go
@@ -0,0 +1,262 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// UserCreateTokenReader is a Reader for the UserCreateToken structure.
+type UserCreateTokenReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *UserCreateTokenReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 201:
+		result := NewUserCreateTokenCreated()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 400:
+		result := NewUserCreateTokenBadRequest()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 403:
+		result := NewUserCreateTokenForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[POST /users/{username}/tokens] userCreateToken", response, response.Code())
+	}
+}
+
+// NewUserCreateTokenCreated creates a UserCreateTokenCreated with default headers values
+func NewUserCreateTokenCreated() *UserCreateTokenCreated {
+	return &UserCreateTokenCreated{}
+}
+
+/*
+UserCreateTokenCreated describes a response with status code 201, with default header values.
+
+AccessToken represents an API access token.
+*/
+type UserCreateTokenCreated struct {
+	Payload *models.AccessToken
+}
+
+// IsSuccess returns true when this user create token created response has a 2xx status code
+func (o *UserCreateTokenCreated) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this user create token created response has a 3xx status code
+func (o *UserCreateTokenCreated) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user create token created response has a 4xx status code
+func (o *UserCreateTokenCreated) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this user create token created response has a 5xx status code
+func (o *UserCreateTokenCreated) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user create token created response a status code equal to that given
+func (o *UserCreateTokenCreated) IsCode(code int) bool {
+	return code == 201
+}
+
+// Code gets the status code for the user create token created response
+func (o *UserCreateTokenCreated) Code() int {
+	return 201
+}
+
+func (o *UserCreateTokenCreated) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /users/{username}/tokens][%d] userCreateTokenCreated %s", 201, payload)
+}
+
+func (o *UserCreateTokenCreated) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /users/{username}/tokens][%d] userCreateTokenCreated %s", 201, payload)
+}
+
+func (o *UserCreateTokenCreated) GetPayload() *models.AccessToken {
+	return o.Payload
+}
+
+func (o *UserCreateTokenCreated) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.AccessToken)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewUserCreateTokenBadRequest creates a UserCreateTokenBadRequest with default headers values
+func NewUserCreateTokenBadRequest() *UserCreateTokenBadRequest {
+	return &UserCreateTokenBadRequest{}
+}
+
+/*
+UserCreateTokenBadRequest describes a response with status code 400, with default header values.
+
+APIError is error format response
+*/
+type UserCreateTokenBadRequest struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this user create token bad request response has a 2xx status code
+func (o *UserCreateTokenBadRequest) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this user create token bad request response has a 3xx status code
+func (o *UserCreateTokenBadRequest) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user create token bad request response has a 4xx status code
+func (o *UserCreateTokenBadRequest) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this user create token bad request response has a 5xx status code
+func (o *UserCreateTokenBadRequest) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user create token bad request response a status code equal to that given
+func (o *UserCreateTokenBadRequest) IsCode(code int) bool {
+	return code == 400
+}
+
+// Code gets the status code for the user create token bad request response
+func (o *UserCreateTokenBadRequest) Code() int {
+	return 400
+}
+
+func (o *UserCreateTokenBadRequest) Error() string {
+	return fmt.Sprintf("[POST /users/{username}/tokens][%d] userCreateTokenBadRequest", 400)
+}
+
+func (o *UserCreateTokenBadRequest) String() string {
+	return fmt.Sprintf("[POST /users/{username}/tokens][%d] userCreateTokenBadRequest", 400)
+}
+
+func (o *UserCreateTokenBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewUserCreateTokenForbidden creates a UserCreateTokenForbidden with default headers values
+func NewUserCreateTokenForbidden() *UserCreateTokenForbidden {
+	return &UserCreateTokenForbidden{}
+}
+
+/*
+UserCreateTokenForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type UserCreateTokenForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this user create token forbidden response has a 2xx status code
+func (o *UserCreateTokenForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this user create token forbidden response has a 3xx status code
+func (o *UserCreateTokenForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user create token forbidden response has a 4xx status code
+func (o *UserCreateTokenForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this user create token forbidden response has a 5xx status code
+func (o *UserCreateTokenForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user create token forbidden response a status code equal to that given
+func (o *UserCreateTokenForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the user create token forbidden response
+func (o *UserCreateTokenForbidden) Code() int {
+	return 403
+}
+
+func (o *UserCreateTokenForbidden) Error() string {
+	return fmt.Sprintf("[POST /users/{username}/tokens][%d] userCreateTokenForbidden", 403)
+}
+
+func (o *UserCreateTokenForbidden) String() string {
+	return fmt.Sprintf("[POST /users/{username}/tokens][%d] userCreateTokenForbidden", 403)
+}
+
+func (o *UserCreateTokenForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_current_check_following_parameters.go b/bots-common/gitea-generated/client/user/user_current_check_following_parameters.go
new file mode 100644
index 0000000..9608e9c
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_current_check_following_parameters.go
@@ -0,0 +1,151 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewUserCurrentCheckFollowingParams creates a new UserCurrentCheckFollowingParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewUserCurrentCheckFollowingParams() *UserCurrentCheckFollowingParams {
+	return &UserCurrentCheckFollowingParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewUserCurrentCheckFollowingParamsWithTimeout creates a new UserCurrentCheckFollowingParams object
+// with the ability to set a timeout on a request.
+func NewUserCurrentCheckFollowingParamsWithTimeout(timeout time.Duration) *UserCurrentCheckFollowingParams {
+	return &UserCurrentCheckFollowingParams{
+		timeout: timeout,
+	}
+}
+
+// NewUserCurrentCheckFollowingParamsWithContext creates a new UserCurrentCheckFollowingParams object
+// with the ability to set a context for a request.
+func NewUserCurrentCheckFollowingParamsWithContext(ctx context.Context) *UserCurrentCheckFollowingParams {
+	return &UserCurrentCheckFollowingParams{
+		Context: ctx,
+	}
+}
+
+// NewUserCurrentCheckFollowingParamsWithHTTPClient creates a new UserCurrentCheckFollowingParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewUserCurrentCheckFollowingParamsWithHTTPClient(client *http.Client) *UserCurrentCheckFollowingParams {
+	return &UserCurrentCheckFollowingParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+UserCurrentCheckFollowingParams contains all the parameters to send to the API endpoint
+
+	for the user current check following operation.
+
+	Typically these are written to a http.Request.
+*/
+type UserCurrentCheckFollowingParams struct {
+
+	/* Username.
+
+	   username of followed user
+	*/
+	Username string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the user current check following params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserCurrentCheckFollowingParams) WithDefaults() *UserCurrentCheckFollowingParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the user current check following params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserCurrentCheckFollowingParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the user current check following params
+func (o *UserCurrentCheckFollowingParams) WithTimeout(timeout time.Duration) *UserCurrentCheckFollowingParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the user current check following params
+func (o *UserCurrentCheckFollowingParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the user current check following params
+func (o *UserCurrentCheckFollowingParams) WithContext(ctx context.Context) *UserCurrentCheckFollowingParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the user current check following params
+func (o *UserCurrentCheckFollowingParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the user current check following params
+func (o *UserCurrentCheckFollowingParams) WithHTTPClient(client *http.Client) *UserCurrentCheckFollowingParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the user current check following params
+func (o *UserCurrentCheckFollowingParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithUsername adds the username to the user current check following params
+func (o *UserCurrentCheckFollowingParams) WithUsername(username string) *UserCurrentCheckFollowingParams {
+	o.SetUsername(username)
+	return o
+}
+
+// SetUsername adds the username to the user current check following params
+func (o *UserCurrentCheckFollowingParams) SetUsername(username string) {
+	o.Username = username
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *UserCurrentCheckFollowingParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param username
+	if err := r.SetPathParam("username", o.Username); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_current_check_following_responses.go b/bots-common/gitea-generated/client/user/user_current_check_following_responses.go
new file mode 100644
index 0000000..67a8ff5
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_current_check_following_responses.go
@@ -0,0 +1,150 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// UserCurrentCheckFollowingReader is a Reader for the UserCurrentCheckFollowing structure.
+type UserCurrentCheckFollowingReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *UserCurrentCheckFollowingReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewUserCurrentCheckFollowingNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewUserCurrentCheckFollowingNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /user/following/{username}] userCurrentCheckFollowing", response, response.Code())
+	}
+}
+
+// NewUserCurrentCheckFollowingNoContent creates a UserCurrentCheckFollowingNoContent with default headers values
+func NewUserCurrentCheckFollowingNoContent() *UserCurrentCheckFollowingNoContent {
+	return &UserCurrentCheckFollowingNoContent{}
+}
+
+/*
+UserCurrentCheckFollowingNoContent describes a response with status code 204, with default header values.
+
+APIEmpty is an empty response
+*/
+type UserCurrentCheckFollowingNoContent struct {
+}
+
+// IsSuccess returns true when this user current check following no content response has a 2xx status code
+func (o *UserCurrentCheckFollowingNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this user current check following no content response has a 3xx status code
+func (o *UserCurrentCheckFollowingNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user current check following no content response has a 4xx status code
+func (o *UserCurrentCheckFollowingNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this user current check following no content response has a 5xx status code
+func (o *UserCurrentCheckFollowingNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user current check following no content response a status code equal to that given
+func (o *UserCurrentCheckFollowingNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the user current check following no content response
+func (o *UserCurrentCheckFollowingNoContent) Code() int {
+	return 204
+}
+
+func (o *UserCurrentCheckFollowingNoContent) Error() string {
+	return fmt.Sprintf("[GET /user/following/{username}][%d] userCurrentCheckFollowingNoContent", 204)
+}
+
+func (o *UserCurrentCheckFollowingNoContent) String() string {
+	return fmt.Sprintf("[GET /user/following/{username}][%d] userCurrentCheckFollowingNoContent", 204)
+}
+
+func (o *UserCurrentCheckFollowingNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewUserCurrentCheckFollowingNotFound creates a UserCurrentCheckFollowingNotFound with default headers values
+func NewUserCurrentCheckFollowingNotFound() *UserCurrentCheckFollowingNotFound {
+	return &UserCurrentCheckFollowingNotFound{}
+}
+
+/*
+UserCurrentCheckFollowingNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type UserCurrentCheckFollowingNotFound struct {
+}
+
+// IsSuccess returns true when this user current check following not found response has a 2xx status code
+func (o *UserCurrentCheckFollowingNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this user current check following not found response has a 3xx status code
+func (o *UserCurrentCheckFollowingNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user current check following not found response has a 4xx status code
+func (o *UserCurrentCheckFollowingNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this user current check following not found response has a 5xx status code
+func (o *UserCurrentCheckFollowingNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user current check following not found response a status code equal to that given
+func (o *UserCurrentCheckFollowingNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the user current check following not found response
+func (o *UserCurrentCheckFollowingNotFound) Code() int {
+	return 404
+}
+
+func (o *UserCurrentCheckFollowingNotFound) Error() string {
+	return fmt.Sprintf("[GET /user/following/{username}][%d] userCurrentCheckFollowingNotFound", 404)
+}
+
+func (o *UserCurrentCheckFollowingNotFound) String() string {
+	return fmt.Sprintf("[GET /user/following/{username}][%d] userCurrentCheckFollowingNotFound", 404)
+}
+
+func (o *UserCurrentCheckFollowingNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_current_check_starring_parameters.go b/bots-common/gitea-generated/client/user/user_current_check_starring_parameters.go
new file mode 100644
index 0000000..6f995b0
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_current_check_starring_parameters.go
@@ -0,0 +1,173 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewUserCurrentCheckStarringParams creates a new UserCurrentCheckStarringParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewUserCurrentCheckStarringParams() *UserCurrentCheckStarringParams {
+	return &UserCurrentCheckStarringParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewUserCurrentCheckStarringParamsWithTimeout creates a new UserCurrentCheckStarringParams object
+// with the ability to set a timeout on a request.
+func NewUserCurrentCheckStarringParamsWithTimeout(timeout time.Duration) *UserCurrentCheckStarringParams {
+	return &UserCurrentCheckStarringParams{
+		timeout: timeout,
+	}
+}
+
+// NewUserCurrentCheckStarringParamsWithContext creates a new UserCurrentCheckStarringParams object
+// with the ability to set a context for a request.
+func NewUserCurrentCheckStarringParamsWithContext(ctx context.Context) *UserCurrentCheckStarringParams {
+	return &UserCurrentCheckStarringParams{
+		Context: ctx,
+	}
+}
+
+// NewUserCurrentCheckStarringParamsWithHTTPClient creates a new UserCurrentCheckStarringParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewUserCurrentCheckStarringParamsWithHTTPClient(client *http.Client) *UserCurrentCheckStarringParams {
+	return &UserCurrentCheckStarringParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+UserCurrentCheckStarringParams contains all the parameters to send to the API endpoint
+
+	for the user current check starring operation.
+
+	Typically these are written to a http.Request.
+*/
+type UserCurrentCheckStarringParams struct {
+
+	/* Owner.
+
+	   owner of the repo
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the user current check starring params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserCurrentCheckStarringParams) WithDefaults() *UserCurrentCheckStarringParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the user current check starring params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserCurrentCheckStarringParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the user current check starring params
+func (o *UserCurrentCheckStarringParams) WithTimeout(timeout time.Duration) *UserCurrentCheckStarringParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the user current check starring params
+func (o *UserCurrentCheckStarringParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the user current check starring params
+func (o *UserCurrentCheckStarringParams) WithContext(ctx context.Context) *UserCurrentCheckStarringParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the user current check starring params
+func (o *UserCurrentCheckStarringParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the user current check starring params
+func (o *UserCurrentCheckStarringParams) WithHTTPClient(client *http.Client) *UserCurrentCheckStarringParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the user current check starring params
+func (o *UserCurrentCheckStarringParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithOwner adds the owner to the user current check starring params
+func (o *UserCurrentCheckStarringParams) WithOwner(owner string) *UserCurrentCheckStarringParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the user current check starring params
+func (o *UserCurrentCheckStarringParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the user current check starring params
+func (o *UserCurrentCheckStarringParams) WithRepo(repo string) *UserCurrentCheckStarringParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the user current check starring params
+func (o *UserCurrentCheckStarringParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *UserCurrentCheckStarringParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_current_check_starring_responses.go b/bots-common/gitea-generated/client/user/user_current_check_starring_responses.go
new file mode 100644
index 0000000..72cb1cb
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_current_check_starring_responses.go
@@ -0,0 +1,150 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// UserCurrentCheckStarringReader is a Reader for the UserCurrentCheckStarring structure.
+type UserCurrentCheckStarringReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *UserCurrentCheckStarringReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewUserCurrentCheckStarringNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewUserCurrentCheckStarringNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /user/starred/{owner}/{repo}] userCurrentCheckStarring", response, response.Code())
+	}
+}
+
+// NewUserCurrentCheckStarringNoContent creates a UserCurrentCheckStarringNoContent with default headers values
+func NewUserCurrentCheckStarringNoContent() *UserCurrentCheckStarringNoContent {
+	return &UserCurrentCheckStarringNoContent{}
+}
+
+/*
+UserCurrentCheckStarringNoContent describes a response with status code 204, with default header values.
+
+APIEmpty is an empty response
+*/
+type UserCurrentCheckStarringNoContent struct {
+}
+
+// IsSuccess returns true when this user current check starring no content response has a 2xx status code
+func (o *UserCurrentCheckStarringNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this user current check starring no content response has a 3xx status code
+func (o *UserCurrentCheckStarringNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user current check starring no content response has a 4xx status code
+func (o *UserCurrentCheckStarringNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this user current check starring no content response has a 5xx status code
+func (o *UserCurrentCheckStarringNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user current check starring no content response a status code equal to that given
+func (o *UserCurrentCheckStarringNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the user current check starring no content response
+func (o *UserCurrentCheckStarringNoContent) Code() int {
+	return 204
+}
+
+func (o *UserCurrentCheckStarringNoContent) Error() string {
+	return fmt.Sprintf("[GET /user/starred/{owner}/{repo}][%d] userCurrentCheckStarringNoContent", 204)
+}
+
+func (o *UserCurrentCheckStarringNoContent) String() string {
+	return fmt.Sprintf("[GET /user/starred/{owner}/{repo}][%d] userCurrentCheckStarringNoContent", 204)
+}
+
+func (o *UserCurrentCheckStarringNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewUserCurrentCheckStarringNotFound creates a UserCurrentCheckStarringNotFound with default headers values
+func NewUserCurrentCheckStarringNotFound() *UserCurrentCheckStarringNotFound {
+	return &UserCurrentCheckStarringNotFound{}
+}
+
+/*
+UserCurrentCheckStarringNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type UserCurrentCheckStarringNotFound struct {
+}
+
+// IsSuccess returns true when this user current check starring not found response has a 2xx status code
+func (o *UserCurrentCheckStarringNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this user current check starring not found response has a 3xx status code
+func (o *UserCurrentCheckStarringNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user current check starring not found response has a 4xx status code
+func (o *UserCurrentCheckStarringNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this user current check starring not found response has a 5xx status code
+func (o *UserCurrentCheckStarringNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user current check starring not found response a status code equal to that given
+func (o *UserCurrentCheckStarringNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the user current check starring not found response
+func (o *UserCurrentCheckStarringNotFound) Code() int {
+	return 404
+}
+
+func (o *UserCurrentCheckStarringNotFound) Error() string {
+	return fmt.Sprintf("[GET /user/starred/{owner}/{repo}][%d] userCurrentCheckStarringNotFound", 404)
+}
+
+func (o *UserCurrentCheckStarringNotFound) String() string {
+	return fmt.Sprintf("[GET /user/starred/{owner}/{repo}][%d] userCurrentCheckStarringNotFound", 404)
+}
+
+func (o *UserCurrentCheckStarringNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_current_delete_follow_parameters.go b/bots-common/gitea-generated/client/user/user_current_delete_follow_parameters.go
new file mode 100644
index 0000000..311aab9
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_current_delete_follow_parameters.go
@@ -0,0 +1,151 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewUserCurrentDeleteFollowParams creates a new UserCurrentDeleteFollowParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewUserCurrentDeleteFollowParams() *UserCurrentDeleteFollowParams {
+	return &UserCurrentDeleteFollowParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewUserCurrentDeleteFollowParamsWithTimeout creates a new UserCurrentDeleteFollowParams object
+// with the ability to set a timeout on a request.
+func NewUserCurrentDeleteFollowParamsWithTimeout(timeout time.Duration) *UserCurrentDeleteFollowParams {
+	return &UserCurrentDeleteFollowParams{
+		timeout: timeout,
+	}
+}
+
+// NewUserCurrentDeleteFollowParamsWithContext creates a new UserCurrentDeleteFollowParams object
+// with the ability to set a context for a request.
+func NewUserCurrentDeleteFollowParamsWithContext(ctx context.Context) *UserCurrentDeleteFollowParams {
+	return &UserCurrentDeleteFollowParams{
+		Context: ctx,
+	}
+}
+
+// NewUserCurrentDeleteFollowParamsWithHTTPClient creates a new UserCurrentDeleteFollowParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewUserCurrentDeleteFollowParamsWithHTTPClient(client *http.Client) *UserCurrentDeleteFollowParams {
+	return &UserCurrentDeleteFollowParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+UserCurrentDeleteFollowParams contains all the parameters to send to the API endpoint
+
+	for the user current delete follow operation.
+
+	Typically these are written to a http.Request.
+*/
+type UserCurrentDeleteFollowParams struct {
+
+	/* Username.
+
+	   username of user to unfollow
+	*/
+	Username string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the user current delete follow params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserCurrentDeleteFollowParams) WithDefaults() *UserCurrentDeleteFollowParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the user current delete follow params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserCurrentDeleteFollowParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the user current delete follow params
+func (o *UserCurrentDeleteFollowParams) WithTimeout(timeout time.Duration) *UserCurrentDeleteFollowParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the user current delete follow params
+func (o *UserCurrentDeleteFollowParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the user current delete follow params
+func (o *UserCurrentDeleteFollowParams) WithContext(ctx context.Context) *UserCurrentDeleteFollowParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the user current delete follow params
+func (o *UserCurrentDeleteFollowParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the user current delete follow params
+func (o *UserCurrentDeleteFollowParams) WithHTTPClient(client *http.Client) *UserCurrentDeleteFollowParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the user current delete follow params
+func (o *UserCurrentDeleteFollowParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithUsername adds the username to the user current delete follow params
+func (o *UserCurrentDeleteFollowParams) WithUsername(username string) *UserCurrentDeleteFollowParams {
+	o.SetUsername(username)
+	return o
+}
+
+// SetUsername adds the username to the user current delete follow params
+func (o *UserCurrentDeleteFollowParams) SetUsername(username string) {
+	o.Username = username
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *UserCurrentDeleteFollowParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param username
+	if err := r.SetPathParam("username", o.Username); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_current_delete_follow_responses.go b/bots-common/gitea-generated/client/user/user_current_delete_follow_responses.go
new file mode 100644
index 0000000..5b1b4f9
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_current_delete_follow_responses.go
@@ -0,0 +1,150 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// UserCurrentDeleteFollowReader is a Reader for the UserCurrentDeleteFollow structure.
+type UserCurrentDeleteFollowReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *UserCurrentDeleteFollowReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewUserCurrentDeleteFollowNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewUserCurrentDeleteFollowNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[DELETE /user/following/{username}] userCurrentDeleteFollow", response, response.Code())
+	}
+}
+
+// NewUserCurrentDeleteFollowNoContent creates a UserCurrentDeleteFollowNoContent with default headers values
+func NewUserCurrentDeleteFollowNoContent() *UserCurrentDeleteFollowNoContent {
+	return &UserCurrentDeleteFollowNoContent{}
+}
+
+/*
+UserCurrentDeleteFollowNoContent describes a response with status code 204, with default header values.
+
+APIEmpty is an empty response
+*/
+type UserCurrentDeleteFollowNoContent struct {
+}
+
+// IsSuccess returns true when this user current delete follow no content response has a 2xx status code
+func (o *UserCurrentDeleteFollowNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this user current delete follow no content response has a 3xx status code
+func (o *UserCurrentDeleteFollowNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user current delete follow no content response has a 4xx status code
+func (o *UserCurrentDeleteFollowNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this user current delete follow no content response has a 5xx status code
+func (o *UserCurrentDeleteFollowNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user current delete follow no content response a status code equal to that given
+func (o *UserCurrentDeleteFollowNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the user current delete follow no content response
+func (o *UserCurrentDeleteFollowNoContent) Code() int {
+	return 204
+}
+
+func (o *UserCurrentDeleteFollowNoContent) Error() string {
+	return fmt.Sprintf("[DELETE /user/following/{username}][%d] userCurrentDeleteFollowNoContent", 204)
+}
+
+func (o *UserCurrentDeleteFollowNoContent) String() string {
+	return fmt.Sprintf("[DELETE /user/following/{username}][%d] userCurrentDeleteFollowNoContent", 204)
+}
+
+func (o *UserCurrentDeleteFollowNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewUserCurrentDeleteFollowNotFound creates a UserCurrentDeleteFollowNotFound with default headers values
+func NewUserCurrentDeleteFollowNotFound() *UserCurrentDeleteFollowNotFound {
+	return &UserCurrentDeleteFollowNotFound{}
+}
+
+/*
+UserCurrentDeleteFollowNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type UserCurrentDeleteFollowNotFound struct {
+}
+
+// IsSuccess returns true when this user current delete follow not found response has a 2xx status code
+func (o *UserCurrentDeleteFollowNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this user current delete follow not found response has a 3xx status code
+func (o *UserCurrentDeleteFollowNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user current delete follow not found response has a 4xx status code
+func (o *UserCurrentDeleteFollowNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this user current delete follow not found response has a 5xx status code
+func (o *UserCurrentDeleteFollowNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user current delete follow not found response a status code equal to that given
+func (o *UserCurrentDeleteFollowNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the user current delete follow not found response
+func (o *UserCurrentDeleteFollowNotFound) Code() int {
+	return 404
+}
+
+func (o *UserCurrentDeleteFollowNotFound) Error() string {
+	return fmt.Sprintf("[DELETE /user/following/{username}][%d] userCurrentDeleteFollowNotFound", 404)
+}
+
+func (o *UserCurrentDeleteFollowNotFound) String() string {
+	return fmt.Sprintf("[DELETE /user/following/{username}][%d] userCurrentDeleteFollowNotFound", 404)
+}
+
+func (o *UserCurrentDeleteFollowNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_current_delete_g_p_g_key_parameters.go b/bots-common/gitea-generated/client/user/user_current_delete_g_p_g_key_parameters.go
new file mode 100644
index 0000000..a76af5b
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_current_delete_g_p_g_key_parameters.go
@@ -0,0 +1,154 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewUserCurrentDeleteGPGKeyParams creates a new UserCurrentDeleteGPGKeyParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewUserCurrentDeleteGPGKeyParams() *UserCurrentDeleteGPGKeyParams {
+	return &UserCurrentDeleteGPGKeyParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewUserCurrentDeleteGPGKeyParamsWithTimeout creates a new UserCurrentDeleteGPGKeyParams object
+// with the ability to set a timeout on a request.
+func NewUserCurrentDeleteGPGKeyParamsWithTimeout(timeout time.Duration) *UserCurrentDeleteGPGKeyParams {
+	return &UserCurrentDeleteGPGKeyParams{
+		timeout: timeout,
+	}
+}
+
+// NewUserCurrentDeleteGPGKeyParamsWithContext creates a new UserCurrentDeleteGPGKeyParams object
+// with the ability to set a context for a request.
+func NewUserCurrentDeleteGPGKeyParamsWithContext(ctx context.Context) *UserCurrentDeleteGPGKeyParams {
+	return &UserCurrentDeleteGPGKeyParams{
+		Context: ctx,
+	}
+}
+
+// NewUserCurrentDeleteGPGKeyParamsWithHTTPClient creates a new UserCurrentDeleteGPGKeyParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewUserCurrentDeleteGPGKeyParamsWithHTTPClient(client *http.Client) *UserCurrentDeleteGPGKeyParams {
+	return &UserCurrentDeleteGPGKeyParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+UserCurrentDeleteGPGKeyParams contains all the parameters to send to the API endpoint
+
+	for the user current delete g p g key operation.
+
+	Typically these are written to a http.Request.
+*/
+type UserCurrentDeleteGPGKeyParams struct {
+
+	/* ID.
+
+	   id of key to delete
+
+	   Format: int64
+	*/
+	ID int64
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the user current delete g p g key params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserCurrentDeleteGPGKeyParams) WithDefaults() *UserCurrentDeleteGPGKeyParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the user current delete g p g key params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserCurrentDeleteGPGKeyParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the user current delete g p g key params
+func (o *UserCurrentDeleteGPGKeyParams) WithTimeout(timeout time.Duration) *UserCurrentDeleteGPGKeyParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the user current delete g p g key params
+func (o *UserCurrentDeleteGPGKeyParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the user current delete g p g key params
+func (o *UserCurrentDeleteGPGKeyParams) WithContext(ctx context.Context) *UserCurrentDeleteGPGKeyParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the user current delete g p g key params
+func (o *UserCurrentDeleteGPGKeyParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the user current delete g p g key params
+func (o *UserCurrentDeleteGPGKeyParams) WithHTTPClient(client *http.Client) *UserCurrentDeleteGPGKeyParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the user current delete g p g key params
+func (o *UserCurrentDeleteGPGKeyParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithID adds the id to the user current delete g p g key params
+func (o *UserCurrentDeleteGPGKeyParams) WithID(id int64) *UserCurrentDeleteGPGKeyParams {
+	o.SetID(id)
+	return o
+}
+
+// SetID adds the id to the user current delete g p g key params
+func (o *UserCurrentDeleteGPGKeyParams) SetID(id int64) {
+	o.ID = id
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *UserCurrentDeleteGPGKeyParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param id
+	if err := r.SetPathParam("id", swag.FormatInt64(o.ID)); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_current_delete_g_p_g_key_responses.go b/bots-common/gitea-generated/client/user/user_current_delete_g_p_g_key_responses.go
new file mode 100644
index 0000000..7ccdb54
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_current_delete_g_p_g_key_responses.go
@@ -0,0 +1,228 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// UserCurrentDeleteGPGKeyReader is a Reader for the UserCurrentDeleteGPGKey structure.
+type UserCurrentDeleteGPGKeyReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *UserCurrentDeleteGPGKeyReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewUserCurrentDeleteGPGKeyNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 403:
+		result := NewUserCurrentDeleteGPGKeyForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewUserCurrentDeleteGPGKeyNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[DELETE /user/gpg_keys/{id}] userCurrentDeleteGPGKey", response, response.Code())
+	}
+}
+
+// NewUserCurrentDeleteGPGKeyNoContent creates a UserCurrentDeleteGPGKeyNoContent with default headers values
+func NewUserCurrentDeleteGPGKeyNoContent() *UserCurrentDeleteGPGKeyNoContent {
+	return &UserCurrentDeleteGPGKeyNoContent{}
+}
+
+/*
+UserCurrentDeleteGPGKeyNoContent describes a response with status code 204, with default header values.
+
+APIEmpty is an empty response
+*/
+type UserCurrentDeleteGPGKeyNoContent struct {
+}
+
+// IsSuccess returns true when this user current delete g p g key no content response has a 2xx status code
+func (o *UserCurrentDeleteGPGKeyNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this user current delete g p g key no content response has a 3xx status code
+func (o *UserCurrentDeleteGPGKeyNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user current delete g p g key no content response has a 4xx status code
+func (o *UserCurrentDeleteGPGKeyNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this user current delete g p g key no content response has a 5xx status code
+func (o *UserCurrentDeleteGPGKeyNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user current delete g p g key no content response a status code equal to that given
+func (o *UserCurrentDeleteGPGKeyNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the user current delete g p g key no content response
+func (o *UserCurrentDeleteGPGKeyNoContent) Code() int {
+	return 204
+}
+
+func (o *UserCurrentDeleteGPGKeyNoContent) Error() string {
+	return fmt.Sprintf("[DELETE /user/gpg_keys/{id}][%d] userCurrentDeleteGPGKeyNoContent", 204)
+}
+
+func (o *UserCurrentDeleteGPGKeyNoContent) String() string {
+	return fmt.Sprintf("[DELETE /user/gpg_keys/{id}][%d] userCurrentDeleteGPGKeyNoContent", 204)
+}
+
+func (o *UserCurrentDeleteGPGKeyNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewUserCurrentDeleteGPGKeyForbidden creates a UserCurrentDeleteGPGKeyForbidden with default headers values
+func NewUserCurrentDeleteGPGKeyForbidden() *UserCurrentDeleteGPGKeyForbidden {
+	return &UserCurrentDeleteGPGKeyForbidden{}
+}
+
+/*
+UserCurrentDeleteGPGKeyForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type UserCurrentDeleteGPGKeyForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this user current delete g p g key forbidden response has a 2xx status code
+func (o *UserCurrentDeleteGPGKeyForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this user current delete g p g key forbidden response has a 3xx status code
+func (o *UserCurrentDeleteGPGKeyForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user current delete g p g key forbidden response has a 4xx status code
+func (o *UserCurrentDeleteGPGKeyForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this user current delete g p g key forbidden response has a 5xx status code
+func (o *UserCurrentDeleteGPGKeyForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user current delete g p g key forbidden response a status code equal to that given
+func (o *UserCurrentDeleteGPGKeyForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the user current delete g p g key forbidden response
+func (o *UserCurrentDeleteGPGKeyForbidden) Code() int {
+	return 403
+}
+
+func (o *UserCurrentDeleteGPGKeyForbidden) Error() string {
+	return fmt.Sprintf("[DELETE /user/gpg_keys/{id}][%d] userCurrentDeleteGPGKeyForbidden", 403)
+}
+
+func (o *UserCurrentDeleteGPGKeyForbidden) String() string {
+	return fmt.Sprintf("[DELETE /user/gpg_keys/{id}][%d] userCurrentDeleteGPGKeyForbidden", 403)
+}
+
+func (o *UserCurrentDeleteGPGKeyForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewUserCurrentDeleteGPGKeyNotFound creates a UserCurrentDeleteGPGKeyNotFound with default headers values
+func NewUserCurrentDeleteGPGKeyNotFound() *UserCurrentDeleteGPGKeyNotFound {
+	return &UserCurrentDeleteGPGKeyNotFound{}
+}
+
+/*
+UserCurrentDeleteGPGKeyNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type UserCurrentDeleteGPGKeyNotFound struct {
+}
+
+// IsSuccess returns true when this user current delete g p g key not found response has a 2xx status code
+func (o *UserCurrentDeleteGPGKeyNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this user current delete g p g key not found response has a 3xx status code
+func (o *UserCurrentDeleteGPGKeyNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user current delete g p g key not found response has a 4xx status code
+func (o *UserCurrentDeleteGPGKeyNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this user current delete g p g key not found response has a 5xx status code
+func (o *UserCurrentDeleteGPGKeyNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user current delete g p g key not found response a status code equal to that given
+func (o *UserCurrentDeleteGPGKeyNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the user current delete g p g key not found response
+func (o *UserCurrentDeleteGPGKeyNotFound) Code() int {
+	return 404
+}
+
+func (o *UserCurrentDeleteGPGKeyNotFound) Error() string {
+	return fmt.Sprintf("[DELETE /user/gpg_keys/{id}][%d] userCurrentDeleteGPGKeyNotFound", 404)
+}
+
+func (o *UserCurrentDeleteGPGKeyNotFound) String() string {
+	return fmt.Sprintf("[DELETE /user/gpg_keys/{id}][%d] userCurrentDeleteGPGKeyNotFound", 404)
+}
+
+func (o *UserCurrentDeleteGPGKeyNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_current_delete_key_parameters.go b/bots-common/gitea-generated/client/user/user_current_delete_key_parameters.go
new file mode 100644
index 0000000..54f55fc
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_current_delete_key_parameters.go
@@ -0,0 +1,154 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewUserCurrentDeleteKeyParams creates a new UserCurrentDeleteKeyParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewUserCurrentDeleteKeyParams() *UserCurrentDeleteKeyParams {
+	return &UserCurrentDeleteKeyParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewUserCurrentDeleteKeyParamsWithTimeout creates a new UserCurrentDeleteKeyParams object
+// with the ability to set a timeout on a request.
+func NewUserCurrentDeleteKeyParamsWithTimeout(timeout time.Duration) *UserCurrentDeleteKeyParams {
+	return &UserCurrentDeleteKeyParams{
+		timeout: timeout,
+	}
+}
+
+// NewUserCurrentDeleteKeyParamsWithContext creates a new UserCurrentDeleteKeyParams object
+// with the ability to set a context for a request.
+func NewUserCurrentDeleteKeyParamsWithContext(ctx context.Context) *UserCurrentDeleteKeyParams {
+	return &UserCurrentDeleteKeyParams{
+		Context: ctx,
+	}
+}
+
+// NewUserCurrentDeleteKeyParamsWithHTTPClient creates a new UserCurrentDeleteKeyParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewUserCurrentDeleteKeyParamsWithHTTPClient(client *http.Client) *UserCurrentDeleteKeyParams {
+	return &UserCurrentDeleteKeyParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+UserCurrentDeleteKeyParams contains all the parameters to send to the API endpoint
+
+	for the user current delete key operation.
+
+	Typically these are written to a http.Request.
+*/
+type UserCurrentDeleteKeyParams struct {
+
+	/* ID.
+
+	   id of key to delete
+
+	   Format: int64
+	*/
+	ID int64
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the user current delete key params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserCurrentDeleteKeyParams) WithDefaults() *UserCurrentDeleteKeyParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the user current delete key params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserCurrentDeleteKeyParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the user current delete key params
+func (o *UserCurrentDeleteKeyParams) WithTimeout(timeout time.Duration) *UserCurrentDeleteKeyParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the user current delete key params
+func (o *UserCurrentDeleteKeyParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the user current delete key params
+func (o *UserCurrentDeleteKeyParams) WithContext(ctx context.Context) *UserCurrentDeleteKeyParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the user current delete key params
+func (o *UserCurrentDeleteKeyParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the user current delete key params
+func (o *UserCurrentDeleteKeyParams) WithHTTPClient(client *http.Client) *UserCurrentDeleteKeyParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the user current delete key params
+func (o *UserCurrentDeleteKeyParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithID adds the id to the user current delete key params
+func (o *UserCurrentDeleteKeyParams) WithID(id int64) *UserCurrentDeleteKeyParams {
+	o.SetID(id)
+	return o
+}
+
+// SetID adds the id to the user current delete key params
+func (o *UserCurrentDeleteKeyParams) SetID(id int64) {
+	o.ID = id
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *UserCurrentDeleteKeyParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param id
+	if err := r.SetPathParam("id", swag.FormatInt64(o.ID)); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_current_delete_key_responses.go b/bots-common/gitea-generated/client/user/user_current_delete_key_responses.go
new file mode 100644
index 0000000..0277a8d
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_current_delete_key_responses.go
@@ -0,0 +1,228 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// UserCurrentDeleteKeyReader is a Reader for the UserCurrentDeleteKey structure.
+type UserCurrentDeleteKeyReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *UserCurrentDeleteKeyReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewUserCurrentDeleteKeyNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 403:
+		result := NewUserCurrentDeleteKeyForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewUserCurrentDeleteKeyNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[DELETE /user/keys/{id}] userCurrentDeleteKey", response, response.Code())
+	}
+}
+
+// NewUserCurrentDeleteKeyNoContent creates a UserCurrentDeleteKeyNoContent with default headers values
+func NewUserCurrentDeleteKeyNoContent() *UserCurrentDeleteKeyNoContent {
+	return &UserCurrentDeleteKeyNoContent{}
+}
+
+/*
+UserCurrentDeleteKeyNoContent describes a response with status code 204, with default header values.
+
+APIEmpty is an empty response
+*/
+type UserCurrentDeleteKeyNoContent struct {
+}
+
+// IsSuccess returns true when this user current delete key no content response has a 2xx status code
+func (o *UserCurrentDeleteKeyNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this user current delete key no content response has a 3xx status code
+func (o *UserCurrentDeleteKeyNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user current delete key no content response has a 4xx status code
+func (o *UserCurrentDeleteKeyNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this user current delete key no content response has a 5xx status code
+func (o *UserCurrentDeleteKeyNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user current delete key no content response a status code equal to that given
+func (o *UserCurrentDeleteKeyNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the user current delete key no content response
+func (o *UserCurrentDeleteKeyNoContent) Code() int {
+	return 204
+}
+
+func (o *UserCurrentDeleteKeyNoContent) Error() string {
+	return fmt.Sprintf("[DELETE /user/keys/{id}][%d] userCurrentDeleteKeyNoContent", 204)
+}
+
+func (o *UserCurrentDeleteKeyNoContent) String() string {
+	return fmt.Sprintf("[DELETE /user/keys/{id}][%d] userCurrentDeleteKeyNoContent", 204)
+}
+
+func (o *UserCurrentDeleteKeyNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewUserCurrentDeleteKeyForbidden creates a UserCurrentDeleteKeyForbidden with default headers values
+func NewUserCurrentDeleteKeyForbidden() *UserCurrentDeleteKeyForbidden {
+	return &UserCurrentDeleteKeyForbidden{}
+}
+
+/*
+UserCurrentDeleteKeyForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type UserCurrentDeleteKeyForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this user current delete key forbidden response has a 2xx status code
+func (o *UserCurrentDeleteKeyForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this user current delete key forbidden response has a 3xx status code
+func (o *UserCurrentDeleteKeyForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user current delete key forbidden response has a 4xx status code
+func (o *UserCurrentDeleteKeyForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this user current delete key forbidden response has a 5xx status code
+func (o *UserCurrentDeleteKeyForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user current delete key forbidden response a status code equal to that given
+func (o *UserCurrentDeleteKeyForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the user current delete key forbidden response
+func (o *UserCurrentDeleteKeyForbidden) Code() int {
+	return 403
+}
+
+func (o *UserCurrentDeleteKeyForbidden) Error() string {
+	return fmt.Sprintf("[DELETE /user/keys/{id}][%d] userCurrentDeleteKeyForbidden", 403)
+}
+
+func (o *UserCurrentDeleteKeyForbidden) String() string {
+	return fmt.Sprintf("[DELETE /user/keys/{id}][%d] userCurrentDeleteKeyForbidden", 403)
+}
+
+func (o *UserCurrentDeleteKeyForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewUserCurrentDeleteKeyNotFound creates a UserCurrentDeleteKeyNotFound with default headers values
+func NewUserCurrentDeleteKeyNotFound() *UserCurrentDeleteKeyNotFound {
+	return &UserCurrentDeleteKeyNotFound{}
+}
+
+/*
+UserCurrentDeleteKeyNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type UserCurrentDeleteKeyNotFound struct {
+}
+
+// IsSuccess returns true when this user current delete key not found response has a 2xx status code
+func (o *UserCurrentDeleteKeyNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this user current delete key not found response has a 3xx status code
+func (o *UserCurrentDeleteKeyNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user current delete key not found response has a 4xx status code
+func (o *UserCurrentDeleteKeyNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this user current delete key not found response has a 5xx status code
+func (o *UserCurrentDeleteKeyNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user current delete key not found response a status code equal to that given
+func (o *UserCurrentDeleteKeyNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the user current delete key not found response
+func (o *UserCurrentDeleteKeyNotFound) Code() int {
+	return 404
+}
+
+func (o *UserCurrentDeleteKeyNotFound) Error() string {
+	return fmt.Sprintf("[DELETE /user/keys/{id}][%d] userCurrentDeleteKeyNotFound", 404)
+}
+
+func (o *UserCurrentDeleteKeyNotFound) String() string {
+	return fmt.Sprintf("[DELETE /user/keys/{id}][%d] userCurrentDeleteKeyNotFound", 404)
+}
+
+func (o *UserCurrentDeleteKeyNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_current_delete_star_parameters.go b/bots-common/gitea-generated/client/user/user_current_delete_star_parameters.go
new file mode 100644
index 0000000..7de1b93
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_current_delete_star_parameters.go
@@ -0,0 +1,173 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewUserCurrentDeleteStarParams creates a new UserCurrentDeleteStarParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewUserCurrentDeleteStarParams() *UserCurrentDeleteStarParams {
+	return &UserCurrentDeleteStarParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewUserCurrentDeleteStarParamsWithTimeout creates a new UserCurrentDeleteStarParams object
+// with the ability to set a timeout on a request.
+func NewUserCurrentDeleteStarParamsWithTimeout(timeout time.Duration) *UserCurrentDeleteStarParams {
+	return &UserCurrentDeleteStarParams{
+		timeout: timeout,
+	}
+}
+
+// NewUserCurrentDeleteStarParamsWithContext creates a new UserCurrentDeleteStarParams object
+// with the ability to set a context for a request.
+func NewUserCurrentDeleteStarParamsWithContext(ctx context.Context) *UserCurrentDeleteStarParams {
+	return &UserCurrentDeleteStarParams{
+		Context: ctx,
+	}
+}
+
+// NewUserCurrentDeleteStarParamsWithHTTPClient creates a new UserCurrentDeleteStarParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewUserCurrentDeleteStarParamsWithHTTPClient(client *http.Client) *UserCurrentDeleteStarParams {
+	return &UserCurrentDeleteStarParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+UserCurrentDeleteStarParams contains all the parameters to send to the API endpoint
+
+	for the user current delete star operation.
+
+	Typically these are written to a http.Request.
+*/
+type UserCurrentDeleteStarParams struct {
+
+	/* Owner.
+
+	   owner of the repo to unstar
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo to unstar
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the user current delete star params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserCurrentDeleteStarParams) WithDefaults() *UserCurrentDeleteStarParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the user current delete star params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserCurrentDeleteStarParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the user current delete star params
+func (o *UserCurrentDeleteStarParams) WithTimeout(timeout time.Duration) *UserCurrentDeleteStarParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the user current delete star params
+func (o *UserCurrentDeleteStarParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the user current delete star params
+func (o *UserCurrentDeleteStarParams) WithContext(ctx context.Context) *UserCurrentDeleteStarParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the user current delete star params
+func (o *UserCurrentDeleteStarParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the user current delete star params
+func (o *UserCurrentDeleteStarParams) WithHTTPClient(client *http.Client) *UserCurrentDeleteStarParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the user current delete star params
+func (o *UserCurrentDeleteStarParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithOwner adds the owner to the user current delete star params
+func (o *UserCurrentDeleteStarParams) WithOwner(owner string) *UserCurrentDeleteStarParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the user current delete star params
+func (o *UserCurrentDeleteStarParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the user current delete star params
+func (o *UserCurrentDeleteStarParams) WithRepo(repo string) *UserCurrentDeleteStarParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the user current delete star params
+func (o *UserCurrentDeleteStarParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *UserCurrentDeleteStarParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_current_delete_star_responses.go b/bots-common/gitea-generated/client/user/user_current_delete_star_responses.go
new file mode 100644
index 0000000..aafbbf1
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_current_delete_star_responses.go
@@ -0,0 +1,150 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// UserCurrentDeleteStarReader is a Reader for the UserCurrentDeleteStar structure.
+type UserCurrentDeleteStarReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *UserCurrentDeleteStarReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewUserCurrentDeleteStarNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewUserCurrentDeleteStarNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[DELETE /user/starred/{owner}/{repo}] userCurrentDeleteStar", response, response.Code())
+	}
+}
+
+// NewUserCurrentDeleteStarNoContent creates a UserCurrentDeleteStarNoContent with default headers values
+func NewUserCurrentDeleteStarNoContent() *UserCurrentDeleteStarNoContent {
+	return &UserCurrentDeleteStarNoContent{}
+}
+
+/*
+UserCurrentDeleteStarNoContent describes a response with status code 204, with default header values.
+
+APIEmpty is an empty response
+*/
+type UserCurrentDeleteStarNoContent struct {
+}
+
+// IsSuccess returns true when this user current delete star no content response has a 2xx status code
+func (o *UserCurrentDeleteStarNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this user current delete star no content response has a 3xx status code
+func (o *UserCurrentDeleteStarNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user current delete star no content response has a 4xx status code
+func (o *UserCurrentDeleteStarNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this user current delete star no content response has a 5xx status code
+func (o *UserCurrentDeleteStarNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user current delete star no content response a status code equal to that given
+func (o *UserCurrentDeleteStarNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the user current delete star no content response
+func (o *UserCurrentDeleteStarNoContent) Code() int {
+	return 204
+}
+
+func (o *UserCurrentDeleteStarNoContent) Error() string {
+	return fmt.Sprintf("[DELETE /user/starred/{owner}/{repo}][%d] userCurrentDeleteStarNoContent", 204)
+}
+
+func (o *UserCurrentDeleteStarNoContent) String() string {
+	return fmt.Sprintf("[DELETE /user/starred/{owner}/{repo}][%d] userCurrentDeleteStarNoContent", 204)
+}
+
+func (o *UserCurrentDeleteStarNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewUserCurrentDeleteStarNotFound creates a UserCurrentDeleteStarNotFound with default headers values
+func NewUserCurrentDeleteStarNotFound() *UserCurrentDeleteStarNotFound {
+	return &UserCurrentDeleteStarNotFound{}
+}
+
+/*
+UserCurrentDeleteStarNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type UserCurrentDeleteStarNotFound struct {
+}
+
+// IsSuccess returns true when this user current delete star not found response has a 2xx status code
+func (o *UserCurrentDeleteStarNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this user current delete star not found response has a 3xx status code
+func (o *UserCurrentDeleteStarNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user current delete star not found response has a 4xx status code
+func (o *UserCurrentDeleteStarNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this user current delete star not found response has a 5xx status code
+func (o *UserCurrentDeleteStarNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user current delete star not found response a status code equal to that given
+func (o *UserCurrentDeleteStarNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the user current delete star not found response
+func (o *UserCurrentDeleteStarNotFound) Code() int {
+	return 404
+}
+
+func (o *UserCurrentDeleteStarNotFound) Error() string {
+	return fmt.Sprintf("[DELETE /user/starred/{owner}/{repo}][%d] userCurrentDeleteStarNotFound", 404)
+}
+
+func (o *UserCurrentDeleteStarNotFound) String() string {
+	return fmt.Sprintf("[DELETE /user/starred/{owner}/{repo}][%d] userCurrentDeleteStarNotFound", 404)
+}
+
+func (o *UserCurrentDeleteStarNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_current_get_g_p_g_key_parameters.go b/bots-common/gitea-generated/client/user/user_current_get_g_p_g_key_parameters.go
new file mode 100644
index 0000000..302241c
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_current_get_g_p_g_key_parameters.go
@@ -0,0 +1,154 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewUserCurrentGetGPGKeyParams creates a new UserCurrentGetGPGKeyParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewUserCurrentGetGPGKeyParams() *UserCurrentGetGPGKeyParams {
+	return &UserCurrentGetGPGKeyParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewUserCurrentGetGPGKeyParamsWithTimeout creates a new UserCurrentGetGPGKeyParams object
+// with the ability to set a timeout on a request.
+func NewUserCurrentGetGPGKeyParamsWithTimeout(timeout time.Duration) *UserCurrentGetGPGKeyParams {
+	return &UserCurrentGetGPGKeyParams{
+		timeout: timeout,
+	}
+}
+
+// NewUserCurrentGetGPGKeyParamsWithContext creates a new UserCurrentGetGPGKeyParams object
+// with the ability to set a context for a request.
+func NewUserCurrentGetGPGKeyParamsWithContext(ctx context.Context) *UserCurrentGetGPGKeyParams {
+	return &UserCurrentGetGPGKeyParams{
+		Context: ctx,
+	}
+}
+
+// NewUserCurrentGetGPGKeyParamsWithHTTPClient creates a new UserCurrentGetGPGKeyParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewUserCurrentGetGPGKeyParamsWithHTTPClient(client *http.Client) *UserCurrentGetGPGKeyParams {
+	return &UserCurrentGetGPGKeyParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+UserCurrentGetGPGKeyParams contains all the parameters to send to the API endpoint
+
+	for the user current get g p g key operation.
+
+	Typically these are written to a http.Request.
+*/
+type UserCurrentGetGPGKeyParams struct {
+
+	/* ID.
+
+	   id of key to get
+
+	   Format: int64
+	*/
+	ID int64
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the user current get g p g key params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserCurrentGetGPGKeyParams) WithDefaults() *UserCurrentGetGPGKeyParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the user current get g p g key params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserCurrentGetGPGKeyParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the user current get g p g key params
+func (o *UserCurrentGetGPGKeyParams) WithTimeout(timeout time.Duration) *UserCurrentGetGPGKeyParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the user current get g p g key params
+func (o *UserCurrentGetGPGKeyParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the user current get g p g key params
+func (o *UserCurrentGetGPGKeyParams) WithContext(ctx context.Context) *UserCurrentGetGPGKeyParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the user current get g p g key params
+func (o *UserCurrentGetGPGKeyParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the user current get g p g key params
+func (o *UserCurrentGetGPGKeyParams) WithHTTPClient(client *http.Client) *UserCurrentGetGPGKeyParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the user current get g p g key params
+func (o *UserCurrentGetGPGKeyParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithID adds the id to the user current get g p g key params
+func (o *UserCurrentGetGPGKeyParams) WithID(id int64) *UserCurrentGetGPGKeyParams {
+	o.SetID(id)
+	return o
+}
+
+// SetID adds the id to the user current get g p g key params
+func (o *UserCurrentGetGPGKeyParams) SetID(id int64) {
+	o.ID = id
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *UserCurrentGetGPGKeyParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param id
+	if err := r.SetPathParam("id", swag.FormatInt64(o.ID)); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_current_get_g_p_g_key_responses.go b/bots-common/gitea-generated/client/user/user_current_get_g_p_g_key_responses.go
new file mode 100644
index 0000000..d9709dd
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_current_get_g_p_g_key_responses.go
@@ -0,0 +1,168 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// UserCurrentGetGPGKeyReader is a Reader for the UserCurrentGetGPGKey structure.
+type UserCurrentGetGPGKeyReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *UserCurrentGetGPGKeyReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewUserCurrentGetGPGKeyOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewUserCurrentGetGPGKeyNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /user/gpg_keys/{id}] userCurrentGetGPGKey", response, response.Code())
+	}
+}
+
+// NewUserCurrentGetGPGKeyOK creates a UserCurrentGetGPGKeyOK with default headers values
+func NewUserCurrentGetGPGKeyOK() *UserCurrentGetGPGKeyOK {
+	return &UserCurrentGetGPGKeyOK{}
+}
+
+/*
+UserCurrentGetGPGKeyOK describes a response with status code 200, with default header values.
+
+GPGKey
+*/
+type UserCurrentGetGPGKeyOK struct {
+	Payload *models.GPGKey
+}
+
+// IsSuccess returns true when this user current get g p g key o k response has a 2xx status code
+func (o *UserCurrentGetGPGKeyOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this user current get g p g key o k response has a 3xx status code
+func (o *UserCurrentGetGPGKeyOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user current get g p g key o k response has a 4xx status code
+func (o *UserCurrentGetGPGKeyOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this user current get g p g key o k response has a 5xx status code
+func (o *UserCurrentGetGPGKeyOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user current get g p g key o k response a status code equal to that given
+func (o *UserCurrentGetGPGKeyOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the user current get g p g key o k response
+func (o *UserCurrentGetGPGKeyOK) Code() int {
+	return 200
+}
+
+func (o *UserCurrentGetGPGKeyOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /user/gpg_keys/{id}][%d] userCurrentGetGPGKeyOK %s", 200, payload)
+}
+
+func (o *UserCurrentGetGPGKeyOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /user/gpg_keys/{id}][%d] userCurrentGetGPGKeyOK %s", 200, payload)
+}
+
+func (o *UserCurrentGetGPGKeyOK) GetPayload() *models.GPGKey {
+	return o.Payload
+}
+
+func (o *UserCurrentGetGPGKeyOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.GPGKey)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewUserCurrentGetGPGKeyNotFound creates a UserCurrentGetGPGKeyNotFound with default headers values
+func NewUserCurrentGetGPGKeyNotFound() *UserCurrentGetGPGKeyNotFound {
+	return &UserCurrentGetGPGKeyNotFound{}
+}
+
+/*
+UserCurrentGetGPGKeyNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type UserCurrentGetGPGKeyNotFound struct {
+}
+
+// IsSuccess returns true when this user current get g p g key not found response has a 2xx status code
+func (o *UserCurrentGetGPGKeyNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this user current get g p g key not found response has a 3xx status code
+func (o *UserCurrentGetGPGKeyNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user current get g p g key not found response has a 4xx status code
+func (o *UserCurrentGetGPGKeyNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this user current get g p g key not found response has a 5xx status code
+func (o *UserCurrentGetGPGKeyNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user current get g p g key not found response a status code equal to that given
+func (o *UserCurrentGetGPGKeyNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the user current get g p g key not found response
+func (o *UserCurrentGetGPGKeyNotFound) Code() int {
+	return 404
+}
+
+func (o *UserCurrentGetGPGKeyNotFound) Error() string {
+	return fmt.Sprintf("[GET /user/gpg_keys/{id}][%d] userCurrentGetGPGKeyNotFound", 404)
+}
+
+func (o *UserCurrentGetGPGKeyNotFound) String() string {
+	return fmt.Sprintf("[GET /user/gpg_keys/{id}][%d] userCurrentGetGPGKeyNotFound", 404)
+}
+
+func (o *UserCurrentGetGPGKeyNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_current_get_key_parameters.go b/bots-common/gitea-generated/client/user/user_current_get_key_parameters.go
new file mode 100644
index 0000000..a06c488
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_current_get_key_parameters.go
@@ -0,0 +1,154 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewUserCurrentGetKeyParams creates a new UserCurrentGetKeyParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewUserCurrentGetKeyParams() *UserCurrentGetKeyParams {
+	return &UserCurrentGetKeyParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewUserCurrentGetKeyParamsWithTimeout creates a new UserCurrentGetKeyParams object
+// with the ability to set a timeout on a request.
+func NewUserCurrentGetKeyParamsWithTimeout(timeout time.Duration) *UserCurrentGetKeyParams {
+	return &UserCurrentGetKeyParams{
+		timeout: timeout,
+	}
+}
+
+// NewUserCurrentGetKeyParamsWithContext creates a new UserCurrentGetKeyParams object
+// with the ability to set a context for a request.
+func NewUserCurrentGetKeyParamsWithContext(ctx context.Context) *UserCurrentGetKeyParams {
+	return &UserCurrentGetKeyParams{
+		Context: ctx,
+	}
+}
+
+// NewUserCurrentGetKeyParamsWithHTTPClient creates a new UserCurrentGetKeyParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewUserCurrentGetKeyParamsWithHTTPClient(client *http.Client) *UserCurrentGetKeyParams {
+	return &UserCurrentGetKeyParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+UserCurrentGetKeyParams contains all the parameters to send to the API endpoint
+
+	for the user current get key operation.
+
+	Typically these are written to a http.Request.
+*/
+type UserCurrentGetKeyParams struct {
+
+	/* ID.
+
+	   id of key to get
+
+	   Format: int64
+	*/
+	ID int64
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the user current get key params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserCurrentGetKeyParams) WithDefaults() *UserCurrentGetKeyParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the user current get key params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserCurrentGetKeyParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the user current get key params
+func (o *UserCurrentGetKeyParams) WithTimeout(timeout time.Duration) *UserCurrentGetKeyParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the user current get key params
+func (o *UserCurrentGetKeyParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the user current get key params
+func (o *UserCurrentGetKeyParams) WithContext(ctx context.Context) *UserCurrentGetKeyParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the user current get key params
+func (o *UserCurrentGetKeyParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the user current get key params
+func (o *UserCurrentGetKeyParams) WithHTTPClient(client *http.Client) *UserCurrentGetKeyParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the user current get key params
+func (o *UserCurrentGetKeyParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithID adds the id to the user current get key params
+func (o *UserCurrentGetKeyParams) WithID(id int64) *UserCurrentGetKeyParams {
+	o.SetID(id)
+	return o
+}
+
+// SetID adds the id to the user current get key params
+func (o *UserCurrentGetKeyParams) SetID(id int64) {
+	o.ID = id
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *UserCurrentGetKeyParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param id
+	if err := r.SetPathParam("id", swag.FormatInt64(o.ID)); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_current_get_key_responses.go b/bots-common/gitea-generated/client/user/user_current_get_key_responses.go
new file mode 100644
index 0000000..132e446
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_current_get_key_responses.go
@@ -0,0 +1,168 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// UserCurrentGetKeyReader is a Reader for the UserCurrentGetKey structure.
+type UserCurrentGetKeyReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *UserCurrentGetKeyReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewUserCurrentGetKeyOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewUserCurrentGetKeyNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /user/keys/{id}] userCurrentGetKey", response, response.Code())
+	}
+}
+
+// NewUserCurrentGetKeyOK creates a UserCurrentGetKeyOK with default headers values
+func NewUserCurrentGetKeyOK() *UserCurrentGetKeyOK {
+	return &UserCurrentGetKeyOK{}
+}
+
+/*
+UserCurrentGetKeyOK describes a response with status code 200, with default header values.
+
+PublicKey
+*/
+type UserCurrentGetKeyOK struct {
+	Payload *models.PublicKey
+}
+
+// IsSuccess returns true when this user current get key o k response has a 2xx status code
+func (o *UserCurrentGetKeyOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this user current get key o k response has a 3xx status code
+func (o *UserCurrentGetKeyOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user current get key o k response has a 4xx status code
+func (o *UserCurrentGetKeyOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this user current get key o k response has a 5xx status code
+func (o *UserCurrentGetKeyOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user current get key o k response a status code equal to that given
+func (o *UserCurrentGetKeyOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the user current get key o k response
+func (o *UserCurrentGetKeyOK) Code() int {
+	return 200
+}
+
+func (o *UserCurrentGetKeyOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /user/keys/{id}][%d] userCurrentGetKeyOK %s", 200, payload)
+}
+
+func (o *UserCurrentGetKeyOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /user/keys/{id}][%d] userCurrentGetKeyOK %s", 200, payload)
+}
+
+func (o *UserCurrentGetKeyOK) GetPayload() *models.PublicKey {
+	return o.Payload
+}
+
+func (o *UserCurrentGetKeyOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.PublicKey)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewUserCurrentGetKeyNotFound creates a UserCurrentGetKeyNotFound with default headers values
+func NewUserCurrentGetKeyNotFound() *UserCurrentGetKeyNotFound {
+	return &UserCurrentGetKeyNotFound{}
+}
+
+/*
+UserCurrentGetKeyNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type UserCurrentGetKeyNotFound struct {
+}
+
+// IsSuccess returns true when this user current get key not found response has a 2xx status code
+func (o *UserCurrentGetKeyNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this user current get key not found response has a 3xx status code
+func (o *UserCurrentGetKeyNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user current get key not found response has a 4xx status code
+func (o *UserCurrentGetKeyNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this user current get key not found response has a 5xx status code
+func (o *UserCurrentGetKeyNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user current get key not found response a status code equal to that given
+func (o *UserCurrentGetKeyNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the user current get key not found response
+func (o *UserCurrentGetKeyNotFound) Code() int {
+	return 404
+}
+
+func (o *UserCurrentGetKeyNotFound) Error() string {
+	return fmt.Sprintf("[GET /user/keys/{id}][%d] userCurrentGetKeyNotFound", 404)
+}
+
+func (o *UserCurrentGetKeyNotFound) String() string {
+	return fmt.Sprintf("[GET /user/keys/{id}][%d] userCurrentGetKeyNotFound", 404)
+}
+
+func (o *UserCurrentGetKeyNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_current_list_followers_parameters.go b/bots-common/gitea-generated/client/user/user_current_list_followers_parameters.go
new file mode 100644
index 0000000..e414a42
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_current_list_followers_parameters.go
@@ -0,0 +1,198 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewUserCurrentListFollowersParams creates a new UserCurrentListFollowersParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewUserCurrentListFollowersParams() *UserCurrentListFollowersParams {
+	return &UserCurrentListFollowersParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewUserCurrentListFollowersParamsWithTimeout creates a new UserCurrentListFollowersParams object
+// with the ability to set a timeout on a request.
+func NewUserCurrentListFollowersParamsWithTimeout(timeout time.Duration) *UserCurrentListFollowersParams {
+	return &UserCurrentListFollowersParams{
+		timeout: timeout,
+	}
+}
+
+// NewUserCurrentListFollowersParamsWithContext creates a new UserCurrentListFollowersParams object
+// with the ability to set a context for a request.
+func NewUserCurrentListFollowersParamsWithContext(ctx context.Context) *UserCurrentListFollowersParams {
+	return &UserCurrentListFollowersParams{
+		Context: ctx,
+	}
+}
+
+// NewUserCurrentListFollowersParamsWithHTTPClient creates a new UserCurrentListFollowersParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewUserCurrentListFollowersParamsWithHTTPClient(client *http.Client) *UserCurrentListFollowersParams {
+	return &UserCurrentListFollowersParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+UserCurrentListFollowersParams contains all the parameters to send to the API endpoint
+
+	for the user current list followers operation.
+
+	Typically these are written to a http.Request.
+*/
+type UserCurrentListFollowersParams struct {
+
+	/* Limit.
+
+	   page size of results
+	*/
+	Limit *int64
+
+	/* Page.
+
+	   page number of results to return (1-based)
+	*/
+	Page *int64
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the user current list followers params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserCurrentListFollowersParams) WithDefaults() *UserCurrentListFollowersParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the user current list followers params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserCurrentListFollowersParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the user current list followers params
+func (o *UserCurrentListFollowersParams) WithTimeout(timeout time.Duration) *UserCurrentListFollowersParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the user current list followers params
+func (o *UserCurrentListFollowersParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the user current list followers params
+func (o *UserCurrentListFollowersParams) WithContext(ctx context.Context) *UserCurrentListFollowersParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the user current list followers params
+func (o *UserCurrentListFollowersParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the user current list followers params
+func (o *UserCurrentListFollowersParams) WithHTTPClient(client *http.Client) *UserCurrentListFollowersParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the user current list followers params
+func (o *UserCurrentListFollowersParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithLimit adds the limit to the user current list followers params
+func (o *UserCurrentListFollowersParams) WithLimit(limit *int64) *UserCurrentListFollowersParams {
+	o.SetLimit(limit)
+	return o
+}
+
+// SetLimit adds the limit to the user current list followers params
+func (o *UserCurrentListFollowersParams) SetLimit(limit *int64) {
+	o.Limit = limit
+}
+
+// WithPage adds the page to the user current list followers params
+func (o *UserCurrentListFollowersParams) WithPage(page *int64) *UserCurrentListFollowersParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the user current list followers params
+func (o *UserCurrentListFollowersParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *UserCurrentListFollowersParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.Limit != nil {
+
+		// query param limit
+		var qrLimit int64
+
+		if o.Limit != nil {
+			qrLimit = *o.Limit
+		}
+		qLimit := swag.FormatInt64(qrLimit)
+		if qLimit != "" {
+
+			if err := r.SetQueryParam("limit", qLimit); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_current_list_followers_responses.go b/bots-common/gitea-generated/client/user/user_current_list_followers_responses.go
new file mode 100644
index 0000000..af61c12
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_current_list_followers_responses.go
@@ -0,0 +1,104 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// UserCurrentListFollowersReader is a Reader for the UserCurrentListFollowers structure.
+type UserCurrentListFollowersReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *UserCurrentListFollowersReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewUserCurrentListFollowersOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	default:
+		return nil, runtime.NewAPIError("[GET /user/followers] userCurrentListFollowers", response, response.Code())
+	}
+}
+
+// NewUserCurrentListFollowersOK creates a UserCurrentListFollowersOK with default headers values
+func NewUserCurrentListFollowersOK() *UserCurrentListFollowersOK {
+	return &UserCurrentListFollowersOK{}
+}
+
+/*
+UserCurrentListFollowersOK describes a response with status code 200, with default header values.
+
+UserList
+*/
+type UserCurrentListFollowersOK struct {
+	Payload []*models.User
+}
+
+// IsSuccess returns true when this user current list followers o k response has a 2xx status code
+func (o *UserCurrentListFollowersOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this user current list followers o k response has a 3xx status code
+func (o *UserCurrentListFollowersOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user current list followers o k response has a 4xx status code
+func (o *UserCurrentListFollowersOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this user current list followers o k response has a 5xx status code
+func (o *UserCurrentListFollowersOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user current list followers o k response a status code equal to that given
+func (o *UserCurrentListFollowersOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the user current list followers o k response
+func (o *UserCurrentListFollowersOK) Code() int {
+	return 200
+}
+
+func (o *UserCurrentListFollowersOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /user/followers][%d] userCurrentListFollowersOK %s", 200, payload)
+}
+
+func (o *UserCurrentListFollowersOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /user/followers][%d] userCurrentListFollowersOK %s", 200, payload)
+}
+
+func (o *UserCurrentListFollowersOK) GetPayload() []*models.User {
+	return o.Payload
+}
+
+func (o *UserCurrentListFollowersOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_current_list_following_parameters.go b/bots-common/gitea-generated/client/user/user_current_list_following_parameters.go
new file mode 100644
index 0000000..81767eb
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_current_list_following_parameters.go
@@ -0,0 +1,198 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewUserCurrentListFollowingParams creates a new UserCurrentListFollowingParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewUserCurrentListFollowingParams() *UserCurrentListFollowingParams {
+	return &UserCurrentListFollowingParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewUserCurrentListFollowingParamsWithTimeout creates a new UserCurrentListFollowingParams object
+// with the ability to set a timeout on a request.
+func NewUserCurrentListFollowingParamsWithTimeout(timeout time.Duration) *UserCurrentListFollowingParams {
+	return &UserCurrentListFollowingParams{
+		timeout: timeout,
+	}
+}
+
+// NewUserCurrentListFollowingParamsWithContext creates a new UserCurrentListFollowingParams object
+// with the ability to set a context for a request.
+func NewUserCurrentListFollowingParamsWithContext(ctx context.Context) *UserCurrentListFollowingParams {
+	return &UserCurrentListFollowingParams{
+		Context: ctx,
+	}
+}
+
+// NewUserCurrentListFollowingParamsWithHTTPClient creates a new UserCurrentListFollowingParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewUserCurrentListFollowingParamsWithHTTPClient(client *http.Client) *UserCurrentListFollowingParams {
+	return &UserCurrentListFollowingParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+UserCurrentListFollowingParams contains all the parameters to send to the API endpoint
+
+	for the user current list following operation.
+
+	Typically these are written to a http.Request.
+*/
+type UserCurrentListFollowingParams struct {
+
+	/* Limit.
+
+	   page size of results
+	*/
+	Limit *int64
+
+	/* Page.
+
+	   page number of results to return (1-based)
+	*/
+	Page *int64
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the user current list following params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserCurrentListFollowingParams) WithDefaults() *UserCurrentListFollowingParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the user current list following params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserCurrentListFollowingParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the user current list following params
+func (o *UserCurrentListFollowingParams) WithTimeout(timeout time.Duration) *UserCurrentListFollowingParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the user current list following params
+func (o *UserCurrentListFollowingParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the user current list following params
+func (o *UserCurrentListFollowingParams) WithContext(ctx context.Context) *UserCurrentListFollowingParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the user current list following params
+func (o *UserCurrentListFollowingParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the user current list following params
+func (o *UserCurrentListFollowingParams) WithHTTPClient(client *http.Client) *UserCurrentListFollowingParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the user current list following params
+func (o *UserCurrentListFollowingParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithLimit adds the limit to the user current list following params
+func (o *UserCurrentListFollowingParams) WithLimit(limit *int64) *UserCurrentListFollowingParams {
+	o.SetLimit(limit)
+	return o
+}
+
+// SetLimit adds the limit to the user current list following params
+func (o *UserCurrentListFollowingParams) SetLimit(limit *int64) {
+	o.Limit = limit
+}
+
+// WithPage adds the page to the user current list following params
+func (o *UserCurrentListFollowingParams) WithPage(page *int64) *UserCurrentListFollowingParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the user current list following params
+func (o *UserCurrentListFollowingParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *UserCurrentListFollowingParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.Limit != nil {
+
+		// query param limit
+		var qrLimit int64
+
+		if o.Limit != nil {
+			qrLimit = *o.Limit
+		}
+		qLimit := swag.FormatInt64(qrLimit)
+		if qLimit != "" {
+
+			if err := r.SetQueryParam("limit", qLimit); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_current_list_following_responses.go b/bots-common/gitea-generated/client/user/user_current_list_following_responses.go
new file mode 100644
index 0000000..d0ba210
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_current_list_following_responses.go
@@ -0,0 +1,104 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// UserCurrentListFollowingReader is a Reader for the UserCurrentListFollowing structure.
+type UserCurrentListFollowingReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *UserCurrentListFollowingReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewUserCurrentListFollowingOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	default:
+		return nil, runtime.NewAPIError("[GET /user/following] userCurrentListFollowing", response, response.Code())
+	}
+}
+
+// NewUserCurrentListFollowingOK creates a UserCurrentListFollowingOK with default headers values
+func NewUserCurrentListFollowingOK() *UserCurrentListFollowingOK {
+	return &UserCurrentListFollowingOK{}
+}
+
+/*
+UserCurrentListFollowingOK describes a response with status code 200, with default header values.
+
+UserList
+*/
+type UserCurrentListFollowingOK struct {
+	Payload []*models.User
+}
+
+// IsSuccess returns true when this user current list following o k response has a 2xx status code
+func (o *UserCurrentListFollowingOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this user current list following o k response has a 3xx status code
+func (o *UserCurrentListFollowingOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user current list following o k response has a 4xx status code
+func (o *UserCurrentListFollowingOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this user current list following o k response has a 5xx status code
+func (o *UserCurrentListFollowingOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user current list following o k response a status code equal to that given
+func (o *UserCurrentListFollowingOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the user current list following o k response
+func (o *UserCurrentListFollowingOK) Code() int {
+	return 200
+}
+
+func (o *UserCurrentListFollowingOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /user/following][%d] userCurrentListFollowingOK %s", 200, payload)
+}
+
+func (o *UserCurrentListFollowingOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /user/following][%d] userCurrentListFollowingOK %s", 200, payload)
+}
+
+func (o *UserCurrentListFollowingOK) GetPayload() []*models.User {
+	return o.Payload
+}
+
+func (o *UserCurrentListFollowingOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_current_list_g_p_g_keys_parameters.go b/bots-common/gitea-generated/client/user/user_current_list_g_p_g_keys_parameters.go
new file mode 100644
index 0000000..eba1585
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_current_list_g_p_g_keys_parameters.go
@@ -0,0 +1,198 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewUserCurrentListGPGKeysParams creates a new UserCurrentListGPGKeysParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewUserCurrentListGPGKeysParams() *UserCurrentListGPGKeysParams {
+	return &UserCurrentListGPGKeysParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewUserCurrentListGPGKeysParamsWithTimeout creates a new UserCurrentListGPGKeysParams object
+// with the ability to set a timeout on a request.
+func NewUserCurrentListGPGKeysParamsWithTimeout(timeout time.Duration) *UserCurrentListGPGKeysParams {
+	return &UserCurrentListGPGKeysParams{
+		timeout: timeout,
+	}
+}
+
+// NewUserCurrentListGPGKeysParamsWithContext creates a new UserCurrentListGPGKeysParams object
+// with the ability to set a context for a request.
+func NewUserCurrentListGPGKeysParamsWithContext(ctx context.Context) *UserCurrentListGPGKeysParams {
+	return &UserCurrentListGPGKeysParams{
+		Context: ctx,
+	}
+}
+
+// NewUserCurrentListGPGKeysParamsWithHTTPClient creates a new UserCurrentListGPGKeysParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewUserCurrentListGPGKeysParamsWithHTTPClient(client *http.Client) *UserCurrentListGPGKeysParams {
+	return &UserCurrentListGPGKeysParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+UserCurrentListGPGKeysParams contains all the parameters to send to the API endpoint
+
+	for the user current list g p g keys operation.
+
+	Typically these are written to a http.Request.
+*/
+type UserCurrentListGPGKeysParams struct {
+
+	/* Limit.
+
+	   page size of results
+	*/
+	Limit *int64
+
+	/* Page.
+
+	   page number of results to return (1-based)
+	*/
+	Page *int64
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the user current list g p g keys params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserCurrentListGPGKeysParams) WithDefaults() *UserCurrentListGPGKeysParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the user current list g p g keys params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserCurrentListGPGKeysParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the user current list g p g keys params
+func (o *UserCurrentListGPGKeysParams) WithTimeout(timeout time.Duration) *UserCurrentListGPGKeysParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the user current list g p g keys params
+func (o *UserCurrentListGPGKeysParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the user current list g p g keys params
+func (o *UserCurrentListGPGKeysParams) WithContext(ctx context.Context) *UserCurrentListGPGKeysParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the user current list g p g keys params
+func (o *UserCurrentListGPGKeysParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the user current list g p g keys params
+func (o *UserCurrentListGPGKeysParams) WithHTTPClient(client *http.Client) *UserCurrentListGPGKeysParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the user current list g p g keys params
+func (o *UserCurrentListGPGKeysParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithLimit adds the limit to the user current list g p g keys params
+func (o *UserCurrentListGPGKeysParams) WithLimit(limit *int64) *UserCurrentListGPGKeysParams {
+	o.SetLimit(limit)
+	return o
+}
+
+// SetLimit adds the limit to the user current list g p g keys params
+func (o *UserCurrentListGPGKeysParams) SetLimit(limit *int64) {
+	o.Limit = limit
+}
+
+// WithPage adds the page to the user current list g p g keys params
+func (o *UserCurrentListGPGKeysParams) WithPage(page *int64) *UserCurrentListGPGKeysParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the user current list g p g keys params
+func (o *UserCurrentListGPGKeysParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *UserCurrentListGPGKeysParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.Limit != nil {
+
+		// query param limit
+		var qrLimit int64
+
+		if o.Limit != nil {
+			qrLimit = *o.Limit
+		}
+		qLimit := swag.FormatInt64(qrLimit)
+		if qLimit != "" {
+
+			if err := r.SetQueryParam("limit", qLimit); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_current_list_g_p_g_keys_responses.go b/bots-common/gitea-generated/client/user/user_current_list_g_p_g_keys_responses.go
new file mode 100644
index 0000000..3891629
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_current_list_g_p_g_keys_responses.go
@@ -0,0 +1,104 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// UserCurrentListGPGKeysReader is a Reader for the UserCurrentListGPGKeys structure.
+type UserCurrentListGPGKeysReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *UserCurrentListGPGKeysReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewUserCurrentListGPGKeysOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	default:
+		return nil, runtime.NewAPIError("[GET /user/gpg_keys] userCurrentListGPGKeys", response, response.Code())
+	}
+}
+
+// NewUserCurrentListGPGKeysOK creates a UserCurrentListGPGKeysOK with default headers values
+func NewUserCurrentListGPGKeysOK() *UserCurrentListGPGKeysOK {
+	return &UserCurrentListGPGKeysOK{}
+}
+
+/*
+UserCurrentListGPGKeysOK describes a response with status code 200, with default header values.
+
+GPGKeyList
+*/
+type UserCurrentListGPGKeysOK struct {
+	Payload []*models.GPGKey
+}
+
+// IsSuccess returns true when this user current list g p g keys o k response has a 2xx status code
+func (o *UserCurrentListGPGKeysOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this user current list g p g keys o k response has a 3xx status code
+func (o *UserCurrentListGPGKeysOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user current list g p g keys o k response has a 4xx status code
+func (o *UserCurrentListGPGKeysOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this user current list g p g keys o k response has a 5xx status code
+func (o *UserCurrentListGPGKeysOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user current list g p g keys o k response a status code equal to that given
+func (o *UserCurrentListGPGKeysOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the user current list g p g keys o k response
+func (o *UserCurrentListGPGKeysOK) Code() int {
+	return 200
+}
+
+func (o *UserCurrentListGPGKeysOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /user/gpg_keys][%d] userCurrentListGPGKeysOK %s", 200, payload)
+}
+
+func (o *UserCurrentListGPGKeysOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /user/gpg_keys][%d] userCurrentListGPGKeysOK %s", 200, payload)
+}
+
+func (o *UserCurrentListGPGKeysOK) GetPayload() []*models.GPGKey {
+	return o.Payload
+}
+
+func (o *UserCurrentListGPGKeysOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_current_list_keys_parameters.go b/bots-common/gitea-generated/client/user/user_current_list_keys_parameters.go
new file mode 100644
index 0000000..2827076
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_current_list_keys_parameters.go
@@ -0,0 +1,232 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewUserCurrentListKeysParams creates a new UserCurrentListKeysParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewUserCurrentListKeysParams() *UserCurrentListKeysParams {
+	return &UserCurrentListKeysParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewUserCurrentListKeysParamsWithTimeout creates a new UserCurrentListKeysParams object
+// with the ability to set a timeout on a request.
+func NewUserCurrentListKeysParamsWithTimeout(timeout time.Duration) *UserCurrentListKeysParams {
+	return &UserCurrentListKeysParams{
+		timeout: timeout,
+	}
+}
+
+// NewUserCurrentListKeysParamsWithContext creates a new UserCurrentListKeysParams object
+// with the ability to set a context for a request.
+func NewUserCurrentListKeysParamsWithContext(ctx context.Context) *UserCurrentListKeysParams {
+	return &UserCurrentListKeysParams{
+		Context: ctx,
+	}
+}
+
+// NewUserCurrentListKeysParamsWithHTTPClient creates a new UserCurrentListKeysParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewUserCurrentListKeysParamsWithHTTPClient(client *http.Client) *UserCurrentListKeysParams {
+	return &UserCurrentListKeysParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+UserCurrentListKeysParams contains all the parameters to send to the API endpoint
+
+	for the user current list keys operation.
+
+	Typically these are written to a http.Request.
+*/
+type UserCurrentListKeysParams struct {
+
+	/* Fingerprint.
+
+	   fingerprint of the key
+	*/
+	Fingerprint *string
+
+	/* Limit.
+
+	   page size of results
+	*/
+	Limit *int64
+
+	/* Page.
+
+	   page number of results to return (1-based)
+	*/
+	Page *int64
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the user current list keys params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserCurrentListKeysParams) WithDefaults() *UserCurrentListKeysParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the user current list keys params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserCurrentListKeysParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the user current list keys params
+func (o *UserCurrentListKeysParams) WithTimeout(timeout time.Duration) *UserCurrentListKeysParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the user current list keys params
+func (o *UserCurrentListKeysParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the user current list keys params
+func (o *UserCurrentListKeysParams) WithContext(ctx context.Context) *UserCurrentListKeysParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the user current list keys params
+func (o *UserCurrentListKeysParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the user current list keys params
+func (o *UserCurrentListKeysParams) WithHTTPClient(client *http.Client) *UserCurrentListKeysParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the user current list keys params
+func (o *UserCurrentListKeysParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithFingerprint adds the fingerprint to the user current list keys params
+func (o *UserCurrentListKeysParams) WithFingerprint(fingerprint *string) *UserCurrentListKeysParams {
+	o.SetFingerprint(fingerprint)
+	return o
+}
+
+// SetFingerprint adds the fingerprint to the user current list keys params
+func (o *UserCurrentListKeysParams) SetFingerprint(fingerprint *string) {
+	o.Fingerprint = fingerprint
+}
+
+// WithLimit adds the limit to the user current list keys params
+func (o *UserCurrentListKeysParams) WithLimit(limit *int64) *UserCurrentListKeysParams {
+	o.SetLimit(limit)
+	return o
+}
+
+// SetLimit adds the limit to the user current list keys params
+func (o *UserCurrentListKeysParams) SetLimit(limit *int64) {
+	o.Limit = limit
+}
+
+// WithPage adds the page to the user current list keys params
+func (o *UserCurrentListKeysParams) WithPage(page *int64) *UserCurrentListKeysParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the user current list keys params
+func (o *UserCurrentListKeysParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *UserCurrentListKeysParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.Fingerprint != nil {
+
+		// query param fingerprint
+		var qrFingerprint string
+
+		if o.Fingerprint != nil {
+			qrFingerprint = *o.Fingerprint
+		}
+		qFingerprint := qrFingerprint
+		if qFingerprint != "" {
+
+			if err := r.SetQueryParam("fingerprint", qFingerprint); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Limit != nil {
+
+		// query param limit
+		var qrLimit int64
+
+		if o.Limit != nil {
+			qrLimit = *o.Limit
+		}
+		qLimit := swag.FormatInt64(qrLimit)
+		if qLimit != "" {
+
+			if err := r.SetQueryParam("limit", qLimit); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_current_list_keys_responses.go b/bots-common/gitea-generated/client/user/user_current_list_keys_responses.go
new file mode 100644
index 0000000..c1382b9
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_current_list_keys_responses.go
@@ -0,0 +1,104 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// UserCurrentListKeysReader is a Reader for the UserCurrentListKeys structure.
+type UserCurrentListKeysReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *UserCurrentListKeysReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewUserCurrentListKeysOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	default:
+		return nil, runtime.NewAPIError("[GET /user/keys] userCurrentListKeys", response, response.Code())
+	}
+}
+
+// NewUserCurrentListKeysOK creates a UserCurrentListKeysOK with default headers values
+func NewUserCurrentListKeysOK() *UserCurrentListKeysOK {
+	return &UserCurrentListKeysOK{}
+}
+
+/*
+UserCurrentListKeysOK describes a response with status code 200, with default header values.
+
+PublicKeyList
+*/
+type UserCurrentListKeysOK struct {
+	Payload []*models.PublicKey
+}
+
+// IsSuccess returns true when this user current list keys o k response has a 2xx status code
+func (o *UserCurrentListKeysOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this user current list keys o k response has a 3xx status code
+func (o *UserCurrentListKeysOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user current list keys o k response has a 4xx status code
+func (o *UserCurrentListKeysOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this user current list keys o k response has a 5xx status code
+func (o *UserCurrentListKeysOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user current list keys o k response a status code equal to that given
+func (o *UserCurrentListKeysOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the user current list keys o k response
+func (o *UserCurrentListKeysOK) Code() int {
+	return 200
+}
+
+func (o *UserCurrentListKeysOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /user/keys][%d] userCurrentListKeysOK %s", 200, payload)
+}
+
+func (o *UserCurrentListKeysOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /user/keys][%d] userCurrentListKeysOK %s", 200, payload)
+}
+
+func (o *UserCurrentListKeysOK) GetPayload() []*models.PublicKey {
+	return o.Payload
+}
+
+func (o *UserCurrentListKeysOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_current_list_repos_parameters.go b/bots-common/gitea-generated/client/user/user_current_list_repos_parameters.go
new file mode 100644
index 0000000..bc194a6
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_current_list_repos_parameters.go
@@ -0,0 +1,198 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewUserCurrentListReposParams creates a new UserCurrentListReposParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewUserCurrentListReposParams() *UserCurrentListReposParams {
+	return &UserCurrentListReposParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewUserCurrentListReposParamsWithTimeout creates a new UserCurrentListReposParams object
+// with the ability to set a timeout on a request.
+func NewUserCurrentListReposParamsWithTimeout(timeout time.Duration) *UserCurrentListReposParams {
+	return &UserCurrentListReposParams{
+		timeout: timeout,
+	}
+}
+
+// NewUserCurrentListReposParamsWithContext creates a new UserCurrentListReposParams object
+// with the ability to set a context for a request.
+func NewUserCurrentListReposParamsWithContext(ctx context.Context) *UserCurrentListReposParams {
+	return &UserCurrentListReposParams{
+		Context: ctx,
+	}
+}
+
+// NewUserCurrentListReposParamsWithHTTPClient creates a new UserCurrentListReposParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewUserCurrentListReposParamsWithHTTPClient(client *http.Client) *UserCurrentListReposParams {
+	return &UserCurrentListReposParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+UserCurrentListReposParams contains all the parameters to send to the API endpoint
+
+	for the user current list repos operation.
+
+	Typically these are written to a http.Request.
+*/
+type UserCurrentListReposParams struct {
+
+	/* Limit.
+
+	   page size of results
+	*/
+	Limit *int64
+
+	/* Page.
+
+	   page number of results to return (1-based)
+	*/
+	Page *int64
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the user current list repos params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserCurrentListReposParams) WithDefaults() *UserCurrentListReposParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the user current list repos params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserCurrentListReposParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the user current list repos params
+func (o *UserCurrentListReposParams) WithTimeout(timeout time.Duration) *UserCurrentListReposParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the user current list repos params
+func (o *UserCurrentListReposParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the user current list repos params
+func (o *UserCurrentListReposParams) WithContext(ctx context.Context) *UserCurrentListReposParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the user current list repos params
+func (o *UserCurrentListReposParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the user current list repos params
+func (o *UserCurrentListReposParams) WithHTTPClient(client *http.Client) *UserCurrentListReposParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the user current list repos params
+func (o *UserCurrentListReposParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithLimit adds the limit to the user current list repos params
+func (o *UserCurrentListReposParams) WithLimit(limit *int64) *UserCurrentListReposParams {
+	o.SetLimit(limit)
+	return o
+}
+
+// SetLimit adds the limit to the user current list repos params
+func (o *UserCurrentListReposParams) SetLimit(limit *int64) {
+	o.Limit = limit
+}
+
+// WithPage adds the page to the user current list repos params
+func (o *UserCurrentListReposParams) WithPage(page *int64) *UserCurrentListReposParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the user current list repos params
+func (o *UserCurrentListReposParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *UserCurrentListReposParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.Limit != nil {
+
+		// query param limit
+		var qrLimit int64
+
+		if o.Limit != nil {
+			qrLimit = *o.Limit
+		}
+		qLimit := swag.FormatInt64(qrLimit)
+		if qLimit != "" {
+
+			if err := r.SetQueryParam("limit", qLimit); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_current_list_repos_responses.go b/bots-common/gitea-generated/client/user/user_current_list_repos_responses.go
new file mode 100644
index 0000000..32aa0ac
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_current_list_repos_responses.go
@@ -0,0 +1,104 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// UserCurrentListReposReader is a Reader for the UserCurrentListRepos structure.
+type UserCurrentListReposReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *UserCurrentListReposReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewUserCurrentListReposOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	default:
+		return nil, runtime.NewAPIError("[GET /user/repos] userCurrentListRepos", response, response.Code())
+	}
+}
+
+// NewUserCurrentListReposOK creates a UserCurrentListReposOK with default headers values
+func NewUserCurrentListReposOK() *UserCurrentListReposOK {
+	return &UserCurrentListReposOK{}
+}
+
+/*
+UserCurrentListReposOK describes a response with status code 200, with default header values.
+
+RepositoryList
+*/
+type UserCurrentListReposOK struct {
+	Payload []*models.Repository
+}
+
+// IsSuccess returns true when this user current list repos o k response has a 2xx status code
+func (o *UserCurrentListReposOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this user current list repos o k response has a 3xx status code
+func (o *UserCurrentListReposOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user current list repos o k response has a 4xx status code
+func (o *UserCurrentListReposOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this user current list repos o k response has a 5xx status code
+func (o *UserCurrentListReposOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user current list repos o k response a status code equal to that given
+func (o *UserCurrentListReposOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the user current list repos o k response
+func (o *UserCurrentListReposOK) Code() int {
+	return 200
+}
+
+func (o *UserCurrentListReposOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /user/repos][%d] userCurrentListReposOK %s", 200, payload)
+}
+
+func (o *UserCurrentListReposOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /user/repos][%d] userCurrentListReposOK %s", 200, payload)
+}
+
+func (o *UserCurrentListReposOK) GetPayload() []*models.Repository {
+	return o.Payload
+}
+
+func (o *UserCurrentListReposOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_current_list_starred_parameters.go b/bots-common/gitea-generated/client/user/user_current_list_starred_parameters.go
new file mode 100644
index 0000000..5fc227e
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_current_list_starred_parameters.go
@@ -0,0 +1,198 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewUserCurrentListStarredParams creates a new UserCurrentListStarredParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewUserCurrentListStarredParams() *UserCurrentListStarredParams {
+	return &UserCurrentListStarredParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewUserCurrentListStarredParamsWithTimeout creates a new UserCurrentListStarredParams object
+// with the ability to set a timeout on a request.
+func NewUserCurrentListStarredParamsWithTimeout(timeout time.Duration) *UserCurrentListStarredParams {
+	return &UserCurrentListStarredParams{
+		timeout: timeout,
+	}
+}
+
+// NewUserCurrentListStarredParamsWithContext creates a new UserCurrentListStarredParams object
+// with the ability to set a context for a request.
+func NewUserCurrentListStarredParamsWithContext(ctx context.Context) *UserCurrentListStarredParams {
+	return &UserCurrentListStarredParams{
+		Context: ctx,
+	}
+}
+
+// NewUserCurrentListStarredParamsWithHTTPClient creates a new UserCurrentListStarredParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewUserCurrentListStarredParamsWithHTTPClient(client *http.Client) *UserCurrentListStarredParams {
+	return &UserCurrentListStarredParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+UserCurrentListStarredParams contains all the parameters to send to the API endpoint
+
+	for the user current list starred operation.
+
+	Typically these are written to a http.Request.
+*/
+type UserCurrentListStarredParams struct {
+
+	/* Limit.
+
+	   page size of results
+	*/
+	Limit *int64
+
+	/* Page.
+
+	   page number of results to return (1-based)
+	*/
+	Page *int64
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the user current list starred params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserCurrentListStarredParams) WithDefaults() *UserCurrentListStarredParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the user current list starred params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserCurrentListStarredParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the user current list starred params
+func (o *UserCurrentListStarredParams) WithTimeout(timeout time.Duration) *UserCurrentListStarredParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the user current list starred params
+func (o *UserCurrentListStarredParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the user current list starred params
+func (o *UserCurrentListStarredParams) WithContext(ctx context.Context) *UserCurrentListStarredParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the user current list starred params
+func (o *UserCurrentListStarredParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the user current list starred params
+func (o *UserCurrentListStarredParams) WithHTTPClient(client *http.Client) *UserCurrentListStarredParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the user current list starred params
+func (o *UserCurrentListStarredParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithLimit adds the limit to the user current list starred params
+func (o *UserCurrentListStarredParams) WithLimit(limit *int64) *UserCurrentListStarredParams {
+	o.SetLimit(limit)
+	return o
+}
+
+// SetLimit adds the limit to the user current list starred params
+func (o *UserCurrentListStarredParams) SetLimit(limit *int64) {
+	o.Limit = limit
+}
+
+// WithPage adds the page to the user current list starred params
+func (o *UserCurrentListStarredParams) WithPage(page *int64) *UserCurrentListStarredParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the user current list starred params
+func (o *UserCurrentListStarredParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *UserCurrentListStarredParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.Limit != nil {
+
+		// query param limit
+		var qrLimit int64
+
+		if o.Limit != nil {
+			qrLimit = *o.Limit
+		}
+		qLimit := swag.FormatInt64(qrLimit)
+		if qLimit != "" {
+
+			if err := r.SetQueryParam("limit", qLimit); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_current_list_starred_responses.go b/bots-common/gitea-generated/client/user/user_current_list_starred_responses.go
new file mode 100644
index 0000000..36e5952
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_current_list_starred_responses.go
@@ -0,0 +1,104 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// UserCurrentListStarredReader is a Reader for the UserCurrentListStarred structure.
+type UserCurrentListStarredReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *UserCurrentListStarredReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewUserCurrentListStarredOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	default:
+		return nil, runtime.NewAPIError("[GET /user/starred] userCurrentListStarred", response, response.Code())
+	}
+}
+
+// NewUserCurrentListStarredOK creates a UserCurrentListStarredOK with default headers values
+func NewUserCurrentListStarredOK() *UserCurrentListStarredOK {
+	return &UserCurrentListStarredOK{}
+}
+
+/*
+UserCurrentListStarredOK describes a response with status code 200, with default header values.
+
+RepositoryList
+*/
+type UserCurrentListStarredOK struct {
+	Payload []*models.Repository
+}
+
+// IsSuccess returns true when this user current list starred o k response has a 2xx status code
+func (o *UserCurrentListStarredOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this user current list starred o k response has a 3xx status code
+func (o *UserCurrentListStarredOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user current list starred o k response has a 4xx status code
+func (o *UserCurrentListStarredOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this user current list starred o k response has a 5xx status code
+func (o *UserCurrentListStarredOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user current list starred o k response a status code equal to that given
+func (o *UserCurrentListStarredOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the user current list starred o k response
+func (o *UserCurrentListStarredOK) Code() int {
+	return 200
+}
+
+func (o *UserCurrentListStarredOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /user/starred][%d] userCurrentListStarredOK %s", 200, payload)
+}
+
+func (o *UserCurrentListStarredOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /user/starred][%d] userCurrentListStarredOK %s", 200, payload)
+}
+
+func (o *UserCurrentListStarredOK) GetPayload() []*models.Repository {
+	return o.Payload
+}
+
+func (o *UserCurrentListStarredOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_current_list_subscriptions_parameters.go b/bots-common/gitea-generated/client/user/user_current_list_subscriptions_parameters.go
new file mode 100644
index 0000000..b86dcb5
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_current_list_subscriptions_parameters.go
@@ -0,0 +1,198 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewUserCurrentListSubscriptionsParams creates a new UserCurrentListSubscriptionsParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewUserCurrentListSubscriptionsParams() *UserCurrentListSubscriptionsParams {
+	return &UserCurrentListSubscriptionsParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewUserCurrentListSubscriptionsParamsWithTimeout creates a new UserCurrentListSubscriptionsParams object
+// with the ability to set a timeout on a request.
+func NewUserCurrentListSubscriptionsParamsWithTimeout(timeout time.Duration) *UserCurrentListSubscriptionsParams {
+	return &UserCurrentListSubscriptionsParams{
+		timeout: timeout,
+	}
+}
+
+// NewUserCurrentListSubscriptionsParamsWithContext creates a new UserCurrentListSubscriptionsParams object
+// with the ability to set a context for a request.
+func NewUserCurrentListSubscriptionsParamsWithContext(ctx context.Context) *UserCurrentListSubscriptionsParams {
+	return &UserCurrentListSubscriptionsParams{
+		Context: ctx,
+	}
+}
+
+// NewUserCurrentListSubscriptionsParamsWithHTTPClient creates a new UserCurrentListSubscriptionsParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewUserCurrentListSubscriptionsParamsWithHTTPClient(client *http.Client) *UserCurrentListSubscriptionsParams {
+	return &UserCurrentListSubscriptionsParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+UserCurrentListSubscriptionsParams contains all the parameters to send to the API endpoint
+
+	for the user current list subscriptions operation.
+
+	Typically these are written to a http.Request.
+*/
+type UserCurrentListSubscriptionsParams struct {
+
+	/* Limit.
+
+	   page size of results
+	*/
+	Limit *int64
+
+	/* Page.
+
+	   page number of results to return (1-based)
+	*/
+	Page *int64
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the user current list subscriptions params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserCurrentListSubscriptionsParams) WithDefaults() *UserCurrentListSubscriptionsParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the user current list subscriptions params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserCurrentListSubscriptionsParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the user current list subscriptions params
+func (o *UserCurrentListSubscriptionsParams) WithTimeout(timeout time.Duration) *UserCurrentListSubscriptionsParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the user current list subscriptions params
+func (o *UserCurrentListSubscriptionsParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the user current list subscriptions params
+func (o *UserCurrentListSubscriptionsParams) WithContext(ctx context.Context) *UserCurrentListSubscriptionsParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the user current list subscriptions params
+func (o *UserCurrentListSubscriptionsParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the user current list subscriptions params
+func (o *UserCurrentListSubscriptionsParams) WithHTTPClient(client *http.Client) *UserCurrentListSubscriptionsParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the user current list subscriptions params
+func (o *UserCurrentListSubscriptionsParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithLimit adds the limit to the user current list subscriptions params
+func (o *UserCurrentListSubscriptionsParams) WithLimit(limit *int64) *UserCurrentListSubscriptionsParams {
+	o.SetLimit(limit)
+	return o
+}
+
+// SetLimit adds the limit to the user current list subscriptions params
+func (o *UserCurrentListSubscriptionsParams) SetLimit(limit *int64) {
+	o.Limit = limit
+}
+
+// WithPage adds the page to the user current list subscriptions params
+func (o *UserCurrentListSubscriptionsParams) WithPage(page *int64) *UserCurrentListSubscriptionsParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the user current list subscriptions params
+func (o *UserCurrentListSubscriptionsParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *UserCurrentListSubscriptionsParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.Limit != nil {
+
+		// query param limit
+		var qrLimit int64
+
+		if o.Limit != nil {
+			qrLimit = *o.Limit
+		}
+		qLimit := swag.FormatInt64(qrLimit)
+		if qLimit != "" {
+
+			if err := r.SetQueryParam("limit", qLimit); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_current_list_subscriptions_responses.go b/bots-common/gitea-generated/client/user/user_current_list_subscriptions_responses.go
new file mode 100644
index 0000000..08412a4
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_current_list_subscriptions_responses.go
@@ -0,0 +1,104 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// UserCurrentListSubscriptionsReader is a Reader for the UserCurrentListSubscriptions structure.
+type UserCurrentListSubscriptionsReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *UserCurrentListSubscriptionsReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewUserCurrentListSubscriptionsOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	default:
+		return nil, runtime.NewAPIError("[GET /user/subscriptions] userCurrentListSubscriptions", response, response.Code())
+	}
+}
+
+// NewUserCurrentListSubscriptionsOK creates a UserCurrentListSubscriptionsOK with default headers values
+func NewUserCurrentListSubscriptionsOK() *UserCurrentListSubscriptionsOK {
+	return &UserCurrentListSubscriptionsOK{}
+}
+
+/*
+UserCurrentListSubscriptionsOK describes a response with status code 200, with default header values.
+
+RepositoryList
+*/
+type UserCurrentListSubscriptionsOK struct {
+	Payload []*models.Repository
+}
+
+// IsSuccess returns true when this user current list subscriptions o k response has a 2xx status code
+func (o *UserCurrentListSubscriptionsOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this user current list subscriptions o k response has a 3xx status code
+func (o *UserCurrentListSubscriptionsOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user current list subscriptions o k response has a 4xx status code
+func (o *UserCurrentListSubscriptionsOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this user current list subscriptions o k response has a 5xx status code
+func (o *UserCurrentListSubscriptionsOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user current list subscriptions o k response a status code equal to that given
+func (o *UserCurrentListSubscriptionsOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the user current list subscriptions o k response
+func (o *UserCurrentListSubscriptionsOK) Code() int {
+	return 200
+}
+
+func (o *UserCurrentListSubscriptionsOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /user/subscriptions][%d] userCurrentListSubscriptionsOK %s", 200, payload)
+}
+
+func (o *UserCurrentListSubscriptionsOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /user/subscriptions][%d] userCurrentListSubscriptionsOK %s", 200, payload)
+}
+
+func (o *UserCurrentListSubscriptionsOK) GetPayload() []*models.Repository {
+	return o.Payload
+}
+
+func (o *UserCurrentListSubscriptionsOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_current_post_g_p_g_key_parameters.go b/bots-common/gitea-generated/client/user/user_current_post_g_p_g_key_parameters.go
new file mode 100644
index 0000000..115fcca
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_current_post_g_p_g_key_parameters.go
@@ -0,0 +1,150 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewUserCurrentPostGPGKeyParams creates a new UserCurrentPostGPGKeyParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewUserCurrentPostGPGKeyParams() *UserCurrentPostGPGKeyParams {
+	return &UserCurrentPostGPGKeyParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewUserCurrentPostGPGKeyParamsWithTimeout creates a new UserCurrentPostGPGKeyParams object
+// with the ability to set a timeout on a request.
+func NewUserCurrentPostGPGKeyParamsWithTimeout(timeout time.Duration) *UserCurrentPostGPGKeyParams {
+	return &UserCurrentPostGPGKeyParams{
+		timeout: timeout,
+	}
+}
+
+// NewUserCurrentPostGPGKeyParamsWithContext creates a new UserCurrentPostGPGKeyParams object
+// with the ability to set a context for a request.
+func NewUserCurrentPostGPGKeyParamsWithContext(ctx context.Context) *UserCurrentPostGPGKeyParams {
+	return &UserCurrentPostGPGKeyParams{
+		Context: ctx,
+	}
+}
+
+// NewUserCurrentPostGPGKeyParamsWithHTTPClient creates a new UserCurrentPostGPGKeyParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewUserCurrentPostGPGKeyParamsWithHTTPClient(client *http.Client) *UserCurrentPostGPGKeyParams {
+	return &UserCurrentPostGPGKeyParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+UserCurrentPostGPGKeyParams contains all the parameters to send to the API endpoint
+
+	for the user current post g p g key operation.
+
+	Typically these are written to a http.Request.
+*/
+type UserCurrentPostGPGKeyParams struct {
+
+	// Form.
+	Form *models.CreateGPGKeyOption
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the user current post g p g key params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserCurrentPostGPGKeyParams) WithDefaults() *UserCurrentPostGPGKeyParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the user current post g p g key params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserCurrentPostGPGKeyParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the user current post g p g key params
+func (o *UserCurrentPostGPGKeyParams) WithTimeout(timeout time.Duration) *UserCurrentPostGPGKeyParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the user current post g p g key params
+func (o *UserCurrentPostGPGKeyParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the user current post g p g key params
+func (o *UserCurrentPostGPGKeyParams) WithContext(ctx context.Context) *UserCurrentPostGPGKeyParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the user current post g p g key params
+func (o *UserCurrentPostGPGKeyParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the user current post g p g key params
+func (o *UserCurrentPostGPGKeyParams) WithHTTPClient(client *http.Client) *UserCurrentPostGPGKeyParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the user current post g p g key params
+func (o *UserCurrentPostGPGKeyParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithForm adds the form to the user current post g p g key params
+func (o *UserCurrentPostGPGKeyParams) WithForm(form *models.CreateGPGKeyOption) *UserCurrentPostGPGKeyParams {
+	o.SetForm(form)
+	return o
+}
+
+// SetForm adds the form to the user current post g p g key params
+func (o *UserCurrentPostGPGKeyParams) SetForm(form *models.CreateGPGKeyOption) {
+	o.Form = form
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *UserCurrentPostGPGKeyParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Form != nil {
+		if err := r.SetBodyParam(o.Form); err != nil {
+			return err
+		}
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_current_post_g_p_g_key_responses.go b/bots-common/gitea-generated/client/user/user_current_post_g_p_g_key_responses.go
new file mode 100644
index 0000000..f2d9a3c
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_current_post_g_p_g_key_responses.go
@@ -0,0 +1,246 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// UserCurrentPostGPGKeyReader is a Reader for the UserCurrentPostGPGKey structure.
+type UserCurrentPostGPGKeyReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *UserCurrentPostGPGKeyReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 201:
+		result := NewUserCurrentPostGPGKeyCreated()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewUserCurrentPostGPGKeyNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 422:
+		result := NewUserCurrentPostGPGKeyUnprocessableEntity()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[POST /user/gpg_keys] userCurrentPostGPGKey", response, response.Code())
+	}
+}
+
+// NewUserCurrentPostGPGKeyCreated creates a UserCurrentPostGPGKeyCreated with default headers values
+func NewUserCurrentPostGPGKeyCreated() *UserCurrentPostGPGKeyCreated {
+	return &UserCurrentPostGPGKeyCreated{}
+}
+
+/*
+UserCurrentPostGPGKeyCreated describes a response with status code 201, with default header values.
+
+GPGKey
+*/
+type UserCurrentPostGPGKeyCreated struct {
+	Payload *models.GPGKey
+}
+
+// IsSuccess returns true when this user current post g p g key created response has a 2xx status code
+func (o *UserCurrentPostGPGKeyCreated) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this user current post g p g key created response has a 3xx status code
+func (o *UserCurrentPostGPGKeyCreated) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user current post g p g key created response has a 4xx status code
+func (o *UserCurrentPostGPGKeyCreated) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this user current post g p g key created response has a 5xx status code
+func (o *UserCurrentPostGPGKeyCreated) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user current post g p g key created response a status code equal to that given
+func (o *UserCurrentPostGPGKeyCreated) IsCode(code int) bool {
+	return code == 201
+}
+
+// Code gets the status code for the user current post g p g key created response
+func (o *UserCurrentPostGPGKeyCreated) Code() int {
+	return 201
+}
+
+func (o *UserCurrentPostGPGKeyCreated) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /user/gpg_keys][%d] userCurrentPostGPGKeyCreated %s", 201, payload)
+}
+
+func (o *UserCurrentPostGPGKeyCreated) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /user/gpg_keys][%d] userCurrentPostGPGKeyCreated %s", 201, payload)
+}
+
+func (o *UserCurrentPostGPGKeyCreated) GetPayload() *models.GPGKey {
+	return o.Payload
+}
+
+func (o *UserCurrentPostGPGKeyCreated) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.GPGKey)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewUserCurrentPostGPGKeyNotFound creates a UserCurrentPostGPGKeyNotFound with default headers values
+func NewUserCurrentPostGPGKeyNotFound() *UserCurrentPostGPGKeyNotFound {
+	return &UserCurrentPostGPGKeyNotFound{}
+}
+
+/*
+UserCurrentPostGPGKeyNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type UserCurrentPostGPGKeyNotFound struct {
+}
+
+// IsSuccess returns true when this user current post g p g key not found response has a 2xx status code
+func (o *UserCurrentPostGPGKeyNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this user current post g p g key not found response has a 3xx status code
+func (o *UserCurrentPostGPGKeyNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user current post g p g key not found response has a 4xx status code
+func (o *UserCurrentPostGPGKeyNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this user current post g p g key not found response has a 5xx status code
+func (o *UserCurrentPostGPGKeyNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user current post g p g key not found response a status code equal to that given
+func (o *UserCurrentPostGPGKeyNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the user current post g p g key not found response
+func (o *UserCurrentPostGPGKeyNotFound) Code() int {
+	return 404
+}
+
+func (o *UserCurrentPostGPGKeyNotFound) Error() string {
+	return fmt.Sprintf("[POST /user/gpg_keys][%d] userCurrentPostGPGKeyNotFound", 404)
+}
+
+func (o *UserCurrentPostGPGKeyNotFound) String() string {
+	return fmt.Sprintf("[POST /user/gpg_keys][%d] userCurrentPostGPGKeyNotFound", 404)
+}
+
+func (o *UserCurrentPostGPGKeyNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewUserCurrentPostGPGKeyUnprocessableEntity creates a UserCurrentPostGPGKeyUnprocessableEntity with default headers values
+func NewUserCurrentPostGPGKeyUnprocessableEntity() *UserCurrentPostGPGKeyUnprocessableEntity {
+	return &UserCurrentPostGPGKeyUnprocessableEntity{}
+}
+
+/*
+UserCurrentPostGPGKeyUnprocessableEntity describes a response with status code 422, with default header values.
+
+APIValidationError is error format response related to input validation
+*/
+type UserCurrentPostGPGKeyUnprocessableEntity struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this user current post g p g key unprocessable entity response has a 2xx status code
+func (o *UserCurrentPostGPGKeyUnprocessableEntity) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this user current post g p g key unprocessable entity response has a 3xx status code
+func (o *UserCurrentPostGPGKeyUnprocessableEntity) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user current post g p g key unprocessable entity response has a 4xx status code
+func (o *UserCurrentPostGPGKeyUnprocessableEntity) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this user current post g p g key unprocessable entity response has a 5xx status code
+func (o *UserCurrentPostGPGKeyUnprocessableEntity) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user current post g p g key unprocessable entity response a status code equal to that given
+func (o *UserCurrentPostGPGKeyUnprocessableEntity) IsCode(code int) bool {
+	return code == 422
+}
+
+// Code gets the status code for the user current post g p g key unprocessable entity response
+func (o *UserCurrentPostGPGKeyUnprocessableEntity) Code() int {
+	return 422
+}
+
+func (o *UserCurrentPostGPGKeyUnprocessableEntity) Error() string {
+	return fmt.Sprintf("[POST /user/gpg_keys][%d] userCurrentPostGPGKeyUnprocessableEntity", 422)
+}
+
+func (o *UserCurrentPostGPGKeyUnprocessableEntity) String() string {
+	return fmt.Sprintf("[POST /user/gpg_keys][%d] userCurrentPostGPGKeyUnprocessableEntity", 422)
+}
+
+func (o *UserCurrentPostGPGKeyUnprocessableEntity) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_current_post_key_parameters.go b/bots-common/gitea-generated/client/user/user_current_post_key_parameters.go
new file mode 100644
index 0000000..e975da7
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_current_post_key_parameters.go
@@ -0,0 +1,150 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewUserCurrentPostKeyParams creates a new UserCurrentPostKeyParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewUserCurrentPostKeyParams() *UserCurrentPostKeyParams {
+	return &UserCurrentPostKeyParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewUserCurrentPostKeyParamsWithTimeout creates a new UserCurrentPostKeyParams object
+// with the ability to set a timeout on a request.
+func NewUserCurrentPostKeyParamsWithTimeout(timeout time.Duration) *UserCurrentPostKeyParams {
+	return &UserCurrentPostKeyParams{
+		timeout: timeout,
+	}
+}
+
+// NewUserCurrentPostKeyParamsWithContext creates a new UserCurrentPostKeyParams object
+// with the ability to set a context for a request.
+func NewUserCurrentPostKeyParamsWithContext(ctx context.Context) *UserCurrentPostKeyParams {
+	return &UserCurrentPostKeyParams{
+		Context: ctx,
+	}
+}
+
+// NewUserCurrentPostKeyParamsWithHTTPClient creates a new UserCurrentPostKeyParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewUserCurrentPostKeyParamsWithHTTPClient(client *http.Client) *UserCurrentPostKeyParams {
+	return &UserCurrentPostKeyParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+UserCurrentPostKeyParams contains all the parameters to send to the API endpoint
+
+	for the user current post key operation.
+
+	Typically these are written to a http.Request.
+*/
+type UserCurrentPostKeyParams struct {
+
+	// Body.
+	Body *models.CreateKeyOption
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the user current post key params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserCurrentPostKeyParams) WithDefaults() *UserCurrentPostKeyParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the user current post key params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserCurrentPostKeyParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the user current post key params
+func (o *UserCurrentPostKeyParams) WithTimeout(timeout time.Duration) *UserCurrentPostKeyParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the user current post key params
+func (o *UserCurrentPostKeyParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the user current post key params
+func (o *UserCurrentPostKeyParams) WithContext(ctx context.Context) *UserCurrentPostKeyParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the user current post key params
+func (o *UserCurrentPostKeyParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the user current post key params
+func (o *UserCurrentPostKeyParams) WithHTTPClient(client *http.Client) *UserCurrentPostKeyParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the user current post key params
+func (o *UserCurrentPostKeyParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the user current post key params
+func (o *UserCurrentPostKeyParams) WithBody(body *models.CreateKeyOption) *UserCurrentPostKeyParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the user current post key params
+func (o *UserCurrentPostKeyParams) SetBody(body *models.CreateKeyOption) {
+	o.Body = body
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *UserCurrentPostKeyParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_current_post_key_responses.go b/bots-common/gitea-generated/client/user/user_current_post_key_responses.go
new file mode 100644
index 0000000..94954a2
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_current_post_key_responses.go
@@ -0,0 +1,184 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// UserCurrentPostKeyReader is a Reader for the UserCurrentPostKey structure.
+type UserCurrentPostKeyReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *UserCurrentPostKeyReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 201:
+		result := NewUserCurrentPostKeyCreated()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 422:
+		result := NewUserCurrentPostKeyUnprocessableEntity()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[POST /user/keys] userCurrentPostKey", response, response.Code())
+	}
+}
+
+// NewUserCurrentPostKeyCreated creates a UserCurrentPostKeyCreated with default headers values
+func NewUserCurrentPostKeyCreated() *UserCurrentPostKeyCreated {
+	return &UserCurrentPostKeyCreated{}
+}
+
+/*
+UserCurrentPostKeyCreated describes a response with status code 201, with default header values.
+
+PublicKey
+*/
+type UserCurrentPostKeyCreated struct {
+	Payload *models.PublicKey
+}
+
+// IsSuccess returns true when this user current post key created response has a 2xx status code
+func (o *UserCurrentPostKeyCreated) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this user current post key created response has a 3xx status code
+func (o *UserCurrentPostKeyCreated) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user current post key created response has a 4xx status code
+func (o *UserCurrentPostKeyCreated) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this user current post key created response has a 5xx status code
+func (o *UserCurrentPostKeyCreated) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user current post key created response a status code equal to that given
+func (o *UserCurrentPostKeyCreated) IsCode(code int) bool {
+	return code == 201
+}
+
+// Code gets the status code for the user current post key created response
+func (o *UserCurrentPostKeyCreated) Code() int {
+	return 201
+}
+
+func (o *UserCurrentPostKeyCreated) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /user/keys][%d] userCurrentPostKeyCreated %s", 201, payload)
+}
+
+func (o *UserCurrentPostKeyCreated) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /user/keys][%d] userCurrentPostKeyCreated %s", 201, payload)
+}
+
+func (o *UserCurrentPostKeyCreated) GetPayload() *models.PublicKey {
+	return o.Payload
+}
+
+func (o *UserCurrentPostKeyCreated) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.PublicKey)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewUserCurrentPostKeyUnprocessableEntity creates a UserCurrentPostKeyUnprocessableEntity with default headers values
+func NewUserCurrentPostKeyUnprocessableEntity() *UserCurrentPostKeyUnprocessableEntity {
+	return &UserCurrentPostKeyUnprocessableEntity{}
+}
+
+/*
+UserCurrentPostKeyUnprocessableEntity describes a response with status code 422, with default header values.
+
+APIValidationError is error format response related to input validation
+*/
+type UserCurrentPostKeyUnprocessableEntity struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this user current post key unprocessable entity response has a 2xx status code
+func (o *UserCurrentPostKeyUnprocessableEntity) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this user current post key unprocessable entity response has a 3xx status code
+func (o *UserCurrentPostKeyUnprocessableEntity) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user current post key unprocessable entity response has a 4xx status code
+func (o *UserCurrentPostKeyUnprocessableEntity) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this user current post key unprocessable entity response has a 5xx status code
+func (o *UserCurrentPostKeyUnprocessableEntity) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user current post key unprocessable entity response a status code equal to that given
+func (o *UserCurrentPostKeyUnprocessableEntity) IsCode(code int) bool {
+	return code == 422
+}
+
+// Code gets the status code for the user current post key unprocessable entity response
+func (o *UserCurrentPostKeyUnprocessableEntity) Code() int {
+	return 422
+}
+
+func (o *UserCurrentPostKeyUnprocessableEntity) Error() string {
+	return fmt.Sprintf("[POST /user/keys][%d] userCurrentPostKeyUnprocessableEntity", 422)
+}
+
+func (o *UserCurrentPostKeyUnprocessableEntity) String() string {
+	return fmt.Sprintf("[POST /user/keys][%d] userCurrentPostKeyUnprocessableEntity", 422)
+}
+
+func (o *UserCurrentPostKeyUnprocessableEntity) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_current_put_follow_parameters.go b/bots-common/gitea-generated/client/user/user_current_put_follow_parameters.go
new file mode 100644
index 0000000..6517781
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_current_put_follow_parameters.go
@@ -0,0 +1,151 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewUserCurrentPutFollowParams creates a new UserCurrentPutFollowParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewUserCurrentPutFollowParams() *UserCurrentPutFollowParams {
+	return &UserCurrentPutFollowParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewUserCurrentPutFollowParamsWithTimeout creates a new UserCurrentPutFollowParams object
+// with the ability to set a timeout on a request.
+func NewUserCurrentPutFollowParamsWithTimeout(timeout time.Duration) *UserCurrentPutFollowParams {
+	return &UserCurrentPutFollowParams{
+		timeout: timeout,
+	}
+}
+
+// NewUserCurrentPutFollowParamsWithContext creates a new UserCurrentPutFollowParams object
+// with the ability to set a context for a request.
+func NewUserCurrentPutFollowParamsWithContext(ctx context.Context) *UserCurrentPutFollowParams {
+	return &UserCurrentPutFollowParams{
+		Context: ctx,
+	}
+}
+
+// NewUserCurrentPutFollowParamsWithHTTPClient creates a new UserCurrentPutFollowParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewUserCurrentPutFollowParamsWithHTTPClient(client *http.Client) *UserCurrentPutFollowParams {
+	return &UserCurrentPutFollowParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+UserCurrentPutFollowParams contains all the parameters to send to the API endpoint
+
+	for the user current put follow operation.
+
+	Typically these are written to a http.Request.
+*/
+type UserCurrentPutFollowParams struct {
+
+	/* Username.
+
+	   username of user to follow
+	*/
+	Username string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the user current put follow params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserCurrentPutFollowParams) WithDefaults() *UserCurrentPutFollowParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the user current put follow params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserCurrentPutFollowParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the user current put follow params
+func (o *UserCurrentPutFollowParams) WithTimeout(timeout time.Duration) *UserCurrentPutFollowParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the user current put follow params
+func (o *UserCurrentPutFollowParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the user current put follow params
+func (o *UserCurrentPutFollowParams) WithContext(ctx context.Context) *UserCurrentPutFollowParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the user current put follow params
+func (o *UserCurrentPutFollowParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the user current put follow params
+func (o *UserCurrentPutFollowParams) WithHTTPClient(client *http.Client) *UserCurrentPutFollowParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the user current put follow params
+func (o *UserCurrentPutFollowParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithUsername adds the username to the user current put follow params
+func (o *UserCurrentPutFollowParams) WithUsername(username string) *UserCurrentPutFollowParams {
+	o.SetUsername(username)
+	return o
+}
+
+// SetUsername adds the username to the user current put follow params
+func (o *UserCurrentPutFollowParams) SetUsername(username string) {
+	o.Username = username
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *UserCurrentPutFollowParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param username
+	if err := r.SetPathParam("username", o.Username); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_current_put_follow_responses.go b/bots-common/gitea-generated/client/user/user_current_put_follow_responses.go
new file mode 100644
index 0000000..527294a
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_current_put_follow_responses.go
@@ -0,0 +1,228 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// UserCurrentPutFollowReader is a Reader for the UserCurrentPutFollow structure.
+type UserCurrentPutFollowReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *UserCurrentPutFollowReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewUserCurrentPutFollowNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 403:
+		result := NewUserCurrentPutFollowForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewUserCurrentPutFollowNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[PUT /user/following/{username}] userCurrentPutFollow", response, response.Code())
+	}
+}
+
+// NewUserCurrentPutFollowNoContent creates a UserCurrentPutFollowNoContent with default headers values
+func NewUserCurrentPutFollowNoContent() *UserCurrentPutFollowNoContent {
+	return &UserCurrentPutFollowNoContent{}
+}
+
+/*
+UserCurrentPutFollowNoContent describes a response with status code 204, with default header values.
+
+APIEmpty is an empty response
+*/
+type UserCurrentPutFollowNoContent struct {
+}
+
+// IsSuccess returns true when this user current put follow no content response has a 2xx status code
+func (o *UserCurrentPutFollowNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this user current put follow no content response has a 3xx status code
+func (o *UserCurrentPutFollowNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user current put follow no content response has a 4xx status code
+func (o *UserCurrentPutFollowNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this user current put follow no content response has a 5xx status code
+func (o *UserCurrentPutFollowNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user current put follow no content response a status code equal to that given
+func (o *UserCurrentPutFollowNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the user current put follow no content response
+func (o *UserCurrentPutFollowNoContent) Code() int {
+	return 204
+}
+
+func (o *UserCurrentPutFollowNoContent) Error() string {
+	return fmt.Sprintf("[PUT /user/following/{username}][%d] userCurrentPutFollowNoContent", 204)
+}
+
+func (o *UserCurrentPutFollowNoContent) String() string {
+	return fmt.Sprintf("[PUT /user/following/{username}][%d] userCurrentPutFollowNoContent", 204)
+}
+
+func (o *UserCurrentPutFollowNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewUserCurrentPutFollowForbidden creates a UserCurrentPutFollowForbidden with default headers values
+func NewUserCurrentPutFollowForbidden() *UserCurrentPutFollowForbidden {
+	return &UserCurrentPutFollowForbidden{}
+}
+
+/*
+UserCurrentPutFollowForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type UserCurrentPutFollowForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this user current put follow forbidden response has a 2xx status code
+func (o *UserCurrentPutFollowForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this user current put follow forbidden response has a 3xx status code
+func (o *UserCurrentPutFollowForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user current put follow forbidden response has a 4xx status code
+func (o *UserCurrentPutFollowForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this user current put follow forbidden response has a 5xx status code
+func (o *UserCurrentPutFollowForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user current put follow forbidden response a status code equal to that given
+func (o *UserCurrentPutFollowForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the user current put follow forbidden response
+func (o *UserCurrentPutFollowForbidden) Code() int {
+	return 403
+}
+
+func (o *UserCurrentPutFollowForbidden) Error() string {
+	return fmt.Sprintf("[PUT /user/following/{username}][%d] userCurrentPutFollowForbidden", 403)
+}
+
+func (o *UserCurrentPutFollowForbidden) String() string {
+	return fmt.Sprintf("[PUT /user/following/{username}][%d] userCurrentPutFollowForbidden", 403)
+}
+
+func (o *UserCurrentPutFollowForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewUserCurrentPutFollowNotFound creates a UserCurrentPutFollowNotFound with default headers values
+func NewUserCurrentPutFollowNotFound() *UserCurrentPutFollowNotFound {
+	return &UserCurrentPutFollowNotFound{}
+}
+
+/*
+UserCurrentPutFollowNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type UserCurrentPutFollowNotFound struct {
+}
+
+// IsSuccess returns true when this user current put follow not found response has a 2xx status code
+func (o *UserCurrentPutFollowNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this user current put follow not found response has a 3xx status code
+func (o *UserCurrentPutFollowNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user current put follow not found response has a 4xx status code
+func (o *UserCurrentPutFollowNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this user current put follow not found response has a 5xx status code
+func (o *UserCurrentPutFollowNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user current put follow not found response a status code equal to that given
+func (o *UserCurrentPutFollowNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the user current put follow not found response
+func (o *UserCurrentPutFollowNotFound) Code() int {
+	return 404
+}
+
+func (o *UserCurrentPutFollowNotFound) Error() string {
+	return fmt.Sprintf("[PUT /user/following/{username}][%d] userCurrentPutFollowNotFound", 404)
+}
+
+func (o *UserCurrentPutFollowNotFound) String() string {
+	return fmt.Sprintf("[PUT /user/following/{username}][%d] userCurrentPutFollowNotFound", 404)
+}
+
+func (o *UserCurrentPutFollowNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_current_put_star_parameters.go b/bots-common/gitea-generated/client/user/user_current_put_star_parameters.go
new file mode 100644
index 0000000..35511c9
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_current_put_star_parameters.go
@@ -0,0 +1,173 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewUserCurrentPutStarParams creates a new UserCurrentPutStarParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewUserCurrentPutStarParams() *UserCurrentPutStarParams {
+	return &UserCurrentPutStarParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewUserCurrentPutStarParamsWithTimeout creates a new UserCurrentPutStarParams object
+// with the ability to set a timeout on a request.
+func NewUserCurrentPutStarParamsWithTimeout(timeout time.Duration) *UserCurrentPutStarParams {
+	return &UserCurrentPutStarParams{
+		timeout: timeout,
+	}
+}
+
+// NewUserCurrentPutStarParamsWithContext creates a new UserCurrentPutStarParams object
+// with the ability to set a context for a request.
+func NewUserCurrentPutStarParamsWithContext(ctx context.Context) *UserCurrentPutStarParams {
+	return &UserCurrentPutStarParams{
+		Context: ctx,
+	}
+}
+
+// NewUserCurrentPutStarParamsWithHTTPClient creates a new UserCurrentPutStarParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewUserCurrentPutStarParamsWithHTTPClient(client *http.Client) *UserCurrentPutStarParams {
+	return &UserCurrentPutStarParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+UserCurrentPutStarParams contains all the parameters to send to the API endpoint
+
+	for the user current put star operation.
+
+	Typically these are written to a http.Request.
+*/
+type UserCurrentPutStarParams struct {
+
+	/* Owner.
+
+	   owner of the repo to star
+	*/
+	Owner string
+
+	/* Repo.
+
+	   name of the repo to star
+	*/
+	Repo string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the user current put star params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserCurrentPutStarParams) WithDefaults() *UserCurrentPutStarParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the user current put star params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserCurrentPutStarParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the user current put star params
+func (o *UserCurrentPutStarParams) WithTimeout(timeout time.Duration) *UserCurrentPutStarParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the user current put star params
+func (o *UserCurrentPutStarParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the user current put star params
+func (o *UserCurrentPutStarParams) WithContext(ctx context.Context) *UserCurrentPutStarParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the user current put star params
+func (o *UserCurrentPutStarParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the user current put star params
+func (o *UserCurrentPutStarParams) WithHTTPClient(client *http.Client) *UserCurrentPutStarParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the user current put star params
+func (o *UserCurrentPutStarParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithOwner adds the owner to the user current put star params
+func (o *UserCurrentPutStarParams) WithOwner(owner string) *UserCurrentPutStarParams {
+	o.SetOwner(owner)
+	return o
+}
+
+// SetOwner adds the owner to the user current put star params
+func (o *UserCurrentPutStarParams) SetOwner(owner string) {
+	o.Owner = owner
+}
+
+// WithRepo adds the repo to the user current put star params
+func (o *UserCurrentPutStarParams) WithRepo(repo string) *UserCurrentPutStarParams {
+	o.SetRepo(repo)
+	return o
+}
+
+// SetRepo adds the repo to the user current put star params
+func (o *UserCurrentPutStarParams) SetRepo(repo string) {
+	o.Repo = repo
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *UserCurrentPutStarParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param owner
+	if err := r.SetPathParam("owner", o.Owner); err != nil {
+		return err
+	}
+
+	// path param repo
+	if err := r.SetPathParam("repo", o.Repo); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_current_put_star_responses.go b/bots-common/gitea-generated/client/user/user_current_put_star_responses.go
new file mode 100644
index 0000000..239df69
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_current_put_star_responses.go
@@ -0,0 +1,228 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// UserCurrentPutStarReader is a Reader for the UserCurrentPutStar structure.
+type UserCurrentPutStarReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *UserCurrentPutStarReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewUserCurrentPutStarNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 403:
+		result := NewUserCurrentPutStarForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewUserCurrentPutStarNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[PUT /user/starred/{owner}/{repo}] userCurrentPutStar", response, response.Code())
+	}
+}
+
+// NewUserCurrentPutStarNoContent creates a UserCurrentPutStarNoContent with default headers values
+func NewUserCurrentPutStarNoContent() *UserCurrentPutStarNoContent {
+	return &UserCurrentPutStarNoContent{}
+}
+
+/*
+UserCurrentPutStarNoContent describes a response with status code 204, with default header values.
+
+APIEmpty is an empty response
+*/
+type UserCurrentPutStarNoContent struct {
+}
+
+// IsSuccess returns true when this user current put star no content response has a 2xx status code
+func (o *UserCurrentPutStarNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this user current put star no content response has a 3xx status code
+func (o *UserCurrentPutStarNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user current put star no content response has a 4xx status code
+func (o *UserCurrentPutStarNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this user current put star no content response has a 5xx status code
+func (o *UserCurrentPutStarNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user current put star no content response a status code equal to that given
+func (o *UserCurrentPutStarNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the user current put star no content response
+func (o *UserCurrentPutStarNoContent) Code() int {
+	return 204
+}
+
+func (o *UserCurrentPutStarNoContent) Error() string {
+	return fmt.Sprintf("[PUT /user/starred/{owner}/{repo}][%d] userCurrentPutStarNoContent", 204)
+}
+
+func (o *UserCurrentPutStarNoContent) String() string {
+	return fmt.Sprintf("[PUT /user/starred/{owner}/{repo}][%d] userCurrentPutStarNoContent", 204)
+}
+
+func (o *UserCurrentPutStarNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewUserCurrentPutStarForbidden creates a UserCurrentPutStarForbidden with default headers values
+func NewUserCurrentPutStarForbidden() *UserCurrentPutStarForbidden {
+	return &UserCurrentPutStarForbidden{}
+}
+
+/*
+UserCurrentPutStarForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type UserCurrentPutStarForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this user current put star forbidden response has a 2xx status code
+func (o *UserCurrentPutStarForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this user current put star forbidden response has a 3xx status code
+func (o *UserCurrentPutStarForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user current put star forbidden response has a 4xx status code
+func (o *UserCurrentPutStarForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this user current put star forbidden response has a 5xx status code
+func (o *UserCurrentPutStarForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user current put star forbidden response a status code equal to that given
+func (o *UserCurrentPutStarForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the user current put star forbidden response
+func (o *UserCurrentPutStarForbidden) Code() int {
+	return 403
+}
+
+func (o *UserCurrentPutStarForbidden) Error() string {
+	return fmt.Sprintf("[PUT /user/starred/{owner}/{repo}][%d] userCurrentPutStarForbidden", 403)
+}
+
+func (o *UserCurrentPutStarForbidden) String() string {
+	return fmt.Sprintf("[PUT /user/starred/{owner}/{repo}][%d] userCurrentPutStarForbidden", 403)
+}
+
+func (o *UserCurrentPutStarForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewUserCurrentPutStarNotFound creates a UserCurrentPutStarNotFound with default headers values
+func NewUserCurrentPutStarNotFound() *UserCurrentPutStarNotFound {
+	return &UserCurrentPutStarNotFound{}
+}
+
+/*
+UserCurrentPutStarNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type UserCurrentPutStarNotFound struct {
+}
+
+// IsSuccess returns true when this user current put star not found response has a 2xx status code
+func (o *UserCurrentPutStarNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this user current put star not found response has a 3xx status code
+func (o *UserCurrentPutStarNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user current put star not found response has a 4xx status code
+func (o *UserCurrentPutStarNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this user current put star not found response has a 5xx status code
+func (o *UserCurrentPutStarNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user current put star not found response a status code equal to that given
+func (o *UserCurrentPutStarNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the user current put star not found response
+func (o *UserCurrentPutStarNotFound) Code() int {
+	return 404
+}
+
+func (o *UserCurrentPutStarNotFound) Error() string {
+	return fmt.Sprintf("[PUT /user/starred/{owner}/{repo}][%d] userCurrentPutStarNotFound", 404)
+}
+
+func (o *UserCurrentPutStarNotFound) String() string {
+	return fmt.Sprintf("[PUT /user/starred/{owner}/{repo}][%d] userCurrentPutStarNotFound", 404)
+}
+
+func (o *UserCurrentPutStarNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_current_tracked_times_parameters.go b/bots-common/gitea-generated/client/user/user_current_tracked_times_parameters.go
new file mode 100644
index 0000000..e8cfaaf
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_current_tracked_times_parameters.go
@@ -0,0 +1,270 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewUserCurrentTrackedTimesParams creates a new UserCurrentTrackedTimesParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewUserCurrentTrackedTimesParams() *UserCurrentTrackedTimesParams {
+	return &UserCurrentTrackedTimesParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewUserCurrentTrackedTimesParamsWithTimeout creates a new UserCurrentTrackedTimesParams object
+// with the ability to set a timeout on a request.
+func NewUserCurrentTrackedTimesParamsWithTimeout(timeout time.Duration) *UserCurrentTrackedTimesParams {
+	return &UserCurrentTrackedTimesParams{
+		timeout: timeout,
+	}
+}
+
+// NewUserCurrentTrackedTimesParamsWithContext creates a new UserCurrentTrackedTimesParams object
+// with the ability to set a context for a request.
+func NewUserCurrentTrackedTimesParamsWithContext(ctx context.Context) *UserCurrentTrackedTimesParams {
+	return &UserCurrentTrackedTimesParams{
+		Context: ctx,
+	}
+}
+
+// NewUserCurrentTrackedTimesParamsWithHTTPClient creates a new UserCurrentTrackedTimesParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewUserCurrentTrackedTimesParamsWithHTTPClient(client *http.Client) *UserCurrentTrackedTimesParams {
+	return &UserCurrentTrackedTimesParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+UserCurrentTrackedTimesParams contains all the parameters to send to the API endpoint
+
+	for the user current tracked times operation.
+
+	Typically these are written to a http.Request.
+*/
+type UserCurrentTrackedTimesParams struct {
+
+	/* Before.
+
+	   Only show times updated before the given time. This is a timestamp in RFC 3339 format
+
+	   Format: date-time
+	*/
+	Before *strfmt.DateTime
+
+	/* Limit.
+
+	   page size of results
+	*/
+	Limit *int64
+
+	/* Page.
+
+	   page number of results to return (1-based)
+	*/
+	Page *int64
+
+	/* Since.
+
+	   Only show times updated after the given time. This is a timestamp in RFC 3339 format
+
+	   Format: date-time
+	*/
+	Since *strfmt.DateTime
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the user current tracked times params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserCurrentTrackedTimesParams) WithDefaults() *UserCurrentTrackedTimesParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the user current tracked times params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserCurrentTrackedTimesParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the user current tracked times params
+func (o *UserCurrentTrackedTimesParams) WithTimeout(timeout time.Duration) *UserCurrentTrackedTimesParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the user current tracked times params
+func (o *UserCurrentTrackedTimesParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the user current tracked times params
+func (o *UserCurrentTrackedTimesParams) WithContext(ctx context.Context) *UserCurrentTrackedTimesParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the user current tracked times params
+func (o *UserCurrentTrackedTimesParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the user current tracked times params
+func (o *UserCurrentTrackedTimesParams) WithHTTPClient(client *http.Client) *UserCurrentTrackedTimesParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the user current tracked times params
+func (o *UserCurrentTrackedTimesParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBefore adds the before to the user current tracked times params
+func (o *UserCurrentTrackedTimesParams) WithBefore(before *strfmt.DateTime) *UserCurrentTrackedTimesParams {
+	o.SetBefore(before)
+	return o
+}
+
+// SetBefore adds the before to the user current tracked times params
+func (o *UserCurrentTrackedTimesParams) SetBefore(before *strfmt.DateTime) {
+	o.Before = before
+}
+
+// WithLimit adds the limit to the user current tracked times params
+func (o *UserCurrentTrackedTimesParams) WithLimit(limit *int64) *UserCurrentTrackedTimesParams {
+	o.SetLimit(limit)
+	return o
+}
+
+// SetLimit adds the limit to the user current tracked times params
+func (o *UserCurrentTrackedTimesParams) SetLimit(limit *int64) {
+	o.Limit = limit
+}
+
+// WithPage adds the page to the user current tracked times params
+func (o *UserCurrentTrackedTimesParams) WithPage(page *int64) *UserCurrentTrackedTimesParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the user current tracked times params
+func (o *UserCurrentTrackedTimesParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WithSince adds the since to the user current tracked times params
+func (o *UserCurrentTrackedTimesParams) WithSince(since *strfmt.DateTime) *UserCurrentTrackedTimesParams {
+	o.SetSince(since)
+	return o
+}
+
+// SetSince adds the since to the user current tracked times params
+func (o *UserCurrentTrackedTimesParams) SetSince(since *strfmt.DateTime) {
+	o.Since = since
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *UserCurrentTrackedTimesParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.Before != nil {
+
+		// query param before
+		var qrBefore strfmt.DateTime
+
+		if o.Before != nil {
+			qrBefore = *o.Before
+		}
+		qBefore := qrBefore.String()
+		if qBefore != "" {
+
+			if err := r.SetQueryParam("before", qBefore); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Limit != nil {
+
+		// query param limit
+		var qrLimit int64
+
+		if o.Limit != nil {
+			qrLimit = *o.Limit
+		}
+		qLimit := swag.FormatInt64(qrLimit)
+		if qLimit != "" {
+
+			if err := r.SetQueryParam("limit", qLimit); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Since != nil {
+
+		// query param since
+		var qrSince strfmt.DateTime
+
+		if o.Since != nil {
+			qrSince = *o.Since
+		}
+		qSince := qrSince.String()
+		if qSince != "" {
+
+			if err := r.SetQueryParam("since", qSince); err != nil {
+				return err
+			}
+		}
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_current_tracked_times_responses.go b/bots-common/gitea-generated/client/user/user_current_tracked_times_responses.go
new file mode 100644
index 0000000..e26d893
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_current_tracked_times_responses.go
@@ -0,0 +1,104 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// UserCurrentTrackedTimesReader is a Reader for the UserCurrentTrackedTimes structure.
+type UserCurrentTrackedTimesReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *UserCurrentTrackedTimesReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewUserCurrentTrackedTimesOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	default:
+		return nil, runtime.NewAPIError("[GET /user/times] userCurrentTrackedTimes", response, response.Code())
+	}
+}
+
+// NewUserCurrentTrackedTimesOK creates a UserCurrentTrackedTimesOK with default headers values
+func NewUserCurrentTrackedTimesOK() *UserCurrentTrackedTimesOK {
+	return &UserCurrentTrackedTimesOK{}
+}
+
+/*
+UserCurrentTrackedTimesOK describes a response with status code 200, with default header values.
+
+TrackedTimeList
+*/
+type UserCurrentTrackedTimesOK struct {
+	Payload []*models.TrackedTime
+}
+
+// IsSuccess returns true when this user current tracked times o k response has a 2xx status code
+func (o *UserCurrentTrackedTimesOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this user current tracked times o k response has a 3xx status code
+func (o *UserCurrentTrackedTimesOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user current tracked times o k response has a 4xx status code
+func (o *UserCurrentTrackedTimesOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this user current tracked times o k response has a 5xx status code
+func (o *UserCurrentTrackedTimesOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user current tracked times o k response a status code equal to that given
+func (o *UserCurrentTrackedTimesOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the user current tracked times o k response
+func (o *UserCurrentTrackedTimesOK) Code() int {
+	return 200
+}
+
+func (o *UserCurrentTrackedTimesOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /user/times][%d] userCurrentTrackedTimesOK %s", 200, payload)
+}
+
+func (o *UserCurrentTrackedTimesOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /user/times][%d] userCurrentTrackedTimesOK %s", 200, payload)
+}
+
+func (o *UserCurrentTrackedTimesOK) GetPayload() []*models.TrackedTime {
+	return o.Payload
+}
+
+func (o *UserCurrentTrackedTimesOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_delete_access_token_parameters.go b/bots-common/gitea-generated/client/user/user_delete_access_token_parameters.go
new file mode 100644
index 0000000..746f5f1
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_delete_access_token_parameters.go
@@ -0,0 +1,173 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewUserDeleteAccessTokenParams creates a new UserDeleteAccessTokenParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewUserDeleteAccessTokenParams() *UserDeleteAccessTokenParams {
+	return &UserDeleteAccessTokenParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewUserDeleteAccessTokenParamsWithTimeout creates a new UserDeleteAccessTokenParams object
+// with the ability to set a timeout on a request.
+func NewUserDeleteAccessTokenParamsWithTimeout(timeout time.Duration) *UserDeleteAccessTokenParams {
+	return &UserDeleteAccessTokenParams{
+		timeout: timeout,
+	}
+}
+
+// NewUserDeleteAccessTokenParamsWithContext creates a new UserDeleteAccessTokenParams object
+// with the ability to set a context for a request.
+func NewUserDeleteAccessTokenParamsWithContext(ctx context.Context) *UserDeleteAccessTokenParams {
+	return &UserDeleteAccessTokenParams{
+		Context: ctx,
+	}
+}
+
+// NewUserDeleteAccessTokenParamsWithHTTPClient creates a new UserDeleteAccessTokenParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewUserDeleteAccessTokenParamsWithHTTPClient(client *http.Client) *UserDeleteAccessTokenParams {
+	return &UserDeleteAccessTokenParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+UserDeleteAccessTokenParams contains all the parameters to send to the API endpoint
+
+	for the user delete access token operation.
+
+	Typically these are written to a http.Request.
+*/
+type UserDeleteAccessTokenParams struct {
+
+	/* Token.
+
+	   token to be deleted, identified by ID and if not available by name
+	*/
+	Token string
+
+	/* Username.
+
+	   username of user
+	*/
+	Username string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the user delete access token params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserDeleteAccessTokenParams) WithDefaults() *UserDeleteAccessTokenParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the user delete access token params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserDeleteAccessTokenParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the user delete access token params
+func (o *UserDeleteAccessTokenParams) WithTimeout(timeout time.Duration) *UserDeleteAccessTokenParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the user delete access token params
+func (o *UserDeleteAccessTokenParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the user delete access token params
+func (o *UserDeleteAccessTokenParams) WithContext(ctx context.Context) *UserDeleteAccessTokenParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the user delete access token params
+func (o *UserDeleteAccessTokenParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the user delete access token params
+func (o *UserDeleteAccessTokenParams) WithHTTPClient(client *http.Client) *UserDeleteAccessTokenParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the user delete access token params
+func (o *UserDeleteAccessTokenParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithToken adds the token to the user delete access token params
+func (o *UserDeleteAccessTokenParams) WithToken(token string) *UserDeleteAccessTokenParams {
+	o.SetToken(token)
+	return o
+}
+
+// SetToken adds the token to the user delete access token params
+func (o *UserDeleteAccessTokenParams) SetToken(token string) {
+	o.Token = token
+}
+
+// WithUsername adds the username to the user delete access token params
+func (o *UserDeleteAccessTokenParams) WithUsername(username string) *UserDeleteAccessTokenParams {
+	o.SetUsername(username)
+	return o
+}
+
+// SetUsername adds the username to the user delete access token params
+func (o *UserDeleteAccessTokenParams) SetUsername(username string) {
+	o.Username = username
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *UserDeleteAccessTokenParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param token
+	if err := r.SetPathParam("token", o.Token); err != nil {
+		return err
+	}
+
+	// path param username
+	if err := r.SetPathParam("username", o.Username); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_delete_access_token_responses.go b/bots-common/gitea-generated/client/user/user_delete_access_token_responses.go
new file mode 100644
index 0000000..ae0e964
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_delete_access_token_responses.go
@@ -0,0 +1,306 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// UserDeleteAccessTokenReader is a Reader for the UserDeleteAccessToken structure.
+type UserDeleteAccessTokenReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *UserDeleteAccessTokenReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewUserDeleteAccessTokenNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 403:
+		result := NewUserDeleteAccessTokenForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 404:
+		result := NewUserDeleteAccessTokenNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 422:
+		result := NewUserDeleteAccessTokenUnprocessableEntity()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[DELETE /users/{username}/tokens/{token}] userDeleteAccessToken", response, response.Code())
+	}
+}
+
+// NewUserDeleteAccessTokenNoContent creates a UserDeleteAccessTokenNoContent with default headers values
+func NewUserDeleteAccessTokenNoContent() *UserDeleteAccessTokenNoContent {
+	return &UserDeleteAccessTokenNoContent{}
+}
+
+/*
+UserDeleteAccessTokenNoContent describes a response with status code 204, with default header values.
+
+APIEmpty is an empty response
+*/
+type UserDeleteAccessTokenNoContent struct {
+}
+
+// IsSuccess returns true when this user delete access token no content response has a 2xx status code
+func (o *UserDeleteAccessTokenNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this user delete access token no content response has a 3xx status code
+func (o *UserDeleteAccessTokenNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user delete access token no content response has a 4xx status code
+func (o *UserDeleteAccessTokenNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this user delete access token no content response has a 5xx status code
+func (o *UserDeleteAccessTokenNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user delete access token no content response a status code equal to that given
+func (o *UserDeleteAccessTokenNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the user delete access token no content response
+func (o *UserDeleteAccessTokenNoContent) Code() int {
+	return 204
+}
+
+func (o *UserDeleteAccessTokenNoContent) Error() string {
+	return fmt.Sprintf("[DELETE /users/{username}/tokens/{token}][%d] userDeleteAccessTokenNoContent", 204)
+}
+
+func (o *UserDeleteAccessTokenNoContent) String() string {
+	return fmt.Sprintf("[DELETE /users/{username}/tokens/{token}][%d] userDeleteAccessTokenNoContent", 204)
+}
+
+func (o *UserDeleteAccessTokenNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewUserDeleteAccessTokenForbidden creates a UserDeleteAccessTokenForbidden with default headers values
+func NewUserDeleteAccessTokenForbidden() *UserDeleteAccessTokenForbidden {
+	return &UserDeleteAccessTokenForbidden{}
+}
+
+/*
+UserDeleteAccessTokenForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type UserDeleteAccessTokenForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this user delete access token forbidden response has a 2xx status code
+func (o *UserDeleteAccessTokenForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this user delete access token forbidden response has a 3xx status code
+func (o *UserDeleteAccessTokenForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user delete access token forbidden response has a 4xx status code
+func (o *UserDeleteAccessTokenForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this user delete access token forbidden response has a 5xx status code
+func (o *UserDeleteAccessTokenForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user delete access token forbidden response a status code equal to that given
+func (o *UserDeleteAccessTokenForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the user delete access token forbidden response
+func (o *UserDeleteAccessTokenForbidden) Code() int {
+	return 403
+}
+
+func (o *UserDeleteAccessTokenForbidden) Error() string {
+	return fmt.Sprintf("[DELETE /users/{username}/tokens/{token}][%d] userDeleteAccessTokenForbidden", 403)
+}
+
+func (o *UserDeleteAccessTokenForbidden) String() string {
+	return fmt.Sprintf("[DELETE /users/{username}/tokens/{token}][%d] userDeleteAccessTokenForbidden", 403)
+}
+
+func (o *UserDeleteAccessTokenForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
+
+// NewUserDeleteAccessTokenNotFound creates a UserDeleteAccessTokenNotFound with default headers values
+func NewUserDeleteAccessTokenNotFound() *UserDeleteAccessTokenNotFound {
+	return &UserDeleteAccessTokenNotFound{}
+}
+
+/*
+UserDeleteAccessTokenNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type UserDeleteAccessTokenNotFound struct {
+}
+
+// IsSuccess returns true when this user delete access token not found response has a 2xx status code
+func (o *UserDeleteAccessTokenNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this user delete access token not found response has a 3xx status code
+func (o *UserDeleteAccessTokenNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user delete access token not found response has a 4xx status code
+func (o *UserDeleteAccessTokenNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this user delete access token not found response has a 5xx status code
+func (o *UserDeleteAccessTokenNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user delete access token not found response a status code equal to that given
+func (o *UserDeleteAccessTokenNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the user delete access token not found response
+func (o *UserDeleteAccessTokenNotFound) Code() int {
+	return 404
+}
+
+func (o *UserDeleteAccessTokenNotFound) Error() string {
+	return fmt.Sprintf("[DELETE /users/{username}/tokens/{token}][%d] userDeleteAccessTokenNotFound", 404)
+}
+
+func (o *UserDeleteAccessTokenNotFound) String() string {
+	return fmt.Sprintf("[DELETE /users/{username}/tokens/{token}][%d] userDeleteAccessTokenNotFound", 404)
+}
+
+func (o *UserDeleteAccessTokenNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewUserDeleteAccessTokenUnprocessableEntity creates a UserDeleteAccessTokenUnprocessableEntity with default headers values
+func NewUserDeleteAccessTokenUnprocessableEntity() *UserDeleteAccessTokenUnprocessableEntity {
+	return &UserDeleteAccessTokenUnprocessableEntity{}
+}
+
+/*
+UserDeleteAccessTokenUnprocessableEntity describes a response with status code 422, with default header values.
+
+APIError is error format response
+*/
+type UserDeleteAccessTokenUnprocessableEntity struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this user delete access token unprocessable entity response has a 2xx status code
+func (o *UserDeleteAccessTokenUnprocessableEntity) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this user delete access token unprocessable entity response has a 3xx status code
+func (o *UserDeleteAccessTokenUnprocessableEntity) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user delete access token unprocessable entity response has a 4xx status code
+func (o *UserDeleteAccessTokenUnprocessableEntity) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this user delete access token unprocessable entity response has a 5xx status code
+func (o *UserDeleteAccessTokenUnprocessableEntity) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user delete access token unprocessable entity response a status code equal to that given
+func (o *UserDeleteAccessTokenUnprocessableEntity) IsCode(code int) bool {
+	return code == 422
+}
+
+// Code gets the status code for the user delete access token unprocessable entity response
+func (o *UserDeleteAccessTokenUnprocessableEntity) Code() int {
+	return 422
+}
+
+func (o *UserDeleteAccessTokenUnprocessableEntity) Error() string {
+	return fmt.Sprintf("[DELETE /users/{username}/tokens/{token}][%d] userDeleteAccessTokenUnprocessableEntity", 422)
+}
+
+func (o *UserDeleteAccessTokenUnprocessableEntity) String() string {
+	return fmt.Sprintf("[DELETE /users/{username}/tokens/{token}][%d] userDeleteAccessTokenUnprocessableEntity", 422)
+}
+
+func (o *UserDeleteAccessTokenUnprocessableEntity) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_delete_avatar_parameters.go b/bots-common/gitea-generated/client/user/user_delete_avatar_parameters.go
new file mode 100644
index 0000000..048a19a
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_delete_avatar_parameters.go
@@ -0,0 +1,128 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewUserDeleteAvatarParams creates a new UserDeleteAvatarParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewUserDeleteAvatarParams() *UserDeleteAvatarParams {
+	return &UserDeleteAvatarParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewUserDeleteAvatarParamsWithTimeout creates a new UserDeleteAvatarParams object
+// with the ability to set a timeout on a request.
+func NewUserDeleteAvatarParamsWithTimeout(timeout time.Duration) *UserDeleteAvatarParams {
+	return &UserDeleteAvatarParams{
+		timeout: timeout,
+	}
+}
+
+// NewUserDeleteAvatarParamsWithContext creates a new UserDeleteAvatarParams object
+// with the ability to set a context for a request.
+func NewUserDeleteAvatarParamsWithContext(ctx context.Context) *UserDeleteAvatarParams {
+	return &UserDeleteAvatarParams{
+		Context: ctx,
+	}
+}
+
+// NewUserDeleteAvatarParamsWithHTTPClient creates a new UserDeleteAvatarParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewUserDeleteAvatarParamsWithHTTPClient(client *http.Client) *UserDeleteAvatarParams {
+	return &UserDeleteAvatarParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+UserDeleteAvatarParams contains all the parameters to send to the API endpoint
+
+	for the user delete avatar operation.
+
+	Typically these are written to a http.Request.
+*/
+type UserDeleteAvatarParams struct {
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the user delete avatar params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserDeleteAvatarParams) WithDefaults() *UserDeleteAvatarParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the user delete avatar params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserDeleteAvatarParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the user delete avatar params
+func (o *UserDeleteAvatarParams) WithTimeout(timeout time.Duration) *UserDeleteAvatarParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the user delete avatar params
+func (o *UserDeleteAvatarParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the user delete avatar params
+func (o *UserDeleteAvatarParams) WithContext(ctx context.Context) *UserDeleteAvatarParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the user delete avatar params
+func (o *UserDeleteAvatarParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the user delete avatar params
+func (o *UserDeleteAvatarParams) WithHTTPClient(client *http.Client) *UserDeleteAvatarParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the user delete avatar params
+func (o *UserDeleteAvatarParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *UserDeleteAvatarParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_delete_avatar_responses.go b/bots-common/gitea-generated/client/user/user_delete_avatar_responses.go
new file mode 100644
index 0000000..440e888
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_delete_avatar_responses.go
@@ -0,0 +1,88 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// UserDeleteAvatarReader is a Reader for the UserDeleteAvatar structure.
+type UserDeleteAvatarReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *UserDeleteAvatarReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewUserDeleteAvatarNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	default:
+		return nil, runtime.NewAPIError("[DELETE /user/avatar] userDeleteAvatar", response, response.Code())
+	}
+}
+
+// NewUserDeleteAvatarNoContent creates a UserDeleteAvatarNoContent with default headers values
+func NewUserDeleteAvatarNoContent() *UserDeleteAvatarNoContent {
+	return &UserDeleteAvatarNoContent{}
+}
+
+/*
+UserDeleteAvatarNoContent describes a response with status code 204, with default header values.
+
+APIEmpty is an empty response
+*/
+type UserDeleteAvatarNoContent struct {
+}
+
+// IsSuccess returns true when this user delete avatar no content response has a 2xx status code
+func (o *UserDeleteAvatarNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this user delete avatar no content response has a 3xx status code
+func (o *UserDeleteAvatarNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user delete avatar no content response has a 4xx status code
+func (o *UserDeleteAvatarNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this user delete avatar no content response has a 5xx status code
+func (o *UserDeleteAvatarNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user delete avatar no content response a status code equal to that given
+func (o *UserDeleteAvatarNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the user delete avatar no content response
+func (o *UserDeleteAvatarNoContent) Code() int {
+	return 204
+}
+
+func (o *UserDeleteAvatarNoContent) Error() string {
+	return fmt.Sprintf("[DELETE /user/avatar][%d] userDeleteAvatarNoContent", 204)
+}
+
+func (o *UserDeleteAvatarNoContent) String() string {
+	return fmt.Sprintf("[DELETE /user/avatar][%d] userDeleteAvatarNoContent", 204)
+}
+
+func (o *UserDeleteAvatarNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_delete_email_parameters.go b/bots-common/gitea-generated/client/user/user_delete_email_parameters.go
new file mode 100644
index 0000000..81da0ce
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_delete_email_parameters.go
@@ -0,0 +1,150 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewUserDeleteEmailParams creates a new UserDeleteEmailParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewUserDeleteEmailParams() *UserDeleteEmailParams {
+	return &UserDeleteEmailParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewUserDeleteEmailParamsWithTimeout creates a new UserDeleteEmailParams object
+// with the ability to set a timeout on a request.
+func NewUserDeleteEmailParamsWithTimeout(timeout time.Duration) *UserDeleteEmailParams {
+	return &UserDeleteEmailParams{
+		timeout: timeout,
+	}
+}
+
+// NewUserDeleteEmailParamsWithContext creates a new UserDeleteEmailParams object
+// with the ability to set a context for a request.
+func NewUserDeleteEmailParamsWithContext(ctx context.Context) *UserDeleteEmailParams {
+	return &UserDeleteEmailParams{
+		Context: ctx,
+	}
+}
+
+// NewUserDeleteEmailParamsWithHTTPClient creates a new UserDeleteEmailParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewUserDeleteEmailParamsWithHTTPClient(client *http.Client) *UserDeleteEmailParams {
+	return &UserDeleteEmailParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+UserDeleteEmailParams contains all the parameters to send to the API endpoint
+
+	for the user delete email operation.
+
+	Typically these are written to a http.Request.
+*/
+type UserDeleteEmailParams struct {
+
+	// Body.
+	Body *models.DeleteEmailOption
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the user delete email params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserDeleteEmailParams) WithDefaults() *UserDeleteEmailParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the user delete email params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserDeleteEmailParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the user delete email params
+func (o *UserDeleteEmailParams) WithTimeout(timeout time.Duration) *UserDeleteEmailParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the user delete email params
+func (o *UserDeleteEmailParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the user delete email params
+func (o *UserDeleteEmailParams) WithContext(ctx context.Context) *UserDeleteEmailParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the user delete email params
+func (o *UserDeleteEmailParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the user delete email params
+func (o *UserDeleteEmailParams) WithHTTPClient(client *http.Client) *UserDeleteEmailParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the user delete email params
+func (o *UserDeleteEmailParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the user delete email params
+func (o *UserDeleteEmailParams) WithBody(body *models.DeleteEmailOption) *UserDeleteEmailParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the user delete email params
+func (o *UserDeleteEmailParams) SetBody(body *models.DeleteEmailOption) {
+	o.Body = body
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *UserDeleteEmailParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_delete_email_responses.go b/bots-common/gitea-generated/client/user/user_delete_email_responses.go
new file mode 100644
index 0000000..cd3806c
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_delete_email_responses.go
@@ -0,0 +1,150 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// UserDeleteEmailReader is a Reader for the UserDeleteEmail structure.
+type UserDeleteEmailReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *UserDeleteEmailReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewUserDeleteEmailNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewUserDeleteEmailNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[DELETE /user/emails] userDeleteEmail", response, response.Code())
+	}
+}
+
+// NewUserDeleteEmailNoContent creates a UserDeleteEmailNoContent with default headers values
+func NewUserDeleteEmailNoContent() *UserDeleteEmailNoContent {
+	return &UserDeleteEmailNoContent{}
+}
+
+/*
+UserDeleteEmailNoContent describes a response with status code 204, with default header values.
+
+APIEmpty is an empty response
+*/
+type UserDeleteEmailNoContent struct {
+}
+
+// IsSuccess returns true when this user delete email no content response has a 2xx status code
+func (o *UserDeleteEmailNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this user delete email no content response has a 3xx status code
+func (o *UserDeleteEmailNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user delete email no content response has a 4xx status code
+func (o *UserDeleteEmailNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this user delete email no content response has a 5xx status code
+func (o *UserDeleteEmailNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user delete email no content response a status code equal to that given
+func (o *UserDeleteEmailNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the user delete email no content response
+func (o *UserDeleteEmailNoContent) Code() int {
+	return 204
+}
+
+func (o *UserDeleteEmailNoContent) Error() string {
+	return fmt.Sprintf("[DELETE /user/emails][%d] userDeleteEmailNoContent", 204)
+}
+
+func (o *UserDeleteEmailNoContent) String() string {
+	return fmt.Sprintf("[DELETE /user/emails][%d] userDeleteEmailNoContent", 204)
+}
+
+func (o *UserDeleteEmailNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewUserDeleteEmailNotFound creates a UserDeleteEmailNotFound with default headers values
+func NewUserDeleteEmailNotFound() *UserDeleteEmailNotFound {
+	return &UserDeleteEmailNotFound{}
+}
+
+/*
+UserDeleteEmailNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type UserDeleteEmailNotFound struct {
+}
+
+// IsSuccess returns true when this user delete email not found response has a 2xx status code
+func (o *UserDeleteEmailNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this user delete email not found response has a 3xx status code
+func (o *UserDeleteEmailNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user delete email not found response has a 4xx status code
+func (o *UserDeleteEmailNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this user delete email not found response has a 5xx status code
+func (o *UserDeleteEmailNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user delete email not found response a status code equal to that given
+func (o *UserDeleteEmailNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the user delete email not found response
+func (o *UserDeleteEmailNotFound) Code() int {
+	return 404
+}
+
+func (o *UserDeleteEmailNotFound) Error() string {
+	return fmt.Sprintf("[DELETE /user/emails][%d] userDeleteEmailNotFound", 404)
+}
+
+func (o *UserDeleteEmailNotFound) String() string {
+	return fmt.Sprintf("[DELETE /user/emails][%d] userDeleteEmailNotFound", 404)
+}
+
+func (o *UserDeleteEmailNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_delete_hook_parameters.go b/bots-common/gitea-generated/client/user/user_delete_hook_parameters.go
new file mode 100644
index 0000000..4bea9cb
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_delete_hook_parameters.go
@@ -0,0 +1,154 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewUserDeleteHookParams creates a new UserDeleteHookParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewUserDeleteHookParams() *UserDeleteHookParams {
+	return &UserDeleteHookParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewUserDeleteHookParamsWithTimeout creates a new UserDeleteHookParams object
+// with the ability to set a timeout on a request.
+func NewUserDeleteHookParamsWithTimeout(timeout time.Duration) *UserDeleteHookParams {
+	return &UserDeleteHookParams{
+		timeout: timeout,
+	}
+}
+
+// NewUserDeleteHookParamsWithContext creates a new UserDeleteHookParams object
+// with the ability to set a context for a request.
+func NewUserDeleteHookParamsWithContext(ctx context.Context) *UserDeleteHookParams {
+	return &UserDeleteHookParams{
+		Context: ctx,
+	}
+}
+
+// NewUserDeleteHookParamsWithHTTPClient creates a new UserDeleteHookParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewUserDeleteHookParamsWithHTTPClient(client *http.Client) *UserDeleteHookParams {
+	return &UserDeleteHookParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+UserDeleteHookParams contains all the parameters to send to the API endpoint
+
+	for the user delete hook operation.
+
+	Typically these are written to a http.Request.
+*/
+type UserDeleteHookParams struct {
+
+	/* ID.
+
+	   id of the hook to delete
+
+	   Format: int64
+	*/
+	ID int64
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the user delete hook params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserDeleteHookParams) WithDefaults() *UserDeleteHookParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the user delete hook params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserDeleteHookParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the user delete hook params
+func (o *UserDeleteHookParams) WithTimeout(timeout time.Duration) *UserDeleteHookParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the user delete hook params
+func (o *UserDeleteHookParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the user delete hook params
+func (o *UserDeleteHookParams) WithContext(ctx context.Context) *UserDeleteHookParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the user delete hook params
+func (o *UserDeleteHookParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the user delete hook params
+func (o *UserDeleteHookParams) WithHTTPClient(client *http.Client) *UserDeleteHookParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the user delete hook params
+func (o *UserDeleteHookParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithID adds the id to the user delete hook params
+func (o *UserDeleteHookParams) WithID(id int64) *UserDeleteHookParams {
+	o.SetID(id)
+	return o
+}
+
+// SetID adds the id to the user delete hook params
+func (o *UserDeleteHookParams) SetID(id int64) {
+	o.ID = id
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *UserDeleteHookParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param id
+	if err := r.SetPathParam("id", swag.FormatInt64(o.ID)); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_delete_hook_responses.go b/bots-common/gitea-generated/client/user/user_delete_hook_responses.go
new file mode 100644
index 0000000..5aea8ce
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_delete_hook_responses.go
@@ -0,0 +1,88 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// UserDeleteHookReader is a Reader for the UserDeleteHook structure.
+type UserDeleteHookReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *UserDeleteHookReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewUserDeleteHookNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	default:
+		return nil, runtime.NewAPIError("[DELETE /user/hooks/{id}] userDeleteHook", response, response.Code())
+	}
+}
+
+// NewUserDeleteHookNoContent creates a UserDeleteHookNoContent with default headers values
+func NewUserDeleteHookNoContent() *UserDeleteHookNoContent {
+	return &UserDeleteHookNoContent{}
+}
+
+/*
+UserDeleteHookNoContent describes a response with status code 204, with default header values.
+
+APIEmpty is an empty response
+*/
+type UserDeleteHookNoContent struct {
+}
+
+// IsSuccess returns true when this user delete hook no content response has a 2xx status code
+func (o *UserDeleteHookNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this user delete hook no content response has a 3xx status code
+func (o *UserDeleteHookNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user delete hook no content response has a 4xx status code
+func (o *UserDeleteHookNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this user delete hook no content response has a 5xx status code
+func (o *UserDeleteHookNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user delete hook no content response a status code equal to that given
+func (o *UserDeleteHookNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the user delete hook no content response
+func (o *UserDeleteHookNoContent) Code() int {
+	return 204
+}
+
+func (o *UserDeleteHookNoContent) Error() string {
+	return fmt.Sprintf("[DELETE /user/hooks/{id}][%d] userDeleteHookNoContent", 204)
+}
+
+func (o *UserDeleteHookNoContent) String() string {
+	return fmt.Sprintf("[DELETE /user/hooks/{id}][%d] userDeleteHookNoContent", 204)
+}
+
+func (o *UserDeleteHookNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_delete_o_auth2_application_parameters.go b/bots-common/gitea-generated/client/user/user_delete_o_auth2_application_parameters.go
new file mode 100644
index 0000000..dfe46d0
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_delete_o_auth2_application_parameters.go
@@ -0,0 +1,154 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewUserDeleteOAuth2ApplicationParams creates a new UserDeleteOAuth2ApplicationParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewUserDeleteOAuth2ApplicationParams() *UserDeleteOAuth2ApplicationParams {
+	return &UserDeleteOAuth2ApplicationParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewUserDeleteOAuth2ApplicationParamsWithTimeout creates a new UserDeleteOAuth2ApplicationParams object
+// with the ability to set a timeout on a request.
+func NewUserDeleteOAuth2ApplicationParamsWithTimeout(timeout time.Duration) *UserDeleteOAuth2ApplicationParams {
+	return &UserDeleteOAuth2ApplicationParams{
+		timeout: timeout,
+	}
+}
+
+// NewUserDeleteOAuth2ApplicationParamsWithContext creates a new UserDeleteOAuth2ApplicationParams object
+// with the ability to set a context for a request.
+func NewUserDeleteOAuth2ApplicationParamsWithContext(ctx context.Context) *UserDeleteOAuth2ApplicationParams {
+	return &UserDeleteOAuth2ApplicationParams{
+		Context: ctx,
+	}
+}
+
+// NewUserDeleteOAuth2ApplicationParamsWithHTTPClient creates a new UserDeleteOAuth2ApplicationParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewUserDeleteOAuth2ApplicationParamsWithHTTPClient(client *http.Client) *UserDeleteOAuth2ApplicationParams {
+	return &UserDeleteOAuth2ApplicationParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+UserDeleteOAuth2ApplicationParams contains all the parameters to send to the API endpoint
+
+	for the user delete o auth2 application operation.
+
+	Typically these are written to a http.Request.
+*/
+type UserDeleteOAuth2ApplicationParams struct {
+
+	/* ID.
+
+	   token to be deleted
+
+	   Format: int64
+	*/
+	ID int64
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the user delete o auth2 application params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserDeleteOAuth2ApplicationParams) WithDefaults() *UserDeleteOAuth2ApplicationParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the user delete o auth2 application params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserDeleteOAuth2ApplicationParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the user delete o auth2 application params
+func (o *UserDeleteOAuth2ApplicationParams) WithTimeout(timeout time.Duration) *UserDeleteOAuth2ApplicationParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the user delete o auth2 application params
+func (o *UserDeleteOAuth2ApplicationParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the user delete o auth2 application params
+func (o *UserDeleteOAuth2ApplicationParams) WithContext(ctx context.Context) *UserDeleteOAuth2ApplicationParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the user delete o auth2 application params
+func (o *UserDeleteOAuth2ApplicationParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the user delete o auth2 application params
+func (o *UserDeleteOAuth2ApplicationParams) WithHTTPClient(client *http.Client) *UserDeleteOAuth2ApplicationParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the user delete o auth2 application params
+func (o *UserDeleteOAuth2ApplicationParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithID adds the id to the user delete o auth2 application params
+func (o *UserDeleteOAuth2ApplicationParams) WithID(id int64) *UserDeleteOAuth2ApplicationParams {
+	o.SetID(id)
+	return o
+}
+
+// SetID adds the id to the user delete o auth2 application params
+func (o *UserDeleteOAuth2ApplicationParams) SetID(id int64) {
+	o.ID = id
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *UserDeleteOAuth2ApplicationParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param id
+	if err := r.SetPathParam("id", swag.FormatInt64(o.ID)); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_delete_o_auth2_application_responses.go b/bots-common/gitea-generated/client/user/user_delete_o_auth2_application_responses.go
new file mode 100644
index 0000000..85a2f7b
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_delete_o_auth2_application_responses.go
@@ -0,0 +1,150 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// UserDeleteOAuth2ApplicationReader is a Reader for the UserDeleteOAuth2Application structure.
+type UserDeleteOAuth2ApplicationReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *UserDeleteOAuth2ApplicationReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewUserDeleteOAuth2ApplicationNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewUserDeleteOAuth2ApplicationNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[DELETE /user/applications/oauth2/{id}] userDeleteOAuth2Application", response, response.Code())
+	}
+}
+
+// NewUserDeleteOAuth2ApplicationNoContent creates a UserDeleteOAuth2ApplicationNoContent with default headers values
+func NewUserDeleteOAuth2ApplicationNoContent() *UserDeleteOAuth2ApplicationNoContent {
+	return &UserDeleteOAuth2ApplicationNoContent{}
+}
+
+/*
+UserDeleteOAuth2ApplicationNoContent describes a response with status code 204, with default header values.
+
+APIEmpty is an empty response
+*/
+type UserDeleteOAuth2ApplicationNoContent struct {
+}
+
+// IsSuccess returns true when this user delete o auth2 application no content response has a 2xx status code
+func (o *UserDeleteOAuth2ApplicationNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this user delete o auth2 application no content response has a 3xx status code
+func (o *UserDeleteOAuth2ApplicationNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user delete o auth2 application no content response has a 4xx status code
+func (o *UserDeleteOAuth2ApplicationNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this user delete o auth2 application no content response has a 5xx status code
+func (o *UserDeleteOAuth2ApplicationNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user delete o auth2 application no content response a status code equal to that given
+func (o *UserDeleteOAuth2ApplicationNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the user delete o auth2 application no content response
+func (o *UserDeleteOAuth2ApplicationNoContent) Code() int {
+	return 204
+}
+
+func (o *UserDeleteOAuth2ApplicationNoContent) Error() string {
+	return fmt.Sprintf("[DELETE /user/applications/oauth2/{id}][%d] userDeleteOAuth2ApplicationNoContent", 204)
+}
+
+func (o *UserDeleteOAuth2ApplicationNoContent) String() string {
+	return fmt.Sprintf("[DELETE /user/applications/oauth2/{id}][%d] userDeleteOAuth2ApplicationNoContent", 204)
+}
+
+func (o *UserDeleteOAuth2ApplicationNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewUserDeleteOAuth2ApplicationNotFound creates a UserDeleteOAuth2ApplicationNotFound with default headers values
+func NewUserDeleteOAuth2ApplicationNotFound() *UserDeleteOAuth2ApplicationNotFound {
+	return &UserDeleteOAuth2ApplicationNotFound{}
+}
+
+/*
+UserDeleteOAuth2ApplicationNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type UserDeleteOAuth2ApplicationNotFound struct {
+}
+
+// IsSuccess returns true when this user delete o auth2 application not found response has a 2xx status code
+func (o *UserDeleteOAuth2ApplicationNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this user delete o auth2 application not found response has a 3xx status code
+func (o *UserDeleteOAuth2ApplicationNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user delete o auth2 application not found response has a 4xx status code
+func (o *UserDeleteOAuth2ApplicationNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this user delete o auth2 application not found response has a 5xx status code
+func (o *UserDeleteOAuth2ApplicationNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user delete o auth2 application not found response a status code equal to that given
+func (o *UserDeleteOAuth2ApplicationNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the user delete o auth2 application not found response
+func (o *UserDeleteOAuth2ApplicationNotFound) Code() int {
+	return 404
+}
+
+func (o *UserDeleteOAuth2ApplicationNotFound) Error() string {
+	return fmt.Sprintf("[DELETE /user/applications/oauth2/{id}][%d] userDeleteOAuth2ApplicationNotFound", 404)
+}
+
+func (o *UserDeleteOAuth2ApplicationNotFound) String() string {
+	return fmt.Sprintf("[DELETE /user/applications/oauth2/{id}][%d] userDeleteOAuth2ApplicationNotFound", 404)
+}
+
+func (o *UserDeleteOAuth2ApplicationNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_edit_hook_parameters.go b/bots-common/gitea-generated/client/user/user_edit_hook_parameters.go
new file mode 100644
index 0000000..a028e44
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_edit_hook_parameters.go
@@ -0,0 +1,175 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewUserEditHookParams creates a new UserEditHookParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewUserEditHookParams() *UserEditHookParams {
+	return &UserEditHookParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewUserEditHookParamsWithTimeout creates a new UserEditHookParams object
+// with the ability to set a timeout on a request.
+func NewUserEditHookParamsWithTimeout(timeout time.Duration) *UserEditHookParams {
+	return &UserEditHookParams{
+		timeout: timeout,
+	}
+}
+
+// NewUserEditHookParamsWithContext creates a new UserEditHookParams object
+// with the ability to set a context for a request.
+func NewUserEditHookParamsWithContext(ctx context.Context) *UserEditHookParams {
+	return &UserEditHookParams{
+		Context: ctx,
+	}
+}
+
+// NewUserEditHookParamsWithHTTPClient creates a new UserEditHookParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewUserEditHookParamsWithHTTPClient(client *http.Client) *UserEditHookParams {
+	return &UserEditHookParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+UserEditHookParams contains all the parameters to send to the API endpoint
+
+	for the user edit hook operation.
+
+	Typically these are written to a http.Request.
+*/
+type UserEditHookParams struct {
+
+	// Body.
+	Body *models.EditHookOption
+
+	/* ID.
+
+	   id of the hook to update
+
+	   Format: int64
+	*/
+	ID int64
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the user edit hook params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserEditHookParams) WithDefaults() *UserEditHookParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the user edit hook params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserEditHookParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the user edit hook params
+func (o *UserEditHookParams) WithTimeout(timeout time.Duration) *UserEditHookParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the user edit hook params
+func (o *UserEditHookParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the user edit hook params
+func (o *UserEditHookParams) WithContext(ctx context.Context) *UserEditHookParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the user edit hook params
+func (o *UserEditHookParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the user edit hook params
+func (o *UserEditHookParams) WithHTTPClient(client *http.Client) *UserEditHookParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the user edit hook params
+func (o *UserEditHookParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the user edit hook params
+func (o *UserEditHookParams) WithBody(body *models.EditHookOption) *UserEditHookParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the user edit hook params
+func (o *UserEditHookParams) SetBody(body *models.EditHookOption) {
+	o.Body = body
+}
+
+// WithID adds the id to the user edit hook params
+func (o *UserEditHookParams) WithID(id int64) *UserEditHookParams {
+	o.SetID(id)
+	return o
+}
+
+// SetID adds the id to the user edit hook params
+func (o *UserEditHookParams) SetID(id int64) {
+	o.ID = id
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *UserEditHookParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	// path param id
+	if err := r.SetPathParam("id", swag.FormatInt64(o.ID)); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_edit_hook_responses.go b/bots-common/gitea-generated/client/user/user_edit_hook_responses.go
new file mode 100644
index 0000000..9f149eb
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_edit_hook_responses.go
@@ -0,0 +1,106 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// UserEditHookReader is a Reader for the UserEditHook structure.
+type UserEditHookReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *UserEditHookReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewUserEditHookOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	default:
+		return nil, runtime.NewAPIError("[PATCH /user/hooks/{id}] userEditHook", response, response.Code())
+	}
+}
+
+// NewUserEditHookOK creates a UserEditHookOK with default headers values
+func NewUserEditHookOK() *UserEditHookOK {
+	return &UserEditHookOK{}
+}
+
+/*
+UserEditHookOK describes a response with status code 200, with default header values.
+
+Hook
+*/
+type UserEditHookOK struct {
+	Payload *models.Hook
+}
+
+// IsSuccess returns true when this user edit hook o k response has a 2xx status code
+func (o *UserEditHookOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this user edit hook o k response has a 3xx status code
+func (o *UserEditHookOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user edit hook o k response has a 4xx status code
+func (o *UserEditHookOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this user edit hook o k response has a 5xx status code
+func (o *UserEditHookOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user edit hook o k response a status code equal to that given
+func (o *UserEditHookOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the user edit hook o k response
+func (o *UserEditHookOK) Code() int {
+	return 200
+}
+
+func (o *UserEditHookOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[PATCH /user/hooks/{id}][%d] userEditHookOK %s", 200, payload)
+}
+
+func (o *UserEditHookOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[PATCH /user/hooks/{id}][%d] userEditHookOK %s", 200, payload)
+}
+
+func (o *UserEditHookOK) GetPayload() *models.Hook {
+	return o.Payload
+}
+
+func (o *UserEditHookOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.Hook)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_get_current_parameters.go b/bots-common/gitea-generated/client/user/user_get_current_parameters.go
new file mode 100644
index 0000000..af621a9
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_get_current_parameters.go
@@ -0,0 +1,128 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewUserGetCurrentParams creates a new UserGetCurrentParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewUserGetCurrentParams() *UserGetCurrentParams {
+	return &UserGetCurrentParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewUserGetCurrentParamsWithTimeout creates a new UserGetCurrentParams object
+// with the ability to set a timeout on a request.
+func NewUserGetCurrentParamsWithTimeout(timeout time.Duration) *UserGetCurrentParams {
+	return &UserGetCurrentParams{
+		timeout: timeout,
+	}
+}
+
+// NewUserGetCurrentParamsWithContext creates a new UserGetCurrentParams object
+// with the ability to set a context for a request.
+func NewUserGetCurrentParamsWithContext(ctx context.Context) *UserGetCurrentParams {
+	return &UserGetCurrentParams{
+		Context: ctx,
+	}
+}
+
+// NewUserGetCurrentParamsWithHTTPClient creates a new UserGetCurrentParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewUserGetCurrentParamsWithHTTPClient(client *http.Client) *UserGetCurrentParams {
+	return &UserGetCurrentParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+UserGetCurrentParams contains all the parameters to send to the API endpoint
+
+	for the user get current operation.
+
+	Typically these are written to a http.Request.
+*/
+type UserGetCurrentParams struct {
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the user get current params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserGetCurrentParams) WithDefaults() *UserGetCurrentParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the user get current params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserGetCurrentParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the user get current params
+func (o *UserGetCurrentParams) WithTimeout(timeout time.Duration) *UserGetCurrentParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the user get current params
+func (o *UserGetCurrentParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the user get current params
+func (o *UserGetCurrentParams) WithContext(ctx context.Context) *UserGetCurrentParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the user get current params
+func (o *UserGetCurrentParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the user get current params
+func (o *UserGetCurrentParams) WithHTTPClient(client *http.Client) *UserGetCurrentParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the user get current params
+func (o *UserGetCurrentParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *UserGetCurrentParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_get_current_responses.go b/bots-common/gitea-generated/client/user/user_get_current_responses.go
new file mode 100644
index 0000000..6270637
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_get_current_responses.go
@@ -0,0 +1,106 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// UserGetCurrentReader is a Reader for the UserGetCurrent structure.
+type UserGetCurrentReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *UserGetCurrentReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewUserGetCurrentOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	default:
+		return nil, runtime.NewAPIError("[GET /user] userGetCurrent", response, response.Code())
+	}
+}
+
+// NewUserGetCurrentOK creates a UserGetCurrentOK with default headers values
+func NewUserGetCurrentOK() *UserGetCurrentOK {
+	return &UserGetCurrentOK{}
+}
+
+/*
+UserGetCurrentOK describes a response with status code 200, with default header values.
+
+User
+*/
+type UserGetCurrentOK struct {
+	Payload *models.User
+}
+
+// IsSuccess returns true when this user get current o k response has a 2xx status code
+func (o *UserGetCurrentOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this user get current o k response has a 3xx status code
+func (o *UserGetCurrentOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user get current o k response has a 4xx status code
+func (o *UserGetCurrentOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this user get current o k response has a 5xx status code
+func (o *UserGetCurrentOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user get current o k response a status code equal to that given
+func (o *UserGetCurrentOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the user get current o k response
+func (o *UserGetCurrentOK) Code() int {
+	return 200
+}
+
+func (o *UserGetCurrentOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /user][%d] userGetCurrentOK %s", 200, payload)
+}
+
+func (o *UserGetCurrentOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /user][%d] userGetCurrentOK %s", 200, payload)
+}
+
+func (o *UserGetCurrentOK) GetPayload() *models.User {
+	return o.Payload
+}
+
+func (o *UserGetCurrentOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.User)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_get_heatmap_data_parameters.go b/bots-common/gitea-generated/client/user/user_get_heatmap_data_parameters.go
new file mode 100644
index 0000000..9cb919f
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_get_heatmap_data_parameters.go
@@ -0,0 +1,151 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewUserGetHeatmapDataParams creates a new UserGetHeatmapDataParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewUserGetHeatmapDataParams() *UserGetHeatmapDataParams {
+	return &UserGetHeatmapDataParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewUserGetHeatmapDataParamsWithTimeout creates a new UserGetHeatmapDataParams object
+// with the ability to set a timeout on a request.
+func NewUserGetHeatmapDataParamsWithTimeout(timeout time.Duration) *UserGetHeatmapDataParams {
+	return &UserGetHeatmapDataParams{
+		timeout: timeout,
+	}
+}
+
+// NewUserGetHeatmapDataParamsWithContext creates a new UserGetHeatmapDataParams object
+// with the ability to set a context for a request.
+func NewUserGetHeatmapDataParamsWithContext(ctx context.Context) *UserGetHeatmapDataParams {
+	return &UserGetHeatmapDataParams{
+		Context: ctx,
+	}
+}
+
+// NewUserGetHeatmapDataParamsWithHTTPClient creates a new UserGetHeatmapDataParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewUserGetHeatmapDataParamsWithHTTPClient(client *http.Client) *UserGetHeatmapDataParams {
+	return &UserGetHeatmapDataParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+UserGetHeatmapDataParams contains all the parameters to send to the API endpoint
+
+	for the user get heatmap data operation.
+
+	Typically these are written to a http.Request.
+*/
+type UserGetHeatmapDataParams struct {
+
+	/* Username.
+
+	   username of user to get
+	*/
+	Username string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the user get heatmap data params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserGetHeatmapDataParams) WithDefaults() *UserGetHeatmapDataParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the user get heatmap data params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserGetHeatmapDataParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the user get heatmap data params
+func (o *UserGetHeatmapDataParams) WithTimeout(timeout time.Duration) *UserGetHeatmapDataParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the user get heatmap data params
+func (o *UserGetHeatmapDataParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the user get heatmap data params
+func (o *UserGetHeatmapDataParams) WithContext(ctx context.Context) *UserGetHeatmapDataParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the user get heatmap data params
+func (o *UserGetHeatmapDataParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the user get heatmap data params
+func (o *UserGetHeatmapDataParams) WithHTTPClient(client *http.Client) *UserGetHeatmapDataParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the user get heatmap data params
+func (o *UserGetHeatmapDataParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithUsername adds the username to the user get heatmap data params
+func (o *UserGetHeatmapDataParams) WithUsername(username string) *UserGetHeatmapDataParams {
+	o.SetUsername(username)
+	return o
+}
+
+// SetUsername adds the username to the user get heatmap data params
+func (o *UserGetHeatmapDataParams) SetUsername(username string) {
+	o.Username = username
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *UserGetHeatmapDataParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param username
+	if err := r.SetPathParam("username", o.Username); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_get_heatmap_data_responses.go b/bots-common/gitea-generated/client/user/user_get_heatmap_data_responses.go
new file mode 100644
index 0000000..4d85b9a
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_get_heatmap_data_responses.go
@@ -0,0 +1,166 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// UserGetHeatmapDataReader is a Reader for the UserGetHeatmapData structure.
+type UserGetHeatmapDataReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *UserGetHeatmapDataReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewUserGetHeatmapDataOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewUserGetHeatmapDataNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /users/{username}/heatmap] userGetHeatmapData", response, response.Code())
+	}
+}
+
+// NewUserGetHeatmapDataOK creates a UserGetHeatmapDataOK with default headers values
+func NewUserGetHeatmapDataOK() *UserGetHeatmapDataOK {
+	return &UserGetHeatmapDataOK{}
+}
+
+/*
+UserGetHeatmapDataOK describes a response with status code 200, with default header values.
+
+UserHeatmapData
+*/
+type UserGetHeatmapDataOK struct {
+	Payload []*models.UserHeatmapData
+}
+
+// IsSuccess returns true when this user get heatmap data o k response has a 2xx status code
+func (o *UserGetHeatmapDataOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this user get heatmap data o k response has a 3xx status code
+func (o *UserGetHeatmapDataOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user get heatmap data o k response has a 4xx status code
+func (o *UserGetHeatmapDataOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this user get heatmap data o k response has a 5xx status code
+func (o *UserGetHeatmapDataOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user get heatmap data o k response a status code equal to that given
+func (o *UserGetHeatmapDataOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the user get heatmap data o k response
+func (o *UserGetHeatmapDataOK) Code() int {
+	return 200
+}
+
+func (o *UserGetHeatmapDataOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /users/{username}/heatmap][%d] userGetHeatmapDataOK %s", 200, payload)
+}
+
+func (o *UserGetHeatmapDataOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /users/{username}/heatmap][%d] userGetHeatmapDataOK %s", 200, payload)
+}
+
+func (o *UserGetHeatmapDataOK) GetPayload() []*models.UserHeatmapData {
+	return o.Payload
+}
+
+func (o *UserGetHeatmapDataOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewUserGetHeatmapDataNotFound creates a UserGetHeatmapDataNotFound with default headers values
+func NewUserGetHeatmapDataNotFound() *UserGetHeatmapDataNotFound {
+	return &UserGetHeatmapDataNotFound{}
+}
+
+/*
+UserGetHeatmapDataNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type UserGetHeatmapDataNotFound struct {
+}
+
+// IsSuccess returns true when this user get heatmap data not found response has a 2xx status code
+func (o *UserGetHeatmapDataNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this user get heatmap data not found response has a 3xx status code
+func (o *UserGetHeatmapDataNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user get heatmap data not found response has a 4xx status code
+func (o *UserGetHeatmapDataNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this user get heatmap data not found response has a 5xx status code
+func (o *UserGetHeatmapDataNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user get heatmap data not found response a status code equal to that given
+func (o *UserGetHeatmapDataNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the user get heatmap data not found response
+func (o *UserGetHeatmapDataNotFound) Code() int {
+	return 404
+}
+
+func (o *UserGetHeatmapDataNotFound) Error() string {
+	return fmt.Sprintf("[GET /users/{username}/heatmap][%d] userGetHeatmapDataNotFound", 404)
+}
+
+func (o *UserGetHeatmapDataNotFound) String() string {
+	return fmt.Sprintf("[GET /users/{username}/heatmap][%d] userGetHeatmapDataNotFound", 404)
+}
+
+func (o *UserGetHeatmapDataNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_get_hook_parameters.go b/bots-common/gitea-generated/client/user/user_get_hook_parameters.go
new file mode 100644
index 0000000..755ba68
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_get_hook_parameters.go
@@ -0,0 +1,154 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewUserGetHookParams creates a new UserGetHookParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewUserGetHookParams() *UserGetHookParams {
+	return &UserGetHookParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewUserGetHookParamsWithTimeout creates a new UserGetHookParams object
+// with the ability to set a timeout on a request.
+func NewUserGetHookParamsWithTimeout(timeout time.Duration) *UserGetHookParams {
+	return &UserGetHookParams{
+		timeout: timeout,
+	}
+}
+
+// NewUserGetHookParamsWithContext creates a new UserGetHookParams object
+// with the ability to set a context for a request.
+func NewUserGetHookParamsWithContext(ctx context.Context) *UserGetHookParams {
+	return &UserGetHookParams{
+		Context: ctx,
+	}
+}
+
+// NewUserGetHookParamsWithHTTPClient creates a new UserGetHookParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewUserGetHookParamsWithHTTPClient(client *http.Client) *UserGetHookParams {
+	return &UserGetHookParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+UserGetHookParams contains all the parameters to send to the API endpoint
+
+	for the user get hook operation.
+
+	Typically these are written to a http.Request.
+*/
+type UserGetHookParams struct {
+
+	/* ID.
+
+	   id of the hook to get
+
+	   Format: int64
+	*/
+	ID int64
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the user get hook params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserGetHookParams) WithDefaults() *UserGetHookParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the user get hook params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserGetHookParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the user get hook params
+func (o *UserGetHookParams) WithTimeout(timeout time.Duration) *UserGetHookParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the user get hook params
+func (o *UserGetHookParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the user get hook params
+func (o *UserGetHookParams) WithContext(ctx context.Context) *UserGetHookParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the user get hook params
+func (o *UserGetHookParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the user get hook params
+func (o *UserGetHookParams) WithHTTPClient(client *http.Client) *UserGetHookParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the user get hook params
+func (o *UserGetHookParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithID adds the id to the user get hook params
+func (o *UserGetHookParams) WithID(id int64) *UserGetHookParams {
+	o.SetID(id)
+	return o
+}
+
+// SetID adds the id to the user get hook params
+func (o *UserGetHookParams) SetID(id int64) {
+	o.ID = id
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *UserGetHookParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param id
+	if err := r.SetPathParam("id", swag.FormatInt64(o.ID)); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_get_hook_responses.go b/bots-common/gitea-generated/client/user/user_get_hook_responses.go
new file mode 100644
index 0000000..8106acb
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_get_hook_responses.go
@@ -0,0 +1,106 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// UserGetHookReader is a Reader for the UserGetHook structure.
+type UserGetHookReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *UserGetHookReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewUserGetHookOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	default:
+		return nil, runtime.NewAPIError("[GET /user/hooks/{id}] userGetHook", response, response.Code())
+	}
+}
+
+// NewUserGetHookOK creates a UserGetHookOK with default headers values
+func NewUserGetHookOK() *UserGetHookOK {
+	return &UserGetHookOK{}
+}
+
+/*
+UserGetHookOK describes a response with status code 200, with default header values.
+
+Hook
+*/
+type UserGetHookOK struct {
+	Payload *models.Hook
+}
+
+// IsSuccess returns true when this user get hook o k response has a 2xx status code
+func (o *UserGetHookOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this user get hook o k response has a 3xx status code
+func (o *UserGetHookOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user get hook o k response has a 4xx status code
+func (o *UserGetHookOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this user get hook o k response has a 5xx status code
+func (o *UserGetHookOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user get hook o k response a status code equal to that given
+func (o *UserGetHookOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the user get hook o k response
+func (o *UserGetHookOK) Code() int {
+	return 200
+}
+
+func (o *UserGetHookOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /user/hooks/{id}][%d] userGetHookOK %s", 200, payload)
+}
+
+func (o *UserGetHookOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /user/hooks/{id}][%d] userGetHookOK %s", 200, payload)
+}
+
+func (o *UserGetHookOK) GetPayload() *models.Hook {
+	return o.Payload
+}
+
+func (o *UserGetHookOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.Hook)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_get_o_auth2_application_parameters.go b/bots-common/gitea-generated/client/user/user_get_o_auth2_application_parameters.go
new file mode 100644
index 0000000..c28a54b
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_get_o_auth2_application_parameters.go
@@ -0,0 +1,154 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewUserGetOAuth2ApplicationParams creates a new UserGetOAuth2ApplicationParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewUserGetOAuth2ApplicationParams() *UserGetOAuth2ApplicationParams {
+	return &UserGetOAuth2ApplicationParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewUserGetOAuth2ApplicationParamsWithTimeout creates a new UserGetOAuth2ApplicationParams object
+// with the ability to set a timeout on a request.
+func NewUserGetOAuth2ApplicationParamsWithTimeout(timeout time.Duration) *UserGetOAuth2ApplicationParams {
+	return &UserGetOAuth2ApplicationParams{
+		timeout: timeout,
+	}
+}
+
+// NewUserGetOAuth2ApplicationParamsWithContext creates a new UserGetOAuth2ApplicationParams object
+// with the ability to set a context for a request.
+func NewUserGetOAuth2ApplicationParamsWithContext(ctx context.Context) *UserGetOAuth2ApplicationParams {
+	return &UserGetOAuth2ApplicationParams{
+		Context: ctx,
+	}
+}
+
+// NewUserGetOAuth2ApplicationParamsWithHTTPClient creates a new UserGetOAuth2ApplicationParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewUserGetOAuth2ApplicationParamsWithHTTPClient(client *http.Client) *UserGetOAuth2ApplicationParams {
+	return &UserGetOAuth2ApplicationParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+UserGetOAuth2ApplicationParams contains all the parameters to send to the API endpoint
+
+	for the user get o auth2 application operation.
+
+	Typically these are written to a http.Request.
+*/
+type UserGetOAuth2ApplicationParams struct {
+
+	/* ID.
+
+	   Application ID to be found
+
+	   Format: int64
+	*/
+	ID int64
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the user get o auth2 application params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserGetOAuth2ApplicationParams) WithDefaults() *UserGetOAuth2ApplicationParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the user get o auth2 application params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserGetOAuth2ApplicationParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the user get o auth2 application params
+func (o *UserGetOAuth2ApplicationParams) WithTimeout(timeout time.Duration) *UserGetOAuth2ApplicationParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the user get o auth2 application params
+func (o *UserGetOAuth2ApplicationParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the user get o auth2 application params
+func (o *UserGetOAuth2ApplicationParams) WithContext(ctx context.Context) *UserGetOAuth2ApplicationParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the user get o auth2 application params
+func (o *UserGetOAuth2ApplicationParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the user get o auth2 application params
+func (o *UserGetOAuth2ApplicationParams) WithHTTPClient(client *http.Client) *UserGetOAuth2ApplicationParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the user get o auth2 application params
+func (o *UserGetOAuth2ApplicationParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithID adds the id to the user get o auth2 application params
+func (o *UserGetOAuth2ApplicationParams) WithID(id int64) *UserGetOAuth2ApplicationParams {
+	o.SetID(id)
+	return o
+}
+
+// SetID adds the id to the user get o auth2 application params
+func (o *UserGetOAuth2ApplicationParams) SetID(id int64) {
+	o.ID = id
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *UserGetOAuth2ApplicationParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param id
+	if err := r.SetPathParam("id", swag.FormatInt64(o.ID)); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_get_o_auth2_application_responses.go b/bots-common/gitea-generated/client/user/user_get_o_auth2_application_responses.go
new file mode 100644
index 0000000..29ce8db
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_get_o_auth2_application_responses.go
@@ -0,0 +1,168 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// UserGetOAuth2ApplicationReader is a Reader for the UserGetOAuth2Application structure.
+type UserGetOAuth2ApplicationReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *UserGetOAuth2ApplicationReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewUserGetOAuth2ApplicationOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewUserGetOAuth2ApplicationNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /user/applications/oauth2/{id}] userGetOAuth2Application", response, response.Code())
+	}
+}
+
+// NewUserGetOAuth2ApplicationOK creates a UserGetOAuth2ApplicationOK with default headers values
+func NewUserGetOAuth2ApplicationOK() *UserGetOAuth2ApplicationOK {
+	return &UserGetOAuth2ApplicationOK{}
+}
+
+/*
+UserGetOAuth2ApplicationOK describes a response with status code 200, with default header values.
+
+OAuth2Application
+*/
+type UserGetOAuth2ApplicationOK struct {
+	Payload *models.OAuth2Application
+}
+
+// IsSuccess returns true when this user get o auth2 application o k response has a 2xx status code
+func (o *UserGetOAuth2ApplicationOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this user get o auth2 application o k response has a 3xx status code
+func (o *UserGetOAuth2ApplicationOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user get o auth2 application o k response has a 4xx status code
+func (o *UserGetOAuth2ApplicationOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this user get o auth2 application o k response has a 5xx status code
+func (o *UserGetOAuth2ApplicationOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user get o auth2 application o k response a status code equal to that given
+func (o *UserGetOAuth2ApplicationOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the user get o auth2 application o k response
+func (o *UserGetOAuth2ApplicationOK) Code() int {
+	return 200
+}
+
+func (o *UserGetOAuth2ApplicationOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /user/applications/oauth2/{id}][%d] userGetOAuth2ApplicationOK %s", 200, payload)
+}
+
+func (o *UserGetOAuth2ApplicationOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /user/applications/oauth2/{id}][%d] userGetOAuth2ApplicationOK %s", 200, payload)
+}
+
+func (o *UserGetOAuth2ApplicationOK) GetPayload() *models.OAuth2Application {
+	return o.Payload
+}
+
+func (o *UserGetOAuth2ApplicationOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.OAuth2Application)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewUserGetOAuth2ApplicationNotFound creates a UserGetOAuth2ApplicationNotFound with default headers values
+func NewUserGetOAuth2ApplicationNotFound() *UserGetOAuth2ApplicationNotFound {
+	return &UserGetOAuth2ApplicationNotFound{}
+}
+
+/*
+UserGetOAuth2ApplicationNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type UserGetOAuth2ApplicationNotFound struct {
+}
+
+// IsSuccess returns true when this user get o auth2 application not found response has a 2xx status code
+func (o *UserGetOAuth2ApplicationNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this user get o auth2 application not found response has a 3xx status code
+func (o *UserGetOAuth2ApplicationNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user get o auth2 application not found response has a 4xx status code
+func (o *UserGetOAuth2ApplicationNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this user get o auth2 application not found response has a 5xx status code
+func (o *UserGetOAuth2ApplicationNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user get o auth2 application not found response a status code equal to that given
+func (o *UserGetOAuth2ApplicationNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the user get o auth2 application not found response
+func (o *UserGetOAuth2ApplicationNotFound) Code() int {
+	return 404
+}
+
+func (o *UserGetOAuth2ApplicationNotFound) Error() string {
+	return fmt.Sprintf("[GET /user/applications/oauth2/{id}][%d] userGetOAuth2ApplicationNotFound", 404)
+}
+
+func (o *UserGetOAuth2ApplicationNotFound) String() string {
+	return fmt.Sprintf("[GET /user/applications/oauth2/{id}][%d] userGetOAuth2ApplicationNotFound", 404)
+}
+
+func (o *UserGetOAuth2ApplicationNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_get_oauth2_application_parameters.go b/bots-common/gitea-generated/client/user/user_get_oauth2_application_parameters.go
new file mode 100644
index 0000000..612e678
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_get_oauth2_application_parameters.go
@@ -0,0 +1,198 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewUserGetOauth2ApplicationParams creates a new UserGetOauth2ApplicationParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewUserGetOauth2ApplicationParams() *UserGetOauth2ApplicationParams {
+	return &UserGetOauth2ApplicationParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewUserGetOauth2ApplicationParamsWithTimeout creates a new UserGetOauth2ApplicationParams object
+// with the ability to set a timeout on a request.
+func NewUserGetOauth2ApplicationParamsWithTimeout(timeout time.Duration) *UserGetOauth2ApplicationParams {
+	return &UserGetOauth2ApplicationParams{
+		timeout: timeout,
+	}
+}
+
+// NewUserGetOauth2ApplicationParamsWithContext creates a new UserGetOauth2ApplicationParams object
+// with the ability to set a context for a request.
+func NewUserGetOauth2ApplicationParamsWithContext(ctx context.Context) *UserGetOauth2ApplicationParams {
+	return &UserGetOauth2ApplicationParams{
+		Context: ctx,
+	}
+}
+
+// NewUserGetOauth2ApplicationParamsWithHTTPClient creates a new UserGetOauth2ApplicationParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewUserGetOauth2ApplicationParamsWithHTTPClient(client *http.Client) *UserGetOauth2ApplicationParams {
+	return &UserGetOauth2ApplicationParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+UserGetOauth2ApplicationParams contains all the parameters to send to the API endpoint
+
+	for the user get oauth2 application operation.
+
+	Typically these are written to a http.Request.
+*/
+type UserGetOauth2ApplicationParams struct {
+
+	/* Limit.
+
+	   page size of results
+	*/
+	Limit *int64
+
+	/* Page.
+
+	   page number of results to return (1-based)
+	*/
+	Page *int64
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the user get oauth2 application params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserGetOauth2ApplicationParams) WithDefaults() *UserGetOauth2ApplicationParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the user get oauth2 application params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserGetOauth2ApplicationParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the user get oauth2 application params
+func (o *UserGetOauth2ApplicationParams) WithTimeout(timeout time.Duration) *UserGetOauth2ApplicationParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the user get oauth2 application params
+func (o *UserGetOauth2ApplicationParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the user get oauth2 application params
+func (o *UserGetOauth2ApplicationParams) WithContext(ctx context.Context) *UserGetOauth2ApplicationParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the user get oauth2 application params
+func (o *UserGetOauth2ApplicationParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the user get oauth2 application params
+func (o *UserGetOauth2ApplicationParams) WithHTTPClient(client *http.Client) *UserGetOauth2ApplicationParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the user get oauth2 application params
+func (o *UserGetOauth2ApplicationParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithLimit adds the limit to the user get oauth2 application params
+func (o *UserGetOauth2ApplicationParams) WithLimit(limit *int64) *UserGetOauth2ApplicationParams {
+	o.SetLimit(limit)
+	return o
+}
+
+// SetLimit adds the limit to the user get oauth2 application params
+func (o *UserGetOauth2ApplicationParams) SetLimit(limit *int64) {
+	o.Limit = limit
+}
+
+// WithPage adds the page to the user get oauth2 application params
+func (o *UserGetOauth2ApplicationParams) WithPage(page *int64) *UserGetOauth2ApplicationParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the user get oauth2 application params
+func (o *UserGetOauth2ApplicationParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *UserGetOauth2ApplicationParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.Limit != nil {
+
+		// query param limit
+		var qrLimit int64
+
+		if o.Limit != nil {
+			qrLimit = *o.Limit
+		}
+		qLimit := swag.FormatInt64(qrLimit)
+		if qLimit != "" {
+
+			if err := r.SetQueryParam("limit", qLimit); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_get_oauth2_application_responses.go b/bots-common/gitea-generated/client/user/user_get_oauth2_application_responses.go
new file mode 100644
index 0000000..09f52c2
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_get_oauth2_application_responses.go
@@ -0,0 +1,104 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// UserGetOauth2ApplicationReader is a Reader for the UserGetOauth2Application structure.
+type UserGetOauth2ApplicationReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *UserGetOauth2ApplicationReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewUserGetOauth2ApplicationOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	default:
+		return nil, runtime.NewAPIError("[GET /user/applications/oauth2] userGetOauth2Application", response, response.Code())
+	}
+}
+
+// NewUserGetOauth2ApplicationOK creates a UserGetOauth2ApplicationOK with default headers values
+func NewUserGetOauth2ApplicationOK() *UserGetOauth2ApplicationOK {
+	return &UserGetOauth2ApplicationOK{}
+}
+
+/*
+UserGetOauth2ApplicationOK describes a response with status code 200, with default header values.
+
+OAuth2ApplicationList represents a list of OAuth2 applications.
+*/
+type UserGetOauth2ApplicationOK struct {
+	Payload []*models.OAuth2Application
+}
+
+// IsSuccess returns true when this user get oauth2 application o k response has a 2xx status code
+func (o *UserGetOauth2ApplicationOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this user get oauth2 application o k response has a 3xx status code
+func (o *UserGetOauth2ApplicationOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user get oauth2 application o k response has a 4xx status code
+func (o *UserGetOauth2ApplicationOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this user get oauth2 application o k response has a 5xx status code
+func (o *UserGetOauth2ApplicationOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user get oauth2 application o k response a status code equal to that given
+func (o *UserGetOauth2ApplicationOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the user get oauth2 application o k response
+func (o *UserGetOauth2ApplicationOK) Code() int {
+	return 200
+}
+
+func (o *UserGetOauth2ApplicationOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /user/applications/oauth2][%d] userGetOauth2ApplicationOK %s", 200, payload)
+}
+
+func (o *UserGetOauth2ApplicationOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /user/applications/oauth2][%d] userGetOauth2ApplicationOK %s", 200, payload)
+}
+
+func (o *UserGetOauth2ApplicationOK) GetPayload() []*models.OAuth2Application {
+	return o.Payload
+}
+
+func (o *UserGetOauth2ApplicationOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_get_parameters.go b/bots-common/gitea-generated/client/user/user_get_parameters.go
new file mode 100644
index 0000000..8731536
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_get_parameters.go
@@ -0,0 +1,151 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewUserGetParams creates a new UserGetParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewUserGetParams() *UserGetParams {
+	return &UserGetParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewUserGetParamsWithTimeout creates a new UserGetParams object
+// with the ability to set a timeout on a request.
+func NewUserGetParamsWithTimeout(timeout time.Duration) *UserGetParams {
+	return &UserGetParams{
+		timeout: timeout,
+	}
+}
+
+// NewUserGetParamsWithContext creates a new UserGetParams object
+// with the ability to set a context for a request.
+func NewUserGetParamsWithContext(ctx context.Context) *UserGetParams {
+	return &UserGetParams{
+		Context: ctx,
+	}
+}
+
+// NewUserGetParamsWithHTTPClient creates a new UserGetParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewUserGetParamsWithHTTPClient(client *http.Client) *UserGetParams {
+	return &UserGetParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+UserGetParams contains all the parameters to send to the API endpoint
+
+	for the user get operation.
+
+	Typically these are written to a http.Request.
+*/
+type UserGetParams struct {
+
+	/* Username.
+
+	   username of user to get
+	*/
+	Username string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the user get params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserGetParams) WithDefaults() *UserGetParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the user get params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserGetParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the user get params
+func (o *UserGetParams) WithTimeout(timeout time.Duration) *UserGetParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the user get params
+func (o *UserGetParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the user get params
+func (o *UserGetParams) WithContext(ctx context.Context) *UserGetParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the user get params
+func (o *UserGetParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the user get params
+func (o *UserGetParams) WithHTTPClient(client *http.Client) *UserGetParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the user get params
+func (o *UserGetParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithUsername adds the username to the user get params
+func (o *UserGetParams) WithUsername(username string) *UserGetParams {
+	o.SetUsername(username)
+	return o
+}
+
+// SetUsername adds the username to the user get params
+func (o *UserGetParams) SetUsername(username string) {
+	o.Username = username
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *UserGetParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param username
+	if err := r.SetPathParam("username", o.Username); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_get_responses.go b/bots-common/gitea-generated/client/user/user_get_responses.go
new file mode 100644
index 0000000..881a6dc
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_get_responses.go
@@ -0,0 +1,168 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// UserGetReader is a Reader for the UserGet structure.
+type UserGetReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *UserGetReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewUserGetOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewUserGetNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /users/{username}] userGet", response, response.Code())
+	}
+}
+
+// NewUserGetOK creates a UserGetOK with default headers values
+func NewUserGetOK() *UserGetOK {
+	return &UserGetOK{}
+}
+
+/*
+UserGetOK describes a response with status code 200, with default header values.
+
+User
+*/
+type UserGetOK struct {
+	Payload *models.User
+}
+
+// IsSuccess returns true when this user get o k response has a 2xx status code
+func (o *UserGetOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this user get o k response has a 3xx status code
+func (o *UserGetOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user get o k response has a 4xx status code
+func (o *UserGetOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this user get o k response has a 5xx status code
+func (o *UserGetOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user get o k response a status code equal to that given
+func (o *UserGetOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the user get o k response
+func (o *UserGetOK) Code() int {
+	return 200
+}
+
+func (o *UserGetOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /users/{username}][%d] userGetOK %s", 200, payload)
+}
+
+func (o *UserGetOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /users/{username}][%d] userGetOK %s", 200, payload)
+}
+
+func (o *UserGetOK) GetPayload() *models.User {
+	return o.Payload
+}
+
+func (o *UserGetOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.User)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewUserGetNotFound creates a UserGetNotFound with default headers values
+func NewUserGetNotFound() *UserGetNotFound {
+	return &UserGetNotFound{}
+}
+
+/*
+UserGetNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type UserGetNotFound struct {
+}
+
+// IsSuccess returns true when this user get not found response has a 2xx status code
+func (o *UserGetNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this user get not found response has a 3xx status code
+func (o *UserGetNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user get not found response has a 4xx status code
+func (o *UserGetNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this user get not found response has a 5xx status code
+func (o *UserGetNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user get not found response a status code equal to that given
+func (o *UserGetNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the user get not found response
+func (o *UserGetNotFound) Code() int {
+	return 404
+}
+
+func (o *UserGetNotFound) Error() string {
+	return fmt.Sprintf("[GET /users/{username}][%d] userGetNotFound", 404)
+}
+
+func (o *UserGetNotFound) String() string {
+	return fmt.Sprintf("[GET /users/{username}][%d] userGetNotFound", 404)
+}
+
+func (o *UserGetNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_get_runner_registration_token_parameters.go b/bots-common/gitea-generated/client/user/user_get_runner_registration_token_parameters.go
new file mode 100644
index 0000000..843ebc6
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_get_runner_registration_token_parameters.go
@@ -0,0 +1,128 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewUserGetRunnerRegistrationTokenParams creates a new UserGetRunnerRegistrationTokenParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewUserGetRunnerRegistrationTokenParams() *UserGetRunnerRegistrationTokenParams {
+	return &UserGetRunnerRegistrationTokenParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewUserGetRunnerRegistrationTokenParamsWithTimeout creates a new UserGetRunnerRegistrationTokenParams object
+// with the ability to set a timeout on a request.
+func NewUserGetRunnerRegistrationTokenParamsWithTimeout(timeout time.Duration) *UserGetRunnerRegistrationTokenParams {
+	return &UserGetRunnerRegistrationTokenParams{
+		timeout: timeout,
+	}
+}
+
+// NewUserGetRunnerRegistrationTokenParamsWithContext creates a new UserGetRunnerRegistrationTokenParams object
+// with the ability to set a context for a request.
+func NewUserGetRunnerRegistrationTokenParamsWithContext(ctx context.Context) *UserGetRunnerRegistrationTokenParams {
+	return &UserGetRunnerRegistrationTokenParams{
+		Context: ctx,
+	}
+}
+
+// NewUserGetRunnerRegistrationTokenParamsWithHTTPClient creates a new UserGetRunnerRegistrationTokenParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewUserGetRunnerRegistrationTokenParamsWithHTTPClient(client *http.Client) *UserGetRunnerRegistrationTokenParams {
+	return &UserGetRunnerRegistrationTokenParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+UserGetRunnerRegistrationTokenParams contains all the parameters to send to the API endpoint
+
+	for the user get runner registration token operation.
+
+	Typically these are written to a http.Request.
+*/
+type UserGetRunnerRegistrationTokenParams struct {
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the user get runner registration token params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserGetRunnerRegistrationTokenParams) WithDefaults() *UserGetRunnerRegistrationTokenParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the user get runner registration token params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserGetRunnerRegistrationTokenParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the user get runner registration token params
+func (o *UserGetRunnerRegistrationTokenParams) WithTimeout(timeout time.Duration) *UserGetRunnerRegistrationTokenParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the user get runner registration token params
+func (o *UserGetRunnerRegistrationTokenParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the user get runner registration token params
+func (o *UserGetRunnerRegistrationTokenParams) WithContext(ctx context.Context) *UserGetRunnerRegistrationTokenParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the user get runner registration token params
+func (o *UserGetRunnerRegistrationTokenParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the user get runner registration token params
+func (o *UserGetRunnerRegistrationTokenParams) WithHTTPClient(client *http.Client) *UserGetRunnerRegistrationTokenParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the user get runner registration token params
+func (o *UserGetRunnerRegistrationTokenParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *UserGetRunnerRegistrationTokenParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_get_runner_registration_token_responses.go b/bots-common/gitea-generated/client/user/user_get_runner_registration_token_responses.go
new file mode 100644
index 0000000..7b7f20b
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_get_runner_registration_token_responses.go
@@ -0,0 +1,96 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// UserGetRunnerRegistrationTokenReader is a Reader for the UserGetRunnerRegistrationToken structure.
+type UserGetRunnerRegistrationTokenReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *UserGetRunnerRegistrationTokenReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewUserGetRunnerRegistrationTokenOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	default:
+		return nil, runtime.NewAPIError("[GET /user/actions/runners/registration-token] userGetRunnerRegistrationToken", response, response.Code())
+	}
+}
+
+// NewUserGetRunnerRegistrationTokenOK creates a UserGetRunnerRegistrationTokenOK with default headers values
+func NewUserGetRunnerRegistrationTokenOK() *UserGetRunnerRegistrationTokenOK {
+	return &UserGetRunnerRegistrationTokenOK{}
+}
+
+/*
+UserGetRunnerRegistrationTokenOK describes a response with status code 200, with default header values.
+
+RegistrationToken is response related to registration token
+*/
+type UserGetRunnerRegistrationTokenOK struct {
+	Token string
+}
+
+// IsSuccess returns true when this user get runner registration token o k response has a 2xx status code
+func (o *UserGetRunnerRegistrationTokenOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this user get runner registration token o k response has a 3xx status code
+func (o *UserGetRunnerRegistrationTokenOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user get runner registration token o k response has a 4xx status code
+func (o *UserGetRunnerRegistrationTokenOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this user get runner registration token o k response has a 5xx status code
+func (o *UserGetRunnerRegistrationTokenOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user get runner registration token o k response a status code equal to that given
+func (o *UserGetRunnerRegistrationTokenOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the user get runner registration token o k response
+func (o *UserGetRunnerRegistrationTokenOK) Code() int {
+	return 200
+}
+
+func (o *UserGetRunnerRegistrationTokenOK) Error() string {
+	return fmt.Sprintf("[GET /user/actions/runners/registration-token][%d] userGetRunnerRegistrationTokenOK", 200)
+}
+
+func (o *UserGetRunnerRegistrationTokenOK) String() string {
+	return fmt.Sprintf("[GET /user/actions/runners/registration-token][%d] userGetRunnerRegistrationTokenOK", 200)
+}
+
+func (o *UserGetRunnerRegistrationTokenOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header token
+	hdrToken := response.GetHeader("token")
+
+	if hdrToken != "" {
+		o.Token = hdrToken
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_get_stop_watches_parameters.go b/bots-common/gitea-generated/client/user/user_get_stop_watches_parameters.go
new file mode 100644
index 0000000..9c299c6
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_get_stop_watches_parameters.go
@@ -0,0 +1,198 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewUserGetStopWatchesParams creates a new UserGetStopWatchesParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewUserGetStopWatchesParams() *UserGetStopWatchesParams {
+	return &UserGetStopWatchesParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewUserGetStopWatchesParamsWithTimeout creates a new UserGetStopWatchesParams object
+// with the ability to set a timeout on a request.
+func NewUserGetStopWatchesParamsWithTimeout(timeout time.Duration) *UserGetStopWatchesParams {
+	return &UserGetStopWatchesParams{
+		timeout: timeout,
+	}
+}
+
+// NewUserGetStopWatchesParamsWithContext creates a new UserGetStopWatchesParams object
+// with the ability to set a context for a request.
+func NewUserGetStopWatchesParamsWithContext(ctx context.Context) *UserGetStopWatchesParams {
+	return &UserGetStopWatchesParams{
+		Context: ctx,
+	}
+}
+
+// NewUserGetStopWatchesParamsWithHTTPClient creates a new UserGetStopWatchesParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewUserGetStopWatchesParamsWithHTTPClient(client *http.Client) *UserGetStopWatchesParams {
+	return &UserGetStopWatchesParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+UserGetStopWatchesParams contains all the parameters to send to the API endpoint
+
+	for the user get stop watches operation.
+
+	Typically these are written to a http.Request.
+*/
+type UserGetStopWatchesParams struct {
+
+	/* Limit.
+
+	   page size of results
+	*/
+	Limit *int64
+
+	/* Page.
+
+	   page number of results to return (1-based)
+	*/
+	Page *int64
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the user get stop watches params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserGetStopWatchesParams) WithDefaults() *UserGetStopWatchesParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the user get stop watches params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserGetStopWatchesParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the user get stop watches params
+func (o *UserGetStopWatchesParams) WithTimeout(timeout time.Duration) *UserGetStopWatchesParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the user get stop watches params
+func (o *UserGetStopWatchesParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the user get stop watches params
+func (o *UserGetStopWatchesParams) WithContext(ctx context.Context) *UserGetStopWatchesParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the user get stop watches params
+func (o *UserGetStopWatchesParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the user get stop watches params
+func (o *UserGetStopWatchesParams) WithHTTPClient(client *http.Client) *UserGetStopWatchesParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the user get stop watches params
+func (o *UserGetStopWatchesParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithLimit adds the limit to the user get stop watches params
+func (o *UserGetStopWatchesParams) WithLimit(limit *int64) *UserGetStopWatchesParams {
+	o.SetLimit(limit)
+	return o
+}
+
+// SetLimit adds the limit to the user get stop watches params
+func (o *UserGetStopWatchesParams) SetLimit(limit *int64) {
+	o.Limit = limit
+}
+
+// WithPage adds the page to the user get stop watches params
+func (o *UserGetStopWatchesParams) WithPage(page *int64) *UserGetStopWatchesParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the user get stop watches params
+func (o *UserGetStopWatchesParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *UserGetStopWatchesParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.Limit != nil {
+
+		// query param limit
+		var qrLimit int64
+
+		if o.Limit != nil {
+			qrLimit = *o.Limit
+		}
+		qLimit := swag.FormatInt64(qrLimit)
+		if qLimit != "" {
+
+			if err := r.SetQueryParam("limit", qLimit); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_get_stop_watches_responses.go b/bots-common/gitea-generated/client/user/user_get_stop_watches_responses.go
new file mode 100644
index 0000000..13c1c29
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_get_stop_watches_responses.go
@@ -0,0 +1,104 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// UserGetStopWatchesReader is a Reader for the UserGetStopWatches structure.
+type UserGetStopWatchesReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *UserGetStopWatchesReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewUserGetStopWatchesOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	default:
+		return nil, runtime.NewAPIError("[GET /user/stopwatches] userGetStopWatches", response, response.Code())
+	}
+}
+
+// NewUserGetStopWatchesOK creates a UserGetStopWatchesOK with default headers values
+func NewUserGetStopWatchesOK() *UserGetStopWatchesOK {
+	return &UserGetStopWatchesOK{}
+}
+
+/*
+UserGetStopWatchesOK describes a response with status code 200, with default header values.
+
+StopWatchList
+*/
+type UserGetStopWatchesOK struct {
+	Payload []*models.StopWatch
+}
+
+// IsSuccess returns true when this user get stop watches o k response has a 2xx status code
+func (o *UserGetStopWatchesOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this user get stop watches o k response has a 3xx status code
+func (o *UserGetStopWatchesOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user get stop watches o k response has a 4xx status code
+func (o *UserGetStopWatchesOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this user get stop watches o k response has a 5xx status code
+func (o *UserGetStopWatchesOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user get stop watches o k response a status code equal to that given
+func (o *UserGetStopWatchesOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the user get stop watches o k response
+func (o *UserGetStopWatchesOK) Code() int {
+	return 200
+}
+
+func (o *UserGetStopWatchesOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /user/stopwatches][%d] userGetStopWatchesOK %s", 200, payload)
+}
+
+func (o *UserGetStopWatchesOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /user/stopwatches][%d] userGetStopWatchesOK %s", 200, payload)
+}
+
+func (o *UserGetStopWatchesOK) GetPayload() []*models.StopWatch {
+	return o.Payload
+}
+
+func (o *UserGetStopWatchesOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_get_tokens_parameters.go b/bots-common/gitea-generated/client/user/user_get_tokens_parameters.go
new file mode 100644
index 0000000..cb336d9
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_get_tokens_parameters.go
@@ -0,0 +1,220 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewUserGetTokensParams creates a new UserGetTokensParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewUserGetTokensParams() *UserGetTokensParams {
+	return &UserGetTokensParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewUserGetTokensParamsWithTimeout creates a new UserGetTokensParams object
+// with the ability to set a timeout on a request.
+func NewUserGetTokensParamsWithTimeout(timeout time.Duration) *UserGetTokensParams {
+	return &UserGetTokensParams{
+		timeout: timeout,
+	}
+}
+
+// NewUserGetTokensParamsWithContext creates a new UserGetTokensParams object
+// with the ability to set a context for a request.
+func NewUserGetTokensParamsWithContext(ctx context.Context) *UserGetTokensParams {
+	return &UserGetTokensParams{
+		Context: ctx,
+	}
+}
+
+// NewUserGetTokensParamsWithHTTPClient creates a new UserGetTokensParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewUserGetTokensParamsWithHTTPClient(client *http.Client) *UserGetTokensParams {
+	return &UserGetTokensParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+UserGetTokensParams contains all the parameters to send to the API endpoint
+
+	for the user get tokens operation.
+
+	Typically these are written to a http.Request.
+*/
+type UserGetTokensParams struct {
+
+	/* Limit.
+
+	   page size of results
+	*/
+	Limit *int64
+
+	/* Page.
+
+	   page number of results to return (1-based)
+	*/
+	Page *int64
+
+	/* Username.
+
+	   username of user
+	*/
+	Username string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the user get tokens params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserGetTokensParams) WithDefaults() *UserGetTokensParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the user get tokens params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserGetTokensParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the user get tokens params
+func (o *UserGetTokensParams) WithTimeout(timeout time.Duration) *UserGetTokensParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the user get tokens params
+func (o *UserGetTokensParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the user get tokens params
+func (o *UserGetTokensParams) WithContext(ctx context.Context) *UserGetTokensParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the user get tokens params
+func (o *UserGetTokensParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the user get tokens params
+func (o *UserGetTokensParams) WithHTTPClient(client *http.Client) *UserGetTokensParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the user get tokens params
+func (o *UserGetTokensParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithLimit adds the limit to the user get tokens params
+func (o *UserGetTokensParams) WithLimit(limit *int64) *UserGetTokensParams {
+	o.SetLimit(limit)
+	return o
+}
+
+// SetLimit adds the limit to the user get tokens params
+func (o *UserGetTokensParams) SetLimit(limit *int64) {
+	o.Limit = limit
+}
+
+// WithPage adds the page to the user get tokens params
+func (o *UserGetTokensParams) WithPage(page *int64) *UserGetTokensParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the user get tokens params
+func (o *UserGetTokensParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WithUsername adds the username to the user get tokens params
+func (o *UserGetTokensParams) WithUsername(username string) *UserGetTokensParams {
+	o.SetUsername(username)
+	return o
+}
+
+// SetUsername adds the username to the user get tokens params
+func (o *UserGetTokensParams) SetUsername(username string) {
+	o.Username = username
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *UserGetTokensParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.Limit != nil {
+
+		// query param limit
+		var qrLimit int64
+
+		if o.Limit != nil {
+			qrLimit = *o.Limit
+		}
+		qLimit := swag.FormatInt64(qrLimit)
+		if qLimit != "" {
+
+			if err := r.SetQueryParam("limit", qLimit); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param username
+	if err := r.SetPathParam("username", o.Username); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_get_tokens_responses.go b/bots-common/gitea-generated/client/user/user_get_tokens_responses.go
new file mode 100644
index 0000000..14ca207
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_get_tokens_responses.go
@@ -0,0 +1,182 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// UserGetTokensReader is a Reader for the UserGetTokens structure.
+type UserGetTokensReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *UserGetTokensReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewUserGetTokensOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 403:
+		result := NewUserGetTokensForbidden()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /users/{username}/tokens] userGetTokens", response, response.Code())
+	}
+}
+
+// NewUserGetTokensOK creates a UserGetTokensOK with default headers values
+func NewUserGetTokensOK() *UserGetTokensOK {
+	return &UserGetTokensOK{}
+}
+
+/*
+UserGetTokensOK describes a response with status code 200, with default header values.
+
+AccessTokenList represents a list of API access token.
+*/
+type UserGetTokensOK struct {
+	Payload []*models.AccessToken
+}
+
+// IsSuccess returns true when this user get tokens o k response has a 2xx status code
+func (o *UserGetTokensOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this user get tokens o k response has a 3xx status code
+func (o *UserGetTokensOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user get tokens o k response has a 4xx status code
+func (o *UserGetTokensOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this user get tokens o k response has a 5xx status code
+func (o *UserGetTokensOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user get tokens o k response a status code equal to that given
+func (o *UserGetTokensOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the user get tokens o k response
+func (o *UserGetTokensOK) Code() int {
+	return 200
+}
+
+func (o *UserGetTokensOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /users/{username}/tokens][%d] userGetTokensOK %s", 200, payload)
+}
+
+func (o *UserGetTokensOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /users/{username}/tokens][%d] userGetTokensOK %s", 200, payload)
+}
+
+func (o *UserGetTokensOK) GetPayload() []*models.AccessToken {
+	return o.Payload
+}
+
+func (o *UserGetTokensOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewUserGetTokensForbidden creates a UserGetTokensForbidden with default headers values
+func NewUserGetTokensForbidden() *UserGetTokensForbidden {
+	return &UserGetTokensForbidden{}
+}
+
+/*
+UserGetTokensForbidden describes a response with status code 403, with default header values.
+
+APIForbiddenError is a forbidden error response
+*/
+type UserGetTokensForbidden struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this user get tokens forbidden response has a 2xx status code
+func (o *UserGetTokensForbidden) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this user get tokens forbidden response has a 3xx status code
+func (o *UserGetTokensForbidden) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user get tokens forbidden response has a 4xx status code
+func (o *UserGetTokensForbidden) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this user get tokens forbidden response has a 5xx status code
+func (o *UserGetTokensForbidden) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user get tokens forbidden response a status code equal to that given
+func (o *UserGetTokensForbidden) IsCode(code int) bool {
+	return code == 403
+}
+
+// Code gets the status code for the user get tokens forbidden response
+func (o *UserGetTokensForbidden) Code() int {
+	return 403
+}
+
+func (o *UserGetTokensForbidden) Error() string {
+	return fmt.Sprintf("[GET /users/{username}/tokens][%d] userGetTokensForbidden", 403)
+}
+
+func (o *UserGetTokensForbidden) String() string {
+	return fmt.Sprintf("[GET /users/{username}/tokens][%d] userGetTokensForbidden", 403)
+}
+
+func (o *UserGetTokensForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_list_activity_feeds_parameters.go b/bots-common/gitea-generated/client/user/user_list_activity_feeds_parameters.go
new file mode 100644
index 0000000..826b33f
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_list_activity_feeds_parameters.go
@@ -0,0 +1,290 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewUserListActivityFeedsParams creates a new UserListActivityFeedsParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewUserListActivityFeedsParams() *UserListActivityFeedsParams {
+	return &UserListActivityFeedsParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewUserListActivityFeedsParamsWithTimeout creates a new UserListActivityFeedsParams object
+// with the ability to set a timeout on a request.
+func NewUserListActivityFeedsParamsWithTimeout(timeout time.Duration) *UserListActivityFeedsParams {
+	return &UserListActivityFeedsParams{
+		timeout: timeout,
+	}
+}
+
+// NewUserListActivityFeedsParamsWithContext creates a new UserListActivityFeedsParams object
+// with the ability to set a context for a request.
+func NewUserListActivityFeedsParamsWithContext(ctx context.Context) *UserListActivityFeedsParams {
+	return &UserListActivityFeedsParams{
+		Context: ctx,
+	}
+}
+
+// NewUserListActivityFeedsParamsWithHTTPClient creates a new UserListActivityFeedsParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewUserListActivityFeedsParamsWithHTTPClient(client *http.Client) *UserListActivityFeedsParams {
+	return &UserListActivityFeedsParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+UserListActivityFeedsParams contains all the parameters to send to the API endpoint
+
+	for the user list activity feeds operation.
+
+	Typically these are written to a http.Request.
+*/
+type UserListActivityFeedsParams struct {
+
+	/* Date.
+
+	   the date of the activities to be found
+
+	   Format: date
+	*/
+	Date *strfmt.Date
+
+	/* Limit.
+
+	   page size of results
+	*/
+	Limit *int64
+
+	/* OnlyPerformedBy.
+
+	   if true, only show actions performed by the requested user
+	*/
+	OnlyPerformedBy *bool
+
+	/* Page.
+
+	   page number of results to return (1-based)
+	*/
+	Page *int64
+
+	/* Username.
+
+	   username of user
+	*/
+	Username string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the user list activity feeds params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserListActivityFeedsParams) WithDefaults() *UserListActivityFeedsParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the user list activity feeds params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserListActivityFeedsParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the user list activity feeds params
+func (o *UserListActivityFeedsParams) WithTimeout(timeout time.Duration) *UserListActivityFeedsParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the user list activity feeds params
+func (o *UserListActivityFeedsParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the user list activity feeds params
+func (o *UserListActivityFeedsParams) WithContext(ctx context.Context) *UserListActivityFeedsParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the user list activity feeds params
+func (o *UserListActivityFeedsParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the user list activity feeds params
+func (o *UserListActivityFeedsParams) WithHTTPClient(client *http.Client) *UserListActivityFeedsParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the user list activity feeds params
+func (o *UserListActivityFeedsParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithDate adds the date to the user list activity feeds params
+func (o *UserListActivityFeedsParams) WithDate(date *strfmt.Date) *UserListActivityFeedsParams {
+	o.SetDate(date)
+	return o
+}
+
+// SetDate adds the date to the user list activity feeds params
+func (o *UserListActivityFeedsParams) SetDate(date *strfmt.Date) {
+	o.Date = date
+}
+
+// WithLimit adds the limit to the user list activity feeds params
+func (o *UserListActivityFeedsParams) WithLimit(limit *int64) *UserListActivityFeedsParams {
+	o.SetLimit(limit)
+	return o
+}
+
+// SetLimit adds the limit to the user list activity feeds params
+func (o *UserListActivityFeedsParams) SetLimit(limit *int64) {
+	o.Limit = limit
+}
+
+// WithOnlyPerformedBy adds the onlyPerformedBy to the user list activity feeds params
+func (o *UserListActivityFeedsParams) WithOnlyPerformedBy(onlyPerformedBy *bool) *UserListActivityFeedsParams {
+	o.SetOnlyPerformedBy(onlyPerformedBy)
+	return o
+}
+
+// SetOnlyPerformedBy adds the onlyPerformedBy to the user list activity feeds params
+func (o *UserListActivityFeedsParams) SetOnlyPerformedBy(onlyPerformedBy *bool) {
+	o.OnlyPerformedBy = onlyPerformedBy
+}
+
+// WithPage adds the page to the user list activity feeds params
+func (o *UserListActivityFeedsParams) WithPage(page *int64) *UserListActivityFeedsParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the user list activity feeds params
+func (o *UserListActivityFeedsParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WithUsername adds the username to the user list activity feeds params
+func (o *UserListActivityFeedsParams) WithUsername(username string) *UserListActivityFeedsParams {
+	o.SetUsername(username)
+	return o
+}
+
+// SetUsername adds the username to the user list activity feeds params
+func (o *UserListActivityFeedsParams) SetUsername(username string) {
+	o.Username = username
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *UserListActivityFeedsParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.Date != nil {
+
+		// query param date
+		var qrDate strfmt.Date
+
+		if o.Date != nil {
+			qrDate = *o.Date
+		}
+		qDate := qrDate.String()
+		if qDate != "" {
+
+			if err := r.SetQueryParam("date", qDate); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Limit != nil {
+
+		// query param limit
+		var qrLimit int64
+
+		if o.Limit != nil {
+			qrLimit = *o.Limit
+		}
+		qLimit := swag.FormatInt64(qrLimit)
+		if qLimit != "" {
+
+			if err := r.SetQueryParam("limit", qLimit); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.OnlyPerformedBy != nil {
+
+		// query param only-performed-by
+		var qrOnlyPerformedBy bool
+
+		if o.OnlyPerformedBy != nil {
+			qrOnlyPerformedBy = *o.OnlyPerformedBy
+		}
+		qOnlyPerformedBy := swag.FormatBool(qrOnlyPerformedBy)
+		if qOnlyPerformedBy != "" {
+
+			if err := r.SetQueryParam("only-performed-by", qOnlyPerformedBy); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param username
+	if err := r.SetPathParam("username", o.Username); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_list_activity_feeds_responses.go b/bots-common/gitea-generated/client/user/user_list_activity_feeds_responses.go
new file mode 100644
index 0000000..efaa5ae
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_list_activity_feeds_responses.go
@@ -0,0 +1,166 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// UserListActivityFeedsReader is a Reader for the UserListActivityFeeds structure.
+type UserListActivityFeedsReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *UserListActivityFeedsReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewUserListActivityFeedsOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewUserListActivityFeedsNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /users/{username}/activities/feeds] userListActivityFeeds", response, response.Code())
+	}
+}
+
+// NewUserListActivityFeedsOK creates a UserListActivityFeedsOK with default headers values
+func NewUserListActivityFeedsOK() *UserListActivityFeedsOK {
+	return &UserListActivityFeedsOK{}
+}
+
+/*
+UserListActivityFeedsOK describes a response with status code 200, with default header values.
+
+ActivityFeedsList
+*/
+type UserListActivityFeedsOK struct {
+	Payload []*models.Activity
+}
+
+// IsSuccess returns true when this user list activity feeds o k response has a 2xx status code
+func (o *UserListActivityFeedsOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this user list activity feeds o k response has a 3xx status code
+func (o *UserListActivityFeedsOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user list activity feeds o k response has a 4xx status code
+func (o *UserListActivityFeedsOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this user list activity feeds o k response has a 5xx status code
+func (o *UserListActivityFeedsOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user list activity feeds o k response a status code equal to that given
+func (o *UserListActivityFeedsOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the user list activity feeds o k response
+func (o *UserListActivityFeedsOK) Code() int {
+	return 200
+}
+
+func (o *UserListActivityFeedsOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /users/{username}/activities/feeds][%d] userListActivityFeedsOK %s", 200, payload)
+}
+
+func (o *UserListActivityFeedsOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /users/{username}/activities/feeds][%d] userListActivityFeedsOK %s", 200, payload)
+}
+
+func (o *UserListActivityFeedsOK) GetPayload() []*models.Activity {
+	return o.Payload
+}
+
+func (o *UserListActivityFeedsOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewUserListActivityFeedsNotFound creates a UserListActivityFeedsNotFound with default headers values
+func NewUserListActivityFeedsNotFound() *UserListActivityFeedsNotFound {
+	return &UserListActivityFeedsNotFound{}
+}
+
+/*
+UserListActivityFeedsNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type UserListActivityFeedsNotFound struct {
+}
+
+// IsSuccess returns true when this user list activity feeds not found response has a 2xx status code
+func (o *UserListActivityFeedsNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this user list activity feeds not found response has a 3xx status code
+func (o *UserListActivityFeedsNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user list activity feeds not found response has a 4xx status code
+func (o *UserListActivityFeedsNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this user list activity feeds not found response has a 5xx status code
+func (o *UserListActivityFeedsNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user list activity feeds not found response a status code equal to that given
+func (o *UserListActivityFeedsNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the user list activity feeds not found response
+func (o *UserListActivityFeedsNotFound) Code() int {
+	return 404
+}
+
+func (o *UserListActivityFeedsNotFound) Error() string {
+	return fmt.Sprintf("[GET /users/{username}/activities/feeds][%d] userListActivityFeedsNotFound", 404)
+}
+
+func (o *UserListActivityFeedsNotFound) String() string {
+	return fmt.Sprintf("[GET /users/{username}/activities/feeds][%d] userListActivityFeedsNotFound", 404)
+}
+
+func (o *UserListActivityFeedsNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_list_blocks_parameters.go b/bots-common/gitea-generated/client/user/user_list_blocks_parameters.go
new file mode 100644
index 0000000..a74c8e3
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_list_blocks_parameters.go
@@ -0,0 +1,198 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewUserListBlocksParams creates a new UserListBlocksParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewUserListBlocksParams() *UserListBlocksParams {
+	return &UserListBlocksParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewUserListBlocksParamsWithTimeout creates a new UserListBlocksParams object
+// with the ability to set a timeout on a request.
+func NewUserListBlocksParamsWithTimeout(timeout time.Duration) *UserListBlocksParams {
+	return &UserListBlocksParams{
+		timeout: timeout,
+	}
+}
+
+// NewUserListBlocksParamsWithContext creates a new UserListBlocksParams object
+// with the ability to set a context for a request.
+func NewUserListBlocksParamsWithContext(ctx context.Context) *UserListBlocksParams {
+	return &UserListBlocksParams{
+		Context: ctx,
+	}
+}
+
+// NewUserListBlocksParamsWithHTTPClient creates a new UserListBlocksParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewUserListBlocksParamsWithHTTPClient(client *http.Client) *UserListBlocksParams {
+	return &UserListBlocksParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+UserListBlocksParams contains all the parameters to send to the API endpoint
+
+	for the user list blocks operation.
+
+	Typically these are written to a http.Request.
+*/
+type UserListBlocksParams struct {
+
+	/* Limit.
+
+	   page size of results
+	*/
+	Limit *int64
+
+	/* Page.
+
+	   page number of results to return (1-based)
+	*/
+	Page *int64
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the user list blocks params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserListBlocksParams) WithDefaults() *UserListBlocksParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the user list blocks params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserListBlocksParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the user list blocks params
+func (o *UserListBlocksParams) WithTimeout(timeout time.Duration) *UserListBlocksParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the user list blocks params
+func (o *UserListBlocksParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the user list blocks params
+func (o *UserListBlocksParams) WithContext(ctx context.Context) *UserListBlocksParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the user list blocks params
+func (o *UserListBlocksParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the user list blocks params
+func (o *UserListBlocksParams) WithHTTPClient(client *http.Client) *UserListBlocksParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the user list blocks params
+func (o *UserListBlocksParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithLimit adds the limit to the user list blocks params
+func (o *UserListBlocksParams) WithLimit(limit *int64) *UserListBlocksParams {
+	o.SetLimit(limit)
+	return o
+}
+
+// SetLimit adds the limit to the user list blocks params
+func (o *UserListBlocksParams) SetLimit(limit *int64) {
+	o.Limit = limit
+}
+
+// WithPage adds the page to the user list blocks params
+func (o *UserListBlocksParams) WithPage(page *int64) *UserListBlocksParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the user list blocks params
+func (o *UserListBlocksParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *UserListBlocksParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.Limit != nil {
+
+		// query param limit
+		var qrLimit int64
+
+		if o.Limit != nil {
+			qrLimit = *o.Limit
+		}
+		qLimit := swag.FormatInt64(qrLimit)
+		if qLimit != "" {
+
+			if err := r.SetQueryParam("limit", qLimit); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_list_blocks_responses.go b/bots-common/gitea-generated/client/user/user_list_blocks_responses.go
new file mode 100644
index 0000000..91d4d96
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_list_blocks_responses.go
@@ -0,0 +1,104 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// UserListBlocksReader is a Reader for the UserListBlocks structure.
+type UserListBlocksReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *UserListBlocksReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewUserListBlocksOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	default:
+		return nil, runtime.NewAPIError("[GET /user/blocks] userListBlocks", response, response.Code())
+	}
+}
+
+// NewUserListBlocksOK creates a UserListBlocksOK with default headers values
+func NewUserListBlocksOK() *UserListBlocksOK {
+	return &UserListBlocksOK{}
+}
+
+/*
+UserListBlocksOK describes a response with status code 200, with default header values.
+
+UserList
+*/
+type UserListBlocksOK struct {
+	Payload []*models.User
+}
+
+// IsSuccess returns true when this user list blocks o k response has a 2xx status code
+func (o *UserListBlocksOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this user list blocks o k response has a 3xx status code
+func (o *UserListBlocksOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user list blocks o k response has a 4xx status code
+func (o *UserListBlocksOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this user list blocks o k response has a 5xx status code
+func (o *UserListBlocksOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user list blocks o k response a status code equal to that given
+func (o *UserListBlocksOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the user list blocks o k response
+func (o *UserListBlocksOK) Code() int {
+	return 200
+}
+
+func (o *UserListBlocksOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /user/blocks][%d] userListBlocksOK %s", 200, payload)
+}
+
+func (o *UserListBlocksOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /user/blocks][%d] userListBlocksOK %s", 200, payload)
+}
+
+func (o *UserListBlocksOK) GetPayload() []*models.User {
+	return o.Payload
+}
+
+func (o *UserListBlocksOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_list_emails_parameters.go b/bots-common/gitea-generated/client/user/user_list_emails_parameters.go
new file mode 100644
index 0000000..0b9abb3
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_list_emails_parameters.go
@@ -0,0 +1,128 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewUserListEmailsParams creates a new UserListEmailsParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewUserListEmailsParams() *UserListEmailsParams {
+	return &UserListEmailsParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewUserListEmailsParamsWithTimeout creates a new UserListEmailsParams object
+// with the ability to set a timeout on a request.
+func NewUserListEmailsParamsWithTimeout(timeout time.Duration) *UserListEmailsParams {
+	return &UserListEmailsParams{
+		timeout: timeout,
+	}
+}
+
+// NewUserListEmailsParamsWithContext creates a new UserListEmailsParams object
+// with the ability to set a context for a request.
+func NewUserListEmailsParamsWithContext(ctx context.Context) *UserListEmailsParams {
+	return &UserListEmailsParams{
+		Context: ctx,
+	}
+}
+
+// NewUserListEmailsParamsWithHTTPClient creates a new UserListEmailsParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewUserListEmailsParamsWithHTTPClient(client *http.Client) *UserListEmailsParams {
+	return &UserListEmailsParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+UserListEmailsParams contains all the parameters to send to the API endpoint
+
+	for the user list emails operation.
+
+	Typically these are written to a http.Request.
+*/
+type UserListEmailsParams struct {
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the user list emails params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserListEmailsParams) WithDefaults() *UserListEmailsParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the user list emails params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserListEmailsParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the user list emails params
+func (o *UserListEmailsParams) WithTimeout(timeout time.Duration) *UserListEmailsParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the user list emails params
+func (o *UserListEmailsParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the user list emails params
+func (o *UserListEmailsParams) WithContext(ctx context.Context) *UserListEmailsParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the user list emails params
+func (o *UserListEmailsParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the user list emails params
+func (o *UserListEmailsParams) WithHTTPClient(client *http.Client) *UserListEmailsParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the user list emails params
+func (o *UserListEmailsParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *UserListEmailsParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_list_emails_responses.go b/bots-common/gitea-generated/client/user/user_list_emails_responses.go
new file mode 100644
index 0000000..229bdd7
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_list_emails_responses.go
@@ -0,0 +1,104 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// UserListEmailsReader is a Reader for the UserListEmails structure.
+type UserListEmailsReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *UserListEmailsReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewUserListEmailsOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	default:
+		return nil, runtime.NewAPIError("[GET /user/emails] userListEmails", response, response.Code())
+	}
+}
+
+// NewUserListEmailsOK creates a UserListEmailsOK with default headers values
+func NewUserListEmailsOK() *UserListEmailsOK {
+	return &UserListEmailsOK{}
+}
+
+/*
+UserListEmailsOK describes a response with status code 200, with default header values.
+
+EmailList
+*/
+type UserListEmailsOK struct {
+	Payload []*models.Email
+}
+
+// IsSuccess returns true when this user list emails o k response has a 2xx status code
+func (o *UserListEmailsOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this user list emails o k response has a 3xx status code
+func (o *UserListEmailsOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user list emails o k response has a 4xx status code
+func (o *UserListEmailsOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this user list emails o k response has a 5xx status code
+func (o *UserListEmailsOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user list emails o k response a status code equal to that given
+func (o *UserListEmailsOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the user list emails o k response
+func (o *UserListEmailsOK) Code() int {
+	return 200
+}
+
+func (o *UserListEmailsOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /user/emails][%d] userListEmailsOK %s", 200, payload)
+}
+
+func (o *UserListEmailsOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /user/emails][%d] userListEmailsOK %s", 200, payload)
+}
+
+func (o *UserListEmailsOK) GetPayload() []*models.Email {
+	return o.Payload
+}
+
+func (o *UserListEmailsOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_list_followers_parameters.go b/bots-common/gitea-generated/client/user/user_list_followers_parameters.go
new file mode 100644
index 0000000..ca53a95
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_list_followers_parameters.go
@@ -0,0 +1,220 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewUserListFollowersParams creates a new UserListFollowersParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewUserListFollowersParams() *UserListFollowersParams {
+	return &UserListFollowersParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewUserListFollowersParamsWithTimeout creates a new UserListFollowersParams object
+// with the ability to set a timeout on a request.
+func NewUserListFollowersParamsWithTimeout(timeout time.Duration) *UserListFollowersParams {
+	return &UserListFollowersParams{
+		timeout: timeout,
+	}
+}
+
+// NewUserListFollowersParamsWithContext creates a new UserListFollowersParams object
+// with the ability to set a context for a request.
+func NewUserListFollowersParamsWithContext(ctx context.Context) *UserListFollowersParams {
+	return &UserListFollowersParams{
+		Context: ctx,
+	}
+}
+
+// NewUserListFollowersParamsWithHTTPClient creates a new UserListFollowersParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewUserListFollowersParamsWithHTTPClient(client *http.Client) *UserListFollowersParams {
+	return &UserListFollowersParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+UserListFollowersParams contains all the parameters to send to the API endpoint
+
+	for the user list followers operation.
+
+	Typically these are written to a http.Request.
+*/
+type UserListFollowersParams struct {
+
+	/* Limit.
+
+	   page size of results
+	*/
+	Limit *int64
+
+	/* Page.
+
+	   page number of results to return (1-based)
+	*/
+	Page *int64
+
+	/* Username.
+
+	   username of user
+	*/
+	Username string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the user list followers params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserListFollowersParams) WithDefaults() *UserListFollowersParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the user list followers params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserListFollowersParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the user list followers params
+func (o *UserListFollowersParams) WithTimeout(timeout time.Duration) *UserListFollowersParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the user list followers params
+func (o *UserListFollowersParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the user list followers params
+func (o *UserListFollowersParams) WithContext(ctx context.Context) *UserListFollowersParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the user list followers params
+func (o *UserListFollowersParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the user list followers params
+func (o *UserListFollowersParams) WithHTTPClient(client *http.Client) *UserListFollowersParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the user list followers params
+func (o *UserListFollowersParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithLimit adds the limit to the user list followers params
+func (o *UserListFollowersParams) WithLimit(limit *int64) *UserListFollowersParams {
+	o.SetLimit(limit)
+	return o
+}
+
+// SetLimit adds the limit to the user list followers params
+func (o *UserListFollowersParams) SetLimit(limit *int64) {
+	o.Limit = limit
+}
+
+// WithPage adds the page to the user list followers params
+func (o *UserListFollowersParams) WithPage(page *int64) *UserListFollowersParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the user list followers params
+func (o *UserListFollowersParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WithUsername adds the username to the user list followers params
+func (o *UserListFollowersParams) WithUsername(username string) *UserListFollowersParams {
+	o.SetUsername(username)
+	return o
+}
+
+// SetUsername adds the username to the user list followers params
+func (o *UserListFollowersParams) SetUsername(username string) {
+	o.Username = username
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *UserListFollowersParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.Limit != nil {
+
+		// query param limit
+		var qrLimit int64
+
+		if o.Limit != nil {
+			qrLimit = *o.Limit
+		}
+		qLimit := swag.FormatInt64(qrLimit)
+		if qLimit != "" {
+
+			if err := r.SetQueryParam("limit", qLimit); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param username
+	if err := r.SetPathParam("username", o.Username); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_list_followers_responses.go b/bots-common/gitea-generated/client/user/user_list_followers_responses.go
new file mode 100644
index 0000000..34a2fff
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_list_followers_responses.go
@@ -0,0 +1,166 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// UserListFollowersReader is a Reader for the UserListFollowers structure.
+type UserListFollowersReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *UserListFollowersReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewUserListFollowersOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewUserListFollowersNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /users/{username}/followers] userListFollowers", response, response.Code())
+	}
+}
+
+// NewUserListFollowersOK creates a UserListFollowersOK with default headers values
+func NewUserListFollowersOK() *UserListFollowersOK {
+	return &UserListFollowersOK{}
+}
+
+/*
+UserListFollowersOK describes a response with status code 200, with default header values.
+
+UserList
+*/
+type UserListFollowersOK struct {
+	Payload []*models.User
+}
+
+// IsSuccess returns true when this user list followers o k response has a 2xx status code
+func (o *UserListFollowersOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this user list followers o k response has a 3xx status code
+func (o *UserListFollowersOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user list followers o k response has a 4xx status code
+func (o *UserListFollowersOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this user list followers o k response has a 5xx status code
+func (o *UserListFollowersOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user list followers o k response a status code equal to that given
+func (o *UserListFollowersOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the user list followers o k response
+func (o *UserListFollowersOK) Code() int {
+	return 200
+}
+
+func (o *UserListFollowersOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /users/{username}/followers][%d] userListFollowersOK %s", 200, payload)
+}
+
+func (o *UserListFollowersOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /users/{username}/followers][%d] userListFollowersOK %s", 200, payload)
+}
+
+func (o *UserListFollowersOK) GetPayload() []*models.User {
+	return o.Payload
+}
+
+func (o *UserListFollowersOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewUserListFollowersNotFound creates a UserListFollowersNotFound with default headers values
+func NewUserListFollowersNotFound() *UserListFollowersNotFound {
+	return &UserListFollowersNotFound{}
+}
+
+/*
+UserListFollowersNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type UserListFollowersNotFound struct {
+}
+
+// IsSuccess returns true when this user list followers not found response has a 2xx status code
+func (o *UserListFollowersNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this user list followers not found response has a 3xx status code
+func (o *UserListFollowersNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user list followers not found response has a 4xx status code
+func (o *UserListFollowersNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this user list followers not found response has a 5xx status code
+func (o *UserListFollowersNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user list followers not found response a status code equal to that given
+func (o *UserListFollowersNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the user list followers not found response
+func (o *UserListFollowersNotFound) Code() int {
+	return 404
+}
+
+func (o *UserListFollowersNotFound) Error() string {
+	return fmt.Sprintf("[GET /users/{username}/followers][%d] userListFollowersNotFound", 404)
+}
+
+func (o *UserListFollowersNotFound) String() string {
+	return fmt.Sprintf("[GET /users/{username}/followers][%d] userListFollowersNotFound", 404)
+}
+
+func (o *UserListFollowersNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_list_following_parameters.go b/bots-common/gitea-generated/client/user/user_list_following_parameters.go
new file mode 100644
index 0000000..f5687d1
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_list_following_parameters.go
@@ -0,0 +1,220 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewUserListFollowingParams creates a new UserListFollowingParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewUserListFollowingParams() *UserListFollowingParams {
+	return &UserListFollowingParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewUserListFollowingParamsWithTimeout creates a new UserListFollowingParams object
+// with the ability to set a timeout on a request.
+func NewUserListFollowingParamsWithTimeout(timeout time.Duration) *UserListFollowingParams {
+	return &UserListFollowingParams{
+		timeout: timeout,
+	}
+}
+
+// NewUserListFollowingParamsWithContext creates a new UserListFollowingParams object
+// with the ability to set a context for a request.
+func NewUserListFollowingParamsWithContext(ctx context.Context) *UserListFollowingParams {
+	return &UserListFollowingParams{
+		Context: ctx,
+	}
+}
+
+// NewUserListFollowingParamsWithHTTPClient creates a new UserListFollowingParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewUserListFollowingParamsWithHTTPClient(client *http.Client) *UserListFollowingParams {
+	return &UserListFollowingParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+UserListFollowingParams contains all the parameters to send to the API endpoint
+
+	for the user list following operation.
+
+	Typically these are written to a http.Request.
+*/
+type UserListFollowingParams struct {
+
+	/* Limit.
+
+	   page size of results
+	*/
+	Limit *int64
+
+	/* Page.
+
+	   page number of results to return (1-based)
+	*/
+	Page *int64
+
+	/* Username.
+
+	   username of user
+	*/
+	Username string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the user list following params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserListFollowingParams) WithDefaults() *UserListFollowingParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the user list following params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserListFollowingParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the user list following params
+func (o *UserListFollowingParams) WithTimeout(timeout time.Duration) *UserListFollowingParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the user list following params
+func (o *UserListFollowingParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the user list following params
+func (o *UserListFollowingParams) WithContext(ctx context.Context) *UserListFollowingParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the user list following params
+func (o *UserListFollowingParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the user list following params
+func (o *UserListFollowingParams) WithHTTPClient(client *http.Client) *UserListFollowingParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the user list following params
+func (o *UserListFollowingParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithLimit adds the limit to the user list following params
+func (o *UserListFollowingParams) WithLimit(limit *int64) *UserListFollowingParams {
+	o.SetLimit(limit)
+	return o
+}
+
+// SetLimit adds the limit to the user list following params
+func (o *UserListFollowingParams) SetLimit(limit *int64) {
+	o.Limit = limit
+}
+
+// WithPage adds the page to the user list following params
+func (o *UserListFollowingParams) WithPage(page *int64) *UserListFollowingParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the user list following params
+func (o *UserListFollowingParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WithUsername adds the username to the user list following params
+func (o *UserListFollowingParams) WithUsername(username string) *UserListFollowingParams {
+	o.SetUsername(username)
+	return o
+}
+
+// SetUsername adds the username to the user list following params
+func (o *UserListFollowingParams) SetUsername(username string) {
+	o.Username = username
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *UserListFollowingParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.Limit != nil {
+
+		// query param limit
+		var qrLimit int64
+
+		if o.Limit != nil {
+			qrLimit = *o.Limit
+		}
+		qLimit := swag.FormatInt64(qrLimit)
+		if qLimit != "" {
+
+			if err := r.SetQueryParam("limit", qLimit); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param username
+	if err := r.SetPathParam("username", o.Username); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_list_following_responses.go b/bots-common/gitea-generated/client/user/user_list_following_responses.go
new file mode 100644
index 0000000..0737089
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_list_following_responses.go
@@ -0,0 +1,166 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// UserListFollowingReader is a Reader for the UserListFollowing structure.
+type UserListFollowingReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *UserListFollowingReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewUserListFollowingOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewUserListFollowingNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /users/{username}/following] userListFollowing", response, response.Code())
+	}
+}
+
+// NewUserListFollowingOK creates a UserListFollowingOK with default headers values
+func NewUserListFollowingOK() *UserListFollowingOK {
+	return &UserListFollowingOK{}
+}
+
+/*
+UserListFollowingOK describes a response with status code 200, with default header values.
+
+UserList
+*/
+type UserListFollowingOK struct {
+	Payload []*models.User
+}
+
+// IsSuccess returns true when this user list following o k response has a 2xx status code
+func (o *UserListFollowingOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this user list following o k response has a 3xx status code
+func (o *UserListFollowingOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user list following o k response has a 4xx status code
+func (o *UserListFollowingOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this user list following o k response has a 5xx status code
+func (o *UserListFollowingOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user list following o k response a status code equal to that given
+func (o *UserListFollowingOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the user list following o k response
+func (o *UserListFollowingOK) Code() int {
+	return 200
+}
+
+func (o *UserListFollowingOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /users/{username}/following][%d] userListFollowingOK %s", 200, payload)
+}
+
+func (o *UserListFollowingOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /users/{username}/following][%d] userListFollowingOK %s", 200, payload)
+}
+
+func (o *UserListFollowingOK) GetPayload() []*models.User {
+	return o.Payload
+}
+
+func (o *UserListFollowingOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewUserListFollowingNotFound creates a UserListFollowingNotFound with default headers values
+func NewUserListFollowingNotFound() *UserListFollowingNotFound {
+	return &UserListFollowingNotFound{}
+}
+
+/*
+UserListFollowingNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type UserListFollowingNotFound struct {
+}
+
+// IsSuccess returns true when this user list following not found response has a 2xx status code
+func (o *UserListFollowingNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this user list following not found response has a 3xx status code
+func (o *UserListFollowingNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user list following not found response has a 4xx status code
+func (o *UserListFollowingNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this user list following not found response has a 5xx status code
+func (o *UserListFollowingNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user list following not found response a status code equal to that given
+func (o *UserListFollowingNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the user list following not found response
+func (o *UserListFollowingNotFound) Code() int {
+	return 404
+}
+
+func (o *UserListFollowingNotFound) Error() string {
+	return fmt.Sprintf("[GET /users/{username}/following][%d] userListFollowingNotFound", 404)
+}
+
+func (o *UserListFollowingNotFound) String() string {
+	return fmt.Sprintf("[GET /users/{username}/following][%d] userListFollowingNotFound", 404)
+}
+
+func (o *UserListFollowingNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_list_g_p_g_keys_parameters.go b/bots-common/gitea-generated/client/user/user_list_g_p_g_keys_parameters.go
new file mode 100644
index 0000000..9fc0e31
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_list_g_p_g_keys_parameters.go
@@ -0,0 +1,220 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewUserListGPGKeysParams creates a new UserListGPGKeysParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewUserListGPGKeysParams() *UserListGPGKeysParams {
+	return &UserListGPGKeysParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewUserListGPGKeysParamsWithTimeout creates a new UserListGPGKeysParams object
+// with the ability to set a timeout on a request.
+func NewUserListGPGKeysParamsWithTimeout(timeout time.Duration) *UserListGPGKeysParams {
+	return &UserListGPGKeysParams{
+		timeout: timeout,
+	}
+}
+
+// NewUserListGPGKeysParamsWithContext creates a new UserListGPGKeysParams object
+// with the ability to set a context for a request.
+func NewUserListGPGKeysParamsWithContext(ctx context.Context) *UserListGPGKeysParams {
+	return &UserListGPGKeysParams{
+		Context: ctx,
+	}
+}
+
+// NewUserListGPGKeysParamsWithHTTPClient creates a new UserListGPGKeysParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewUserListGPGKeysParamsWithHTTPClient(client *http.Client) *UserListGPGKeysParams {
+	return &UserListGPGKeysParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+UserListGPGKeysParams contains all the parameters to send to the API endpoint
+
+	for the user list g p g keys operation.
+
+	Typically these are written to a http.Request.
+*/
+type UserListGPGKeysParams struct {
+
+	/* Limit.
+
+	   page size of results
+	*/
+	Limit *int64
+
+	/* Page.
+
+	   page number of results to return (1-based)
+	*/
+	Page *int64
+
+	/* Username.
+
+	   username of user
+	*/
+	Username string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the user list g p g keys params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserListGPGKeysParams) WithDefaults() *UserListGPGKeysParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the user list g p g keys params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserListGPGKeysParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the user list g p g keys params
+func (o *UserListGPGKeysParams) WithTimeout(timeout time.Duration) *UserListGPGKeysParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the user list g p g keys params
+func (o *UserListGPGKeysParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the user list g p g keys params
+func (o *UserListGPGKeysParams) WithContext(ctx context.Context) *UserListGPGKeysParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the user list g p g keys params
+func (o *UserListGPGKeysParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the user list g p g keys params
+func (o *UserListGPGKeysParams) WithHTTPClient(client *http.Client) *UserListGPGKeysParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the user list g p g keys params
+func (o *UserListGPGKeysParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithLimit adds the limit to the user list g p g keys params
+func (o *UserListGPGKeysParams) WithLimit(limit *int64) *UserListGPGKeysParams {
+	o.SetLimit(limit)
+	return o
+}
+
+// SetLimit adds the limit to the user list g p g keys params
+func (o *UserListGPGKeysParams) SetLimit(limit *int64) {
+	o.Limit = limit
+}
+
+// WithPage adds the page to the user list g p g keys params
+func (o *UserListGPGKeysParams) WithPage(page *int64) *UserListGPGKeysParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the user list g p g keys params
+func (o *UserListGPGKeysParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WithUsername adds the username to the user list g p g keys params
+func (o *UserListGPGKeysParams) WithUsername(username string) *UserListGPGKeysParams {
+	o.SetUsername(username)
+	return o
+}
+
+// SetUsername adds the username to the user list g p g keys params
+func (o *UserListGPGKeysParams) SetUsername(username string) {
+	o.Username = username
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *UserListGPGKeysParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.Limit != nil {
+
+		// query param limit
+		var qrLimit int64
+
+		if o.Limit != nil {
+			qrLimit = *o.Limit
+		}
+		qLimit := swag.FormatInt64(qrLimit)
+		if qLimit != "" {
+
+			if err := r.SetQueryParam("limit", qLimit); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param username
+	if err := r.SetPathParam("username", o.Username); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_list_g_p_g_keys_responses.go b/bots-common/gitea-generated/client/user/user_list_g_p_g_keys_responses.go
new file mode 100644
index 0000000..6cc2da4
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_list_g_p_g_keys_responses.go
@@ -0,0 +1,166 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// UserListGPGKeysReader is a Reader for the UserListGPGKeys structure.
+type UserListGPGKeysReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *UserListGPGKeysReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewUserListGPGKeysOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewUserListGPGKeysNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /users/{username}/gpg_keys] userListGPGKeys", response, response.Code())
+	}
+}
+
+// NewUserListGPGKeysOK creates a UserListGPGKeysOK with default headers values
+func NewUserListGPGKeysOK() *UserListGPGKeysOK {
+	return &UserListGPGKeysOK{}
+}
+
+/*
+UserListGPGKeysOK describes a response with status code 200, with default header values.
+
+GPGKeyList
+*/
+type UserListGPGKeysOK struct {
+	Payload []*models.GPGKey
+}
+
+// IsSuccess returns true when this user list g p g keys o k response has a 2xx status code
+func (o *UserListGPGKeysOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this user list g p g keys o k response has a 3xx status code
+func (o *UserListGPGKeysOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user list g p g keys o k response has a 4xx status code
+func (o *UserListGPGKeysOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this user list g p g keys o k response has a 5xx status code
+func (o *UserListGPGKeysOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user list g p g keys o k response a status code equal to that given
+func (o *UserListGPGKeysOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the user list g p g keys o k response
+func (o *UserListGPGKeysOK) Code() int {
+	return 200
+}
+
+func (o *UserListGPGKeysOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /users/{username}/gpg_keys][%d] userListGPGKeysOK %s", 200, payload)
+}
+
+func (o *UserListGPGKeysOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /users/{username}/gpg_keys][%d] userListGPGKeysOK %s", 200, payload)
+}
+
+func (o *UserListGPGKeysOK) GetPayload() []*models.GPGKey {
+	return o.Payload
+}
+
+func (o *UserListGPGKeysOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewUserListGPGKeysNotFound creates a UserListGPGKeysNotFound with default headers values
+func NewUserListGPGKeysNotFound() *UserListGPGKeysNotFound {
+	return &UserListGPGKeysNotFound{}
+}
+
+/*
+UserListGPGKeysNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type UserListGPGKeysNotFound struct {
+}
+
+// IsSuccess returns true when this user list g p g keys not found response has a 2xx status code
+func (o *UserListGPGKeysNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this user list g p g keys not found response has a 3xx status code
+func (o *UserListGPGKeysNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user list g p g keys not found response has a 4xx status code
+func (o *UserListGPGKeysNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this user list g p g keys not found response has a 5xx status code
+func (o *UserListGPGKeysNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user list g p g keys not found response a status code equal to that given
+func (o *UserListGPGKeysNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the user list g p g keys not found response
+func (o *UserListGPGKeysNotFound) Code() int {
+	return 404
+}
+
+func (o *UserListGPGKeysNotFound) Error() string {
+	return fmt.Sprintf("[GET /users/{username}/gpg_keys][%d] userListGPGKeysNotFound", 404)
+}
+
+func (o *UserListGPGKeysNotFound) String() string {
+	return fmt.Sprintf("[GET /users/{username}/gpg_keys][%d] userListGPGKeysNotFound", 404)
+}
+
+func (o *UserListGPGKeysNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_list_hooks_parameters.go b/bots-common/gitea-generated/client/user/user_list_hooks_parameters.go
new file mode 100644
index 0000000..34007b4
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_list_hooks_parameters.go
@@ -0,0 +1,198 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewUserListHooksParams creates a new UserListHooksParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewUserListHooksParams() *UserListHooksParams {
+	return &UserListHooksParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewUserListHooksParamsWithTimeout creates a new UserListHooksParams object
+// with the ability to set a timeout on a request.
+func NewUserListHooksParamsWithTimeout(timeout time.Duration) *UserListHooksParams {
+	return &UserListHooksParams{
+		timeout: timeout,
+	}
+}
+
+// NewUserListHooksParamsWithContext creates a new UserListHooksParams object
+// with the ability to set a context for a request.
+func NewUserListHooksParamsWithContext(ctx context.Context) *UserListHooksParams {
+	return &UserListHooksParams{
+		Context: ctx,
+	}
+}
+
+// NewUserListHooksParamsWithHTTPClient creates a new UserListHooksParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewUserListHooksParamsWithHTTPClient(client *http.Client) *UserListHooksParams {
+	return &UserListHooksParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+UserListHooksParams contains all the parameters to send to the API endpoint
+
+	for the user list hooks operation.
+
+	Typically these are written to a http.Request.
+*/
+type UserListHooksParams struct {
+
+	/* Limit.
+
+	   page size of results
+	*/
+	Limit *int64
+
+	/* Page.
+
+	   page number of results to return (1-based)
+	*/
+	Page *int64
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the user list hooks params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserListHooksParams) WithDefaults() *UserListHooksParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the user list hooks params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserListHooksParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the user list hooks params
+func (o *UserListHooksParams) WithTimeout(timeout time.Duration) *UserListHooksParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the user list hooks params
+func (o *UserListHooksParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the user list hooks params
+func (o *UserListHooksParams) WithContext(ctx context.Context) *UserListHooksParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the user list hooks params
+func (o *UserListHooksParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the user list hooks params
+func (o *UserListHooksParams) WithHTTPClient(client *http.Client) *UserListHooksParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the user list hooks params
+func (o *UserListHooksParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithLimit adds the limit to the user list hooks params
+func (o *UserListHooksParams) WithLimit(limit *int64) *UserListHooksParams {
+	o.SetLimit(limit)
+	return o
+}
+
+// SetLimit adds the limit to the user list hooks params
+func (o *UserListHooksParams) SetLimit(limit *int64) {
+	o.Limit = limit
+}
+
+// WithPage adds the page to the user list hooks params
+func (o *UserListHooksParams) WithPage(page *int64) *UserListHooksParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the user list hooks params
+func (o *UserListHooksParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *UserListHooksParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.Limit != nil {
+
+		// query param limit
+		var qrLimit int64
+
+		if o.Limit != nil {
+			qrLimit = *o.Limit
+		}
+		qLimit := swag.FormatInt64(qrLimit)
+		if qLimit != "" {
+
+			if err := r.SetQueryParam("limit", qLimit); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_list_hooks_responses.go b/bots-common/gitea-generated/client/user/user_list_hooks_responses.go
new file mode 100644
index 0000000..556a285
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_list_hooks_responses.go
@@ -0,0 +1,104 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// UserListHooksReader is a Reader for the UserListHooks structure.
+type UserListHooksReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *UserListHooksReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewUserListHooksOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	default:
+		return nil, runtime.NewAPIError("[GET /user/hooks] userListHooks", response, response.Code())
+	}
+}
+
+// NewUserListHooksOK creates a UserListHooksOK with default headers values
+func NewUserListHooksOK() *UserListHooksOK {
+	return &UserListHooksOK{}
+}
+
+/*
+UserListHooksOK describes a response with status code 200, with default header values.
+
+HookList
+*/
+type UserListHooksOK struct {
+	Payload []*models.Hook
+}
+
+// IsSuccess returns true when this user list hooks o k response has a 2xx status code
+func (o *UserListHooksOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this user list hooks o k response has a 3xx status code
+func (o *UserListHooksOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user list hooks o k response has a 4xx status code
+func (o *UserListHooksOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this user list hooks o k response has a 5xx status code
+func (o *UserListHooksOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user list hooks o k response a status code equal to that given
+func (o *UserListHooksOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the user list hooks o k response
+func (o *UserListHooksOK) Code() int {
+	return 200
+}
+
+func (o *UserListHooksOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /user/hooks][%d] userListHooksOK %s", 200, payload)
+}
+
+func (o *UserListHooksOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /user/hooks][%d] userListHooksOK %s", 200, payload)
+}
+
+func (o *UserListHooksOK) GetPayload() []*models.Hook {
+	return o.Payload
+}
+
+func (o *UserListHooksOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_list_keys_parameters.go b/bots-common/gitea-generated/client/user/user_list_keys_parameters.go
new file mode 100644
index 0000000..45feee6
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_list_keys_parameters.go
@@ -0,0 +1,254 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewUserListKeysParams creates a new UserListKeysParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewUserListKeysParams() *UserListKeysParams {
+	return &UserListKeysParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewUserListKeysParamsWithTimeout creates a new UserListKeysParams object
+// with the ability to set a timeout on a request.
+func NewUserListKeysParamsWithTimeout(timeout time.Duration) *UserListKeysParams {
+	return &UserListKeysParams{
+		timeout: timeout,
+	}
+}
+
+// NewUserListKeysParamsWithContext creates a new UserListKeysParams object
+// with the ability to set a context for a request.
+func NewUserListKeysParamsWithContext(ctx context.Context) *UserListKeysParams {
+	return &UserListKeysParams{
+		Context: ctx,
+	}
+}
+
+// NewUserListKeysParamsWithHTTPClient creates a new UserListKeysParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewUserListKeysParamsWithHTTPClient(client *http.Client) *UserListKeysParams {
+	return &UserListKeysParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+UserListKeysParams contains all the parameters to send to the API endpoint
+
+	for the user list keys operation.
+
+	Typically these are written to a http.Request.
+*/
+type UserListKeysParams struct {
+
+	/* Fingerprint.
+
+	   fingerprint of the key
+	*/
+	Fingerprint *string
+
+	/* Limit.
+
+	   page size of results
+	*/
+	Limit *int64
+
+	/* Page.
+
+	   page number of results to return (1-based)
+	*/
+	Page *int64
+
+	/* Username.
+
+	   username of user
+	*/
+	Username string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the user list keys params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserListKeysParams) WithDefaults() *UserListKeysParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the user list keys params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserListKeysParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the user list keys params
+func (o *UserListKeysParams) WithTimeout(timeout time.Duration) *UserListKeysParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the user list keys params
+func (o *UserListKeysParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the user list keys params
+func (o *UserListKeysParams) WithContext(ctx context.Context) *UserListKeysParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the user list keys params
+func (o *UserListKeysParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the user list keys params
+func (o *UserListKeysParams) WithHTTPClient(client *http.Client) *UserListKeysParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the user list keys params
+func (o *UserListKeysParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithFingerprint adds the fingerprint to the user list keys params
+func (o *UserListKeysParams) WithFingerprint(fingerprint *string) *UserListKeysParams {
+	o.SetFingerprint(fingerprint)
+	return o
+}
+
+// SetFingerprint adds the fingerprint to the user list keys params
+func (o *UserListKeysParams) SetFingerprint(fingerprint *string) {
+	o.Fingerprint = fingerprint
+}
+
+// WithLimit adds the limit to the user list keys params
+func (o *UserListKeysParams) WithLimit(limit *int64) *UserListKeysParams {
+	o.SetLimit(limit)
+	return o
+}
+
+// SetLimit adds the limit to the user list keys params
+func (o *UserListKeysParams) SetLimit(limit *int64) {
+	o.Limit = limit
+}
+
+// WithPage adds the page to the user list keys params
+func (o *UserListKeysParams) WithPage(page *int64) *UserListKeysParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the user list keys params
+func (o *UserListKeysParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WithUsername adds the username to the user list keys params
+func (o *UserListKeysParams) WithUsername(username string) *UserListKeysParams {
+	o.SetUsername(username)
+	return o
+}
+
+// SetUsername adds the username to the user list keys params
+func (o *UserListKeysParams) SetUsername(username string) {
+	o.Username = username
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *UserListKeysParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.Fingerprint != nil {
+
+		// query param fingerprint
+		var qrFingerprint string
+
+		if o.Fingerprint != nil {
+			qrFingerprint = *o.Fingerprint
+		}
+		qFingerprint := qrFingerprint
+		if qFingerprint != "" {
+
+			if err := r.SetQueryParam("fingerprint", qFingerprint); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Limit != nil {
+
+		// query param limit
+		var qrLimit int64
+
+		if o.Limit != nil {
+			qrLimit = *o.Limit
+		}
+		qLimit := swag.FormatInt64(qrLimit)
+		if qLimit != "" {
+
+			if err := r.SetQueryParam("limit", qLimit); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param username
+	if err := r.SetPathParam("username", o.Username); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_list_keys_responses.go b/bots-common/gitea-generated/client/user/user_list_keys_responses.go
new file mode 100644
index 0000000..d44f250
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_list_keys_responses.go
@@ -0,0 +1,166 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// UserListKeysReader is a Reader for the UserListKeys structure.
+type UserListKeysReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *UserListKeysReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewUserListKeysOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewUserListKeysNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /users/{username}/keys] userListKeys", response, response.Code())
+	}
+}
+
+// NewUserListKeysOK creates a UserListKeysOK with default headers values
+func NewUserListKeysOK() *UserListKeysOK {
+	return &UserListKeysOK{}
+}
+
+/*
+UserListKeysOK describes a response with status code 200, with default header values.
+
+PublicKeyList
+*/
+type UserListKeysOK struct {
+	Payload []*models.PublicKey
+}
+
+// IsSuccess returns true when this user list keys o k response has a 2xx status code
+func (o *UserListKeysOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this user list keys o k response has a 3xx status code
+func (o *UserListKeysOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user list keys o k response has a 4xx status code
+func (o *UserListKeysOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this user list keys o k response has a 5xx status code
+func (o *UserListKeysOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user list keys o k response a status code equal to that given
+func (o *UserListKeysOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the user list keys o k response
+func (o *UserListKeysOK) Code() int {
+	return 200
+}
+
+func (o *UserListKeysOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /users/{username}/keys][%d] userListKeysOK %s", 200, payload)
+}
+
+func (o *UserListKeysOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /users/{username}/keys][%d] userListKeysOK %s", 200, payload)
+}
+
+func (o *UserListKeysOK) GetPayload() []*models.PublicKey {
+	return o.Payload
+}
+
+func (o *UserListKeysOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewUserListKeysNotFound creates a UserListKeysNotFound with default headers values
+func NewUserListKeysNotFound() *UserListKeysNotFound {
+	return &UserListKeysNotFound{}
+}
+
+/*
+UserListKeysNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type UserListKeysNotFound struct {
+}
+
+// IsSuccess returns true when this user list keys not found response has a 2xx status code
+func (o *UserListKeysNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this user list keys not found response has a 3xx status code
+func (o *UserListKeysNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user list keys not found response has a 4xx status code
+func (o *UserListKeysNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this user list keys not found response has a 5xx status code
+func (o *UserListKeysNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user list keys not found response a status code equal to that given
+func (o *UserListKeysNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the user list keys not found response
+func (o *UserListKeysNotFound) Code() int {
+	return 404
+}
+
+func (o *UserListKeysNotFound) Error() string {
+	return fmt.Sprintf("[GET /users/{username}/keys][%d] userListKeysNotFound", 404)
+}
+
+func (o *UserListKeysNotFound) String() string {
+	return fmt.Sprintf("[GET /users/{username}/keys][%d] userListKeysNotFound", 404)
+}
+
+func (o *UserListKeysNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_list_repos_parameters.go b/bots-common/gitea-generated/client/user/user_list_repos_parameters.go
new file mode 100644
index 0000000..9b1d412
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_list_repos_parameters.go
@@ -0,0 +1,220 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewUserListReposParams creates a new UserListReposParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewUserListReposParams() *UserListReposParams {
+	return &UserListReposParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewUserListReposParamsWithTimeout creates a new UserListReposParams object
+// with the ability to set a timeout on a request.
+func NewUserListReposParamsWithTimeout(timeout time.Duration) *UserListReposParams {
+	return &UserListReposParams{
+		timeout: timeout,
+	}
+}
+
+// NewUserListReposParamsWithContext creates a new UserListReposParams object
+// with the ability to set a context for a request.
+func NewUserListReposParamsWithContext(ctx context.Context) *UserListReposParams {
+	return &UserListReposParams{
+		Context: ctx,
+	}
+}
+
+// NewUserListReposParamsWithHTTPClient creates a new UserListReposParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewUserListReposParamsWithHTTPClient(client *http.Client) *UserListReposParams {
+	return &UserListReposParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+UserListReposParams contains all the parameters to send to the API endpoint
+
+	for the user list repos operation.
+
+	Typically these are written to a http.Request.
+*/
+type UserListReposParams struct {
+
+	/* Limit.
+
+	   page size of results
+	*/
+	Limit *int64
+
+	/* Page.
+
+	   page number of results to return (1-based)
+	*/
+	Page *int64
+
+	/* Username.
+
+	   username of user
+	*/
+	Username string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the user list repos params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserListReposParams) WithDefaults() *UserListReposParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the user list repos params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserListReposParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the user list repos params
+func (o *UserListReposParams) WithTimeout(timeout time.Duration) *UserListReposParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the user list repos params
+func (o *UserListReposParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the user list repos params
+func (o *UserListReposParams) WithContext(ctx context.Context) *UserListReposParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the user list repos params
+func (o *UserListReposParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the user list repos params
+func (o *UserListReposParams) WithHTTPClient(client *http.Client) *UserListReposParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the user list repos params
+func (o *UserListReposParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithLimit adds the limit to the user list repos params
+func (o *UserListReposParams) WithLimit(limit *int64) *UserListReposParams {
+	o.SetLimit(limit)
+	return o
+}
+
+// SetLimit adds the limit to the user list repos params
+func (o *UserListReposParams) SetLimit(limit *int64) {
+	o.Limit = limit
+}
+
+// WithPage adds the page to the user list repos params
+func (o *UserListReposParams) WithPage(page *int64) *UserListReposParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the user list repos params
+func (o *UserListReposParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WithUsername adds the username to the user list repos params
+func (o *UserListReposParams) WithUsername(username string) *UserListReposParams {
+	o.SetUsername(username)
+	return o
+}
+
+// SetUsername adds the username to the user list repos params
+func (o *UserListReposParams) SetUsername(username string) {
+	o.Username = username
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *UserListReposParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.Limit != nil {
+
+		// query param limit
+		var qrLimit int64
+
+		if o.Limit != nil {
+			qrLimit = *o.Limit
+		}
+		qLimit := swag.FormatInt64(qrLimit)
+		if qLimit != "" {
+
+			if err := r.SetQueryParam("limit", qLimit); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param username
+	if err := r.SetPathParam("username", o.Username); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_list_repos_responses.go b/bots-common/gitea-generated/client/user/user_list_repos_responses.go
new file mode 100644
index 0000000..9b00df8
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_list_repos_responses.go
@@ -0,0 +1,166 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// UserListReposReader is a Reader for the UserListRepos structure.
+type UserListReposReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *UserListReposReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewUserListReposOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewUserListReposNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /users/{username}/repos] userListRepos", response, response.Code())
+	}
+}
+
+// NewUserListReposOK creates a UserListReposOK with default headers values
+func NewUserListReposOK() *UserListReposOK {
+	return &UserListReposOK{}
+}
+
+/*
+UserListReposOK describes a response with status code 200, with default header values.
+
+RepositoryList
+*/
+type UserListReposOK struct {
+	Payload []*models.Repository
+}
+
+// IsSuccess returns true when this user list repos o k response has a 2xx status code
+func (o *UserListReposOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this user list repos o k response has a 3xx status code
+func (o *UserListReposOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user list repos o k response has a 4xx status code
+func (o *UserListReposOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this user list repos o k response has a 5xx status code
+func (o *UserListReposOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user list repos o k response a status code equal to that given
+func (o *UserListReposOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the user list repos o k response
+func (o *UserListReposOK) Code() int {
+	return 200
+}
+
+func (o *UserListReposOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /users/{username}/repos][%d] userListReposOK %s", 200, payload)
+}
+
+func (o *UserListReposOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /users/{username}/repos][%d] userListReposOK %s", 200, payload)
+}
+
+func (o *UserListReposOK) GetPayload() []*models.Repository {
+	return o.Payload
+}
+
+func (o *UserListReposOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewUserListReposNotFound creates a UserListReposNotFound with default headers values
+func NewUserListReposNotFound() *UserListReposNotFound {
+	return &UserListReposNotFound{}
+}
+
+/*
+UserListReposNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type UserListReposNotFound struct {
+}
+
+// IsSuccess returns true when this user list repos not found response has a 2xx status code
+func (o *UserListReposNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this user list repos not found response has a 3xx status code
+func (o *UserListReposNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user list repos not found response has a 4xx status code
+func (o *UserListReposNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this user list repos not found response has a 5xx status code
+func (o *UserListReposNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user list repos not found response a status code equal to that given
+func (o *UserListReposNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the user list repos not found response
+func (o *UserListReposNotFound) Code() int {
+	return 404
+}
+
+func (o *UserListReposNotFound) Error() string {
+	return fmt.Sprintf("[GET /users/{username}/repos][%d] userListReposNotFound", 404)
+}
+
+func (o *UserListReposNotFound) String() string {
+	return fmt.Sprintf("[GET /users/{username}/repos][%d] userListReposNotFound", 404)
+}
+
+func (o *UserListReposNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_list_starred_parameters.go b/bots-common/gitea-generated/client/user/user_list_starred_parameters.go
new file mode 100644
index 0000000..58894e6
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_list_starred_parameters.go
@@ -0,0 +1,220 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewUserListStarredParams creates a new UserListStarredParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewUserListStarredParams() *UserListStarredParams {
+	return &UserListStarredParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewUserListStarredParamsWithTimeout creates a new UserListStarredParams object
+// with the ability to set a timeout on a request.
+func NewUserListStarredParamsWithTimeout(timeout time.Duration) *UserListStarredParams {
+	return &UserListStarredParams{
+		timeout: timeout,
+	}
+}
+
+// NewUserListStarredParamsWithContext creates a new UserListStarredParams object
+// with the ability to set a context for a request.
+func NewUserListStarredParamsWithContext(ctx context.Context) *UserListStarredParams {
+	return &UserListStarredParams{
+		Context: ctx,
+	}
+}
+
+// NewUserListStarredParamsWithHTTPClient creates a new UserListStarredParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewUserListStarredParamsWithHTTPClient(client *http.Client) *UserListStarredParams {
+	return &UserListStarredParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+UserListStarredParams contains all the parameters to send to the API endpoint
+
+	for the user list starred operation.
+
+	Typically these are written to a http.Request.
+*/
+type UserListStarredParams struct {
+
+	/* Limit.
+
+	   page size of results
+	*/
+	Limit *int64
+
+	/* Page.
+
+	   page number of results to return (1-based)
+	*/
+	Page *int64
+
+	/* Username.
+
+	   username of user
+	*/
+	Username string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the user list starred params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserListStarredParams) WithDefaults() *UserListStarredParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the user list starred params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserListStarredParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the user list starred params
+func (o *UserListStarredParams) WithTimeout(timeout time.Duration) *UserListStarredParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the user list starred params
+func (o *UserListStarredParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the user list starred params
+func (o *UserListStarredParams) WithContext(ctx context.Context) *UserListStarredParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the user list starred params
+func (o *UserListStarredParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the user list starred params
+func (o *UserListStarredParams) WithHTTPClient(client *http.Client) *UserListStarredParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the user list starred params
+func (o *UserListStarredParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithLimit adds the limit to the user list starred params
+func (o *UserListStarredParams) WithLimit(limit *int64) *UserListStarredParams {
+	o.SetLimit(limit)
+	return o
+}
+
+// SetLimit adds the limit to the user list starred params
+func (o *UserListStarredParams) SetLimit(limit *int64) {
+	o.Limit = limit
+}
+
+// WithPage adds the page to the user list starred params
+func (o *UserListStarredParams) WithPage(page *int64) *UserListStarredParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the user list starred params
+func (o *UserListStarredParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WithUsername adds the username to the user list starred params
+func (o *UserListStarredParams) WithUsername(username string) *UserListStarredParams {
+	o.SetUsername(username)
+	return o
+}
+
+// SetUsername adds the username to the user list starred params
+func (o *UserListStarredParams) SetUsername(username string) {
+	o.Username = username
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *UserListStarredParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.Limit != nil {
+
+		// query param limit
+		var qrLimit int64
+
+		if o.Limit != nil {
+			qrLimit = *o.Limit
+		}
+		qLimit := swag.FormatInt64(qrLimit)
+		if qLimit != "" {
+
+			if err := r.SetQueryParam("limit", qLimit); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param username
+	if err := r.SetPathParam("username", o.Username); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_list_starred_responses.go b/bots-common/gitea-generated/client/user/user_list_starred_responses.go
new file mode 100644
index 0000000..15b8f5d
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_list_starred_responses.go
@@ -0,0 +1,166 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// UserListStarredReader is a Reader for the UserListStarred structure.
+type UserListStarredReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *UserListStarredReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewUserListStarredOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewUserListStarredNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /users/{username}/starred] userListStarred", response, response.Code())
+	}
+}
+
+// NewUserListStarredOK creates a UserListStarredOK with default headers values
+func NewUserListStarredOK() *UserListStarredOK {
+	return &UserListStarredOK{}
+}
+
+/*
+UserListStarredOK describes a response with status code 200, with default header values.
+
+RepositoryList
+*/
+type UserListStarredOK struct {
+	Payload []*models.Repository
+}
+
+// IsSuccess returns true when this user list starred o k response has a 2xx status code
+func (o *UserListStarredOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this user list starred o k response has a 3xx status code
+func (o *UserListStarredOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user list starred o k response has a 4xx status code
+func (o *UserListStarredOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this user list starred o k response has a 5xx status code
+func (o *UserListStarredOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user list starred o k response a status code equal to that given
+func (o *UserListStarredOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the user list starred o k response
+func (o *UserListStarredOK) Code() int {
+	return 200
+}
+
+func (o *UserListStarredOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /users/{username}/starred][%d] userListStarredOK %s", 200, payload)
+}
+
+func (o *UserListStarredOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /users/{username}/starred][%d] userListStarredOK %s", 200, payload)
+}
+
+func (o *UserListStarredOK) GetPayload() []*models.Repository {
+	return o.Payload
+}
+
+func (o *UserListStarredOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewUserListStarredNotFound creates a UserListStarredNotFound with default headers values
+func NewUserListStarredNotFound() *UserListStarredNotFound {
+	return &UserListStarredNotFound{}
+}
+
+/*
+UserListStarredNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type UserListStarredNotFound struct {
+}
+
+// IsSuccess returns true when this user list starred not found response has a 2xx status code
+func (o *UserListStarredNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this user list starred not found response has a 3xx status code
+func (o *UserListStarredNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user list starred not found response has a 4xx status code
+func (o *UserListStarredNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this user list starred not found response has a 5xx status code
+func (o *UserListStarredNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user list starred not found response a status code equal to that given
+func (o *UserListStarredNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the user list starred not found response
+func (o *UserListStarredNotFound) Code() int {
+	return 404
+}
+
+func (o *UserListStarredNotFound) Error() string {
+	return fmt.Sprintf("[GET /users/{username}/starred][%d] userListStarredNotFound", 404)
+}
+
+func (o *UserListStarredNotFound) String() string {
+	return fmt.Sprintf("[GET /users/{username}/starred][%d] userListStarredNotFound", 404)
+}
+
+func (o *UserListStarredNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_list_subscriptions_parameters.go b/bots-common/gitea-generated/client/user/user_list_subscriptions_parameters.go
new file mode 100644
index 0000000..c4569b9
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_list_subscriptions_parameters.go
@@ -0,0 +1,220 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewUserListSubscriptionsParams creates a new UserListSubscriptionsParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewUserListSubscriptionsParams() *UserListSubscriptionsParams {
+	return &UserListSubscriptionsParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewUserListSubscriptionsParamsWithTimeout creates a new UserListSubscriptionsParams object
+// with the ability to set a timeout on a request.
+func NewUserListSubscriptionsParamsWithTimeout(timeout time.Duration) *UserListSubscriptionsParams {
+	return &UserListSubscriptionsParams{
+		timeout: timeout,
+	}
+}
+
+// NewUserListSubscriptionsParamsWithContext creates a new UserListSubscriptionsParams object
+// with the ability to set a context for a request.
+func NewUserListSubscriptionsParamsWithContext(ctx context.Context) *UserListSubscriptionsParams {
+	return &UserListSubscriptionsParams{
+		Context: ctx,
+	}
+}
+
+// NewUserListSubscriptionsParamsWithHTTPClient creates a new UserListSubscriptionsParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewUserListSubscriptionsParamsWithHTTPClient(client *http.Client) *UserListSubscriptionsParams {
+	return &UserListSubscriptionsParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+UserListSubscriptionsParams contains all the parameters to send to the API endpoint
+
+	for the user list subscriptions operation.
+
+	Typically these are written to a http.Request.
+*/
+type UserListSubscriptionsParams struct {
+
+	/* Limit.
+
+	   page size of results
+	*/
+	Limit *int64
+
+	/* Page.
+
+	   page number of results to return (1-based)
+	*/
+	Page *int64
+
+	/* Username.
+
+	   username of the user
+	*/
+	Username string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the user list subscriptions params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserListSubscriptionsParams) WithDefaults() *UserListSubscriptionsParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the user list subscriptions params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserListSubscriptionsParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the user list subscriptions params
+func (o *UserListSubscriptionsParams) WithTimeout(timeout time.Duration) *UserListSubscriptionsParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the user list subscriptions params
+func (o *UserListSubscriptionsParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the user list subscriptions params
+func (o *UserListSubscriptionsParams) WithContext(ctx context.Context) *UserListSubscriptionsParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the user list subscriptions params
+func (o *UserListSubscriptionsParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the user list subscriptions params
+func (o *UserListSubscriptionsParams) WithHTTPClient(client *http.Client) *UserListSubscriptionsParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the user list subscriptions params
+func (o *UserListSubscriptionsParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithLimit adds the limit to the user list subscriptions params
+func (o *UserListSubscriptionsParams) WithLimit(limit *int64) *UserListSubscriptionsParams {
+	o.SetLimit(limit)
+	return o
+}
+
+// SetLimit adds the limit to the user list subscriptions params
+func (o *UserListSubscriptionsParams) SetLimit(limit *int64) {
+	o.Limit = limit
+}
+
+// WithPage adds the page to the user list subscriptions params
+func (o *UserListSubscriptionsParams) WithPage(page *int64) *UserListSubscriptionsParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the user list subscriptions params
+func (o *UserListSubscriptionsParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WithUsername adds the username to the user list subscriptions params
+func (o *UserListSubscriptionsParams) WithUsername(username string) *UserListSubscriptionsParams {
+	o.SetUsername(username)
+	return o
+}
+
+// SetUsername adds the username to the user list subscriptions params
+func (o *UserListSubscriptionsParams) SetUsername(username string) {
+	o.Username = username
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *UserListSubscriptionsParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.Limit != nil {
+
+		// query param limit
+		var qrLimit int64
+
+		if o.Limit != nil {
+			qrLimit = *o.Limit
+		}
+		qLimit := swag.FormatInt64(qrLimit)
+		if qLimit != "" {
+
+			if err := r.SetQueryParam("limit", qLimit); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	// path param username
+	if err := r.SetPathParam("username", o.Username); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_list_subscriptions_responses.go b/bots-common/gitea-generated/client/user/user_list_subscriptions_responses.go
new file mode 100644
index 0000000..9eb1804
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_list_subscriptions_responses.go
@@ -0,0 +1,166 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// UserListSubscriptionsReader is a Reader for the UserListSubscriptions structure.
+type UserListSubscriptionsReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *UserListSubscriptionsReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewUserListSubscriptionsOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewUserListSubscriptionsNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[GET /users/{username}/subscriptions] userListSubscriptions", response, response.Code())
+	}
+}
+
+// NewUserListSubscriptionsOK creates a UserListSubscriptionsOK with default headers values
+func NewUserListSubscriptionsOK() *UserListSubscriptionsOK {
+	return &UserListSubscriptionsOK{}
+}
+
+/*
+UserListSubscriptionsOK describes a response with status code 200, with default header values.
+
+RepositoryList
+*/
+type UserListSubscriptionsOK struct {
+	Payload []*models.Repository
+}
+
+// IsSuccess returns true when this user list subscriptions o k response has a 2xx status code
+func (o *UserListSubscriptionsOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this user list subscriptions o k response has a 3xx status code
+func (o *UserListSubscriptionsOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user list subscriptions o k response has a 4xx status code
+func (o *UserListSubscriptionsOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this user list subscriptions o k response has a 5xx status code
+func (o *UserListSubscriptionsOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user list subscriptions o k response a status code equal to that given
+func (o *UserListSubscriptionsOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the user list subscriptions o k response
+func (o *UserListSubscriptionsOK) Code() int {
+	return 200
+}
+
+func (o *UserListSubscriptionsOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /users/{username}/subscriptions][%d] userListSubscriptionsOK %s", 200, payload)
+}
+
+func (o *UserListSubscriptionsOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /users/{username}/subscriptions][%d] userListSubscriptionsOK %s", 200, payload)
+}
+
+func (o *UserListSubscriptionsOK) GetPayload() []*models.Repository {
+	return o.Payload
+}
+
+func (o *UserListSubscriptionsOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewUserListSubscriptionsNotFound creates a UserListSubscriptionsNotFound with default headers values
+func NewUserListSubscriptionsNotFound() *UserListSubscriptionsNotFound {
+	return &UserListSubscriptionsNotFound{}
+}
+
+/*
+UserListSubscriptionsNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type UserListSubscriptionsNotFound struct {
+}
+
+// IsSuccess returns true when this user list subscriptions not found response has a 2xx status code
+func (o *UserListSubscriptionsNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this user list subscriptions not found response has a 3xx status code
+func (o *UserListSubscriptionsNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user list subscriptions not found response has a 4xx status code
+func (o *UserListSubscriptionsNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this user list subscriptions not found response has a 5xx status code
+func (o *UserListSubscriptionsNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user list subscriptions not found response a status code equal to that given
+func (o *UserListSubscriptionsNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the user list subscriptions not found response
+func (o *UserListSubscriptionsNotFound) Code() int {
+	return 404
+}
+
+func (o *UserListSubscriptionsNotFound) Error() string {
+	return fmt.Sprintf("[GET /users/{username}/subscriptions][%d] userListSubscriptionsNotFound", 404)
+}
+
+func (o *UserListSubscriptionsNotFound) String() string {
+	return fmt.Sprintf("[GET /users/{username}/subscriptions][%d] userListSubscriptionsNotFound", 404)
+}
+
+func (o *UserListSubscriptionsNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_list_teams_parameters.go b/bots-common/gitea-generated/client/user/user_list_teams_parameters.go
new file mode 100644
index 0000000..54cc46c
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_list_teams_parameters.go
@@ -0,0 +1,198 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewUserListTeamsParams creates a new UserListTeamsParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewUserListTeamsParams() *UserListTeamsParams {
+	return &UserListTeamsParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewUserListTeamsParamsWithTimeout creates a new UserListTeamsParams object
+// with the ability to set a timeout on a request.
+func NewUserListTeamsParamsWithTimeout(timeout time.Duration) *UserListTeamsParams {
+	return &UserListTeamsParams{
+		timeout: timeout,
+	}
+}
+
+// NewUserListTeamsParamsWithContext creates a new UserListTeamsParams object
+// with the ability to set a context for a request.
+func NewUserListTeamsParamsWithContext(ctx context.Context) *UserListTeamsParams {
+	return &UserListTeamsParams{
+		Context: ctx,
+	}
+}
+
+// NewUserListTeamsParamsWithHTTPClient creates a new UserListTeamsParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewUserListTeamsParamsWithHTTPClient(client *http.Client) *UserListTeamsParams {
+	return &UserListTeamsParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+UserListTeamsParams contains all the parameters to send to the API endpoint
+
+	for the user list teams operation.
+
+	Typically these are written to a http.Request.
+*/
+type UserListTeamsParams struct {
+
+	/* Limit.
+
+	   page size of results
+	*/
+	Limit *int64
+
+	/* Page.
+
+	   page number of results to return (1-based)
+	*/
+	Page *int64
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the user list teams params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserListTeamsParams) WithDefaults() *UserListTeamsParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the user list teams params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserListTeamsParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the user list teams params
+func (o *UserListTeamsParams) WithTimeout(timeout time.Duration) *UserListTeamsParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the user list teams params
+func (o *UserListTeamsParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the user list teams params
+func (o *UserListTeamsParams) WithContext(ctx context.Context) *UserListTeamsParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the user list teams params
+func (o *UserListTeamsParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the user list teams params
+func (o *UserListTeamsParams) WithHTTPClient(client *http.Client) *UserListTeamsParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the user list teams params
+func (o *UserListTeamsParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithLimit adds the limit to the user list teams params
+func (o *UserListTeamsParams) WithLimit(limit *int64) *UserListTeamsParams {
+	o.SetLimit(limit)
+	return o
+}
+
+// SetLimit adds the limit to the user list teams params
+func (o *UserListTeamsParams) SetLimit(limit *int64) {
+	o.Limit = limit
+}
+
+// WithPage adds the page to the user list teams params
+func (o *UserListTeamsParams) WithPage(page *int64) *UserListTeamsParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the user list teams params
+func (o *UserListTeamsParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *UserListTeamsParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.Limit != nil {
+
+		// query param limit
+		var qrLimit int64
+
+		if o.Limit != nil {
+			qrLimit = *o.Limit
+		}
+		qLimit := swag.FormatInt64(qrLimit)
+		if qLimit != "" {
+
+			if err := r.SetQueryParam("limit", qLimit); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_list_teams_responses.go b/bots-common/gitea-generated/client/user/user_list_teams_responses.go
new file mode 100644
index 0000000..423d22b
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_list_teams_responses.go
@@ -0,0 +1,104 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// UserListTeamsReader is a Reader for the UserListTeams structure.
+type UserListTeamsReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *UserListTeamsReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewUserListTeamsOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	default:
+		return nil, runtime.NewAPIError("[GET /user/teams] userListTeams", response, response.Code())
+	}
+}
+
+// NewUserListTeamsOK creates a UserListTeamsOK with default headers values
+func NewUserListTeamsOK() *UserListTeamsOK {
+	return &UserListTeamsOK{}
+}
+
+/*
+UserListTeamsOK describes a response with status code 200, with default header values.
+
+TeamList
+*/
+type UserListTeamsOK struct {
+	Payload []*models.Team
+}
+
+// IsSuccess returns true when this user list teams o k response has a 2xx status code
+func (o *UserListTeamsOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this user list teams o k response has a 3xx status code
+func (o *UserListTeamsOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user list teams o k response has a 4xx status code
+func (o *UserListTeamsOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this user list teams o k response has a 5xx status code
+func (o *UserListTeamsOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user list teams o k response a status code equal to that given
+func (o *UserListTeamsOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the user list teams o k response
+func (o *UserListTeamsOK) Code() int {
+	return 200
+}
+
+func (o *UserListTeamsOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /user/teams][%d] userListTeamsOK %s", 200, payload)
+}
+
+func (o *UserListTeamsOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /user/teams][%d] userListTeamsOK %s", 200, payload)
+}
+
+func (o *UserListTeamsOK) GetPayload() []*models.Team {
+	return o.Payload
+}
+
+func (o *UserListTeamsOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// response payload
+	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_search_parameters.go b/bots-common/gitea-generated/client/user/user_search_parameters.go
new file mode 100644
index 0000000..d617d0e
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_search_parameters.go
@@ -0,0 +1,268 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewUserSearchParams creates a new UserSearchParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewUserSearchParams() *UserSearchParams {
+	return &UserSearchParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewUserSearchParamsWithTimeout creates a new UserSearchParams object
+// with the ability to set a timeout on a request.
+func NewUserSearchParamsWithTimeout(timeout time.Duration) *UserSearchParams {
+	return &UserSearchParams{
+		timeout: timeout,
+	}
+}
+
+// NewUserSearchParamsWithContext creates a new UserSearchParams object
+// with the ability to set a context for a request.
+func NewUserSearchParamsWithContext(ctx context.Context) *UserSearchParams {
+	return &UserSearchParams{
+		Context: ctx,
+	}
+}
+
+// NewUserSearchParamsWithHTTPClient creates a new UserSearchParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewUserSearchParamsWithHTTPClient(client *http.Client) *UserSearchParams {
+	return &UserSearchParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+UserSearchParams contains all the parameters to send to the API endpoint
+
+	for the user search operation.
+
+	Typically these are written to a http.Request.
+*/
+type UserSearchParams struct {
+
+	/* Limit.
+
+	   page size of results
+	*/
+	Limit *int64
+
+	/* Page.
+
+	   page number of results to return (1-based)
+	*/
+	Page *int64
+
+	/* Q.
+
+	   keyword
+	*/
+	Q *string
+
+	/* UID.
+
+	   ID of the user to search for
+
+	   Format: int64
+	*/
+	UID *int64
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the user search params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserSearchParams) WithDefaults() *UserSearchParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the user search params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserSearchParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the user search params
+func (o *UserSearchParams) WithTimeout(timeout time.Duration) *UserSearchParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the user search params
+func (o *UserSearchParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the user search params
+func (o *UserSearchParams) WithContext(ctx context.Context) *UserSearchParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the user search params
+func (o *UserSearchParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the user search params
+func (o *UserSearchParams) WithHTTPClient(client *http.Client) *UserSearchParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the user search params
+func (o *UserSearchParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithLimit adds the limit to the user search params
+func (o *UserSearchParams) WithLimit(limit *int64) *UserSearchParams {
+	o.SetLimit(limit)
+	return o
+}
+
+// SetLimit adds the limit to the user search params
+func (o *UserSearchParams) SetLimit(limit *int64) {
+	o.Limit = limit
+}
+
+// WithPage adds the page to the user search params
+func (o *UserSearchParams) WithPage(page *int64) *UserSearchParams {
+	o.SetPage(page)
+	return o
+}
+
+// SetPage adds the page to the user search params
+func (o *UserSearchParams) SetPage(page *int64) {
+	o.Page = page
+}
+
+// WithQ adds the q to the user search params
+func (o *UserSearchParams) WithQ(q *string) *UserSearchParams {
+	o.SetQ(q)
+	return o
+}
+
+// SetQ adds the q to the user search params
+func (o *UserSearchParams) SetQ(q *string) {
+	o.Q = q
+}
+
+// WithUID adds the uid to the user search params
+func (o *UserSearchParams) WithUID(uid *int64) *UserSearchParams {
+	o.SetUID(uid)
+	return o
+}
+
+// SetUID adds the uid to the user search params
+func (o *UserSearchParams) SetUID(uid *int64) {
+	o.UID = uid
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *UserSearchParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if o.Limit != nil {
+
+		// query param limit
+		var qrLimit int64
+
+		if o.Limit != nil {
+			qrLimit = *o.Limit
+		}
+		qLimit := swag.FormatInt64(qrLimit)
+		if qLimit != "" {
+
+			if err := r.SetQueryParam("limit", qLimit); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Page != nil {
+
+		// query param page
+		var qrPage int64
+
+		if o.Page != nil {
+			qrPage = *o.Page
+		}
+		qPage := swag.FormatInt64(qrPage)
+		if qPage != "" {
+
+			if err := r.SetQueryParam("page", qPage); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.Q != nil {
+
+		// query param q
+		var qrQ string
+
+		if o.Q != nil {
+			qrQ = *o.Q
+		}
+		qQ := qrQ
+		if qQ != "" {
+
+			if err := r.SetQueryParam("q", qQ); err != nil {
+				return err
+			}
+		}
+	}
+
+	if o.UID != nil {
+
+		// query param uid
+		var qrUID int64
+
+		if o.UID != nil {
+			qrUID = *o.UID
+		}
+		qUID := swag.FormatInt64(qrUID)
+		if qUID != "" {
+
+			if err := r.SetQueryParam("uid", qUID); err != nil {
+				return err
+			}
+		}
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_search_responses.go b/bots-common/gitea-generated/client/user/user_search_responses.go
new file mode 100644
index 0000000..25fd366
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_search_responses.go
@@ -0,0 +1,220 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"encoding/json"
+	"fmt"
+	"io"
+	"strconv"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// UserSearchReader is a Reader for the UserSearch structure.
+type UserSearchReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *UserSearchReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewUserSearchOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	default:
+		return nil, runtime.NewAPIError("[GET /users/search] userSearch", response, response.Code())
+	}
+}
+
+// NewUserSearchOK creates a UserSearchOK with default headers values
+func NewUserSearchOK() *UserSearchOK {
+	return &UserSearchOK{}
+}
+
+/*
+UserSearchOK describes a response with status code 200, with default header values.
+
+SearchResults of a successful search
+*/
+type UserSearchOK struct {
+	Payload *UserSearchOKBody
+}
+
+// IsSuccess returns true when this user search o k response has a 2xx status code
+func (o *UserSearchOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this user search o k response has a 3xx status code
+func (o *UserSearchOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user search o k response has a 4xx status code
+func (o *UserSearchOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this user search o k response has a 5xx status code
+func (o *UserSearchOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user search o k response a status code equal to that given
+func (o *UserSearchOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the user search o k response
+func (o *UserSearchOK) Code() int {
+	return 200
+}
+
+func (o *UserSearchOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /users/search][%d] userSearchOK %s", 200, payload)
+}
+
+func (o *UserSearchOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[GET /users/search][%d] userSearchOK %s", 200, payload)
+}
+
+func (o *UserSearchOK) GetPayload() *UserSearchOKBody {
+	return o.Payload
+}
+
+func (o *UserSearchOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(UserSearchOKBody)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+/*
+UserSearchOKBody user search o k body
+swagger:model UserSearchOKBody
+*/
+type UserSearchOKBody struct {
+
+	// data
+	Data []*models.User `json:"data"`
+
+	// ok
+	Ok bool `json:"ok,omitempty"`
+}
+
+// Validate validates this user search o k body
+func (o *UserSearchOKBody) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := o.validateData(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (o *UserSearchOKBody) validateData(formats strfmt.Registry) error {
+	if swag.IsZero(o.Data) { // not required
+		return nil
+	}
+
+	for i := 0; i < len(o.Data); i++ {
+		if swag.IsZero(o.Data[i]) { // not required
+			continue
+		}
+
+		if o.Data[i] != nil {
+			if err := o.Data[i].Validate(formats); err != nil {
+				if ve, ok := err.(*errors.Validation); ok {
+					return ve.ValidateName("userSearchOK" + "." + "data" + "." + strconv.Itoa(i))
+				} else if ce, ok := err.(*errors.CompositeError); ok {
+					return ce.ValidateName("userSearchOK" + "." + "data" + "." + strconv.Itoa(i))
+				}
+				return err
+			}
+		}
+
+	}
+
+	return nil
+}
+
+// ContextValidate validate this user search o k body based on the context it is used
+func (o *UserSearchOKBody) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	var res []error
+
+	if err := o.contextValidateData(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (o *UserSearchOKBody) contextValidateData(ctx context.Context, formats strfmt.Registry) error {
+
+	for i := 0; i < len(o.Data); i++ {
+
+		if o.Data[i] != nil {
+
+			if swag.IsZero(o.Data[i]) { // not required
+				return nil
+			}
+
+			if err := o.Data[i].ContextValidate(ctx, formats); err != nil {
+				if ve, ok := err.(*errors.Validation); ok {
+					return ve.ValidateName("userSearchOK" + "." + "data" + "." + strconv.Itoa(i))
+				} else if ce, ok := err.(*errors.CompositeError); ok {
+					return ce.ValidateName("userSearchOK" + "." + "data" + "." + strconv.Itoa(i))
+				}
+				return err
+			}
+		}
+
+	}
+
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (o *UserSearchOKBody) MarshalBinary() ([]byte, error) {
+	if o == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(o)
+}
+
+// UnmarshalBinary interface implementation
+func (o *UserSearchOKBody) UnmarshalBinary(b []byte) error {
+	var res UserSearchOKBody
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*o = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_unblock_user_parameters.go b/bots-common/gitea-generated/client/user/user_unblock_user_parameters.go
new file mode 100644
index 0000000..727bef9
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_unblock_user_parameters.go
@@ -0,0 +1,151 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewUserUnblockUserParams creates a new UserUnblockUserParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewUserUnblockUserParams() *UserUnblockUserParams {
+	return &UserUnblockUserParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewUserUnblockUserParamsWithTimeout creates a new UserUnblockUserParams object
+// with the ability to set a timeout on a request.
+func NewUserUnblockUserParamsWithTimeout(timeout time.Duration) *UserUnblockUserParams {
+	return &UserUnblockUserParams{
+		timeout: timeout,
+	}
+}
+
+// NewUserUnblockUserParamsWithContext creates a new UserUnblockUserParams object
+// with the ability to set a context for a request.
+func NewUserUnblockUserParamsWithContext(ctx context.Context) *UserUnblockUserParams {
+	return &UserUnblockUserParams{
+		Context: ctx,
+	}
+}
+
+// NewUserUnblockUserParamsWithHTTPClient creates a new UserUnblockUserParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewUserUnblockUserParamsWithHTTPClient(client *http.Client) *UserUnblockUserParams {
+	return &UserUnblockUserParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+UserUnblockUserParams contains all the parameters to send to the API endpoint
+
+	for the user unblock user operation.
+
+	Typically these are written to a http.Request.
+*/
+type UserUnblockUserParams struct {
+
+	/* Username.
+
+	   user to unblock
+	*/
+	Username string
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the user unblock user params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserUnblockUserParams) WithDefaults() *UserUnblockUserParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the user unblock user params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserUnblockUserParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the user unblock user params
+func (o *UserUnblockUserParams) WithTimeout(timeout time.Duration) *UserUnblockUserParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the user unblock user params
+func (o *UserUnblockUserParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the user unblock user params
+func (o *UserUnblockUserParams) WithContext(ctx context.Context) *UserUnblockUserParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the user unblock user params
+func (o *UserUnblockUserParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the user unblock user params
+func (o *UserUnblockUserParams) WithHTTPClient(client *http.Client) *UserUnblockUserParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the user unblock user params
+func (o *UserUnblockUserParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithUsername adds the username to the user unblock user params
+func (o *UserUnblockUserParams) WithUsername(username string) *UserUnblockUserParams {
+	o.SetUsername(username)
+	return o
+}
+
+// SetUsername adds the username to the user unblock user params
+func (o *UserUnblockUserParams) SetUsername(username string) {
+	o.Username = username
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *UserUnblockUserParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	// path param username
+	if err := r.SetPathParam("username", o.Username); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_unblock_user_responses.go b/bots-common/gitea-generated/client/user/user_unblock_user_responses.go
new file mode 100644
index 0000000..2c0ccc4
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_unblock_user_responses.go
@@ -0,0 +1,228 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// UserUnblockUserReader is a Reader for the UserUnblockUser structure.
+type UserUnblockUserReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *UserUnblockUserReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewUserUnblockUserNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewUserUnblockUserNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 422:
+		result := NewUserUnblockUserUnprocessableEntity()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[DELETE /user/blocks/{username}] userUnblockUser", response, response.Code())
+	}
+}
+
+// NewUserUnblockUserNoContent creates a UserUnblockUserNoContent with default headers values
+func NewUserUnblockUserNoContent() *UserUnblockUserNoContent {
+	return &UserUnblockUserNoContent{}
+}
+
+/*
+UserUnblockUserNoContent describes a response with status code 204, with default header values.
+
+APIEmpty is an empty response
+*/
+type UserUnblockUserNoContent struct {
+}
+
+// IsSuccess returns true when this user unblock user no content response has a 2xx status code
+func (o *UserUnblockUserNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this user unblock user no content response has a 3xx status code
+func (o *UserUnblockUserNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user unblock user no content response has a 4xx status code
+func (o *UserUnblockUserNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this user unblock user no content response has a 5xx status code
+func (o *UserUnblockUserNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user unblock user no content response a status code equal to that given
+func (o *UserUnblockUserNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the user unblock user no content response
+func (o *UserUnblockUserNoContent) Code() int {
+	return 204
+}
+
+func (o *UserUnblockUserNoContent) Error() string {
+	return fmt.Sprintf("[DELETE /user/blocks/{username}][%d] userUnblockUserNoContent", 204)
+}
+
+func (o *UserUnblockUserNoContent) String() string {
+	return fmt.Sprintf("[DELETE /user/blocks/{username}][%d] userUnblockUserNoContent", 204)
+}
+
+func (o *UserUnblockUserNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewUserUnblockUserNotFound creates a UserUnblockUserNotFound with default headers values
+func NewUserUnblockUserNotFound() *UserUnblockUserNotFound {
+	return &UserUnblockUserNotFound{}
+}
+
+/*
+UserUnblockUserNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type UserUnblockUserNotFound struct {
+}
+
+// IsSuccess returns true when this user unblock user not found response has a 2xx status code
+func (o *UserUnblockUserNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this user unblock user not found response has a 3xx status code
+func (o *UserUnblockUserNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user unblock user not found response has a 4xx status code
+func (o *UserUnblockUserNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this user unblock user not found response has a 5xx status code
+func (o *UserUnblockUserNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user unblock user not found response a status code equal to that given
+func (o *UserUnblockUserNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the user unblock user not found response
+func (o *UserUnblockUserNotFound) Code() int {
+	return 404
+}
+
+func (o *UserUnblockUserNotFound) Error() string {
+	return fmt.Sprintf("[DELETE /user/blocks/{username}][%d] userUnblockUserNotFound", 404)
+}
+
+func (o *UserUnblockUserNotFound) String() string {
+	return fmt.Sprintf("[DELETE /user/blocks/{username}][%d] userUnblockUserNotFound", 404)
+}
+
+func (o *UserUnblockUserNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewUserUnblockUserUnprocessableEntity creates a UserUnblockUserUnprocessableEntity with default headers values
+func NewUserUnblockUserUnprocessableEntity() *UserUnblockUserUnprocessableEntity {
+	return &UserUnblockUserUnprocessableEntity{}
+}
+
+/*
+UserUnblockUserUnprocessableEntity describes a response with status code 422, with default header values.
+
+APIValidationError is error format response related to input validation
+*/
+type UserUnblockUserUnprocessableEntity struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this user unblock user unprocessable entity response has a 2xx status code
+func (o *UserUnblockUserUnprocessableEntity) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this user unblock user unprocessable entity response has a 3xx status code
+func (o *UserUnblockUserUnprocessableEntity) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user unblock user unprocessable entity response has a 4xx status code
+func (o *UserUnblockUserUnprocessableEntity) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this user unblock user unprocessable entity response has a 5xx status code
+func (o *UserUnblockUserUnprocessableEntity) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user unblock user unprocessable entity response a status code equal to that given
+func (o *UserUnblockUserUnprocessableEntity) IsCode(code int) bool {
+	return code == 422
+}
+
+// Code gets the status code for the user unblock user unprocessable entity response
+func (o *UserUnblockUserUnprocessableEntity) Code() int {
+	return 422
+}
+
+func (o *UserUnblockUserUnprocessableEntity) Error() string {
+	return fmt.Sprintf("[DELETE /user/blocks/{username}][%d] userUnblockUserUnprocessableEntity", 422)
+}
+
+func (o *UserUnblockUserUnprocessableEntity) String() string {
+	return fmt.Sprintf("[DELETE /user/blocks/{username}][%d] userUnblockUserUnprocessableEntity", 422)
+}
+
+func (o *UserUnblockUserUnprocessableEntity) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_update_avatar_parameters.go b/bots-common/gitea-generated/client/user/user_update_avatar_parameters.go
new file mode 100644
index 0000000..c37c5f5
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_update_avatar_parameters.go
@@ -0,0 +1,150 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewUserUpdateAvatarParams creates a new UserUpdateAvatarParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewUserUpdateAvatarParams() *UserUpdateAvatarParams {
+	return &UserUpdateAvatarParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewUserUpdateAvatarParamsWithTimeout creates a new UserUpdateAvatarParams object
+// with the ability to set a timeout on a request.
+func NewUserUpdateAvatarParamsWithTimeout(timeout time.Duration) *UserUpdateAvatarParams {
+	return &UserUpdateAvatarParams{
+		timeout: timeout,
+	}
+}
+
+// NewUserUpdateAvatarParamsWithContext creates a new UserUpdateAvatarParams object
+// with the ability to set a context for a request.
+func NewUserUpdateAvatarParamsWithContext(ctx context.Context) *UserUpdateAvatarParams {
+	return &UserUpdateAvatarParams{
+		Context: ctx,
+	}
+}
+
+// NewUserUpdateAvatarParamsWithHTTPClient creates a new UserUpdateAvatarParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewUserUpdateAvatarParamsWithHTTPClient(client *http.Client) *UserUpdateAvatarParams {
+	return &UserUpdateAvatarParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+UserUpdateAvatarParams contains all the parameters to send to the API endpoint
+
+	for the user update avatar operation.
+
+	Typically these are written to a http.Request.
+*/
+type UserUpdateAvatarParams struct {
+
+	// Body.
+	Body *models.UpdateUserAvatarOption
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the user update avatar params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserUpdateAvatarParams) WithDefaults() *UserUpdateAvatarParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the user update avatar params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserUpdateAvatarParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the user update avatar params
+func (o *UserUpdateAvatarParams) WithTimeout(timeout time.Duration) *UserUpdateAvatarParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the user update avatar params
+func (o *UserUpdateAvatarParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the user update avatar params
+func (o *UserUpdateAvatarParams) WithContext(ctx context.Context) *UserUpdateAvatarParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the user update avatar params
+func (o *UserUpdateAvatarParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the user update avatar params
+func (o *UserUpdateAvatarParams) WithHTTPClient(client *http.Client) *UserUpdateAvatarParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the user update avatar params
+func (o *UserUpdateAvatarParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the user update avatar params
+func (o *UserUpdateAvatarParams) WithBody(body *models.UpdateUserAvatarOption) *UserUpdateAvatarParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the user update avatar params
+func (o *UserUpdateAvatarParams) SetBody(body *models.UpdateUserAvatarOption) {
+	o.Body = body
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *UserUpdateAvatarParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_update_avatar_responses.go b/bots-common/gitea-generated/client/user/user_update_avatar_responses.go
new file mode 100644
index 0000000..dd1b10d
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_update_avatar_responses.go
@@ -0,0 +1,88 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"fmt"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+)
+
+// UserUpdateAvatarReader is a Reader for the UserUpdateAvatar structure.
+type UserUpdateAvatarReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *UserUpdateAvatarReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 204:
+		result := NewUserUpdateAvatarNoContent()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	default:
+		return nil, runtime.NewAPIError("[POST /user/avatar] userUpdateAvatar", response, response.Code())
+	}
+}
+
+// NewUserUpdateAvatarNoContent creates a UserUpdateAvatarNoContent with default headers values
+func NewUserUpdateAvatarNoContent() *UserUpdateAvatarNoContent {
+	return &UserUpdateAvatarNoContent{}
+}
+
+/*
+UserUpdateAvatarNoContent describes a response with status code 204, with default header values.
+
+APIEmpty is an empty response
+*/
+type UserUpdateAvatarNoContent struct {
+}
+
+// IsSuccess returns true when this user update avatar no content response has a 2xx status code
+func (o *UserUpdateAvatarNoContent) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this user update avatar no content response has a 3xx status code
+func (o *UserUpdateAvatarNoContent) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user update avatar no content response has a 4xx status code
+func (o *UserUpdateAvatarNoContent) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this user update avatar no content response has a 5xx status code
+func (o *UserUpdateAvatarNoContent) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user update avatar no content response a status code equal to that given
+func (o *UserUpdateAvatarNoContent) IsCode(code int) bool {
+	return code == 204
+}
+
+// Code gets the status code for the user update avatar no content response
+func (o *UserUpdateAvatarNoContent) Code() int {
+	return 204
+}
+
+func (o *UserUpdateAvatarNoContent) Error() string {
+	return fmt.Sprintf("[POST /user/avatar][%d] userUpdateAvatarNoContent", 204)
+}
+
+func (o *UserUpdateAvatarNoContent) String() string {
+	return fmt.Sprintf("[POST /user/avatar][%d] userUpdateAvatarNoContent", 204)
+}
+
+func (o *UserUpdateAvatarNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_update_o_auth2_application_parameters.go b/bots-common/gitea-generated/client/user/user_update_o_auth2_application_parameters.go
new file mode 100644
index 0000000..e391a5f
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_update_o_auth2_application_parameters.go
@@ -0,0 +1,175 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// NewUserUpdateOAuth2ApplicationParams creates a new UserUpdateOAuth2ApplicationParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewUserUpdateOAuth2ApplicationParams() *UserUpdateOAuth2ApplicationParams {
+	return &UserUpdateOAuth2ApplicationParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewUserUpdateOAuth2ApplicationParamsWithTimeout creates a new UserUpdateOAuth2ApplicationParams object
+// with the ability to set a timeout on a request.
+func NewUserUpdateOAuth2ApplicationParamsWithTimeout(timeout time.Duration) *UserUpdateOAuth2ApplicationParams {
+	return &UserUpdateOAuth2ApplicationParams{
+		timeout: timeout,
+	}
+}
+
+// NewUserUpdateOAuth2ApplicationParamsWithContext creates a new UserUpdateOAuth2ApplicationParams object
+// with the ability to set a context for a request.
+func NewUserUpdateOAuth2ApplicationParamsWithContext(ctx context.Context) *UserUpdateOAuth2ApplicationParams {
+	return &UserUpdateOAuth2ApplicationParams{
+		Context: ctx,
+	}
+}
+
+// NewUserUpdateOAuth2ApplicationParamsWithHTTPClient creates a new UserUpdateOAuth2ApplicationParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewUserUpdateOAuth2ApplicationParamsWithHTTPClient(client *http.Client) *UserUpdateOAuth2ApplicationParams {
+	return &UserUpdateOAuth2ApplicationParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+UserUpdateOAuth2ApplicationParams contains all the parameters to send to the API endpoint
+
+	for the user update o auth2 application operation.
+
+	Typically these are written to a http.Request.
+*/
+type UserUpdateOAuth2ApplicationParams struct {
+
+	// Body.
+	Body *models.CreateOAuth2ApplicationOptions
+
+	/* ID.
+
+	   application to be updated
+
+	   Format: int64
+	*/
+	ID int64
+
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the user update o auth2 application params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserUpdateOAuth2ApplicationParams) WithDefaults() *UserUpdateOAuth2ApplicationParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the user update o auth2 application params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserUpdateOAuth2ApplicationParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the user update o auth2 application params
+func (o *UserUpdateOAuth2ApplicationParams) WithTimeout(timeout time.Duration) *UserUpdateOAuth2ApplicationParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the user update o auth2 application params
+func (o *UserUpdateOAuth2ApplicationParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the user update o auth2 application params
+func (o *UserUpdateOAuth2ApplicationParams) WithContext(ctx context.Context) *UserUpdateOAuth2ApplicationParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the user update o auth2 application params
+func (o *UserUpdateOAuth2ApplicationParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the user update o auth2 application params
+func (o *UserUpdateOAuth2ApplicationParams) WithHTTPClient(client *http.Client) *UserUpdateOAuth2ApplicationParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the user update o auth2 application params
+func (o *UserUpdateOAuth2ApplicationParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WithBody adds the body to the user update o auth2 application params
+func (o *UserUpdateOAuth2ApplicationParams) WithBody(body *models.CreateOAuth2ApplicationOptions) *UserUpdateOAuth2ApplicationParams {
+	o.SetBody(body)
+	return o
+}
+
+// SetBody adds the body to the user update o auth2 application params
+func (o *UserUpdateOAuth2ApplicationParams) SetBody(body *models.CreateOAuth2ApplicationOptions) {
+	o.Body = body
+}
+
+// WithID adds the id to the user update o auth2 application params
+func (o *UserUpdateOAuth2ApplicationParams) WithID(id int64) *UserUpdateOAuth2ApplicationParams {
+	o.SetID(id)
+	return o
+}
+
+// SetID adds the id to the user update o auth2 application params
+func (o *UserUpdateOAuth2ApplicationParams) SetID(id int64) {
+	o.ID = id
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *UserUpdateOAuth2ApplicationParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+	if o.Body != nil {
+		if err := r.SetBodyParam(o.Body); err != nil {
+			return err
+		}
+	}
+
+	// path param id
+	if err := r.SetPathParam("id", swag.FormatInt64(o.ID)); err != nil {
+		return err
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_update_o_auth2_application_responses.go b/bots-common/gitea-generated/client/user/user_update_o_auth2_application_responses.go
new file mode 100644
index 0000000..6f7b414
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_update_o_auth2_application_responses.go
@@ -0,0 +1,168 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// UserUpdateOAuth2ApplicationReader is a Reader for the UserUpdateOAuth2Application structure.
+type UserUpdateOAuth2ApplicationReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *UserUpdateOAuth2ApplicationReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 200:
+		result := NewUserUpdateOAuth2ApplicationOK()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewUserUpdateOAuth2ApplicationNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[PATCH /user/applications/oauth2/{id}] userUpdateOAuth2Application", response, response.Code())
+	}
+}
+
+// NewUserUpdateOAuth2ApplicationOK creates a UserUpdateOAuth2ApplicationOK with default headers values
+func NewUserUpdateOAuth2ApplicationOK() *UserUpdateOAuth2ApplicationOK {
+	return &UserUpdateOAuth2ApplicationOK{}
+}
+
+/*
+UserUpdateOAuth2ApplicationOK describes a response with status code 200, with default header values.
+
+OAuth2Application
+*/
+type UserUpdateOAuth2ApplicationOK struct {
+	Payload *models.OAuth2Application
+}
+
+// IsSuccess returns true when this user update o auth2 application o k response has a 2xx status code
+func (o *UserUpdateOAuth2ApplicationOK) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this user update o auth2 application o k response has a 3xx status code
+func (o *UserUpdateOAuth2ApplicationOK) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user update o auth2 application o k response has a 4xx status code
+func (o *UserUpdateOAuth2ApplicationOK) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this user update o auth2 application o k response has a 5xx status code
+func (o *UserUpdateOAuth2ApplicationOK) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user update o auth2 application o k response a status code equal to that given
+func (o *UserUpdateOAuth2ApplicationOK) IsCode(code int) bool {
+	return code == 200
+}
+
+// Code gets the status code for the user update o auth2 application o k response
+func (o *UserUpdateOAuth2ApplicationOK) Code() int {
+	return 200
+}
+
+func (o *UserUpdateOAuth2ApplicationOK) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[PATCH /user/applications/oauth2/{id}][%d] userUpdateOAuth2ApplicationOK %s", 200, payload)
+}
+
+func (o *UserUpdateOAuth2ApplicationOK) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[PATCH /user/applications/oauth2/{id}][%d] userUpdateOAuth2ApplicationOK %s", 200, payload)
+}
+
+func (o *UserUpdateOAuth2ApplicationOK) GetPayload() *models.OAuth2Application {
+	return o.Payload
+}
+
+func (o *UserUpdateOAuth2ApplicationOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.OAuth2Application)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewUserUpdateOAuth2ApplicationNotFound creates a UserUpdateOAuth2ApplicationNotFound with default headers values
+func NewUserUpdateOAuth2ApplicationNotFound() *UserUpdateOAuth2ApplicationNotFound {
+	return &UserUpdateOAuth2ApplicationNotFound{}
+}
+
+/*
+UserUpdateOAuth2ApplicationNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type UserUpdateOAuth2ApplicationNotFound struct {
+}
+
+// IsSuccess returns true when this user update o auth2 application not found response has a 2xx status code
+func (o *UserUpdateOAuth2ApplicationNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this user update o auth2 application not found response has a 3xx status code
+func (o *UserUpdateOAuth2ApplicationNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user update o auth2 application not found response has a 4xx status code
+func (o *UserUpdateOAuth2ApplicationNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this user update o auth2 application not found response has a 5xx status code
+func (o *UserUpdateOAuth2ApplicationNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user update o auth2 application not found response a status code equal to that given
+func (o *UserUpdateOAuth2ApplicationNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the user update o auth2 application not found response
+func (o *UserUpdateOAuth2ApplicationNotFound) Code() int {
+	return 404
+}
+
+func (o *UserUpdateOAuth2ApplicationNotFound) Error() string {
+	return fmt.Sprintf("[PATCH /user/applications/oauth2/{id}][%d] userUpdateOAuth2ApplicationNotFound", 404)
+}
+
+func (o *UserUpdateOAuth2ApplicationNotFound) String() string {
+	return fmt.Sprintf("[PATCH /user/applications/oauth2/{id}][%d] userUpdateOAuth2ApplicationNotFound", 404)
+}
+
+func (o *UserUpdateOAuth2ApplicationNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_verify_g_p_g_key_parameters.go b/bots-common/gitea-generated/client/user/user_verify_g_p_g_key_parameters.go
new file mode 100644
index 0000000..5ac1196
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_verify_g_p_g_key_parameters.go
@@ -0,0 +1,128 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"net/http"
+	"time"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/runtime"
+	cr "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+)
+
+// NewUserVerifyGPGKeyParams creates a new UserVerifyGPGKeyParams object,
+// with the default timeout for this client.
+//
+// Default values are not hydrated, since defaults are normally applied by the API server side.
+//
+// To enforce default values in parameter, use SetDefaults or WithDefaults.
+func NewUserVerifyGPGKeyParams() *UserVerifyGPGKeyParams {
+	return &UserVerifyGPGKeyParams{
+		timeout: cr.DefaultTimeout,
+	}
+}
+
+// NewUserVerifyGPGKeyParamsWithTimeout creates a new UserVerifyGPGKeyParams object
+// with the ability to set a timeout on a request.
+func NewUserVerifyGPGKeyParamsWithTimeout(timeout time.Duration) *UserVerifyGPGKeyParams {
+	return &UserVerifyGPGKeyParams{
+		timeout: timeout,
+	}
+}
+
+// NewUserVerifyGPGKeyParamsWithContext creates a new UserVerifyGPGKeyParams object
+// with the ability to set a context for a request.
+func NewUserVerifyGPGKeyParamsWithContext(ctx context.Context) *UserVerifyGPGKeyParams {
+	return &UserVerifyGPGKeyParams{
+		Context: ctx,
+	}
+}
+
+// NewUserVerifyGPGKeyParamsWithHTTPClient creates a new UserVerifyGPGKeyParams object
+// with the ability to set a custom HTTPClient for a request.
+func NewUserVerifyGPGKeyParamsWithHTTPClient(client *http.Client) *UserVerifyGPGKeyParams {
+	return &UserVerifyGPGKeyParams{
+		HTTPClient: client,
+	}
+}
+
+/*
+UserVerifyGPGKeyParams contains all the parameters to send to the API endpoint
+
+	for the user verify g p g key operation.
+
+	Typically these are written to a http.Request.
+*/
+type UserVerifyGPGKeyParams struct {
+	timeout    time.Duration
+	Context    context.Context
+	HTTPClient *http.Client
+}
+
+// WithDefaults hydrates default values in the user verify g p g key params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserVerifyGPGKeyParams) WithDefaults() *UserVerifyGPGKeyParams {
+	o.SetDefaults()
+	return o
+}
+
+// SetDefaults hydrates default values in the user verify g p g key params (not the query body).
+//
+// All values with no default are reset to their zero value.
+func (o *UserVerifyGPGKeyParams) SetDefaults() {
+	// no default values defined for this parameter
+}
+
+// WithTimeout adds the timeout to the user verify g p g key params
+func (o *UserVerifyGPGKeyParams) WithTimeout(timeout time.Duration) *UserVerifyGPGKeyParams {
+	o.SetTimeout(timeout)
+	return o
+}
+
+// SetTimeout adds the timeout to the user verify g p g key params
+func (o *UserVerifyGPGKeyParams) SetTimeout(timeout time.Duration) {
+	o.timeout = timeout
+}
+
+// WithContext adds the context to the user verify g p g key params
+func (o *UserVerifyGPGKeyParams) WithContext(ctx context.Context) *UserVerifyGPGKeyParams {
+	o.SetContext(ctx)
+	return o
+}
+
+// SetContext adds the context to the user verify g p g key params
+func (o *UserVerifyGPGKeyParams) SetContext(ctx context.Context) {
+	o.Context = ctx
+}
+
+// WithHTTPClient adds the HTTPClient to the user verify g p g key params
+func (o *UserVerifyGPGKeyParams) WithHTTPClient(client *http.Client) *UserVerifyGPGKeyParams {
+	o.SetHTTPClient(client)
+	return o
+}
+
+// SetHTTPClient adds the HTTPClient to the user verify g p g key params
+func (o *UserVerifyGPGKeyParams) SetHTTPClient(client *http.Client) {
+	o.HTTPClient = client
+}
+
+// WriteToRequest writes these params to a swagger request
+func (o *UserVerifyGPGKeyParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
+
+	if err := r.SetTimeout(o.timeout); err != nil {
+		return err
+	}
+	var res []error
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
diff --git a/bots-common/gitea-generated/client/user/user_verify_g_p_g_key_responses.go b/bots-common/gitea-generated/client/user/user_verify_g_p_g_key_responses.go
new file mode 100644
index 0000000..a6a4cd4
--- /dev/null
+++ b/bots-common/gitea-generated/client/user/user_verify_g_p_g_key_responses.go
@@ -0,0 +1,246 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package user
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/go-openapi/runtime"
+	"github.com/go-openapi/strfmt"
+
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+// UserVerifyGPGKeyReader is a Reader for the UserVerifyGPGKey structure.
+type UserVerifyGPGKeyReader struct {
+	formats strfmt.Registry
+}
+
+// ReadResponse reads a server response into the received o.
+func (o *UserVerifyGPGKeyReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
+	switch response.Code() {
+	case 201:
+		result := NewUserVerifyGPGKeyCreated()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return result, nil
+	case 404:
+		result := NewUserVerifyGPGKeyNotFound()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	case 422:
+		result := NewUserVerifyGPGKeyUnprocessableEntity()
+		if err := result.readResponse(response, consumer, o.formats); err != nil {
+			return nil, err
+		}
+		return nil, result
+	default:
+		return nil, runtime.NewAPIError("[POST /user/gpg_key_verify] userVerifyGPGKey", response, response.Code())
+	}
+}
+
+// NewUserVerifyGPGKeyCreated creates a UserVerifyGPGKeyCreated with default headers values
+func NewUserVerifyGPGKeyCreated() *UserVerifyGPGKeyCreated {
+	return &UserVerifyGPGKeyCreated{}
+}
+
+/*
+UserVerifyGPGKeyCreated describes a response with status code 201, with default header values.
+
+GPGKey
+*/
+type UserVerifyGPGKeyCreated struct {
+	Payload *models.GPGKey
+}
+
+// IsSuccess returns true when this user verify g p g key created response has a 2xx status code
+func (o *UserVerifyGPGKeyCreated) IsSuccess() bool {
+	return true
+}
+
+// IsRedirect returns true when this user verify g p g key created response has a 3xx status code
+func (o *UserVerifyGPGKeyCreated) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user verify g p g key created response has a 4xx status code
+func (o *UserVerifyGPGKeyCreated) IsClientError() bool {
+	return false
+}
+
+// IsServerError returns true when this user verify g p g key created response has a 5xx status code
+func (o *UserVerifyGPGKeyCreated) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user verify g p g key created response a status code equal to that given
+func (o *UserVerifyGPGKeyCreated) IsCode(code int) bool {
+	return code == 201
+}
+
+// Code gets the status code for the user verify g p g key created response
+func (o *UserVerifyGPGKeyCreated) Code() int {
+	return 201
+}
+
+func (o *UserVerifyGPGKeyCreated) Error() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /user/gpg_key_verify][%d] userVerifyGPGKeyCreated %s", 201, payload)
+}
+
+func (o *UserVerifyGPGKeyCreated) String() string {
+	payload, _ := json.Marshal(o.Payload)
+	return fmt.Sprintf("[POST /user/gpg_key_verify][%d] userVerifyGPGKeyCreated %s", 201, payload)
+}
+
+func (o *UserVerifyGPGKeyCreated) GetPayload() *models.GPGKey {
+	return o.Payload
+}
+
+func (o *UserVerifyGPGKeyCreated) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	o.Payload = new(models.GPGKey)
+
+	// response payload
+	if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
+		return err
+	}
+
+	return nil
+}
+
+// NewUserVerifyGPGKeyNotFound creates a UserVerifyGPGKeyNotFound with default headers values
+func NewUserVerifyGPGKeyNotFound() *UserVerifyGPGKeyNotFound {
+	return &UserVerifyGPGKeyNotFound{}
+}
+
+/*
+UserVerifyGPGKeyNotFound describes a response with status code 404, with default header values.
+
+APINotFound is a not found empty response
+*/
+type UserVerifyGPGKeyNotFound struct {
+}
+
+// IsSuccess returns true when this user verify g p g key not found response has a 2xx status code
+func (o *UserVerifyGPGKeyNotFound) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this user verify g p g key not found response has a 3xx status code
+func (o *UserVerifyGPGKeyNotFound) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user verify g p g key not found response has a 4xx status code
+func (o *UserVerifyGPGKeyNotFound) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this user verify g p g key not found response has a 5xx status code
+func (o *UserVerifyGPGKeyNotFound) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user verify g p g key not found response a status code equal to that given
+func (o *UserVerifyGPGKeyNotFound) IsCode(code int) bool {
+	return code == 404
+}
+
+// Code gets the status code for the user verify g p g key not found response
+func (o *UserVerifyGPGKeyNotFound) Code() int {
+	return 404
+}
+
+func (o *UserVerifyGPGKeyNotFound) Error() string {
+	return fmt.Sprintf("[POST /user/gpg_key_verify][%d] userVerifyGPGKeyNotFound", 404)
+}
+
+func (o *UserVerifyGPGKeyNotFound) String() string {
+	return fmt.Sprintf("[POST /user/gpg_key_verify][%d] userVerifyGPGKeyNotFound", 404)
+}
+
+func (o *UserVerifyGPGKeyNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	return nil
+}
+
+// NewUserVerifyGPGKeyUnprocessableEntity creates a UserVerifyGPGKeyUnprocessableEntity with default headers values
+func NewUserVerifyGPGKeyUnprocessableEntity() *UserVerifyGPGKeyUnprocessableEntity {
+	return &UserVerifyGPGKeyUnprocessableEntity{}
+}
+
+/*
+UserVerifyGPGKeyUnprocessableEntity describes a response with status code 422, with default header values.
+
+APIValidationError is error format response related to input validation
+*/
+type UserVerifyGPGKeyUnprocessableEntity struct {
+	Message string
+	URL     string
+}
+
+// IsSuccess returns true when this user verify g p g key unprocessable entity response has a 2xx status code
+func (o *UserVerifyGPGKeyUnprocessableEntity) IsSuccess() bool {
+	return false
+}
+
+// IsRedirect returns true when this user verify g p g key unprocessable entity response has a 3xx status code
+func (o *UserVerifyGPGKeyUnprocessableEntity) IsRedirect() bool {
+	return false
+}
+
+// IsClientError returns true when this user verify g p g key unprocessable entity response has a 4xx status code
+func (o *UserVerifyGPGKeyUnprocessableEntity) IsClientError() bool {
+	return true
+}
+
+// IsServerError returns true when this user verify g p g key unprocessable entity response has a 5xx status code
+func (o *UserVerifyGPGKeyUnprocessableEntity) IsServerError() bool {
+	return false
+}
+
+// IsCode returns true when this user verify g p g key unprocessable entity response a status code equal to that given
+func (o *UserVerifyGPGKeyUnprocessableEntity) IsCode(code int) bool {
+	return code == 422
+}
+
+// Code gets the status code for the user verify g p g key unprocessable entity response
+func (o *UserVerifyGPGKeyUnprocessableEntity) Code() int {
+	return 422
+}
+
+func (o *UserVerifyGPGKeyUnprocessableEntity) Error() string {
+	return fmt.Sprintf("[POST /user/gpg_key_verify][%d] userVerifyGPGKeyUnprocessableEntity", 422)
+}
+
+func (o *UserVerifyGPGKeyUnprocessableEntity) String() string {
+	return fmt.Sprintf("[POST /user/gpg_key_verify][%d] userVerifyGPGKeyUnprocessableEntity", 422)
+}
+
+func (o *UserVerifyGPGKeyUnprocessableEntity) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
+
+	// hydrates response header message
+	hdrMessage := response.GetHeader("message")
+
+	if hdrMessage != "" {
+		o.Message = hdrMessage
+	}
+
+	// hydrates response header url
+	hdrURL := response.GetHeader("url")
+
+	if hdrURL != "" {
+		o.URL = hdrURL
+	}
+
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/access_token.go b/bots-common/gitea-generated/models/access_token.go
new file mode 100644
index 0000000..f73b7cb
--- /dev/null
+++ b/bots-common/gitea-generated/models/access_token.go
@@ -0,0 +1,62 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// AccessToken AccessToken represents an API access token.
+//
+// swagger:model AccessToken
+type AccessToken struct {
+
+	// ID
+	ID int64 `json:"id,omitempty"`
+
+	// name
+	Name string `json:"name,omitempty"`
+
+	// scopes
+	Scopes []string `json:"scopes"`
+
+	// token
+	Token string `json:"sha1,omitempty"`
+
+	// token last eight
+	TokenLastEight string `json:"token_last_eight,omitempty"`
+}
+
+// Validate validates this access token
+func (m *AccessToken) Validate(formats strfmt.Registry) error {
+	return nil
+}
+
+// ContextValidate validates this access token based on context it is used
+func (m *AccessToken) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *AccessToken) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *AccessToken) UnmarshalBinary(b []byte) error {
+	var res AccessToken
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/action_variable.go b/bots-common/gitea-generated/models/action_variable.go
new file mode 100644
index 0000000..4368c70
--- /dev/null
+++ b/bots-common/gitea-generated/models/action_variable.go
@@ -0,0 +1,59 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// ActionVariable ActionVariable return value of the query API
+//
+// swagger:model ActionVariable
+type ActionVariable struct {
+
+	// the value of the variable
+	Data string `json:"data,omitempty"`
+
+	// the name of the variable
+	Name string `json:"name,omitempty"`
+
+	// the owner to which the variable belongs
+	OwnerID int64 `json:"owner_id,omitempty"`
+
+	// the repository to which the variable belongs
+	RepoID int64 `json:"repo_id,omitempty"`
+}
+
+// Validate validates this action variable
+func (m *ActionVariable) Validate(formats strfmt.Registry) error {
+	return nil
+}
+
+// ContextValidate validates this action variable based on context it is used
+func (m *ActionVariable) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *ActionVariable) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *ActionVariable) UnmarshalBinary(b []byte) error {
+	var res ActionVariable
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/activity.go b/bots-common/gitea-generated/models/activity.go
new file mode 100644
index 0000000..dccc62c
--- /dev/null
+++ b/bots-common/gitea-generated/models/activity.go
@@ -0,0 +1,259 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+	"github.com/go-openapi/validate"
+)
+
+// Activity activity
+//
+// swagger:model Activity
+type Activity struct {
+
+	// act user ID
+	ActUserID int64 `json:"act_user_id,omitempty"`
+
+	// comment ID
+	CommentID int64 `json:"comment_id,omitempty"`
+
+	// content
+	Content string `json:"content,omitempty"`
+
+	// created
+	// Format: date-time
+	Created strfmt.DateTime `json:"created,omitempty"`
+
+	// ID
+	ID int64 `json:"id,omitempty"`
+
+	// is private
+	IsPrivate bool `json:"is_private,omitempty"`
+
+	// op type
+	OpType string `json:"op_type,omitempty"`
+
+	// ref name
+	RefName string `json:"ref_name,omitempty"`
+
+	// repo ID
+	RepoID int64 `json:"repo_id,omitempty"`
+
+	// user ID
+	UserID int64 `json:"user_id,omitempty"`
+
+	// act user
+	ActUser *User `json:"act_user,omitempty"`
+
+	// comment
+	Comment *Comment `json:"comment,omitempty"`
+
+	// repo
+	Repo *Repository `json:"repo,omitempty"`
+}
+
+// Validate validates this activity
+func (m *Activity) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateCreated(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateActUser(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateComment(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateRepo(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *Activity) validateCreated(formats strfmt.Registry) error {
+	if swag.IsZero(m.Created) { // not required
+		return nil
+	}
+
+	if err := validate.FormatOf("created", "body", "date-time", m.Created.String(), formats); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (m *Activity) validateActUser(formats strfmt.Registry) error {
+	if swag.IsZero(m.ActUser) { // not required
+		return nil
+	}
+
+	if m.ActUser != nil {
+		if err := m.ActUser.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("act_user")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("act_user")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *Activity) validateComment(formats strfmt.Registry) error {
+	if swag.IsZero(m.Comment) { // not required
+		return nil
+	}
+
+	if m.Comment != nil {
+		if err := m.Comment.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("comment")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("comment")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *Activity) validateRepo(formats strfmt.Registry) error {
+	if swag.IsZero(m.Repo) { // not required
+		return nil
+	}
+
+	if m.Repo != nil {
+		if err := m.Repo.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("repo")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("repo")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+// ContextValidate validate this activity based on the context it is used
+func (m *Activity) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.contextValidateActUser(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.contextValidateComment(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.contextValidateRepo(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *Activity) contextValidateActUser(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.ActUser != nil {
+
+		if swag.IsZero(m.ActUser) { // not required
+			return nil
+		}
+
+		if err := m.ActUser.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("act_user")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("act_user")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *Activity) contextValidateComment(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.Comment != nil {
+
+		if swag.IsZero(m.Comment) { // not required
+			return nil
+		}
+
+		if err := m.Comment.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("comment")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("comment")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *Activity) contextValidateRepo(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.Repo != nil {
+
+		if swag.IsZero(m.Repo) { // not required
+			return nil
+		}
+
+		if err := m.Repo.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("repo")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("repo")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *Activity) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *Activity) UnmarshalBinary(b []byte) error {
+	var res Activity
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/activity_pub.go b/bots-common/gitea-generated/models/activity_pub.go
new file mode 100644
index 0000000..fa23ac8
--- /dev/null
+++ b/bots-common/gitea-generated/models/activity_pub.go
@@ -0,0 +1,50 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// ActivityPub ActivityPub type
+//
+// swagger:model ActivityPub
+type ActivityPub struct {
+
+	// context
+	Context string `json:"@context,omitempty"`
+}
+
+// Validate validates this activity pub
+func (m *ActivityPub) Validate(formats strfmt.Registry) error {
+	return nil
+}
+
+// ContextValidate validates this activity pub based on context it is used
+func (m *ActivityPub) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *ActivityPub) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *ActivityPub) UnmarshalBinary(b []byte) error {
+	var res ActivityPub
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/add_collaborator_option.go b/bots-common/gitea-generated/models/add_collaborator_option.go
new file mode 100644
index 0000000..8680b0f
--- /dev/null
+++ b/bots-common/gitea-generated/models/add_collaborator_option.go
@@ -0,0 +1,50 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// AddCollaboratorOption AddCollaboratorOption options when adding a user as a collaborator of a repository
+//
+// swagger:model AddCollaboratorOption
+type AddCollaboratorOption struct {
+
+	// permission
+	Permission string `json:"permission,omitempty"`
+}
+
+// Validate validates this add collaborator option
+func (m *AddCollaboratorOption) Validate(formats strfmt.Registry) error {
+	return nil
+}
+
+// ContextValidate validates this add collaborator option based on context it is used
+func (m *AddCollaboratorOption) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *AddCollaboratorOption) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *AddCollaboratorOption) UnmarshalBinary(b []byte) error {
+	var res AddCollaboratorOption
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/add_time_option.go b/bots-common/gitea-generated/models/add_time_option.go
new file mode 100644
index 0000000..c2248e1
--- /dev/null
+++ b/bots-common/gitea-generated/models/add_time_option.go
@@ -0,0 +1,94 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+	"github.com/go-openapi/validate"
+)
+
+// AddTimeOption AddTimeOption options for adding time to an issue
+//
+// swagger:model AddTimeOption
+type AddTimeOption struct {
+
+	// created
+	// Format: date-time
+	Created strfmt.DateTime `json:"created,omitempty"`
+
+	// time in seconds
+	// Required: true
+	Time *int64 `json:"time"`
+
+	// User who spent the time (optional)
+	User string `json:"user_name,omitempty"`
+}
+
+// Validate validates this add time option
+func (m *AddTimeOption) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateCreated(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateTime(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *AddTimeOption) validateCreated(formats strfmt.Registry) error {
+	if swag.IsZero(m.Created) { // not required
+		return nil
+	}
+
+	if err := validate.FormatOf("created", "body", "date-time", m.Created.String(), formats); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (m *AddTimeOption) validateTime(formats strfmt.Registry) error {
+
+	if err := validate.Required("time", "body", m.Time); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+// ContextValidate validates this add time option based on context it is used
+func (m *AddTimeOption) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *AddTimeOption) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *AddTimeOption) UnmarshalBinary(b []byte) error {
+	var res AddTimeOption
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/annotated_tag.go b/bots-common/gitea-generated/models/annotated_tag.go
new file mode 100644
index 0000000..a95ea36
--- /dev/null
+++ b/bots-common/gitea-generated/models/annotated_tag.go
@@ -0,0 +1,223 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// AnnotatedTag AnnotatedTag represents an annotated tag
+//
+// swagger:model AnnotatedTag
+type AnnotatedTag struct {
+
+	// message
+	Message string `json:"message,omitempty"`
+
+	// s h a
+	SHA string `json:"sha,omitempty"`
+
+	// tag
+	Tag string `json:"tag,omitempty"`
+
+	// URL
+	URL string `json:"url,omitempty"`
+
+	// object
+	Object *AnnotatedTagObject `json:"object,omitempty"`
+
+	// tagger
+	Tagger *CommitUser `json:"tagger,omitempty"`
+
+	// verification
+	Verification *PayloadCommitVerification `json:"verification,omitempty"`
+}
+
+// Validate validates this annotated tag
+func (m *AnnotatedTag) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateObject(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateTagger(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateVerification(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *AnnotatedTag) validateObject(formats strfmt.Registry) error {
+	if swag.IsZero(m.Object) { // not required
+		return nil
+	}
+
+	if m.Object != nil {
+		if err := m.Object.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("object")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("object")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *AnnotatedTag) validateTagger(formats strfmt.Registry) error {
+	if swag.IsZero(m.Tagger) { // not required
+		return nil
+	}
+
+	if m.Tagger != nil {
+		if err := m.Tagger.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("tagger")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("tagger")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *AnnotatedTag) validateVerification(formats strfmt.Registry) error {
+	if swag.IsZero(m.Verification) { // not required
+		return nil
+	}
+
+	if m.Verification != nil {
+		if err := m.Verification.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("verification")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("verification")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+// ContextValidate validate this annotated tag based on the context it is used
+func (m *AnnotatedTag) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.contextValidateObject(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.contextValidateTagger(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.contextValidateVerification(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *AnnotatedTag) contextValidateObject(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.Object != nil {
+
+		if swag.IsZero(m.Object) { // not required
+			return nil
+		}
+
+		if err := m.Object.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("object")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("object")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *AnnotatedTag) contextValidateTagger(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.Tagger != nil {
+
+		if swag.IsZero(m.Tagger) { // not required
+			return nil
+		}
+
+		if err := m.Tagger.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("tagger")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("tagger")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *AnnotatedTag) contextValidateVerification(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.Verification != nil {
+
+		if swag.IsZero(m.Verification) { // not required
+			return nil
+		}
+
+		if err := m.Verification.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("verification")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("verification")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *AnnotatedTag) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *AnnotatedTag) UnmarshalBinary(b []byte) error {
+	var res AnnotatedTag
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/annotated_tag_object.go b/bots-common/gitea-generated/models/annotated_tag_object.go
new file mode 100644
index 0000000..cb1baf1
--- /dev/null
+++ b/bots-common/gitea-generated/models/annotated_tag_object.go
@@ -0,0 +1,56 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// AnnotatedTagObject AnnotatedTagObject contains meta information of the tag object
+//
+// swagger:model AnnotatedTagObject
+type AnnotatedTagObject struct {
+
+	// s h a
+	SHA string `json:"sha,omitempty"`
+
+	// type
+	Type string `json:"type,omitempty"`
+
+	// URL
+	URL string `json:"url,omitempty"`
+}
+
+// Validate validates this annotated tag object
+func (m *AnnotatedTagObject) Validate(formats strfmt.Registry) error {
+	return nil
+}
+
+// ContextValidate validates this annotated tag object based on context it is used
+func (m *AnnotatedTagObject) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *AnnotatedTagObject) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *AnnotatedTagObject) UnmarshalBinary(b []byte) error {
+	var res AnnotatedTagObject
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/api_error.go b/bots-common/gitea-generated/models/api_error.go
new file mode 100644
index 0000000..45844f7
--- /dev/null
+++ b/bots-common/gitea-generated/models/api_error.go
@@ -0,0 +1,53 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// APIError APIError is an api error with a message
+//
+// swagger:model APIError
+type APIError struct {
+
+	// message
+	Message string `json:"message,omitempty"`
+
+	// URL
+	URL string `json:"url,omitempty"`
+}
+
+// Validate validates this API error
+func (m *APIError) Validate(formats strfmt.Registry) error {
+	return nil
+}
+
+// ContextValidate validates this API error based on context it is used
+func (m *APIError) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *APIError) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *APIError) UnmarshalBinary(b []byte) error {
+	var res APIError
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/attachment.go b/bots-common/gitea-generated/models/attachment.go
new file mode 100644
index 0000000..581049e
--- /dev/null
+++ b/bots-common/gitea-generated/models/attachment.go
@@ -0,0 +1,92 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+	"github.com/go-openapi/validate"
+)
+
+// Attachment Attachment a generic attachment
+//
+// swagger:model Attachment
+type Attachment struct {
+
+	// created
+	// Format: date-time
+	Created strfmt.DateTime `json:"created_at,omitempty"`
+
+	// download count
+	DownloadCount int64 `json:"download_count,omitempty"`
+
+	// download URL
+	DownloadURL string `json:"browser_download_url,omitempty"`
+
+	// ID
+	ID int64 `json:"id,omitempty"`
+
+	// name
+	Name string `json:"name,omitempty"`
+
+	// size
+	Size int64 `json:"size,omitempty"`
+
+	// UUID
+	UUID string `json:"uuid,omitempty"`
+}
+
+// Validate validates this attachment
+func (m *Attachment) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateCreated(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *Attachment) validateCreated(formats strfmt.Registry) error {
+	if swag.IsZero(m.Created) { // not required
+		return nil
+	}
+
+	if err := validate.FormatOf("created_at", "body", "date-time", m.Created.String(), formats); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+// ContextValidate validates this attachment based on context it is used
+func (m *Attachment) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *Attachment) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *Attachment) UnmarshalBinary(b []byte) error {
+	var res Attachment
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/badge.go b/bots-common/gitea-generated/models/badge.go
new file mode 100644
index 0000000..23c53c1
--- /dev/null
+++ b/bots-common/gitea-generated/models/badge.go
@@ -0,0 +1,59 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// Badge Badge represents a user badge
+//
+// swagger:model Badge
+type Badge struct {
+
+	// description
+	Description string `json:"description,omitempty"`
+
+	// ID
+	ID int64 `json:"id,omitempty"`
+
+	// image URL
+	ImageURL string `json:"image_url,omitempty"`
+
+	// slug
+	Slug string `json:"slug,omitempty"`
+}
+
+// Validate validates this badge
+func (m *Badge) Validate(formats strfmt.Registry) error {
+	return nil
+}
+
+// ContextValidate validates this badge based on context it is used
+func (m *Badge) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *Badge) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *Badge) UnmarshalBinary(b []byte) error {
+	var res Badge
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/branch.go b/bots-common/gitea-generated/models/branch.go
new file mode 100644
index 0000000..0e7ba37
--- /dev/null
+++ b/bots-common/gitea-generated/models/branch.go
@@ -0,0 +1,133 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// Branch Branch represents a repository branch
+//
+// swagger:model Branch
+type Branch struct {
+
+	// effective branch protection name
+	EffectiveBranchProtectionName string `json:"effective_branch_protection_name,omitempty"`
+
+	// enable status check
+	EnableStatusCheck bool `json:"enable_status_check,omitempty"`
+
+	// name
+	Name string `json:"name,omitempty"`
+
+	// protected
+	Protected bool `json:"protected,omitempty"`
+
+	// required approvals
+	RequiredApprovals int64 `json:"required_approvals,omitempty"`
+
+	// status check contexts
+	StatusCheckContexts []string `json:"status_check_contexts"`
+
+	// user can merge
+	UserCanMerge bool `json:"user_can_merge,omitempty"`
+
+	// user can push
+	UserCanPush bool `json:"user_can_push,omitempty"`
+
+	// commit
+	Commit *PayloadCommit `json:"commit,omitempty"`
+}
+
+// Validate validates this branch
+func (m *Branch) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateCommit(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *Branch) validateCommit(formats strfmt.Registry) error {
+	if swag.IsZero(m.Commit) { // not required
+		return nil
+	}
+
+	if m.Commit != nil {
+		if err := m.Commit.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("commit")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("commit")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+// ContextValidate validate this branch based on the context it is used
+func (m *Branch) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.contextValidateCommit(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *Branch) contextValidateCommit(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.Commit != nil {
+
+		if swag.IsZero(m.Commit) { // not required
+			return nil
+		}
+
+		if err := m.Commit.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("commit")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("commit")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *Branch) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *Branch) UnmarshalBinary(b []byte) error {
+	var res Branch
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/branch_protection.go b/bots-common/gitea-generated/models/branch_protection.go
new file mode 100644
index 0000000..af55b97
--- /dev/null
+++ b/bots-common/gitea-generated/models/branch_protection.go
@@ -0,0 +1,166 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+	"github.com/go-openapi/validate"
+)
+
+// BranchProtection BranchProtection represents a branch protection for a repository
+//
+// swagger:model BranchProtection
+type BranchProtection struct {
+
+	// approvals whitelist teams
+	ApprovalsWhitelistTeams []string `json:"approvals_whitelist_teams"`
+
+	// approvals whitelist usernames
+	ApprovalsWhitelistUsernames []string `json:"approvals_whitelist_username"`
+
+	// block on official review requests
+	BlockOnOfficialReviewRequests bool `json:"block_on_official_review_requests,omitempty"`
+
+	// block on outdated branch
+	BlockOnOutdatedBranch bool `json:"block_on_outdated_branch,omitempty"`
+
+	// block on rejected reviews
+	BlockOnRejectedReviews bool `json:"block_on_rejected_reviews,omitempty"`
+
+	// Deprecated: true
+	BranchName string `json:"branch_name,omitempty"`
+
+	// created
+	// Format: date-time
+	Created strfmt.DateTime `json:"created_at,omitempty"`
+
+	// dismiss stale approvals
+	DismissStaleApprovals bool `json:"dismiss_stale_approvals,omitempty"`
+
+	// enable approvals whitelist
+	EnableApprovalsWhitelist bool `json:"enable_approvals_whitelist,omitempty"`
+
+	// enable merge whitelist
+	EnableMergeWhitelist bool `json:"enable_merge_whitelist,omitempty"`
+
+	// enable push
+	EnablePush bool `json:"enable_push,omitempty"`
+
+	// enable push whitelist
+	EnablePushWhitelist bool `json:"enable_push_whitelist,omitempty"`
+
+	// enable status check
+	EnableStatusCheck bool `json:"enable_status_check,omitempty"`
+
+	// ignore stale approvals
+	IgnoreStaleApprovals bool `json:"ignore_stale_approvals,omitempty"`
+
+	// merge whitelist teams
+	MergeWhitelistTeams []string `json:"merge_whitelist_teams"`
+
+	// merge whitelist usernames
+	MergeWhitelistUsernames []string `json:"merge_whitelist_usernames"`
+
+	// protected file patterns
+	ProtectedFilePatterns string `json:"protected_file_patterns,omitempty"`
+
+	// push whitelist deploy keys
+	PushWhitelistDeployKeys bool `json:"push_whitelist_deploy_keys,omitempty"`
+
+	// push whitelist teams
+	PushWhitelistTeams []string `json:"push_whitelist_teams"`
+
+	// push whitelist usernames
+	PushWhitelistUsernames []string `json:"push_whitelist_usernames"`
+
+	// require signed commits
+	RequireSignedCommits bool `json:"require_signed_commits,omitempty"`
+
+	// required approvals
+	RequiredApprovals int64 `json:"required_approvals,omitempty"`
+
+	// rule name
+	RuleName string `json:"rule_name,omitempty"`
+
+	// status check contexts
+	StatusCheckContexts []string `json:"status_check_contexts"`
+
+	// unprotected file patterns
+	UnprotectedFilePatterns string `json:"unprotected_file_patterns,omitempty"`
+
+	// updated
+	// Format: date-time
+	Updated strfmt.DateTime `json:"updated_at,omitempty"`
+}
+
+// Validate validates this branch protection
+func (m *BranchProtection) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateCreated(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateUpdated(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *BranchProtection) validateCreated(formats strfmt.Registry) error {
+	if swag.IsZero(m.Created) { // not required
+		return nil
+	}
+
+	if err := validate.FormatOf("created_at", "body", "date-time", m.Created.String(), formats); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (m *BranchProtection) validateUpdated(formats strfmt.Registry) error {
+	if swag.IsZero(m.Updated) { // not required
+		return nil
+	}
+
+	if err := validate.FormatOf("updated_at", "body", "date-time", m.Updated.String(), formats); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+// ContextValidate validates this branch protection based on context it is used
+func (m *BranchProtection) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *BranchProtection) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *BranchProtection) UnmarshalBinary(b []byte) error {
+	var res BranchProtection
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/change_file_operation.go b/bots-common/gitea-generated/models/change_file_operation.go
new file mode 100644
index 0000000..5bb1281
--- /dev/null
+++ b/bots-common/gitea-generated/models/change_file_operation.go
@@ -0,0 +1,136 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"encoding/json"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+	"github.com/go-openapi/validate"
+)
+
+// ChangeFileOperation ChangeFileOperation for creating, updating or deleting a file
+//
+// swagger:model ChangeFileOperation
+type ChangeFileOperation struct {
+
+	// new or updated file content, must be base64 encoded
+	ContentBase64 string `json:"content,omitempty"`
+
+	// old path of the file to move
+	FromPath string `json:"from_path,omitempty"`
+
+	// indicates what to do with the file
+	// Required: true
+	// Enum: ["create","update","delete"]
+	Operation *string `json:"operation"`
+
+	// path to the existing or new file
+	// Required: true
+	Path *string `json:"path"`
+
+	// sha is the SHA for the file that already exists, required for update or delete
+	SHA string `json:"sha,omitempty"`
+}
+
+// Validate validates this change file operation
+func (m *ChangeFileOperation) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateOperation(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validatePath(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+var changeFileOperationTypeOperationPropEnum []interface{}
+
+func init() {
+	var res []string
+	if err := json.Unmarshal([]byte(`["create","update","delete"]`), &res); err != nil {
+		panic(err)
+	}
+	for _, v := range res {
+		changeFileOperationTypeOperationPropEnum = append(changeFileOperationTypeOperationPropEnum, v)
+	}
+}
+
+const (
+
+	// ChangeFileOperationOperationCreate captures enum value "create"
+	ChangeFileOperationOperationCreate string = "create"
+
+	// ChangeFileOperationOperationUpdate captures enum value "update"
+	ChangeFileOperationOperationUpdate string = "update"
+
+	// ChangeFileOperationOperationDelete captures enum value "delete"
+	ChangeFileOperationOperationDelete string = "delete"
+)
+
+// prop value enum
+func (m *ChangeFileOperation) validateOperationEnum(path, location string, value string) error {
+	if err := validate.EnumCase(path, location, value, changeFileOperationTypeOperationPropEnum, true); err != nil {
+		return err
+	}
+	return nil
+}
+
+func (m *ChangeFileOperation) validateOperation(formats strfmt.Registry) error {
+
+	if err := validate.Required("operation", "body", m.Operation); err != nil {
+		return err
+	}
+
+	// value enum
+	if err := m.validateOperationEnum("operation", "body", *m.Operation); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (m *ChangeFileOperation) validatePath(formats strfmt.Registry) error {
+
+	if err := validate.Required("path", "body", m.Path); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+// ContextValidate validates this change file operation based on context it is used
+func (m *ChangeFileOperation) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *ChangeFileOperation) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *ChangeFileOperation) UnmarshalBinary(b []byte) error {
+	var res ChangeFileOperation
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/change_files_options.go b/bots-common/gitea-generated/models/change_files_options.go
new file mode 100644
index 0000000..29471c8
--- /dev/null
+++ b/bots-common/gitea-generated/models/change_files_options.go
@@ -0,0 +1,290 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"strconv"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+	"github.com/go-openapi/validate"
+)
+
+// ChangeFilesOptions ChangeFilesOptions options for creating, updating or deleting multiple files
+// Note: `author` and `committer` are optional (if only one is given, it will be used for the other, otherwise the authenticated user will be used)
+//
+// swagger:model ChangeFilesOptions
+type ChangeFilesOptions struct {
+
+	// branch (optional) to base this file from. if not given, the default branch is used
+	BranchName string `json:"branch,omitempty"`
+
+	// list of file operations
+	// Required: true
+	Files []*ChangeFileOperation `json:"files"`
+
+	// message (optional) for the commit of this file. if not supplied, a default message will be used
+	Message string `json:"message,omitempty"`
+
+	// new_branch (optional) will make a new branch from `branch` before creating the file
+	NewBranchName string `json:"new_branch,omitempty"`
+
+	// Add a Signed-off-by trailer by the committer at the end of the commit log message.
+	Signoff bool `json:"signoff,omitempty"`
+
+	// author
+	Author *Identity `json:"author,omitempty"`
+
+	// committer
+	Committer *Identity `json:"committer,omitempty"`
+
+	// dates
+	Dates *CommitDateOptions `json:"dates,omitempty"`
+}
+
+// Validate validates this change files options
+func (m *ChangeFilesOptions) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateFiles(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateAuthor(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateCommitter(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateDates(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *ChangeFilesOptions) validateFiles(formats strfmt.Registry) error {
+
+	if err := validate.Required("files", "body", m.Files); err != nil {
+		return err
+	}
+
+	for i := 0; i < len(m.Files); i++ {
+		if swag.IsZero(m.Files[i]) { // not required
+			continue
+		}
+
+		if m.Files[i] != nil {
+			if err := m.Files[i].Validate(formats); err != nil {
+				if ve, ok := err.(*errors.Validation); ok {
+					return ve.ValidateName("files" + "." + strconv.Itoa(i))
+				} else if ce, ok := err.(*errors.CompositeError); ok {
+					return ce.ValidateName("files" + "." + strconv.Itoa(i))
+				}
+				return err
+			}
+		}
+
+	}
+
+	return nil
+}
+
+func (m *ChangeFilesOptions) validateAuthor(formats strfmt.Registry) error {
+	if swag.IsZero(m.Author) { // not required
+		return nil
+	}
+
+	if m.Author != nil {
+		if err := m.Author.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("author")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("author")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *ChangeFilesOptions) validateCommitter(formats strfmt.Registry) error {
+	if swag.IsZero(m.Committer) { // not required
+		return nil
+	}
+
+	if m.Committer != nil {
+		if err := m.Committer.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("committer")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("committer")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *ChangeFilesOptions) validateDates(formats strfmt.Registry) error {
+	if swag.IsZero(m.Dates) { // not required
+		return nil
+	}
+
+	if m.Dates != nil {
+		if err := m.Dates.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("dates")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("dates")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+// ContextValidate validate this change files options based on the context it is used
+func (m *ChangeFilesOptions) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.contextValidateFiles(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.contextValidateAuthor(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.contextValidateCommitter(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.contextValidateDates(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *ChangeFilesOptions) contextValidateFiles(ctx context.Context, formats strfmt.Registry) error {
+
+	for i := 0; i < len(m.Files); i++ {
+
+		if m.Files[i] != nil {
+
+			if swag.IsZero(m.Files[i]) { // not required
+				return nil
+			}
+
+			if err := m.Files[i].ContextValidate(ctx, formats); err != nil {
+				if ve, ok := err.(*errors.Validation); ok {
+					return ve.ValidateName("files" + "." + strconv.Itoa(i))
+				} else if ce, ok := err.(*errors.CompositeError); ok {
+					return ce.ValidateName("files" + "." + strconv.Itoa(i))
+				}
+				return err
+			}
+		}
+
+	}
+
+	return nil
+}
+
+func (m *ChangeFilesOptions) contextValidateAuthor(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.Author != nil {
+
+		if swag.IsZero(m.Author) { // not required
+			return nil
+		}
+
+		if err := m.Author.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("author")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("author")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *ChangeFilesOptions) contextValidateCommitter(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.Committer != nil {
+
+		if swag.IsZero(m.Committer) { // not required
+			return nil
+		}
+
+		if err := m.Committer.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("committer")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("committer")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *ChangeFilesOptions) contextValidateDates(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.Dates != nil {
+
+		if swag.IsZero(m.Dates) { // not required
+			return nil
+		}
+
+		if err := m.Dates.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("dates")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("dates")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *ChangeFilesOptions) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *ChangeFilesOptions) UnmarshalBinary(b []byte) error {
+	var res ChangeFilesOptions
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/changed_file.go b/bots-common/gitea-generated/models/changed_file.go
new file mode 100644
index 0000000..4ae9d68
--- /dev/null
+++ b/bots-common/gitea-generated/models/changed_file.go
@@ -0,0 +1,74 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// ChangedFile ChangedFile store information about files affected by the pull request
+//
+// swagger:model ChangedFile
+type ChangedFile struct {
+
+	// additions
+	Additions int64 `json:"additions,omitempty"`
+
+	// changes
+	Changes int64 `json:"changes,omitempty"`
+
+	// contents URL
+	ContentsURL string `json:"contents_url,omitempty"`
+
+	// deletions
+	Deletions int64 `json:"deletions,omitempty"`
+
+	// filename
+	Filename string `json:"filename,omitempty"`
+
+	// HTML URL
+	HTMLURL string `json:"html_url,omitempty"`
+
+	// previous filename
+	PreviousFilename string `json:"previous_filename,omitempty"`
+
+	// raw URL
+	RawURL string `json:"raw_url,omitempty"`
+
+	// status
+	Status string `json:"status,omitempty"`
+}
+
+// Validate validates this changed file
+func (m *ChangedFile) Validate(formats strfmt.Registry) error {
+	return nil
+}
+
+// ContextValidate validates this changed file based on context it is used
+func (m *ChangedFile) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *ChangedFile) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *ChangedFile) UnmarshalBinary(b []byte) error {
+	var res ChangedFile
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/combined_status.go b/bots-common/gitea-generated/models/combined_status.go
new file mode 100644
index 0000000..1eb2a9f
--- /dev/null
+++ b/bots-common/gitea-generated/models/combined_status.go
@@ -0,0 +1,230 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"strconv"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// CombinedStatus CombinedStatus holds the combined state of several statuses for a single commit
+//
+// swagger:model CombinedStatus
+type CombinedStatus struct {
+
+	// commit URL
+	CommitURL string `json:"commit_url,omitempty"`
+
+	// s h a
+	SHA string `json:"sha,omitempty"`
+
+	// statuses
+	Statuses []*CommitStatus `json:"statuses"`
+
+	// total count
+	TotalCount int64 `json:"total_count,omitempty"`
+
+	// URL
+	URL string `json:"url,omitempty"`
+
+	// repository
+	Repository *Repository `json:"repository,omitempty"`
+
+	// state
+	State CommitStatusState `json:"state,omitempty"`
+}
+
+// Validate validates this combined status
+func (m *CombinedStatus) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateStatuses(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateRepository(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateState(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *CombinedStatus) validateStatuses(formats strfmt.Registry) error {
+	if swag.IsZero(m.Statuses) { // not required
+		return nil
+	}
+
+	for i := 0; i < len(m.Statuses); i++ {
+		if swag.IsZero(m.Statuses[i]) { // not required
+			continue
+		}
+
+		if m.Statuses[i] != nil {
+			if err := m.Statuses[i].Validate(formats); err != nil {
+				if ve, ok := err.(*errors.Validation); ok {
+					return ve.ValidateName("statuses" + "." + strconv.Itoa(i))
+				} else if ce, ok := err.(*errors.CompositeError); ok {
+					return ce.ValidateName("statuses" + "." + strconv.Itoa(i))
+				}
+				return err
+			}
+		}
+
+	}
+
+	return nil
+}
+
+func (m *CombinedStatus) validateRepository(formats strfmt.Registry) error {
+	if swag.IsZero(m.Repository) { // not required
+		return nil
+	}
+
+	if m.Repository != nil {
+		if err := m.Repository.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("repository")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("repository")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *CombinedStatus) validateState(formats strfmt.Registry) error {
+	if swag.IsZero(m.State) { // not required
+		return nil
+	}
+
+	if err := m.State.Validate(formats); err != nil {
+		if ve, ok := err.(*errors.Validation); ok {
+			return ve.ValidateName("state")
+		} else if ce, ok := err.(*errors.CompositeError); ok {
+			return ce.ValidateName("state")
+		}
+		return err
+	}
+
+	return nil
+}
+
+// ContextValidate validate this combined status based on the context it is used
+func (m *CombinedStatus) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.contextValidateStatuses(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.contextValidateRepository(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.contextValidateState(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *CombinedStatus) contextValidateStatuses(ctx context.Context, formats strfmt.Registry) error {
+
+	for i := 0; i < len(m.Statuses); i++ {
+
+		if m.Statuses[i] != nil {
+
+			if swag.IsZero(m.Statuses[i]) { // not required
+				return nil
+			}
+
+			if err := m.Statuses[i].ContextValidate(ctx, formats); err != nil {
+				if ve, ok := err.(*errors.Validation); ok {
+					return ve.ValidateName("statuses" + "." + strconv.Itoa(i))
+				} else if ce, ok := err.(*errors.CompositeError); ok {
+					return ce.ValidateName("statuses" + "." + strconv.Itoa(i))
+				}
+				return err
+			}
+		}
+
+	}
+
+	return nil
+}
+
+func (m *CombinedStatus) contextValidateRepository(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.Repository != nil {
+
+		if swag.IsZero(m.Repository) { // not required
+			return nil
+		}
+
+		if err := m.Repository.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("repository")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("repository")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *CombinedStatus) contextValidateState(ctx context.Context, formats strfmt.Registry) error {
+
+	if swag.IsZero(m.State) { // not required
+		return nil
+	}
+
+	if err := m.State.ContextValidate(ctx, formats); err != nil {
+		if ve, ok := err.(*errors.Validation); ok {
+			return ve.ValidateName("state")
+		} else if ce, ok := err.(*errors.CompositeError); ok {
+			return ce.ValidateName("state")
+		}
+		return err
+	}
+
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *CombinedStatus) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *CombinedStatus) UnmarshalBinary(b []byte) error {
+	var res CombinedStatus
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/comment.go b/bots-common/gitea-generated/models/comment.go
new file mode 100644
index 0000000..605f84f
--- /dev/null
+++ b/bots-common/gitea-generated/models/comment.go
@@ -0,0 +1,234 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"strconv"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+	"github.com/go-openapi/validate"
+)
+
+// Comment Comment represents a comment on a commit or issue
+//
+// swagger:model Comment
+type Comment struct {
+
+	// attachments
+	Attachments []*Attachment `json:"assets"`
+
+	// body
+	Body string `json:"body,omitempty"`
+
+	// created
+	// Format: date-time
+	Created strfmt.DateTime `json:"created_at,omitempty"`
+
+	// HTML URL
+	HTMLURL string `json:"html_url,omitempty"`
+
+	// ID
+	ID int64 `json:"id,omitempty"`
+
+	// issue URL
+	IssueURL string `json:"issue_url,omitempty"`
+
+	// original author
+	OriginalAuthor string `json:"original_author,omitempty"`
+
+	// original author ID
+	OriginalAuthorID int64 `json:"original_author_id,omitempty"`
+
+	// p r URL
+	PRURL string `json:"pull_request_url,omitempty"`
+
+	// updated
+	// Format: date-time
+	Updated strfmt.DateTime `json:"updated_at,omitempty"`
+
+	// user
+	User *User `json:"user,omitempty"`
+}
+
+// Validate validates this comment
+func (m *Comment) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateAttachments(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateCreated(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateUpdated(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateUser(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *Comment) validateAttachments(formats strfmt.Registry) error {
+	if swag.IsZero(m.Attachments) { // not required
+		return nil
+	}
+
+	for i := 0; i < len(m.Attachments); i++ {
+		if swag.IsZero(m.Attachments[i]) { // not required
+			continue
+		}
+
+		if m.Attachments[i] != nil {
+			if err := m.Attachments[i].Validate(formats); err != nil {
+				if ve, ok := err.(*errors.Validation); ok {
+					return ve.ValidateName("assets" + "." + strconv.Itoa(i))
+				} else if ce, ok := err.(*errors.CompositeError); ok {
+					return ce.ValidateName("assets" + "." + strconv.Itoa(i))
+				}
+				return err
+			}
+		}
+
+	}
+
+	return nil
+}
+
+func (m *Comment) validateCreated(formats strfmt.Registry) error {
+	if swag.IsZero(m.Created) { // not required
+		return nil
+	}
+
+	if err := validate.FormatOf("created_at", "body", "date-time", m.Created.String(), formats); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (m *Comment) validateUpdated(formats strfmt.Registry) error {
+	if swag.IsZero(m.Updated) { // not required
+		return nil
+	}
+
+	if err := validate.FormatOf("updated_at", "body", "date-time", m.Updated.String(), formats); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (m *Comment) validateUser(formats strfmt.Registry) error {
+	if swag.IsZero(m.User) { // not required
+		return nil
+	}
+
+	if m.User != nil {
+		if err := m.User.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("user")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("user")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+// ContextValidate validate this comment based on the context it is used
+func (m *Comment) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.contextValidateAttachments(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.contextValidateUser(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *Comment) contextValidateAttachments(ctx context.Context, formats strfmt.Registry) error {
+
+	for i := 0; i < len(m.Attachments); i++ {
+
+		if m.Attachments[i] != nil {
+
+			if swag.IsZero(m.Attachments[i]) { // not required
+				return nil
+			}
+
+			if err := m.Attachments[i].ContextValidate(ctx, formats); err != nil {
+				if ve, ok := err.(*errors.Validation); ok {
+					return ve.ValidateName("assets" + "." + strconv.Itoa(i))
+				} else if ce, ok := err.(*errors.CompositeError); ok {
+					return ce.ValidateName("assets" + "." + strconv.Itoa(i))
+				}
+				return err
+			}
+		}
+
+	}
+
+	return nil
+}
+
+func (m *Comment) contextValidateUser(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.User != nil {
+
+		if swag.IsZero(m.User) { // not required
+			return nil
+		}
+
+		if err := m.User.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("user")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("user")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *Comment) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *Comment) UnmarshalBinary(b []byte) error {
+	var res Comment
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/commit.go b/bots-common/gitea-generated/models/commit.go
new file mode 100644
index 0000000..ab0a91f
--- /dev/null
+++ b/bots-common/gitea-generated/models/commit.go
@@ -0,0 +1,417 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"strconv"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+	"github.com/go-openapi/validate"
+)
+
+// Commit Commit contains information generated from a Git commit.
+//
+// swagger:model Commit
+type Commit struct {
+
+	// created
+	// Format: date-time
+	Created strfmt.DateTime `json:"created,omitempty"`
+
+	// files
+	Files []*CommitAffectedFiles `json:"files"`
+
+	// HTML URL
+	HTMLURL string `json:"html_url,omitempty"`
+
+	// parents
+	Parents []*CommitMeta `json:"parents"`
+
+	// s h a
+	SHA string `json:"sha,omitempty"`
+
+	// URL
+	URL string `json:"url,omitempty"`
+
+	// author
+	Author *User `json:"author,omitempty"`
+
+	// commit
+	Commit *RepoCommit `json:"commit,omitempty"`
+
+	// committer
+	Committer *User `json:"committer,omitempty"`
+
+	// stats
+	Stats *CommitStats `json:"stats,omitempty"`
+}
+
+// Validate validates this commit
+func (m *Commit) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateCreated(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateFiles(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateParents(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateAuthor(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateCommit(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateCommitter(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateStats(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *Commit) validateCreated(formats strfmt.Registry) error {
+	if swag.IsZero(m.Created) { // not required
+		return nil
+	}
+
+	if err := validate.FormatOf("created", "body", "date-time", m.Created.String(), formats); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (m *Commit) validateFiles(formats strfmt.Registry) error {
+	if swag.IsZero(m.Files) { // not required
+		return nil
+	}
+
+	for i := 0; i < len(m.Files); i++ {
+		if swag.IsZero(m.Files[i]) { // not required
+			continue
+		}
+
+		if m.Files[i] != nil {
+			if err := m.Files[i].Validate(formats); err != nil {
+				if ve, ok := err.(*errors.Validation); ok {
+					return ve.ValidateName("files" + "." + strconv.Itoa(i))
+				} else if ce, ok := err.(*errors.CompositeError); ok {
+					return ce.ValidateName("files" + "." + strconv.Itoa(i))
+				}
+				return err
+			}
+		}
+
+	}
+
+	return nil
+}
+
+func (m *Commit) validateParents(formats strfmt.Registry) error {
+	if swag.IsZero(m.Parents) { // not required
+		return nil
+	}
+
+	for i := 0; i < len(m.Parents); i++ {
+		if swag.IsZero(m.Parents[i]) { // not required
+			continue
+		}
+
+		if m.Parents[i] != nil {
+			if err := m.Parents[i].Validate(formats); err != nil {
+				if ve, ok := err.(*errors.Validation); ok {
+					return ve.ValidateName("parents" + "." + strconv.Itoa(i))
+				} else if ce, ok := err.(*errors.CompositeError); ok {
+					return ce.ValidateName("parents" + "." + strconv.Itoa(i))
+				}
+				return err
+			}
+		}
+
+	}
+
+	return nil
+}
+
+func (m *Commit) validateAuthor(formats strfmt.Registry) error {
+	if swag.IsZero(m.Author) { // not required
+		return nil
+	}
+
+	if m.Author != nil {
+		if err := m.Author.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("author")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("author")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *Commit) validateCommit(formats strfmt.Registry) error {
+	if swag.IsZero(m.Commit) { // not required
+		return nil
+	}
+
+	if m.Commit != nil {
+		if err := m.Commit.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("commit")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("commit")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *Commit) validateCommitter(formats strfmt.Registry) error {
+	if swag.IsZero(m.Committer) { // not required
+		return nil
+	}
+
+	if m.Committer != nil {
+		if err := m.Committer.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("committer")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("committer")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *Commit) validateStats(formats strfmt.Registry) error {
+	if swag.IsZero(m.Stats) { // not required
+		return nil
+	}
+
+	if m.Stats != nil {
+		if err := m.Stats.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("stats")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("stats")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+// ContextValidate validate this commit based on the context it is used
+func (m *Commit) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.contextValidateFiles(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.contextValidateParents(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.contextValidateAuthor(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.contextValidateCommit(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.contextValidateCommitter(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.contextValidateStats(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *Commit) contextValidateFiles(ctx context.Context, formats strfmt.Registry) error {
+
+	for i := 0; i < len(m.Files); i++ {
+
+		if m.Files[i] != nil {
+
+			if swag.IsZero(m.Files[i]) { // not required
+				return nil
+			}
+
+			if err := m.Files[i].ContextValidate(ctx, formats); err != nil {
+				if ve, ok := err.(*errors.Validation); ok {
+					return ve.ValidateName("files" + "." + strconv.Itoa(i))
+				} else if ce, ok := err.(*errors.CompositeError); ok {
+					return ce.ValidateName("files" + "." + strconv.Itoa(i))
+				}
+				return err
+			}
+		}
+
+	}
+
+	return nil
+}
+
+func (m *Commit) contextValidateParents(ctx context.Context, formats strfmt.Registry) error {
+
+	for i := 0; i < len(m.Parents); i++ {
+
+		if m.Parents[i] != nil {
+
+			if swag.IsZero(m.Parents[i]) { // not required
+				return nil
+			}
+
+			if err := m.Parents[i].ContextValidate(ctx, formats); err != nil {
+				if ve, ok := err.(*errors.Validation); ok {
+					return ve.ValidateName("parents" + "." + strconv.Itoa(i))
+				} else if ce, ok := err.(*errors.CompositeError); ok {
+					return ce.ValidateName("parents" + "." + strconv.Itoa(i))
+				}
+				return err
+			}
+		}
+
+	}
+
+	return nil
+}
+
+func (m *Commit) contextValidateAuthor(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.Author != nil {
+
+		if swag.IsZero(m.Author) { // not required
+			return nil
+		}
+
+		if err := m.Author.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("author")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("author")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *Commit) contextValidateCommit(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.Commit != nil {
+
+		if swag.IsZero(m.Commit) { // not required
+			return nil
+		}
+
+		if err := m.Commit.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("commit")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("commit")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *Commit) contextValidateCommitter(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.Committer != nil {
+
+		if swag.IsZero(m.Committer) { // not required
+			return nil
+		}
+
+		if err := m.Committer.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("committer")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("committer")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *Commit) contextValidateStats(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.Stats != nil {
+
+		if swag.IsZero(m.Stats) { // not required
+			return nil
+		}
+
+		if err := m.Stats.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("stats")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("stats")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *Commit) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *Commit) UnmarshalBinary(b []byte) error {
+	var res Commit
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/commit_affected_files.go b/bots-common/gitea-generated/models/commit_affected_files.go
new file mode 100644
index 0000000..dd594b6
--- /dev/null
+++ b/bots-common/gitea-generated/models/commit_affected_files.go
@@ -0,0 +1,53 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// CommitAffectedFiles CommitAffectedFiles store information about files affected by the commit
+//
+// swagger:model CommitAffectedFiles
+type CommitAffectedFiles struct {
+
+	// filename
+	Filename string `json:"filename,omitempty"`
+
+	// status
+	Status string `json:"status,omitempty"`
+}
+
+// Validate validates this commit affected files
+func (m *CommitAffectedFiles) Validate(formats strfmt.Registry) error {
+	return nil
+}
+
+// ContextValidate validates this commit affected files based on context it is used
+func (m *CommitAffectedFiles) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *CommitAffectedFiles) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *CommitAffectedFiles) UnmarshalBinary(b []byte) error {
+	var res CommitAffectedFiles
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/commit_date_options.go b/bots-common/gitea-generated/models/commit_date_options.go
new file mode 100644
index 0000000..a9bfa65
--- /dev/null
+++ b/bots-common/gitea-generated/models/commit_date_options.go
@@ -0,0 +1,94 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+	"github.com/go-openapi/validate"
+)
+
+// CommitDateOptions CommitDateOptions store dates for GIT_AUTHOR_DATE and GIT_COMMITTER_DATE
+//
+// swagger:model CommitDateOptions
+type CommitDateOptions struct {
+
+	// author
+	// Format: date-time
+	Author strfmt.DateTime `json:"author,omitempty"`
+
+	// committer
+	// Format: date-time
+	Committer strfmt.DateTime `json:"committer,omitempty"`
+}
+
+// Validate validates this commit date options
+func (m *CommitDateOptions) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateAuthor(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateCommitter(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *CommitDateOptions) validateAuthor(formats strfmt.Registry) error {
+	if swag.IsZero(m.Author) { // not required
+		return nil
+	}
+
+	if err := validate.FormatOf("author", "body", "date-time", m.Author.String(), formats); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (m *CommitDateOptions) validateCommitter(formats strfmt.Registry) error {
+	if swag.IsZero(m.Committer) { // not required
+		return nil
+	}
+
+	if err := validate.FormatOf("committer", "body", "date-time", m.Committer.String(), formats); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+// ContextValidate validates this commit date options based on context it is used
+func (m *CommitDateOptions) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *CommitDateOptions) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *CommitDateOptions) UnmarshalBinary(b []byte) error {
+	var res CommitDateOptions
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/commit_meta.go b/bots-common/gitea-generated/models/commit_meta.go
new file mode 100644
index 0000000..093ca27
--- /dev/null
+++ b/bots-common/gitea-generated/models/commit_meta.go
@@ -0,0 +1,80 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+	"github.com/go-openapi/validate"
+)
+
+// CommitMeta CommitMeta contains meta information of a commit in terms of API.
+//
+// swagger:model CommitMeta
+type CommitMeta struct {
+
+	// created
+	// Format: date-time
+	Created strfmt.DateTime `json:"created,omitempty"`
+
+	// s h a
+	SHA string `json:"sha,omitempty"`
+
+	// URL
+	URL string `json:"url,omitempty"`
+}
+
+// Validate validates this commit meta
+func (m *CommitMeta) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateCreated(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *CommitMeta) validateCreated(formats strfmt.Registry) error {
+	if swag.IsZero(m.Created) { // not required
+		return nil
+	}
+
+	if err := validate.FormatOf("created", "body", "date-time", m.Created.String(), formats); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+// ContextValidate validates this commit meta based on context it is used
+func (m *CommitMeta) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *CommitMeta) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *CommitMeta) UnmarshalBinary(b []byte) error {
+	var res CommitMeta
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/commit_stats.go b/bots-common/gitea-generated/models/commit_stats.go
new file mode 100644
index 0000000..ff17536
--- /dev/null
+++ b/bots-common/gitea-generated/models/commit_stats.go
@@ -0,0 +1,56 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// CommitStats CommitStats is statistics for a RepoCommit
+//
+// swagger:model CommitStats
+type CommitStats struct {
+
+	// additions
+	Additions int64 `json:"additions,omitempty"`
+
+	// deletions
+	Deletions int64 `json:"deletions,omitempty"`
+
+	// total
+	Total int64 `json:"total,omitempty"`
+}
+
+// Validate validates this commit stats
+func (m *CommitStats) Validate(formats strfmt.Registry) error {
+	return nil
+}
+
+// ContextValidate validates this commit stats based on context it is used
+func (m *CommitStats) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *CommitStats) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *CommitStats) UnmarshalBinary(b []byte) error {
+	var res CommitStats
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/commit_status.go b/bots-common/gitea-generated/models/commit_status.go
new file mode 100644
index 0000000..0581a96
--- /dev/null
+++ b/bots-common/gitea-generated/models/commit_status.go
@@ -0,0 +1,211 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+	"github.com/go-openapi/validate"
+)
+
+// CommitStatus CommitStatus holds a single status of a single Commit
+//
+// swagger:model CommitStatus
+type CommitStatus struct {
+
+	// context
+	Context string `json:"context,omitempty"`
+
+	// created
+	// Format: date-time
+	Created strfmt.DateTime `json:"created_at,omitempty"`
+
+	// description
+	Description string `json:"description,omitempty"`
+
+	// ID
+	ID int64 `json:"id,omitempty"`
+
+	// target URL
+	TargetURL string `json:"target_url,omitempty"`
+
+	// URL
+	URL string `json:"url,omitempty"`
+
+	// updated
+	// Format: date-time
+	Updated strfmt.DateTime `json:"updated_at,omitempty"`
+
+	// creator
+	Creator *User `json:"creator,omitempty"`
+
+	// status
+	Status CommitStatusState `json:"status,omitempty"`
+}
+
+// Validate validates this commit status
+func (m *CommitStatus) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateCreated(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateUpdated(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateCreator(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateStatus(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *CommitStatus) validateCreated(formats strfmt.Registry) error {
+	if swag.IsZero(m.Created) { // not required
+		return nil
+	}
+
+	if err := validate.FormatOf("created_at", "body", "date-time", m.Created.String(), formats); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (m *CommitStatus) validateUpdated(formats strfmt.Registry) error {
+	if swag.IsZero(m.Updated) { // not required
+		return nil
+	}
+
+	if err := validate.FormatOf("updated_at", "body", "date-time", m.Updated.String(), formats); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (m *CommitStatus) validateCreator(formats strfmt.Registry) error {
+	if swag.IsZero(m.Creator) { // not required
+		return nil
+	}
+
+	if m.Creator != nil {
+		if err := m.Creator.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("creator")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("creator")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *CommitStatus) validateStatus(formats strfmt.Registry) error {
+	if swag.IsZero(m.Status) { // not required
+		return nil
+	}
+
+	if err := m.Status.Validate(formats); err != nil {
+		if ve, ok := err.(*errors.Validation); ok {
+			return ve.ValidateName("status")
+		} else if ce, ok := err.(*errors.CompositeError); ok {
+			return ce.ValidateName("status")
+		}
+		return err
+	}
+
+	return nil
+}
+
+// ContextValidate validate this commit status based on the context it is used
+func (m *CommitStatus) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.contextValidateCreator(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.contextValidateStatus(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *CommitStatus) contextValidateCreator(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.Creator != nil {
+
+		if swag.IsZero(m.Creator) { // not required
+			return nil
+		}
+
+		if err := m.Creator.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("creator")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("creator")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *CommitStatus) contextValidateStatus(ctx context.Context, formats strfmt.Registry) error {
+
+	if swag.IsZero(m.Status) { // not required
+		return nil
+	}
+
+	if err := m.Status.ContextValidate(ctx, formats); err != nil {
+		if ve, ok := err.(*errors.Validation); ok {
+			return ve.ValidateName("status")
+		} else if ce, ok := err.(*errors.CompositeError); ok {
+			return ce.ValidateName("status")
+		}
+		return err
+	}
+
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *CommitStatus) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *CommitStatus) UnmarshalBinary(b []byte) error {
+	var res CommitStatus
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/commit_status_state.go b/bots-common/gitea-generated/models/commit_status_state.go
new file mode 100644
index 0000000..216c389
--- /dev/null
+++ b/bots-common/gitea-generated/models/commit_status_state.go
@@ -0,0 +1,28 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/strfmt"
+)
+
+// CommitStatusState CommitStatusState holds the state of a CommitStatus
+// It can be "pending", "success", "error" and "failure"
+//
+// swagger:model CommitStatusState
+type CommitStatusState string
+
+// Validate validates this commit status state
+func (m CommitStatusState) Validate(formats strfmt.Registry) error {
+	return nil
+}
+
+// ContextValidate validates this commit status state based on context it is used
+func (m CommitStatusState) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/commit_user.go b/bots-common/gitea-generated/models/commit_user.go
new file mode 100644
index 0000000..9415c87
--- /dev/null
+++ b/bots-common/gitea-generated/models/commit_user.go
@@ -0,0 +1,80 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+	"github.com/go-openapi/validate"
+)
+
+// CommitUser CommitUser contains information of a user in the context of a commit.
+//
+// swagger:model CommitUser
+type CommitUser struct {
+
+	// date
+	Date string `json:"date,omitempty"`
+
+	// email
+	// Format: email
+	Email strfmt.Email `json:"email,omitempty"`
+
+	// name
+	Name string `json:"name,omitempty"`
+}
+
+// Validate validates this commit user
+func (m *CommitUser) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateEmail(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *CommitUser) validateEmail(formats strfmt.Registry) error {
+	if swag.IsZero(m.Email) { // not required
+		return nil
+	}
+
+	if err := validate.FormatOf("email", "body", "email", m.Email.String(), formats); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+// ContextValidate validates this commit user based on context it is used
+func (m *CommitUser) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *CommitUser) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *CommitUser) UnmarshalBinary(b []byte) error {
+	var res CommitUser
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/compare.go b/bots-common/gitea-generated/models/compare.go
new file mode 100644
index 0000000..e5a5649
--- /dev/null
+++ b/bots-common/gitea-generated/models/compare.go
@@ -0,0 +1,124 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"strconv"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// Compare Compare represents a comparison between two commits.
+//
+// swagger:model Compare
+type Compare struct {
+
+	// commits
+	Commits []*Commit `json:"commits"`
+
+	// total commits
+	TotalCommits int64 `json:"total_commits,omitempty"`
+}
+
+// Validate validates this compare
+func (m *Compare) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateCommits(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *Compare) validateCommits(formats strfmt.Registry) error {
+	if swag.IsZero(m.Commits) { // not required
+		return nil
+	}
+
+	for i := 0; i < len(m.Commits); i++ {
+		if swag.IsZero(m.Commits[i]) { // not required
+			continue
+		}
+
+		if m.Commits[i] != nil {
+			if err := m.Commits[i].Validate(formats); err != nil {
+				if ve, ok := err.(*errors.Validation); ok {
+					return ve.ValidateName("commits" + "." + strconv.Itoa(i))
+				} else if ce, ok := err.(*errors.CompositeError); ok {
+					return ce.ValidateName("commits" + "." + strconv.Itoa(i))
+				}
+				return err
+			}
+		}
+
+	}
+
+	return nil
+}
+
+// ContextValidate validate this compare based on the context it is used
+func (m *Compare) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.contextValidateCommits(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *Compare) contextValidateCommits(ctx context.Context, formats strfmt.Registry) error {
+
+	for i := 0; i < len(m.Commits); i++ {
+
+		if m.Commits[i] != nil {
+
+			if swag.IsZero(m.Commits[i]) { // not required
+				return nil
+			}
+
+			if err := m.Commits[i].ContextValidate(ctx, formats); err != nil {
+				if ve, ok := err.(*errors.Validation); ok {
+					return ve.ValidateName("commits" + "." + strconv.Itoa(i))
+				} else if ce, ok := err.(*errors.CompositeError); ok {
+					return ce.ValidateName("commits" + "." + strconv.Itoa(i))
+				}
+				return err
+			}
+		}
+
+	}
+
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *Compare) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *Compare) UnmarshalBinary(b []byte) error {
+	var res Compare
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/contents_response.go b/bots-common/gitea-generated/models/contents_response.go
new file mode 100644
index 0000000..3203c56
--- /dev/null
+++ b/bots-common/gitea-generated/models/contents_response.go
@@ -0,0 +1,151 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// ContentsResponse ContentsResponse contains information about a repo's entry's (dir, file, symlink, submodule) metadata and content
+//
+// swagger:model ContentsResponse
+type ContentsResponse struct {
+
+	// `content` is populated when `type` is `file`, otherwise null
+	Content string `json:"content,omitempty"`
+
+	// download URL
+	DownloadURL string `json:"download_url,omitempty"`
+
+	// `encoding` is populated when `type` is `file`, otherwise null
+	Encoding string `json:"encoding,omitempty"`
+
+	// git URL
+	GitURL string `json:"git_url,omitempty"`
+
+	// HTML URL
+	HTMLURL string `json:"html_url,omitempty"`
+
+	// last commit s h a
+	LastCommitSHA string `json:"last_commit_sha,omitempty"`
+
+	// name
+	Name string `json:"name,omitempty"`
+
+	// path
+	Path string `json:"path,omitempty"`
+
+	// s h a
+	SHA string `json:"sha,omitempty"`
+
+	// size
+	Size int64 `json:"size,omitempty"`
+
+	// `submodule_git_url` is populated when `type` is `submodule`, otherwise null
+	SubmoduleGitURL string `json:"submodule_git_url,omitempty"`
+
+	// `target` is populated when `type` is `symlink`, otherwise null
+	Target string `json:"target,omitempty"`
+
+	// `type` will be `file`, `dir`, `symlink`, or `submodule`
+	Type string `json:"type,omitempty"`
+
+	// URL
+	URL string `json:"url,omitempty"`
+
+	// links
+	Links *FileLinksResponse `json:"_links,omitempty"`
+}
+
+// Validate validates this contents response
+func (m *ContentsResponse) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateLinks(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *ContentsResponse) validateLinks(formats strfmt.Registry) error {
+	if swag.IsZero(m.Links) { // not required
+		return nil
+	}
+
+	if m.Links != nil {
+		if err := m.Links.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("_links")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("_links")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+// ContextValidate validate this contents response based on the context it is used
+func (m *ContentsResponse) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.contextValidateLinks(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *ContentsResponse) contextValidateLinks(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.Links != nil {
+
+		if swag.IsZero(m.Links) { // not required
+			return nil
+		}
+
+		if err := m.Links.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("_links")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("_links")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *ContentsResponse) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *ContentsResponse) UnmarshalBinary(b []byte) error {
+	var res ContentsResponse
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/create_access_token_option.go b/bots-common/gitea-generated/models/create_access_token_option.go
new file mode 100644
index 0000000..c06dbcb
--- /dev/null
+++ b/bots-common/gitea-generated/models/create_access_token_option.go
@@ -0,0 +1,74 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+	"github.com/go-openapi/validate"
+)
+
+// CreateAccessTokenOption CreateAccessTokenOption options when create access token
+//
+// swagger:model CreateAccessTokenOption
+type CreateAccessTokenOption struct {
+
+	// name
+	// Required: true
+	Name *string `json:"name"`
+
+	// scopes
+	Scopes []string `json:"scopes"`
+}
+
+// Validate validates this create access token option
+func (m *CreateAccessTokenOption) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateName(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *CreateAccessTokenOption) validateName(formats strfmt.Registry) error {
+
+	if err := validate.Required("name", "body", m.Name); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+// ContextValidate validates this create access token option based on context it is used
+func (m *CreateAccessTokenOption) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *CreateAccessTokenOption) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *CreateAccessTokenOption) UnmarshalBinary(b []byte) error {
+	var res CreateAccessTokenOption
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/create_branch_protection_option.go b/bots-common/gitea-generated/models/create_branch_protection_option.go
new file mode 100644
index 0000000..47a4dfe
--- /dev/null
+++ b/bots-common/gitea-generated/models/create_branch_protection_option.go
@@ -0,0 +1,119 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// CreateBranchProtectionOption CreateBranchProtectionOption options for creating a branch protection
+//
+// swagger:model CreateBranchProtectionOption
+type CreateBranchProtectionOption struct {
+
+	// approvals whitelist teams
+	ApprovalsWhitelistTeams []string `json:"approvals_whitelist_teams"`
+
+	// approvals whitelist usernames
+	ApprovalsWhitelistUsernames []string `json:"approvals_whitelist_username"`
+
+	// block on official review requests
+	BlockOnOfficialReviewRequests bool `json:"block_on_official_review_requests,omitempty"`
+
+	// block on outdated branch
+	BlockOnOutdatedBranch bool `json:"block_on_outdated_branch,omitempty"`
+
+	// block on rejected reviews
+	BlockOnRejectedReviews bool `json:"block_on_rejected_reviews,omitempty"`
+
+	// Deprecated: true
+	BranchName string `json:"branch_name,omitempty"`
+
+	// dismiss stale approvals
+	DismissStaleApprovals bool `json:"dismiss_stale_approvals,omitempty"`
+
+	// enable approvals whitelist
+	EnableApprovalsWhitelist bool `json:"enable_approvals_whitelist,omitempty"`
+
+	// enable merge whitelist
+	EnableMergeWhitelist bool `json:"enable_merge_whitelist,omitempty"`
+
+	// enable push
+	EnablePush bool `json:"enable_push,omitempty"`
+
+	// enable push whitelist
+	EnablePushWhitelist bool `json:"enable_push_whitelist,omitempty"`
+
+	// enable status check
+	EnableStatusCheck bool `json:"enable_status_check,omitempty"`
+
+	// ignore stale approvals
+	IgnoreStaleApprovals bool `json:"ignore_stale_approvals,omitempty"`
+
+	// merge whitelist teams
+	MergeWhitelistTeams []string `json:"merge_whitelist_teams"`
+
+	// merge whitelist usernames
+	MergeWhitelistUsernames []string `json:"merge_whitelist_usernames"`
+
+	// protected file patterns
+	ProtectedFilePatterns string `json:"protected_file_patterns,omitempty"`
+
+	// push whitelist deploy keys
+	PushWhitelistDeployKeys bool `json:"push_whitelist_deploy_keys,omitempty"`
+
+	// push whitelist teams
+	PushWhitelistTeams []string `json:"push_whitelist_teams"`
+
+	// push whitelist usernames
+	PushWhitelistUsernames []string `json:"push_whitelist_usernames"`
+
+	// require signed commits
+	RequireSignedCommits bool `json:"require_signed_commits,omitempty"`
+
+	// required approvals
+	RequiredApprovals int64 `json:"required_approvals,omitempty"`
+
+	// rule name
+	RuleName string `json:"rule_name,omitempty"`
+
+	// status check contexts
+	StatusCheckContexts []string `json:"status_check_contexts"`
+
+	// unprotected file patterns
+	UnprotectedFilePatterns string `json:"unprotected_file_patterns,omitempty"`
+}
+
+// Validate validates this create branch protection option
+func (m *CreateBranchProtectionOption) Validate(formats strfmt.Registry) error {
+	return nil
+}
+
+// ContextValidate validates this create branch protection option based on context it is used
+func (m *CreateBranchProtectionOption) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *CreateBranchProtectionOption) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *CreateBranchProtectionOption) UnmarshalBinary(b []byte) error {
+	var res CreateBranchProtectionOption
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/create_branch_repo_option.go b/bots-common/gitea-generated/models/create_branch_repo_option.go
new file mode 100644
index 0000000..9ad4436
--- /dev/null
+++ b/bots-common/gitea-generated/models/create_branch_repo_option.go
@@ -0,0 +1,78 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+	"github.com/go-openapi/validate"
+)
+
+// CreateBranchRepoOption CreateBranchRepoOption options when creating a branch in a repository
+//
+// swagger:model CreateBranchRepoOption
+type CreateBranchRepoOption struct {
+
+	// Name of the branch to create
+	// Required: true
+	BranchName *string `json:"new_branch_name"`
+
+	// Deprecated: true
+	// Name of the old branch to create from
+	OldBranchName string `json:"old_branch_name,omitempty"`
+
+	// Name of the old branch/tag/commit to create from
+	OldRefName string `json:"old_ref_name,omitempty"`
+}
+
+// Validate validates this create branch repo option
+func (m *CreateBranchRepoOption) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateBranchName(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *CreateBranchRepoOption) validateBranchName(formats strfmt.Registry) error {
+
+	if err := validate.Required("new_branch_name", "body", m.BranchName); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+// ContextValidate validates this create branch repo option based on context it is used
+func (m *CreateBranchRepoOption) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *CreateBranchRepoOption) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *CreateBranchRepoOption) UnmarshalBinary(b []byte) error {
+	var res CreateBranchRepoOption
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/create_email_option.go b/bots-common/gitea-generated/models/create_email_option.go
new file mode 100644
index 0000000..7918c4d
--- /dev/null
+++ b/bots-common/gitea-generated/models/create_email_option.go
@@ -0,0 +1,50 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// CreateEmailOption CreateEmailOption options when creating email addresses
+//
+// swagger:model CreateEmailOption
+type CreateEmailOption struct {
+
+	// email addresses to add
+	Emails []string `json:"emails"`
+}
+
+// Validate validates this create email option
+func (m *CreateEmailOption) Validate(formats strfmt.Registry) error {
+	return nil
+}
+
+// ContextValidate validates this create email option based on context it is used
+func (m *CreateEmailOption) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *CreateEmailOption) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *CreateEmailOption) UnmarshalBinary(b []byte) error {
+	var res CreateEmailOption
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/create_file_options.go b/bots-common/gitea-generated/models/create_file_options.go
new file mode 100644
index 0000000..8034dc1
--- /dev/null
+++ b/bots-common/gitea-generated/models/create_file_options.go
@@ -0,0 +1,242 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+	"github.com/go-openapi/validate"
+)
+
+// CreateFileOptions CreateFileOptions options for creating files
+// Note: `author` and `committer` are optional (if only one is given, it will be used for the other, otherwise the authenticated user will be used)
+//
+// swagger:model CreateFileOptions
+type CreateFileOptions struct {
+
+	// branch (optional) to base this file from. if not given, the default branch is used
+	BranchName string `json:"branch,omitempty"`
+
+	// content must be base64 encoded
+	// Required: true
+	ContentBase64 *string `json:"content"`
+
+	// message (optional) for the commit of this file. if not supplied, a default message will be used
+	Message string `json:"message,omitempty"`
+
+	// new_branch (optional) will make a new branch from `branch` before creating the file
+	NewBranchName string `json:"new_branch,omitempty"`
+
+	// Add a Signed-off-by trailer by the committer at the end of the commit log message.
+	Signoff bool `json:"signoff,omitempty"`
+
+	// author
+	Author *Identity `json:"author,omitempty"`
+
+	// committer
+	Committer *Identity `json:"committer,omitempty"`
+
+	// dates
+	Dates *CommitDateOptions `json:"dates,omitempty"`
+}
+
+// Validate validates this create file options
+func (m *CreateFileOptions) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateContentBase64(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateAuthor(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateCommitter(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateDates(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *CreateFileOptions) validateContentBase64(formats strfmt.Registry) error {
+
+	if err := validate.Required("content", "body", m.ContentBase64); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (m *CreateFileOptions) validateAuthor(formats strfmt.Registry) error {
+	if swag.IsZero(m.Author) { // not required
+		return nil
+	}
+
+	if m.Author != nil {
+		if err := m.Author.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("author")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("author")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *CreateFileOptions) validateCommitter(formats strfmt.Registry) error {
+	if swag.IsZero(m.Committer) { // not required
+		return nil
+	}
+
+	if m.Committer != nil {
+		if err := m.Committer.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("committer")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("committer")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *CreateFileOptions) validateDates(formats strfmt.Registry) error {
+	if swag.IsZero(m.Dates) { // not required
+		return nil
+	}
+
+	if m.Dates != nil {
+		if err := m.Dates.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("dates")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("dates")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+// ContextValidate validate this create file options based on the context it is used
+func (m *CreateFileOptions) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.contextValidateAuthor(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.contextValidateCommitter(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.contextValidateDates(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *CreateFileOptions) contextValidateAuthor(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.Author != nil {
+
+		if swag.IsZero(m.Author) { // not required
+			return nil
+		}
+
+		if err := m.Author.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("author")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("author")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *CreateFileOptions) contextValidateCommitter(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.Committer != nil {
+
+		if swag.IsZero(m.Committer) { // not required
+			return nil
+		}
+
+		if err := m.Committer.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("committer")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("committer")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *CreateFileOptions) contextValidateDates(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.Dates != nil {
+
+		if swag.IsZero(m.Dates) { // not required
+			return nil
+		}
+
+		if err := m.Dates.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("dates")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("dates")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *CreateFileOptions) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *CreateFileOptions) UnmarshalBinary(b []byte) error {
+	var res CreateFileOptions
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/create_fork_option.go b/bots-common/gitea-generated/models/create_fork_option.go
new file mode 100644
index 0000000..1eb09be
--- /dev/null
+++ b/bots-common/gitea-generated/models/create_fork_option.go
@@ -0,0 +1,53 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// CreateForkOption CreateForkOption options for creating a fork
+//
+// swagger:model CreateForkOption
+type CreateForkOption struct {
+
+	// name of the forked repository
+	Name string `json:"name,omitempty"`
+
+	// organization name, if forking into an organization
+	Organization string `json:"organization,omitempty"`
+}
+
+// Validate validates this create fork option
+func (m *CreateForkOption) Validate(formats strfmt.Registry) error {
+	return nil
+}
+
+// ContextValidate validates this create fork option based on context it is used
+func (m *CreateForkOption) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *CreateForkOption) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *CreateForkOption) UnmarshalBinary(b []byte) error {
+	var res CreateForkOption
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/create_g_p_g_key_option.go b/bots-common/gitea-generated/models/create_g_p_g_key_option.go
new file mode 100644
index 0000000..4c6d980
--- /dev/null
+++ b/bots-common/gitea-generated/models/create_g_p_g_key_option.go
@@ -0,0 +1,74 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+	"github.com/go-openapi/validate"
+)
+
+// CreateGPGKeyOption CreateGPGKeyOption options create user GPG key
+//
+// swagger:model CreateGPGKeyOption
+type CreateGPGKeyOption struct {
+
+	// An armored GPG key to add
+	// Required: true
+	ArmoredKey *string `json:"armored_public_key"`
+
+	// signature
+	Signature string `json:"armored_signature,omitempty"`
+}
+
+// Validate validates this create g p g key option
+func (m *CreateGPGKeyOption) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateArmoredKey(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *CreateGPGKeyOption) validateArmoredKey(formats strfmt.Registry) error {
+
+	if err := validate.Required("armored_public_key", "body", m.ArmoredKey); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+// ContextValidate validates this create g p g key option based on context it is used
+func (m *CreateGPGKeyOption) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *CreateGPGKeyOption) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *CreateGPGKeyOption) UnmarshalBinary(b []byte) error {
+	var res CreateGPGKeyOption
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/create_hook_option.go b/bots-common/gitea-generated/models/create_hook_option.go
new file mode 100644
index 0000000..faadce7
--- /dev/null
+++ b/bots-common/gitea-generated/models/create_hook_option.go
@@ -0,0 +1,194 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"encoding/json"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+	"github.com/go-openapi/validate"
+)
+
+// CreateHookOption CreateHookOption options when create a hook
+//
+// swagger:model CreateHookOption
+type CreateHookOption struct {
+
+	// active
+	Active *bool `json:"active,omitempty"`
+
+	// authorization header
+	AuthorizationHeader string `json:"authorization_header,omitempty"`
+
+	// branch filter
+	BranchFilter string `json:"branch_filter,omitempty"`
+
+	// events
+	Events []string `json:"events"`
+
+	// type
+	// Required: true
+	// Enum: ["dingtalk","discord","gitea","gogs","msteams","slack","telegram","feishu","wechatwork","packagist"]
+	Type *string `json:"type"`
+
+	// config
+	// Required: true
+	Config CreateHookOptionConfig `json:"config"`
+}
+
+// Validate validates this create hook option
+func (m *CreateHookOption) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateType(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateConfig(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+var createHookOptionTypeTypePropEnum []interface{}
+
+func init() {
+	var res []string
+	if err := json.Unmarshal([]byte(`["dingtalk","discord","gitea","gogs","msteams","slack","telegram","feishu","wechatwork","packagist"]`), &res); err != nil {
+		panic(err)
+	}
+	for _, v := range res {
+		createHookOptionTypeTypePropEnum = append(createHookOptionTypeTypePropEnum, v)
+	}
+}
+
+const (
+
+	// CreateHookOptionTypeDingtalk captures enum value "dingtalk"
+	CreateHookOptionTypeDingtalk string = "dingtalk"
+
+	// CreateHookOptionTypeDiscord captures enum value "discord"
+	CreateHookOptionTypeDiscord string = "discord"
+
+	// CreateHookOptionTypeGitea captures enum value "gitea"
+	CreateHookOptionTypeGitea string = "gitea"
+
+	// CreateHookOptionTypeGogs captures enum value "gogs"
+	CreateHookOptionTypeGogs string = "gogs"
+
+	// CreateHookOptionTypeMsteams captures enum value "msteams"
+	CreateHookOptionTypeMsteams string = "msteams"
+
+	// CreateHookOptionTypeSlack captures enum value "slack"
+	CreateHookOptionTypeSlack string = "slack"
+
+	// CreateHookOptionTypeTelegram captures enum value "telegram"
+	CreateHookOptionTypeTelegram string = "telegram"
+
+	// CreateHookOptionTypeFeishu captures enum value "feishu"
+	CreateHookOptionTypeFeishu string = "feishu"
+
+	// CreateHookOptionTypeWechatwork captures enum value "wechatwork"
+	CreateHookOptionTypeWechatwork string = "wechatwork"
+
+	// CreateHookOptionTypePackagist captures enum value "packagist"
+	CreateHookOptionTypePackagist string = "packagist"
+)
+
+// prop value enum
+func (m *CreateHookOption) validateTypeEnum(path, location string, value string) error {
+	if err := validate.EnumCase(path, location, value, createHookOptionTypeTypePropEnum, true); err != nil {
+		return err
+	}
+	return nil
+}
+
+func (m *CreateHookOption) validateType(formats strfmt.Registry) error {
+
+	if err := validate.Required("type", "body", m.Type); err != nil {
+		return err
+	}
+
+	// value enum
+	if err := m.validateTypeEnum("type", "body", *m.Type); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (m *CreateHookOption) validateConfig(formats strfmt.Registry) error {
+
+	if err := validate.Required("config", "body", m.Config); err != nil {
+		return err
+	}
+
+	if m.Config != nil {
+		if err := m.Config.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("config")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("config")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+// ContextValidate validate this create hook option based on the context it is used
+func (m *CreateHookOption) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.contextValidateConfig(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *CreateHookOption) contextValidateConfig(ctx context.Context, formats strfmt.Registry) error {
+
+	if err := m.Config.ContextValidate(ctx, formats); err != nil {
+		if ve, ok := err.(*errors.Validation); ok {
+			return ve.ValidateName("config")
+		} else if ce, ok := err.(*errors.CompositeError); ok {
+			return ce.ValidateName("config")
+		}
+		return err
+	}
+
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *CreateHookOption) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *CreateHookOption) UnmarshalBinary(b []byte) error {
+	var res CreateHookOption
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/create_hook_option_config.go b/bots-common/gitea-generated/models/create_hook_option_config.go
new file mode 100644
index 0000000..ff2e59a
--- /dev/null
+++ b/bots-common/gitea-generated/models/create_hook_option_config.go
@@ -0,0 +1,28 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/strfmt"
+)
+
+// CreateHookOptionConfig CreateHookOptionConfig has all config options in it
+// required are "content_type" and "url" Required
+//
+// swagger:model CreateHookOptionConfig
+type CreateHookOptionConfig map[string]string
+
+// Validate validates this create hook option config
+func (m CreateHookOptionConfig) Validate(formats strfmt.Registry) error {
+	return nil
+}
+
+// ContextValidate validates this create hook option config based on context it is used
+func (m CreateHookOptionConfig) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/create_issue_comment_option.go b/bots-common/gitea-generated/models/create_issue_comment_option.go
new file mode 100644
index 0000000..8042130
--- /dev/null
+++ b/bots-common/gitea-generated/models/create_issue_comment_option.go
@@ -0,0 +1,71 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+	"github.com/go-openapi/validate"
+)
+
+// CreateIssueCommentOption CreateIssueCommentOption options for creating a comment on an issue
+//
+// swagger:model CreateIssueCommentOption
+type CreateIssueCommentOption struct {
+
+	// body
+	// Required: true
+	Body *string `json:"body"`
+}
+
+// Validate validates this create issue comment option
+func (m *CreateIssueCommentOption) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateBody(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *CreateIssueCommentOption) validateBody(formats strfmt.Registry) error {
+
+	if err := validate.Required("body", "body", m.Body); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+// ContextValidate validates this create issue comment option based on context it is used
+func (m *CreateIssueCommentOption) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *CreateIssueCommentOption) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *CreateIssueCommentOption) UnmarshalBinary(b []byte) error {
+	var res CreateIssueCommentOption
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/create_issue_option.go b/bots-common/gitea-generated/models/create_issue_option.go
new file mode 100644
index 0000000..1bcabe2
--- /dev/null
+++ b/bots-common/gitea-generated/models/create_issue_option.go
@@ -0,0 +1,112 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+	"github.com/go-openapi/validate"
+)
+
+// CreateIssueOption CreateIssueOption options to create one issue
+//
+// swagger:model CreateIssueOption
+type CreateIssueOption struct {
+
+	// deprecated
+	Assignee string `json:"assignee,omitempty"`
+
+	// assignees
+	Assignees []string `json:"assignees"`
+
+	// body
+	Body string `json:"body,omitempty"`
+
+	// closed
+	Closed bool `json:"closed,omitempty"`
+
+	// deadline
+	// Format: date-time
+	Deadline strfmt.DateTime `json:"due_date,omitempty"`
+
+	// list of label ids
+	Labels []int64 `json:"labels"`
+
+	// milestone id
+	Milestone int64 `json:"milestone,omitempty"`
+
+	// ref
+	Ref string `json:"ref,omitempty"`
+
+	// title
+	// Required: true
+	Title *string `json:"title"`
+}
+
+// Validate validates this create issue option
+func (m *CreateIssueOption) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateDeadline(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateTitle(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *CreateIssueOption) validateDeadline(formats strfmt.Registry) error {
+	if swag.IsZero(m.Deadline) { // not required
+		return nil
+	}
+
+	if err := validate.FormatOf("due_date", "body", "date-time", m.Deadline.String(), formats); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (m *CreateIssueOption) validateTitle(formats strfmt.Registry) error {
+
+	if err := validate.Required("title", "body", m.Title); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+// ContextValidate validates this create issue option based on context it is used
+func (m *CreateIssueOption) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *CreateIssueOption) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *CreateIssueOption) UnmarshalBinary(b []byte) error {
+	var res CreateIssueOption
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/create_key_option.go b/bots-common/gitea-generated/models/create_key_option.go
new file mode 100644
index 0000000..5101da8
--- /dev/null
+++ b/bots-common/gitea-generated/models/create_key_option.go
@@ -0,0 +1,91 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+	"github.com/go-openapi/validate"
+)
+
+// CreateKeyOption CreateKeyOption options when creating a key
+//
+// swagger:model CreateKeyOption
+type CreateKeyOption struct {
+
+	// An armored SSH key to add
+	// Required: true
+	Key *string `json:"key"`
+
+	// Describe if the key has only read access or read/write
+	ReadOnly bool `json:"read_only,omitempty"`
+
+	// Title of the key to add
+	// Required: true
+	Title *string `json:"title"`
+}
+
+// Validate validates this create key option
+func (m *CreateKeyOption) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateKey(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateTitle(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *CreateKeyOption) validateKey(formats strfmt.Registry) error {
+
+	if err := validate.Required("key", "body", m.Key); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (m *CreateKeyOption) validateTitle(formats strfmt.Registry) error {
+
+	if err := validate.Required("title", "body", m.Title); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+// ContextValidate validates this create key option based on context it is used
+func (m *CreateKeyOption) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *CreateKeyOption) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *CreateKeyOption) UnmarshalBinary(b []byte) error {
+	var res CreateKeyOption
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/create_label_option.go b/bots-common/gitea-generated/models/create_label_option.go
new file mode 100644
index 0000000..fb485ef
--- /dev/null
+++ b/bots-common/gitea-generated/models/create_label_option.go
@@ -0,0 +1,100 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+	"github.com/go-openapi/validate"
+)
+
+// CreateLabelOption CreateLabelOption options for creating a label
+//
+// swagger:model CreateLabelOption
+type CreateLabelOption struct {
+
+	// color
+	// Example: #00aabb
+	// Required: true
+	Color *string `json:"color"`
+
+	// description
+	Description string `json:"description,omitempty"`
+
+	// exclusive
+	// Example: false
+	Exclusive bool `json:"exclusive,omitempty"`
+
+	// is archived
+	// Example: false
+	IsArchived bool `json:"is_archived,omitempty"`
+
+	// name
+	// Required: true
+	Name *string `json:"name"`
+}
+
+// Validate validates this create label option
+func (m *CreateLabelOption) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateColor(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateName(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *CreateLabelOption) validateColor(formats strfmt.Registry) error {
+
+	if err := validate.Required("color", "body", m.Color); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (m *CreateLabelOption) validateName(formats strfmt.Registry) error {
+
+	if err := validate.Required("name", "body", m.Name); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+// ContextValidate validates this create label option based on context it is used
+func (m *CreateLabelOption) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *CreateLabelOption) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *CreateLabelOption) UnmarshalBinary(b []byte) error {
+	var res CreateLabelOption
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/create_milestone_option.go b/bots-common/gitea-generated/models/create_milestone_option.go
new file mode 100644
index 0000000..e42412f
--- /dev/null
+++ b/bots-common/gitea-generated/models/create_milestone_option.go
@@ -0,0 +1,131 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"encoding/json"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+	"github.com/go-openapi/validate"
+)
+
+// CreateMilestoneOption CreateMilestoneOption options for creating a milestone
+//
+// swagger:model CreateMilestoneOption
+type CreateMilestoneOption struct {
+
+	// deadline
+	// Format: date-time
+	Deadline strfmt.DateTime `json:"due_on,omitempty"`
+
+	// description
+	Description string `json:"description,omitempty"`
+
+	// state
+	// Enum: ["open","closed"]
+	State string `json:"state,omitempty"`
+
+	// title
+	Title string `json:"title,omitempty"`
+}
+
+// Validate validates this create milestone option
+func (m *CreateMilestoneOption) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateDeadline(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateState(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *CreateMilestoneOption) validateDeadline(formats strfmt.Registry) error {
+	if swag.IsZero(m.Deadline) { // not required
+		return nil
+	}
+
+	if err := validate.FormatOf("due_on", "body", "date-time", m.Deadline.String(), formats); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+var createMilestoneOptionTypeStatePropEnum []interface{}
+
+func init() {
+	var res []string
+	if err := json.Unmarshal([]byte(`["open","closed"]`), &res); err != nil {
+		panic(err)
+	}
+	for _, v := range res {
+		createMilestoneOptionTypeStatePropEnum = append(createMilestoneOptionTypeStatePropEnum, v)
+	}
+}
+
+const (
+
+	// CreateMilestoneOptionStateOpen captures enum value "open"
+	CreateMilestoneOptionStateOpen string = "open"
+
+	// CreateMilestoneOptionStateClosed captures enum value "closed"
+	CreateMilestoneOptionStateClosed string = "closed"
+)
+
+// prop value enum
+func (m *CreateMilestoneOption) validateStateEnum(path, location string, value string) error {
+	if err := validate.EnumCase(path, location, value, createMilestoneOptionTypeStatePropEnum, true); err != nil {
+		return err
+	}
+	return nil
+}
+
+func (m *CreateMilestoneOption) validateState(formats strfmt.Registry) error {
+	if swag.IsZero(m.State) { // not required
+		return nil
+	}
+
+	// value enum
+	if err := m.validateStateEnum("state", "body", m.State); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+// ContextValidate validates this create milestone option based on context it is used
+func (m *CreateMilestoneOption) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *CreateMilestoneOption) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *CreateMilestoneOption) UnmarshalBinary(b []byte) error {
+	var res CreateMilestoneOption
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/create_o_auth2_application_options.go b/bots-common/gitea-generated/models/create_o_auth2_application_options.go
new file mode 100644
index 0000000..546882a
--- /dev/null
+++ b/bots-common/gitea-generated/models/create_o_auth2_application_options.go
@@ -0,0 +1,56 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// CreateOAuth2ApplicationOptions CreateOAuth2ApplicationOptions holds options to create an oauth2 application
+//
+// swagger:model CreateOAuth2ApplicationOptions
+type CreateOAuth2ApplicationOptions struct {
+
+	// confidential client
+	ConfidentialClient bool `json:"confidential_client,omitempty"`
+
+	// name
+	Name string `json:"name,omitempty"`
+
+	// redirect u r is
+	RedirectURIs []string `json:"redirect_uris"`
+}
+
+// Validate validates this create o auth2 application options
+func (m *CreateOAuth2ApplicationOptions) Validate(formats strfmt.Registry) error {
+	return nil
+}
+
+// ContextValidate validates this create o auth2 application options based on context it is used
+func (m *CreateOAuth2ApplicationOptions) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *CreateOAuth2ApplicationOptions) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *CreateOAuth2ApplicationOptions) UnmarshalBinary(b []byte) error {
+	var res CreateOAuth2ApplicationOptions
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/create_or_update_secret_option.go b/bots-common/gitea-generated/models/create_or_update_secret_option.go
new file mode 100644
index 0000000..3f6773f
--- /dev/null
+++ b/bots-common/gitea-generated/models/create_or_update_secret_option.go
@@ -0,0 +1,71 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+	"github.com/go-openapi/validate"
+)
+
+// CreateOrUpdateSecretOption CreateOrUpdateSecretOption options when creating or updating secret
+//
+// swagger:model CreateOrUpdateSecretOption
+type CreateOrUpdateSecretOption struct {
+
+	// Data of the secret to update
+	// Required: true
+	Data *string `json:"data"`
+}
+
+// Validate validates this create or update secret option
+func (m *CreateOrUpdateSecretOption) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateData(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *CreateOrUpdateSecretOption) validateData(formats strfmt.Registry) error {
+
+	if err := validate.Required("data", "body", m.Data); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+// ContextValidate validates this create or update secret option based on context it is used
+func (m *CreateOrUpdateSecretOption) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *CreateOrUpdateSecretOption) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *CreateOrUpdateSecretOption) UnmarshalBinary(b []byte) error {
+	var res CreateOrUpdateSecretOption
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/create_org_option.go b/bots-common/gitea-generated/models/create_org_option.go
new file mode 100644
index 0000000..142cac7
--- /dev/null
+++ b/bots-common/gitea-generated/models/create_org_option.go
@@ -0,0 +1,143 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"encoding/json"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+	"github.com/go-openapi/validate"
+)
+
+// CreateOrgOption CreateOrgOption options for creating an organization
+//
+// swagger:model CreateOrgOption
+type CreateOrgOption struct {
+
+	// description
+	Description string `json:"description,omitempty"`
+
+	// email
+	Email string `json:"email,omitempty"`
+
+	// full name
+	FullName string `json:"full_name,omitempty"`
+
+	// location
+	Location string `json:"location,omitempty"`
+
+	// repo admin change team access
+	RepoAdminChangeTeamAccess bool `json:"repo_admin_change_team_access,omitempty"`
+
+	// user name
+	// Required: true
+	UserName *string `json:"username"`
+
+	// possible values are `public` (default), `limited` or `private`
+	// Enum: ["public","limited","private"]
+	Visibility string `json:"visibility,omitempty"`
+
+	// website
+	Website string `json:"website,omitempty"`
+}
+
+// Validate validates this create org option
+func (m *CreateOrgOption) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateUserName(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateVisibility(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *CreateOrgOption) validateUserName(formats strfmt.Registry) error {
+
+	if err := validate.Required("username", "body", m.UserName); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+var createOrgOptionTypeVisibilityPropEnum []interface{}
+
+func init() {
+	var res []string
+	if err := json.Unmarshal([]byte(`["public","limited","private"]`), &res); err != nil {
+		panic(err)
+	}
+	for _, v := range res {
+		createOrgOptionTypeVisibilityPropEnum = append(createOrgOptionTypeVisibilityPropEnum, v)
+	}
+}
+
+const (
+
+	// CreateOrgOptionVisibilityPublic captures enum value "public"
+	CreateOrgOptionVisibilityPublic string = "public"
+
+	// CreateOrgOptionVisibilityLimited captures enum value "limited"
+	CreateOrgOptionVisibilityLimited string = "limited"
+
+	// CreateOrgOptionVisibilityPrivate captures enum value "private"
+	CreateOrgOptionVisibilityPrivate string = "private"
+)
+
+// prop value enum
+func (m *CreateOrgOption) validateVisibilityEnum(path, location string, value string) error {
+	if err := validate.EnumCase(path, location, value, createOrgOptionTypeVisibilityPropEnum, true); err != nil {
+		return err
+	}
+	return nil
+}
+
+func (m *CreateOrgOption) validateVisibility(formats strfmt.Registry) error {
+	if swag.IsZero(m.Visibility) { // not required
+		return nil
+	}
+
+	// value enum
+	if err := m.validateVisibilityEnum("visibility", "body", m.Visibility); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+// ContextValidate validates this create org option based on context it is used
+func (m *CreateOrgOption) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *CreateOrgOption) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *CreateOrgOption) UnmarshalBinary(b []byte) error {
+	var res CreateOrgOption
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/create_pull_request_option.go b/bots-common/gitea-generated/models/create_pull_request_option.go
new file mode 100644
index 0000000..9b63dd1
--- /dev/null
+++ b/bots-common/gitea-generated/models/create_pull_request_option.go
@@ -0,0 +1,98 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+	"github.com/go-openapi/validate"
+)
+
+// CreatePullRequestOption CreatePullRequestOption options when creating a pull request
+//
+// swagger:model CreatePullRequestOption
+type CreatePullRequestOption struct {
+
+	// assignee
+	Assignee string `json:"assignee,omitempty"`
+
+	// assignees
+	Assignees []string `json:"assignees"`
+
+	// base
+	Base string `json:"base,omitempty"`
+
+	// body
+	Body string `json:"body,omitempty"`
+
+	// deadline
+	// Format: date-time
+	Deadline strfmt.DateTime `json:"due_date,omitempty"`
+
+	// head
+	Head string `json:"head,omitempty"`
+
+	// labels
+	Labels []int64 `json:"labels"`
+
+	// milestone
+	Milestone int64 `json:"milestone,omitempty"`
+
+	// title
+	Title string `json:"title,omitempty"`
+}
+
+// Validate validates this create pull request option
+func (m *CreatePullRequestOption) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateDeadline(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *CreatePullRequestOption) validateDeadline(formats strfmt.Registry) error {
+	if swag.IsZero(m.Deadline) { // not required
+		return nil
+	}
+
+	if err := validate.FormatOf("due_date", "body", "date-time", m.Deadline.String(), formats); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+// ContextValidate validates this create pull request option based on context it is used
+func (m *CreatePullRequestOption) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *CreatePullRequestOption) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *CreatePullRequestOption) UnmarshalBinary(b []byte) error {
+	var res CreatePullRequestOption
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/create_pull_review_comment.go b/bots-common/gitea-generated/models/create_pull_review_comment.go
new file mode 100644
index 0000000..c3f55d7
--- /dev/null
+++ b/bots-common/gitea-generated/models/create_pull_review_comment.go
@@ -0,0 +1,59 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// CreatePullReviewComment CreatePullReviewComment represent a review comment for creation api
+//
+// swagger:model CreatePullReviewComment
+type CreatePullReviewComment struct {
+
+	// body
+	Body string `json:"body,omitempty"`
+
+	// if comment to new file line or 0
+	NewLineNum int64 `json:"new_position,omitempty"`
+
+	// if comment to old file line or 0
+	OldLineNum int64 `json:"old_position,omitempty"`
+
+	// the tree path
+	Path string `json:"path,omitempty"`
+}
+
+// Validate validates this create pull review comment
+func (m *CreatePullReviewComment) Validate(formats strfmt.Registry) error {
+	return nil
+}
+
+// ContextValidate validates this create pull review comment based on context it is used
+func (m *CreatePullReviewComment) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *CreatePullReviewComment) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *CreatePullReviewComment) UnmarshalBinary(b []byte) error {
+	var res CreatePullReviewComment
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/create_pull_review_options.go b/bots-common/gitea-generated/models/create_pull_review_options.go
new file mode 100644
index 0000000..aec9779
--- /dev/null
+++ b/bots-common/gitea-generated/models/create_pull_review_options.go
@@ -0,0 +1,173 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"strconv"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// CreatePullReviewOptions CreatePullReviewOptions are options to create a pull review
+//
+// swagger:model CreatePullReviewOptions
+type CreatePullReviewOptions struct {
+
+	// body
+	Body string `json:"body,omitempty"`
+
+	// comments
+	Comments []*CreatePullReviewComment `json:"comments"`
+
+	// commit ID
+	CommitID string `json:"commit_id,omitempty"`
+
+	// event
+	Event ReviewStateType `json:"event,omitempty"`
+}
+
+// Validate validates this create pull review options
+func (m *CreatePullReviewOptions) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateComments(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateEvent(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *CreatePullReviewOptions) validateComments(formats strfmt.Registry) error {
+	if swag.IsZero(m.Comments) { // not required
+		return nil
+	}
+
+	for i := 0; i < len(m.Comments); i++ {
+		if swag.IsZero(m.Comments[i]) { // not required
+			continue
+		}
+
+		if m.Comments[i] != nil {
+			if err := m.Comments[i].Validate(formats); err != nil {
+				if ve, ok := err.(*errors.Validation); ok {
+					return ve.ValidateName("comments" + "." + strconv.Itoa(i))
+				} else if ce, ok := err.(*errors.CompositeError); ok {
+					return ce.ValidateName("comments" + "." + strconv.Itoa(i))
+				}
+				return err
+			}
+		}
+
+	}
+
+	return nil
+}
+
+func (m *CreatePullReviewOptions) validateEvent(formats strfmt.Registry) error {
+	if swag.IsZero(m.Event) { // not required
+		return nil
+	}
+
+	if err := m.Event.Validate(formats); err != nil {
+		if ve, ok := err.(*errors.Validation); ok {
+			return ve.ValidateName("event")
+		} else if ce, ok := err.(*errors.CompositeError); ok {
+			return ce.ValidateName("event")
+		}
+		return err
+	}
+
+	return nil
+}
+
+// ContextValidate validate this create pull review options based on the context it is used
+func (m *CreatePullReviewOptions) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.contextValidateComments(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.contextValidateEvent(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *CreatePullReviewOptions) contextValidateComments(ctx context.Context, formats strfmt.Registry) error {
+
+	for i := 0; i < len(m.Comments); i++ {
+
+		if m.Comments[i] != nil {
+
+			if swag.IsZero(m.Comments[i]) { // not required
+				return nil
+			}
+
+			if err := m.Comments[i].ContextValidate(ctx, formats); err != nil {
+				if ve, ok := err.(*errors.Validation); ok {
+					return ve.ValidateName("comments" + "." + strconv.Itoa(i))
+				} else if ce, ok := err.(*errors.CompositeError); ok {
+					return ce.ValidateName("comments" + "." + strconv.Itoa(i))
+				}
+				return err
+			}
+		}
+
+	}
+
+	return nil
+}
+
+func (m *CreatePullReviewOptions) contextValidateEvent(ctx context.Context, formats strfmt.Registry) error {
+
+	if swag.IsZero(m.Event) { // not required
+		return nil
+	}
+
+	if err := m.Event.ContextValidate(ctx, formats); err != nil {
+		if ve, ok := err.(*errors.Validation); ok {
+			return ve.ValidateName("event")
+		} else if ce, ok := err.(*errors.CompositeError); ok {
+			return ce.ValidateName("event")
+		}
+		return err
+	}
+
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *CreatePullReviewOptions) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *CreatePullReviewOptions) UnmarshalBinary(b []byte) error {
+	var res CreatePullReviewOptions
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/create_push_mirror_option.go b/bots-common/gitea-generated/models/create_push_mirror_option.go
new file mode 100644
index 0000000..fcd1244
--- /dev/null
+++ b/bots-common/gitea-generated/models/create_push_mirror_option.go
@@ -0,0 +1,62 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// CreatePushMirrorOption CreatePushMirrorOption represents need information to create a push mirror of a repository.
+//
+// swagger:model CreatePushMirrorOption
+type CreatePushMirrorOption struct {
+
+	// interval
+	Interval string `json:"interval,omitempty"`
+
+	// remote address
+	RemoteAddress string `json:"remote_address,omitempty"`
+
+	// remote password
+	RemotePassword string `json:"remote_password,omitempty"`
+
+	// remote username
+	RemoteUsername string `json:"remote_username,omitempty"`
+
+	// sync on commit
+	SyncOnCommit bool `json:"sync_on_commit,omitempty"`
+}
+
+// Validate validates this create push mirror option
+func (m *CreatePushMirrorOption) Validate(formats strfmt.Registry) error {
+	return nil
+}
+
+// ContextValidate validates this create push mirror option based on context it is used
+func (m *CreatePushMirrorOption) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *CreatePushMirrorOption) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *CreatePushMirrorOption) UnmarshalBinary(b []byte) error {
+	var res CreatePushMirrorOption
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/create_release_option.go b/bots-common/gitea-generated/models/create_release_option.go
new file mode 100644
index 0000000..bee0d4c
--- /dev/null
+++ b/bots-common/gitea-generated/models/create_release_option.go
@@ -0,0 +1,86 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+	"github.com/go-openapi/validate"
+)
+
+// CreateReleaseOption CreateReleaseOption options when creating a release
+//
+// swagger:model CreateReleaseOption
+type CreateReleaseOption struct {
+
+	// is draft
+	IsDraft bool `json:"draft,omitempty"`
+
+	// is prerelease
+	IsPrerelease bool `json:"prerelease,omitempty"`
+
+	// note
+	Note string `json:"body,omitempty"`
+
+	// tag name
+	// Required: true
+	TagName *string `json:"tag_name"`
+
+	// target
+	Target string `json:"target_commitish,omitempty"`
+
+	// title
+	Title string `json:"name,omitempty"`
+}
+
+// Validate validates this create release option
+func (m *CreateReleaseOption) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateTagName(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *CreateReleaseOption) validateTagName(formats strfmt.Registry) error {
+
+	if err := validate.Required("tag_name", "body", m.TagName); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+// ContextValidate validates this create release option based on context it is used
+func (m *CreateReleaseOption) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *CreateReleaseOption) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *CreateReleaseOption) UnmarshalBinary(b []byte) error {
+	var res CreateReleaseOption
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/create_repo_option.go b/bots-common/gitea-generated/models/create_repo_option.go
new file mode 100644
index 0000000..53e4fd1
--- /dev/null
+++ b/bots-common/gitea-generated/models/create_repo_option.go
@@ -0,0 +1,205 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"encoding/json"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+	"github.com/go-openapi/validate"
+)
+
+// CreateRepoOption CreateRepoOption options when creating repository
+//
+// swagger:model CreateRepoOption
+type CreateRepoOption struct {
+
+	// Whether the repository should be auto-initialized?
+	AutoInit bool `json:"auto_init,omitempty"`
+
+	// DefaultBranch of the repository (used when initializes and in template)
+	DefaultBranch string `json:"default_branch,omitempty"`
+
+	// Description of the repository to create
+	Description string `json:"description,omitempty"`
+
+	// Gitignores to use
+	Gitignores string `json:"gitignores,omitempty"`
+
+	// Label-Set to use
+	IssueLabels string `json:"issue_labels,omitempty"`
+
+	// License to use
+	License string `json:"license,omitempty"`
+
+	// Name of the repository to create
+	// Required: true
+	Name *string `json:"name"`
+
+	// ObjectFormatName of the underlying git repository
+	// Enum: ["sha1","sha256"]
+	ObjectFormatName string `json:"object_format_name,omitempty"`
+
+	// Whether the repository is private
+	Private bool `json:"private,omitempty"`
+
+	// Readme of the repository to create
+	Readme string `json:"readme,omitempty"`
+
+	// Whether the repository is template
+	Template bool `json:"template,omitempty"`
+
+	// TrustModel of the repository
+	// Enum: ["default","collaborator","committer","collaboratorcommitter"]
+	TrustModel string `json:"trust_model,omitempty"`
+}
+
+// Validate validates this create repo option
+func (m *CreateRepoOption) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateName(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateObjectFormatName(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateTrustModel(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *CreateRepoOption) validateName(formats strfmt.Registry) error {
+
+	if err := validate.Required("name", "body", m.Name); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+var createRepoOptionTypeObjectFormatNamePropEnum []interface{}
+
+func init() {
+	var res []string
+	if err := json.Unmarshal([]byte(`["sha1","sha256"]`), &res); err != nil {
+		panic(err)
+	}
+	for _, v := range res {
+		createRepoOptionTypeObjectFormatNamePropEnum = append(createRepoOptionTypeObjectFormatNamePropEnum, v)
+	}
+}
+
+const (
+
+	// CreateRepoOptionObjectFormatNameSha1 captures enum value "sha1"
+	CreateRepoOptionObjectFormatNameSha1 string = "sha1"
+
+	// CreateRepoOptionObjectFormatNameSha256 captures enum value "sha256"
+	CreateRepoOptionObjectFormatNameSha256 string = "sha256"
+)
+
+// prop value enum
+func (m *CreateRepoOption) validateObjectFormatNameEnum(path, location string, value string) error {
+	if err := validate.EnumCase(path, location, value, createRepoOptionTypeObjectFormatNamePropEnum, true); err != nil {
+		return err
+	}
+	return nil
+}
+
+func (m *CreateRepoOption) validateObjectFormatName(formats strfmt.Registry) error {
+	if swag.IsZero(m.ObjectFormatName) { // not required
+		return nil
+	}
+
+	// value enum
+	if err := m.validateObjectFormatNameEnum("object_format_name", "body", m.ObjectFormatName); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+var createRepoOptionTypeTrustModelPropEnum []interface{}
+
+func init() {
+	var res []string
+	if err := json.Unmarshal([]byte(`["default","collaborator","committer","collaboratorcommitter"]`), &res); err != nil {
+		panic(err)
+	}
+	for _, v := range res {
+		createRepoOptionTypeTrustModelPropEnum = append(createRepoOptionTypeTrustModelPropEnum, v)
+	}
+}
+
+const (
+
+	// CreateRepoOptionTrustModelDefault captures enum value "default"
+	CreateRepoOptionTrustModelDefault string = "default"
+
+	// CreateRepoOptionTrustModelCollaborator captures enum value "collaborator"
+	CreateRepoOptionTrustModelCollaborator string = "collaborator"
+
+	// CreateRepoOptionTrustModelCommitter captures enum value "committer"
+	CreateRepoOptionTrustModelCommitter string = "committer"
+
+	// CreateRepoOptionTrustModelCollaboratorcommitter captures enum value "collaboratorcommitter"
+	CreateRepoOptionTrustModelCollaboratorcommitter string = "collaboratorcommitter"
+)
+
+// prop value enum
+func (m *CreateRepoOption) validateTrustModelEnum(path, location string, value string) error {
+	if err := validate.EnumCase(path, location, value, createRepoOptionTypeTrustModelPropEnum, true); err != nil {
+		return err
+	}
+	return nil
+}
+
+func (m *CreateRepoOption) validateTrustModel(formats strfmt.Registry) error {
+	if swag.IsZero(m.TrustModel) { // not required
+		return nil
+	}
+
+	// value enum
+	if err := m.validateTrustModelEnum("trust_model", "body", m.TrustModel); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+// ContextValidate validates this create repo option based on context it is used
+func (m *CreateRepoOption) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *CreateRepoOption) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *CreateRepoOption) UnmarshalBinary(b []byte) error {
+	var res CreateRepoOption
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/create_status_option.go b/bots-common/gitea-generated/models/create_status_option.go
new file mode 100644
index 0000000..52edda7
--- /dev/null
+++ b/bots-common/gitea-generated/models/create_status_option.go
@@ -0,0 +1,113 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// CreateStatusOption CreateStatusOption holds the information needed to create a new CommitStatus for a Commit
+//
+// swagger:model CreateStatusOption
+type CreateStatusOption struct {
+
+	// context
+	Context string `json:"context,omitempty"`
+
+	// description
+	Description string `json:"description,omitempty"`
+
+	// target URL
+	TargetURL string `json:"target_url,omitempty"`
+
+	// state
+	State CommitStatusState `json:"state,omitempty"`
+}
+
+// Validate validates this create status option
+func (m *CreateStatusOption) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateState(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *CreateStatusOption) validateState(formats strfmt.Registry) error {
+	if swag.IsZero(m.State) { // not required
+		return nil
+	}
+
+	if err := m.State.Validate(formats); err != nil {
+		if ve, ok := err.(*errors.Validation); ok {
+			return ve.ValidateName("state")
+		} else if ce, ok := err.(*errors.CompositeError); ok {
+			return ce.ValidateName("state")
+		}
+		return err
+	}
+
+	return nil
+}
+
+// ContextValidate validate this create status option based on the context it is used
+func (m *CreateStatusOption) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.contextValidateState(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *CreateStatusOption) contextValidateState(ctx context.Context, formats strfmt.Registry) error {
+
+	if swag.IsZero(m.State) { // not required
+		return nil
+	}
+
+	if err := m.State.ContextValidate(ctx, formats); err != nil {
+		if ve, ok := err.(*errors.Validation); ok {
+			return ve.ValidateName("state")
+		} else if ce, ok := err.(*errors.CompositeError); ok {
+			return ce.ValidateName("state")
+		}
+		return err
+	}
+
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *CreateStatusOption) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *CreateStatusOption) UnmarshalBinary(b []byte) error {
+	var res CreateStatusOption
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/create_tag_option.go b/bots-common/gitea-generated/models/create_tag_option.go
new file mode 100644
index 0000000..1e1b840
--- /dev/null
+++ b/bots-common/gitea-generated/models/create_tag_option.go
@@ -0,0 +1,77 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+	"github.com/go-openapi/validate"
+)
+
+// CreateTagOption CreateTagOption options when creating a tag
+//
+// swagger:model CreateTagOption
+type CreateTagOption struct {
+
+	// message
+	Message string `json:"message,omitempty"`
+
+	// tag name
+	// Required: true
+	TagName *string `json:"tag_name"`
+
+	// target
+	Target string `json:"target,omitempty"`
+}
+
+// Validate validates this create tag option
+func (m *CreateTagOption) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateTagName(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *CreateTagOption) validateTagName(formats strfmt.Registry) error {
+
+	if err := validate.Required("tag_name", "body", m.TagName); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+// ContextValidate validates this create tag option based on context it is used
+func (m *CreateTagOption) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *CreateTagOption) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *CreateTagOption) UnmarshalBinary(b []byte) error {
+	var res CreateTagOption
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/create_team_option.go b/bots-common/gitea-generated/models/create_team_option.go
new file mode 100644
index 0000000..b32c0a5
--- /dev/null
+++ b/bots-common/gitea-generated/models/create_team_option.go
@@ -0,0 +1,142 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"encoding/json"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+	"github.com/go-openapi/validate"
+)
+
+// CreateTeamOption CreateTeamOption options for creating a team
+//
+// swagger:model CreateTeamOption
+type CreateTeamOption struct {
+
+	// can create org repo
+	CanCreateOrgRepo bool `json:"can_create_org_repo,omitempty"`
+
+	// description
+	Description string `json:"description,omitempty"`
+
+	// includes all repositories
+	IncludesAllRepositories bool `json:"includes_all_repositories,omitempty"`
+
+	// name
+	// Required: true
+	Name *string `json:"name"`
+
+	// permission
+	// Enum: ["read","write","admin"]
+	Permission string `json:"permission,omitempty"`
+
+	// units
+	// Example: ["repo.actions","repo.code","repo.issues","repo.ext_issues","repo.wiki","repo.ext_wiki","repo.pulls","repo.releases","repo.projects","repo.ext_wiki"]
+	Units []string `json:"units"`
+
+	// units map
+	// Example: {\"repo.actions\",\"repo.packages\",\"repo.code\":\"read\",\"repo.issues\":\"write\",\"repo.ext_issues\":\"none\",\"repo.wiki\":\"admin\",\"repo.pulls\":\"owner\",\"repo.releases\":\"none\",\"repo.projects\":\"none\",\"repo.ext_wiki\":\"none\"}
+	UnitsMap map[string]string `json:"units_map,omitempty"`
+}
+
+// Validate validates this create team option
+func (m *CreateTeamOption) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateName(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validatePermission(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *CreateTeamOption) validateName(formats strfmt.Registry) error {
+
+	if err := validate.Required("name", "body", m.Name); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+var createTeamOptionTypePermissionPropEnum []interface{}
+
+func init() {
+	var res []string
+	if err := json.Unmarshal([]byte(`["read","write","admin"]`), &res); err != nil {
+		panic(err)
+	}
+	for _, v := range res {
+		createTeamOptionTypePermissionPropEnum = append(createTeamOptionTypePermissionPropEnum, v)
+	}
+}
+
+const (
+
+	// CreateTeamOptionPermissionRead captures enum value "read"
+	CreateTeamOptionPermissionRead string = "read"
+
+	// CreateTeamOptionPermissionWrite captures enum value "write"
+	CreateTeamOptionPermissionWrite string = "write"
+
+	// CreateTeamOptionPermissionAdmin captures enum value "admin"
+	CreateTeamOptionPermissionAdmin string = "admin"
+)
+
+// prop value enum
+func (m *CreateTeamOption) validatePermissionEnum(path, location string, value string) error {
+	if err := validate.EnumCase(path, location, value, createTeamOptionTypePermissionPropEnum, true); err != nil {
+		return err
+	}
+	return nil
+}
+
+func (m *CreateTeamOption) validatePermission(formats strfmt.Registry) error {
+	if swag.IsZero(m.Permission) { // not required
+		return nil
+	}
+
+	// value enum
+	if err := m.validatePermissionEnum("permission", "body", m.Permission); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+// ContextValidate validates this create team option based on context it is used
+func (m *CreateTeamOption) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *CreateTeamOption) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *CreateTeamOption) UnmarshalBinary(b []byte) error {
+	var res CreateTeamOption
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/create_user_option.go b/bots-common/gitea-generated/models/create_user_option.go
new file mode 100644
index 0000000..48bd8fd
--- /dev/null
+++ b/bots-common/gitea-generated/models/create_user_option.go
@@ -0,0 +1,139 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+	"github.com/go-openapi/validate"
+)
+
+// CreateUserOption CreateUserOption create user options
+//
+// swagger:model CreateUserOption
+type CreateUserOption struct {
+
+	// For explicitly setting the user creation timestamp. Useful when users are
+	// migrated from other systems. When omitted, the user's creation timestamp
+	// will be set to "now".
+	// Format: date-time
+	Created strfmt.DateTime `json:"created_at,omitempty"`
+
+	// email
+	// Required: true
+	// Format: email
+	Email *strfmt.Email `json:"email"`
+
+	// full name
+	FullName string `json:"full_name,omitempty"`
+
+	// login name
+	LoginName string `json:"login_name,omitempty"`
+
+	// must change password
+	MustChangePassword bool `json:"must_change_password,omitempty"`
+
+	// password
+	Password string `json:"password,omitempty"`
+
+	// restricted
+	Restricted bool `json:"restricted,omitempty"`
+
+	// send notify
+	SendNotify bool `json:"send_notify,omitempty"`
+
+	// source ID
+	SourceID int64 `json:"source_id,omitempty"`
+
+	// username
+	// Required: true
+	Username *string `json:"username"`
+
+	// visibility
+	Visibility string `json:"visibility,omitempty"`
+}
+
+// Validate validates this create user option
+func (m *CreateUserOption) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateCreated(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateEmail(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateUsername(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *CreateUserOption) validateCreated(formats strfmt.Registry) error {
+	if swag.IsZero(m.Created) { // not required
+		return nil
+	}
+
+	if err := validate.FormatOf("created_at", "body", "date-time", m.Created.String(), formats); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (m *CreateUserOption) validateEmail(formats strfmt.Registry) error {
+
+	if err := validate.Required("email", "body", m.Email); err != nil {
+		return err
+	}
+
+	if err := validate.FormatOf("email", "body", "email", m.Email.String(), formats); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (m *CreateUserOption) validateUsername(formats strfmt.Registry) error {
+
+	if err := validate.Required("username", "body", m.Username); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+// ContextValidate validates this create user option based on context it is used
+func (m *CreateUserOption) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *CreateUserOption) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *CreateUserOption) UnmarshalBinary(b []byte) error {
+	var res CreateUserOption
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/create_variable_option.go b/bots-common/gitea-generated/models/create_variable_option.go
new file mode 100644
index 0000000..4b20471
--- /dev/null
+++ b/bots-common/gitea-generated/models/create_variable_option.go
@@ -0,0 +1,71 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+	"github.com/go-openapi/validate"
+)
+
+// CreateVariableOption CreateVariableOption the option when creating variable
+//
+// swagger:model CreateVariableOption
+type CreateVariableOption struct {
+
+	// Value of the variable to create
+	// Required: true
+	Value *string `json:"value"`
+}
+
+// Validate validates this create variable option
+func (m *CreateVariableOption) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateValue(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *CreateVariableOption) validateValue(formats strfmt.Registry) error {
+
+	if err := validate.Required("value", "body", m.Value); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+// ContextValidate validates this create variable option based on context it is used
+func (m *CreateVariableOption) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *CreateVariableOption) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *CreateVariableOption) UnmarshalBinary(b []byte) error {
+	var res CreateVariableOption
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/create_wiki_page_options.go b/bots-common/gitea-generated/models/create_wiki_page_options.go
new file mode 100644
index 0000000..1ada6df
--- /dev/null
+++ b/bots-common/gitea-generated/models/create_wiki_page_options.go
@@ -0,0 +1,56 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// CreateWikiPageOptions CreateWikiPageOptions form for creating wiki
+//
+// swagger:model CreateWikiPageOptions
+type CreateWikiPageOptions struct {
+
+	// content must be base64 encoded
+	ContentBase64 string `json:"content_base64,omitempty"`
+
+	// optional commit message summarizing the change
+	Message string `json:"message,omitempty"`
+
+	// page title. leave empty to keep unchanged
+	Title string `json:"title,omitempty"`
+}
+
+// Validate validates this create wiki page options
+func (m *CreateWikiPageOptions) Validate(formats strfmt.Registry) error {
+	return nil
+}
+
+// ContextValidate validates this create wiki page options based on context it is used
+func (m *CreateWikiPageOptions) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *CreateWikiPageOptions) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *CreateWikiPageOptions) UnmarshalBinary(b []byte) error {
+	var res CreateWikiPageOptions
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/cron.go b/bots-common/gitea-generated/models/cron.go
new file mode 100644
index 0000000..e37ac72
--- /dev/null
+++ b/bots-common/gitea-generated/models/cron.go
@@ -0,0 +1,103 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+	"github.com/go-openapi/validate"
+)
+
+// Cron Cron represents a Cron task
+//
+// swagger:model Cron
+type Cron struct {
+
+	// exec times
+	ExecTimes int64 `json:"exec_times,omitempty"`
+
+	// name
+	Name string `json:"name,omitempty"`
+
+	// next
+	// Format: date-time
+	Next strfmt.DateTime `json:"next,omitempty"`
+
+	// prev
+	// Format: date-time
+	Prev strfmt.DateTime `json:"prev,omitempty"`
+
+	// schedule
+	Schedule string `json:"schedule,omitempty"`
+}
+
+// Validate validates this cron
+func (m *Cron) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateNext(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validatePrev(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *Cron) validateNext(formats strfmt.Registry) error {
+	if swag.IsZero(m.Next) { // not required
+		return nil
+	}
+
+	if err := validate.FormatOf("next", "body", "date-time", m.Next.String(), formats); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (m *Cron) validatePrev(formats strfmt.Registry) error {
+	if swag.IsZero(m.Prev) { // not required
+		return nil
+	}
+
+	if err := validate.FormatOf("prev", "body", "date-time", m.Prev.String(), formats); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+// ContextValidate validates this cron based on context it is used
+func (m *Cron) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *Cron) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *Cron) UnmarshalBinary(b []byte) error {
+	var res Cron
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/delete_email_option.go b/bots-common/gitea-generated/models/delete_email_option.go
new file mode 100644
index 0000000..f03b29e
--- /dev/null
+++ b/bots-common/gitea-generated/models/delete_email_option.go
@@ -0,0 +1,50 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// DeleteEmailOption DeleteEmailOption options when deleting email addresses
+//
+// swagger:model DeleteEmailOption
+type DeleteEmailOption struct {
+
+	// email addresses to delete
+	Emails []string `json:"emails"`
+}
+
+// Validate validates this delete email option
+func (m *DeleteEmailOption) Validate(formats strfmt.Registry) error {
+	return nil
+}
+
+// ContextValidate validates this delete email option based on context it is used
+func (m *DeleteEmailOption) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *DeleteEmailOption) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *DeleteEmailOption) UnmarshalBinary(b []byte) error {
+	var res DeleteEmailOption
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/delete_file_options.go b/bots-common/gitea-generated/models/delete_file_options.go
new file mode 100644
index 0000000..47cd6b4
--- /dev/null
+++ b/bots-common/gitea-generated/models/delete_file_options.go
@@ -0,0 +1,242 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+	"github.com/go-openapi/validate"
+)
+
+// DeleteFileOptions DeleteFileOptions options for deleting files (used for other File structs below)
+// Note: `author` and `committer` are optional (if only one is given, it will be used for the other, otherwise the authenticated user will be used)
+//
+// swagger:model DeleteFileOptions
+type DeleteFileOptions struct {
+
+	// branch (optional) to base this file from. if not given, the default branch is used
+	BranchName string `json:"branch,omitempty"`
+
+	// message (optional) for the commit of this file. if not supplied, a default message will be used
+	Message string `json:"message,omitempty"`
+
+	// new_branch (optional) will make a new branch from `branch` before creating the file
+	NewBranchName string `json:"new_branch,omitempty"`
+
+	// sha is the SHA for the file that already exists
+	// Required: true
+	SHA *string `json:"sha"`
+
+	// Add a Signed-off-by trailer by the committer at the end of the commit log message.
+	Signoff bool `json:"signoff,omitempty"`
+
+	// author
+	Author *Identity `json:"author,omitempty"`
+
+	// committer
+	Committer *Identity `json:"committer,omitempty"`
+
+	// dates
+	Dates *CommitDateOptions `json:"dates,omitempty"`
+}
+
+// Validate validates this delete file options
+func (m *DeleteFileOptions) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateSHA(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateAuthor(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateCommitter(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateDates(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *DeleteFileOptions) validateSHA(formats strfmt.Registry) error {
+
+	if err := validate.Required("sha", "body", m.SHA); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (m *DeleteFileOptions) validateAuthor(formats strfmt.Registry) error {
+	if swag.IsZero(m.Author) { // not required
+		return nil
+	}
+
+	if m.Author != nil {
+		if err := m.Author.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("author")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("author")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *DeleteFileOptions) validateCommitter(formats strfmt.Registry) error {
+	if swag.IsZero(m.Committer) { // not required
+		return nil
+	}
+
+	if m.Committer != nil {
+		if err := m.Committer.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("committer")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("committer")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *DeleteFileOptions) validateDates(formats strfmt.Registry) error {
+	if swag.IsZero(m.Dates) { // not required
+		return nil
+	}
+
+	if m.Dates != nil {
+		if err := m.Dates.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("dates")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("dates")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+// ContextValidate validate this delete file options based on the context it is used
+func (m *DeleteFileOptions) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.contextValidateAuthor(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.contextValidateCommitter(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.contextValidateDates(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *DeleteFileOptions) contextValidateAuthor(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.Author != nil {
+
+		if swag.IsZero(m.Author) { // not required
+			return nil
+		}
+
+		if err := m.Author.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("author")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("author")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *DeleteFileOptions) contextValidateCommitter(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.Committer != nil {
+
+		if swag.IsZero(m.Committer) { // not required
+			return nil
+		}
+
+		if err := m.Committer.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("committer")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("committer")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *DeleteFileOptions) contextValidateDates(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.Dates != nil {
+
+		if swag.IsZero(m.Dates) { // not required
+			return nil
+		}
+
+		if err := m.Dates.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("dates")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("dates")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *DeleteFileOptions) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *DeleteFileOptions) UnmarshalBinary(b []byte) error {
+	var res DeleteFileOptions
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/deploy_key.go b/bots-common/gitea-generated/models/deploy_key.go
new file mode 100644
index 0000000..d990f8d
--- /dev/null
+++ b/bots-common/gitea-generated/models/deploy_key.go
@@ -0,0 +1,151 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+	"github.com/go-openapi/validate"
+)
+
+// DeployKey DeployKey a deploy key
+//
+// swagger:model DeployKey
+type DeployKey struct {
+
+	// created
+	// Format: date-time
+	Created strfmt.DateTime `json:"created_at,omitempty"`
+
+	// fingerprint
+	Fingerprint string `json:"fingerprint,omitempty"`
+
+	// ID
+	ID int64 `json:"id,omitempty"`
+
+	// key
+	Key string `json:"key,omitempty"`
+
+	// key ID
+	KeyID int64 `json:"key_id,omitempty"`
+
+	// read only
+	ReadOnly bool `json:"read_only,omitempty"`
+
+	// title
+	Title string `json:"title,omitempty"`
+
+	// URL
+	URL string `json:"url,omitempty"`
+
+	// repository
+	Repository *Repository `json:"repository,omitempty"`
+}
+
+// Validate validates this deploy key
+func (m *DeployKey) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateCreated(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateRepository(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *DeployKey) validateCreated(formats strfmt.Registry) error {
+	if swag.IsZero(m.Created) { // not required
+		return nil
+	}
+
+	if err := validate.FormatOf("created_at", "body", "date-time", m.Created.String(), formats); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (m *DeployKey) validateRepository(formats strfmt.Registry) error {
+	if swag.IsZero(m.Repository) { // not required
+		return nil
+	}
+
+	if m.Repository != nil {
+		if err := m.Repository.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("repository")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("repository")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+// ContextValidate validate this deploy key based on the context it is used
+func (m *DeployKey) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.contextValidateRepository(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *DeployKey) contextValidateRepository(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.Repository != nil {
+
+		if swag.IsZero(m.Repository) { // not required
+			return nil
+		}
+
+		if err := m.Repository.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("repository")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("repository")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *DeployKey) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *DeployKey) UnmarshalBinary(b []byte) error {
+	var res DeployKey
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/dismiss_pull_review_options.go b/bots-common/gitea-generated/models/dismiss_pull_review_options.go
new file mode 100644
index 0000000..f49b29f
--- /dev/null
+++ b/bots-common/gitea-generated/models/dismiss_pull_review_options.go
@@ -0,0 +1,53 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// DismissPullReviewOptions DismissPullReviewOptions are options to dismiss a pull review
+//
+// swagger:model DismissPullReviewOptions
+type DismissPullReviewOptions struct {
+
+	// message
+	Message string `json:"message,omitempty"`
+
+	// priors
+	Priors bool `json:"priors,omitempty"`
+}
+
+// Validate validates this dismiss pull review options
+func (m *DismissPullReviewOptions) Validate(formats strfmt.Registry) error {
+	return nil
+}
+
+// ContextValidate validates this dismiss pull review options based on context it is used
+func (m *DismissPullReviewOptions) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *DismissPullReviewOptions) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *DismissPullReviewOptions) UnmarshalBinary(b []byte) error {
+	var res DismissPullReviewOptions
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/edit_attachment_options.go b/bots-common/gitea-generated/models/edit_attachment_options.go
new file mode 100644
index 0000000..4de0e66
--- /dev/null
+++ b/bots-common/gitea-generated/models/edit_attachment_options.go
@@ -0,0 +1,50 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// EditAttachmentOptions EditAttachmentOptions options for editing attachments
+//
+// swagger:model EditAttachmentOptions
+type EditAttachmentOptions struct {
+
+	// name
+	Name string `json:"name,omitempty"`
+}
+
+// Validate validates this edit attachment options
+func (m *EditAttachmentOptions) Validate(formats strfmt.Registry) error {
+	return nil
+}
+
+// ContextValidate validates this edit attachment options based on context it is used
+func (m *EditAttachmentOptions) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *EditAttachmentOptions) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *EditAttachmentOptions) UnmarshalBinary(b []byte) error {
+	var res EditAttachmentOptions
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/edit_branch_protection_option.go b/bots-common/gitea-generated/models/edit_branch_protection_option.go
new file mode 100644
index 0000000..efd4937
--- /dev/null
+++ b/bots-common/gitea-generated/models/edit_branch_protection_option.go
@@ -0,0 +1,113 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// EditBranchProtectionOption EditBranchProtectionOption options for editing a branch protection
+//
+// swagger:model EditBranchProtectionOption
+type EditBranchProtectionOption struct {
+
+	// approvals whitelist teams
+	ApprovalsWhitelistTeams []string `json:"approvals_whitelist_teams"`
+
+	// approvals whitelist usernames
+	ApprovalsWhitelistUsernames []string `json:"approvals_whitelist_username"`
+
+	// block on official review requests
+	BlockOnOfficialReviewRequests bool `json:"block_on_official_review_requests,omitempty"`
+
+	// block on outdated branch
+	BlockOnOutdatedBranch bool `json:"block_on_outdated_branch,omitempty"`
+
+	// block on rejected reviews
+	BlockOnRejectedReviews bool `json:"block_on_rejected_reviews,omitempty"`
+
+	// dismiss stale approvals
+	DismissStaleApprovals bool `json:"dismiss_stale_approvals,omitempty"`
+
+	// enable approvals whitelist
+	EnableApprovalsWhitelist bool `json:"enable_approvals_whitelist,omitempty"`
+
+	// enable merge whitelist
+	EnableMergeWhitelist bool `json:"enable_merge_whitelist,omitempty"`
+
+	// enable push
+	EnablePush bool `json:"enable_push,omitempty"`
+
+	// enable push whitelist
+	EnablePushWhitelist bool `json:"enable_push_whitelist,omitempty"`
+
+	// enable status check
+	EnableStatusCheck bool `json:"enable_status_check,omitempty"`
+
+	// ignore stale approvals
+	IgnoreStaleApprovals bool `json:"ignore_stale_approvals,omitempty"`
+
+	// merge whitelist teams
+	MergeWhitelistTeams []string `json:"merge_whitelist_teams"`
+
+	// merge whitelist usernames
+	MergeWhitelistUsernames []string `json:"merge_whitelist_usernames"`
+
+	// protected file patterns
+	ProtectedFilePatterns string `json:"protected_file_patterns,omitempty"`
+
+	// push whitelist deploy keys
+	PushWhitelistDeployKeys bool `json:"push_whitelist_deploy_keys,omitempty"`
+
+	// push whitelist teams
+	PushWhitelistTeams []string `json:"push_whitelist_teams"`
+
+	// push whitelist usernames
+	PushWhitelistUsernames []string `json:"push_whitelist_usernames"`
+
+	// require signed commits
+	RequireSignedCommits bool `json:"require_signed_commits,omitempty"`
+
+	// required approvals
+	RequiredApprovals int64 `json:"required_approvals,omitempty"`
+
+	// status check contexts
+	StatusCheckContexts []string `json:"status_check_contexts"`
+
+	// unprotected file patterns
+	UnprotectedFilePatterns string `json:"unprotected_file_patterns,omitempty"`
+}
+
+// Validate validates this edit branch protection option
+func (m *EditBranchProtectionOption) Validate(formats strfmt.Registry) error {
+	return nil
+}
+
+// ContextValidate validates this edit branch protection option based on context it is used
+func (m *EditBranchProtectionOption) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *EditBranchProtectionOption) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *EditBranchProtectionOption) UnmarshalBinary(b []byte) error {
+	var res EditBranchProtectionOption
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/edit_deadline_option.go b/bots-common/gitea-generated/models/edit_deadline_option.go
new file mode 100644
index 0000000..96a8498
--- /dev/null
+++ b/bots-common/gitea-generated/models/edit_deadline_option.go
@@ -0,0 +1,76 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+	"github.com/go-openapi/validate"
+)
+
+// EditDeadlineOption EditDeadlineOption options for creating a deadline
+//
+// swagger:model EditDeadlineOption
+type EditDeadlineOption struct {
+
+	// deadline
+	// Required: true
+	// Format: date-time
+	Deadline *strfmt.DateTime `json:"due_date"`
+}
+
+// Validate validates this edit deadline option
+func (m *EditDeadlineOption) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateDeadline(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *EditDeadlineOption) validateDeadline(formats strfmt.Registry) error {
+
+	if err := validate.Required("due_date", "body", m.Deadline); err != nil {
+		return err
+	}
+
+	if err := validate.FormatOf("due_date", "body", "date-time", m.Deadline.String(), formats); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+// ContextValidate validates this edit deadline option based on context it is used
+func (m *EditDeadlineOption) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *EditDeadlineOption) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *EditDeadlineOption) UnmarshalBinary(b []byte) error {
+	var res EditDeadlineOption
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/edit_git_hook_option.go b/bots-common/gitea-generated/models/edit_git_hook_option.go
new file mode 100644
index 0000000..f5e0173
--- /dev/null
+++ b/bots-common/gitea-generated/models/edit_git_hook_option.go
@@ -0,0 +1,50 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// EditGitHookOption EditGitHookOption options when modifying one Git hook
+//
+// swagger:model EditGitHookOption
+type EditGitHookOption struct {
+
+	// content
+	Content string `json:"content,omitempty"`
+}
+
+// Validate validates this edit git hook option
+func (m *EditGitHookOption) Validate(formats strfmt.Registry) error {
+	return nil
+}
+
+// ContextValidate validates this edit git hook option based on context it is used
+func (m *EditGitHookOption) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *EditGitHookOption) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *EditGitHookOption) UnmarshalBinary(b []byte) error {
+	var res EditGitHookOption
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/edit_hook_option.go b/bots-common/gitea-generated/models/edit_hook_option.go
new file mode 100644
index 0000000..0845ce7
--- /dev/null
+++ b/bots-common/gitea-generated/models/edit_hook_option.go
@@ -0,0 +1,62 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// EditHookOption EditHookOption options when modify one hook
+//
+// swagger:model EditHookOption
+type EditHookOption struct {
+
+	// active
+	Active bool `json:"active,omitempty"`
+
+	// authorization header
+	AuthorizationHeader string `json:"authorization_header,omitempty"`
+
+	// branch filter
+	BranchFilter string `json:"branch_filter,omitempty"`
+
+	// config
+	Config map[string]string `json:"config,omitempty"`
+
+	// events
+	Events []string `json:"events"`
+}
+
+// Validate validates this edit hook option
+func (m *EditHookOption) Validate(formats strfmt.Registry) error {
+	return nil
+}
+
+// ContextValidate validates this edit hook option based on context it is used
+func (m *EditHookOption) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *EditHookOption) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *EditHookOption) UnmarshalBinary(b []byte) error {
+	var res EditHookOption
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/edit_issue_comment_option.go b/bots-common/gitea-generated/models/edit_issue_comment_option.go
new file mode 100644
index 0000000..de8cb92
--- /dev/null
+++ b/bots-common/gitea-generated/models/edit_issue_comment_option.go
@@ -0,0 +1,71 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+	"github.com/go-openapi/validate"
+)
+
+// EditIssueCommentOption EditIssueCommentOption options for editing a comment
+//
+// swagger:model EditIssueCommentOption
+type EditIssueCommentOption struct {
+
+	// body
+	// Required: true
+	Body *string `json:"body"`
+}
+
+// Validate validates this edit issue comment option
+func (m *EditIssueCommentOption) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateBody(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *EditIssueCommentOption) validateBody(formats strfmt.Registry) error {
+
+	if err := validate.Required("body", "body", m.Body); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+// ContextValidate validates this edit issue comment option based on context it is used
+func (m *EditIssueCommentOption) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *EditIssueCommentOption) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *EditIssueCommentOption) UnmarshalBinary(b []byte) error {
+	var res EditIssueCommentOption
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/edit_issue_option.go b/bots-common/gitea-generated/models/edit_issue_option.go
new file mode 100644
index 0000000..315cffa
--- /dev/null
+++ b/bots-common/gitea-generated/models/edit_issue_option.go
@@ -0,0 +1,98 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+	"github.com/go-openapi/validate"
+)
+
+// EditIssueOption EditIssueOption options for editing an issue
+//
+// swagger:model EditIssueOption
+type EditIssueOption struct {
+
+	// deprecated
+	Assignee string `json:"assignee,omitempty"`
+
+	// assignees
+	Assignees []string `json:"assignees"`
+
+	// body
+	Body string `json:"body,omitempty"`
+
+	// deadline
+	// Format: date-time
+	Deadline strfmt.DateTime `json:"due_date,omitempty"`
+
+	// milestone
+	Milestone int64 `json:"milestone,omitempty"`
+
+	// ref
+	Ref string `json:"ref,omitempty"`
+
+	// remove deadline
+	RemoveDeadline bool `json:"unset_due_date,omitempty"`
+
+	// state
+	State string `json:"state,omitempty"`
+
+	// title
+	Title string `json:"title,omitempty"`
+}
+
+// Validate validates this edit issue option
+func (m *EditIssueOption) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateDeadline(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *EditIssueOption) validateDeadline(formats strfmt.Registry) error {
+	if swag.IsZero(m.Deadline) { // not required
+		return nil
+	}
+
+	if err := validate.FormatOf("due_date", "body", "date-time", m.Deadline.String(), formats); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+// ContextValidate validates this edit issue option based on context it is used
+func (m *EditIssueOption) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *EditIssueOption) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *EditIssueOption) UnmarshalBinary(b []byte) error {
+	var res EditIssueOption
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/edit_label_option.go b/bots-common/gitea-generated/models/edit_label_option.go
new file mode 100644
index 0000000..d4f5b28
--- /dev/null
+++ b/bots-common/gitea-generated/models/edit_label_option.go
@@ -0,0 +1,65 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// EditLabelOption EditLabelOption options for editing a label
+//
+// swagger:model EditLabelOption
+type EditLabelOption struct {
+
+	// color
+	// Example: #00aabb
+	Color string `json:"color,omitempty"`
+
+	// description
+	Description string `json:"description,omitempty"`
+
+	// exclusive
+	// Example: false
+	Exclusive bool `json:"exclusive,omitempty"`
+
+	// is archived
+	// Example: false
+	IsArchived bool `json:"is_archived,omitempty"`
+
+	// name
+	Name string `json:"name,omitempty"`
+}
+
+// Validate validates this edit label option
+func (m *EditLabelOption) Validate(formats strfmt.Registry) error {
+	return nil
+}
+
+// ContextValidate validates this edit label option based on context it is used
+func (m *EditLabelOption) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *EditLabelOption) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *EditLabelOption) UnmarshalBinary(b []byte) error {
+	var res EditLabelOption
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/edit_milestone_option.go b/bots-common/gitea-generated/models/edit_milestone_option.go
new file mode 100644
index 0000000..8943c8f
--- /dev/null
+++ b/bots-common/gitea-generated/models/edit_milestone_option.go
@@ -0,0 +1,83 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+	"github.com/go-openapi/validate"
+)
+
+// EditMilestoneOption EditMilestoneOption options for editing a milestone
+//
+// swagger:model EditMilestoneOption
+type EditMilestoneOption struct {
+
+	// deadline
+	// Format: date-time
+	Deadline strfmt.DateTime `json:"due_on,omitempty"`
+
+	// description
+	Description string `json:"description,omitempty"`
+
+	// state
+	State string `json:"state,omitempty"`
+
+	// title
+	Title string `json:"title,omitempty"`
+}
+
+// Validate validates this edit milestone option
+func (m *EditMilestoneOption) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateDeadline(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *EditMilestoneOption) validateDeadline(formats strfmt.Registry) error {
+	if swag.IsZero(m.Deadline) { // not required
+		return nil
+	}
+
+	if err := validate.FormatOf("due_on", "body", "date-time", m.Deadline.String(), formats); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+// ContextValidate validates this edit milestone option based on context it is used
+func (m *EditMilestoneOption) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *EditMilestoneOption) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *EditMilestoneOption) UnmarshalBinary(b []byte) error {
+	var res EditMilestoneOption
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/edit_org_option.go b/bots-common/gitea-generated/models/edit_org_option.go
new file mode 100644
index 0000000..0cd986c
--- /dev/null
+++ b/bots-common/gitea-generated/models/edit_org_option.go
@@ -0,0 +1,126 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"encoding/json"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+	"github.com/go-openapi/validate"
+)
+
+// EditOrgOption EditOrgOption options for editing an organization
+//
+// swagger:model EditOrgOption
+type EditOrgOption struct {
+
+	// description
+	Description string `json:"description,omitempty"`
+
+	// email
+	Email string `json:"email,omitempty"`
+
+	// full name
+	FullName string `json:"full_name,omitempty"`
+
+	// location
+	Location string `json:"location,omitempty"`
+
+	// repo admin change team access
+	RepoAdminChangeTeamAccess bool `json:"repo_admin_change_team_access,omitempty"`
+
+	// possible values are `public`, `limited` or `private`
+	// Enum: ["public","limited","private"]
+	Visibility string `json:"visibility,omitempty"`
+
+	// website
+	Website string `json:"website,omitempty"`
+}
+
+// Validate validates this edit org option
+func (m *EditOrgOption) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateVisibility(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+var editOrgOptionTypeVisibilityPropEnum []interface{}
+
+func init() {
+	var res []string
+	if err := json.Unmarshal([]byte(`["public","limited","private"]`), &res); err != nil {
+		panic(err)
+	}
+	for _, v := range res {
+		editOrgOptionTypeVisibilityPropEnum = append(editOrgOptionTypeVisibilityPropEnum, v)
+	}
+}
+
+const (
+
+	// EditOrgOptionVisibilityPublic captures enum value "public"
+	EditOrgOptionVisibilityPublic string = "public"
+
+	// EditOrgOptionVisibilityLimited captures enum value "limited"
+	EditOrgOptionVisibilityLimited string = "limited"
+
+	// EditOrgOptionVisibilityPrivate captures enum value "private"
+	EditOrgOptionVisibilityPrivate string = "private"
+)
+
+// prop value enum
+func (m *EditOrgOption) validateVisibilityEnum(path, location string, value string) error {
+	if err := validate.EnumCase(path, location, value, editOrgOptionTypeVisibilityPropEnum, true); err != nil {
+		return err
+	}
+	return nil
+}
+
+func (m *EditOrgOption) validateVisibility(formats strfmt.Registry) error {
+	if swag.IsZero(m.Visibility) { // not required
+		return nil
+	}
+
+	// value enum
+	if err := m.validateVisibilityEnum("visibility", "body", m.Visibility); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+// ContextValidate validates this edit org option based on context it is used
+func (m *EditOrgOption) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *EditOrgOption) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *EditOrgOption) UnmarshalBinary(b []byte) error {
+	var res EditOrgOption
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/edit_pull_request_option.go b/bots-common/gitea-generated/models/edit_pull_request_option.go
new file mode 100644
index 0000000..39f264f
--- /dev/null
+++ b/bots-common/gitea-generated/models/edit_pull_request_option.go
@@ -0,0 +1,104 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+	"github.com/go-openapi/validate"
+)
+
+// EditPullRequestOption EditPullRequestOption options when modify pull request
+//
+// swagger:model EditPullRequestOption
+type EditPullRequestOption struct {
+
+	// allow maintainer edit
+	AllowMaintainerEdit bool `json:"allow_maintainer_edit,omitempty"`
+
+	// assignee
+	Assignee string `json:"assignee,omitempty"`
+
+	// assignees
+	Assignees []string `json:"assignees"`
+
+	// base
+	Base string `json:"base,omitempty"`
+
+	// body
+	Body string `json:"body,omitempty"`
+
+	// deadline
+	// Format: date-time
+	Deadline strfmt.DateTime `json:"due_date,omitempty"`
+
+	// labels
+	Labels []int64 `json:"labels"`
+
+	// milestone
+	Milestone int64 `json:"milestone,omitempty"`
+
+	// remove deadline
+	RemoveDeadline bool `json:"unset_due_date,omitempty"`
+
+	// state
+	State string `json:"state,omitempty"`
+
+	// title
+	Title string `json:"title,omitempty"`
+}
+
+// Validate validates this edit pull request option
+func (m *EditPullRequestOption) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateDeadline(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *EditPullRequestOption) validateDeadline(formats strfmt.Registry) error {
+	if swag.IsZero(m.Deadline) { // not required
+		return nil
+	}
+
+	if err := validate.FormatOf("due_date", "body", "date-time", m.Deadline.String(), formats); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+// ContextValidate validates this edit pull request option based on context it is used
+func (m *EditPullRequestOption) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *EditPullRequestOption) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *EditPullRequestOption) UnmarshalBinary(b []byte) error {
+	var res EditPullRequestOption
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/edit_reaction_option.go b/bots-common/gitea-generated/models/edit_reaction_option.go
new file mode 100644
index 0000000..7ac59fa
--- /dev/null
+++ b/bots-common/gitea-generated/models/edit_reaction_option.go
@@ -0,0 +1,50 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// EditReactionOption EditReactionOption contain the reaction type
+//
+// swagger:model EditReactionOption
+type EditReactionOption struct {
+
+	// reaction
+	Reaction string `json:"content,omitempty"`
+}
+
+// Validate validates this edit reaction option
+func (m *EditReactionOption) Validate(formats strfmt.Registry) error {
+	return nil
+}
+
+// ContextValidate validates this edit reaction option based on context it is used
+func (m *EditReactionOption) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *EditReactionOption) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *EditReactionOption) UnmarshalBinary(b []byte) error {
+	var res EditReactionOption
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/edit_release_option.go b/bots-common/gitea-generated/models/edit_release_option.go
new file mode 100644
index 0000000..1057592
--- /dev/null
+++ b/bots-common/gitea-generated/models/edit_release_option.go
@@ -0,0 +1,65 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// EditReleaseOption EditReleaseOption options when editing a release
+//
+// swagger:model EditReleaseOption
+type EditReleaseOption struct {
+
+	// is draft
+	IsDraft bool `json:"draft,omitempty"`
+
+	// is prerelease
+	IsPrerelease bool `json:"prerelease,omitempty"`
+
+	// note
+	Note string `json:"body,omitempty"`
+
+	// tag name
+	TagName string `json:"tag_name,omitempty"`
+
+	// target
+	Target string `json:"target_commitish,omitempty"`
+
+	// title
+	Title string `json:"name,omitempty"`
+}
+
+// Validate validates this edit release option
+func (m *EditReleaseOption) Validate(formats strfmt.Registry) error {
+	return nil
+}
+
+// ContextValidate validates this edit release option based on context it is used
+func (m *EditReleaseOption) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *EditReleaseOption) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *EditReleaseOption) UnmarshalBinary(b []byte) error {
+	var res EditReleaseOption
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/edit_repo_option.go b/bots-common/gitea-generated/models/edit_repo_option.go
new file mode 100644
index 0000000..99ac120
--- /dev/null
+++ b/bots-common/gitea-generated/models/edit_repo_option.go
@@ -0,0 +1,300 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// EditRepoOption EditRepoOption options when editing a repository's properties
+//
+// swagger:model EditRepoOption
+type EditRepoOption struct {
+
+	// either `true` to allow fast-forward-only merging pull requests, or `false` to prevent fast-forward-only merging.
+	AllowFastForwardOnly bool `json:"allow_fast_forward_only_merge,omitempty"`
+
+	// either `true` to allow mark pr as merged manually, or `false` to prevent it.
+	AllowManualMerge bool `json:"allow_manual_merge,omitempty"`
+
+	// either `true` to allow merging pull requests with a merge commit, or `false` to prevent merging pull requests with merge commits.
+	AllowMerge bool `json:"allow_merge_commits,omitempty"`
+
+	// either `true` to allow rebase-merging pull requests, or `false` to prevent rebase-merging.
+	AllowRebase bool `json:"allow_rebase,omitempty"`
+
+	// either `true` to allow rebase with explicit merge commits (--no-ff), or `false` to prevent rebase with explicit merge commits.
+	AllowRebaseMerge bool `json:"allow_rebase_explicit,omitempty"`
+
+	// either `true` to allow updating pull request branch by rebase, or `false` to prevent it.
+	AllowRebaseUpdate bool `json:"allow_rebase_update,omitempty"`
+
+	// either `true` to allow squash-merging pull requests, or `false` to prevent squash-merging.
+	AllowSquash bool `json:"allow_squash_merge,omitempty"`
+
+	// set to `true` to archive this repository.
+	Archived bool `json:"archived,omitempty"`
+
+	// either `true` to enable AutodetectManualMerge, or `false` to prevent it. Note: In some special cases, misjudgments can occur.
+	AutodetectManualMerge bool `json:"autodetect_manual_merge,omitempty"`
+
+	// set to `true` to allow edits from maintainers by default
+	DefaultAllowMaintainerEdit bool `json:"default_allow_maintainer_edit,omitempty"`
+
+	// sets the default branch for this repository.
+	DefaultBranch string `json:"default_branch,omitempty"`
+
+	// set to `true` to delete pr branch after merge by default
+	DefaultDeleteBranchAfterMerge bool `json:"default_delete_branch_after_merge,omitempty"`
+
+	// set to a merge style to be used by this repository: "merge", "rebase", "rebase-merge", "squash", or "fast-forward-only".
+	DefaultMergeStyle string `json:"default_merge_style,omitempty"`
+
+	// a short description of the repository.
+	Description string `json:"description,omitempty"`
+
+	// enable prune - remove obsolete remote-tracking references when mirroring
+	EnablePrune bool `json:"enable_prune,omitempty"`
+
+	// either `true` to enable actions unit, or `false` to disable them.
+	HasActions bool `json:"has_actions,omitempty"`
+
+	// either `true` to enable issues for this repository or `false` to disable them.
+	HasIssues bool `json:"has_issues,omitempty"`
+
+	// either `true` to enable packages unit, or `false` to disable them.
+	HasPackages bool `json:"has_packages,omitempty"`
+
+	// either `true` to enable project unit, or `false` to disable them.
+	HasProjects bool `json:"has_projects,omitempty"`
+
+	// either `true` to allow pull requests, or `false` to prevent pull request.
+	HasPullRequests bool `json:"has_pull_requests,omitempty"`
+
+	// either `true` to enable releases unit, or `false` to disable them.
+	HasReleases bool `json:"has_releases,omitempty"`
+
+	// either `true` to enable the wiki for this repository or `false` to disable it.
+	HasWiki bool `json:"has_wiki,omitempty"`
+
+	// either `true` to ignore whitespace for conflicts, or `false` to not ignore whitespace.
+	IgnoreWhitespaceConflicts bool `json:"ignore_whitespace_conflicts,omitempty"`
+
+	// set to a string like `8h30m0s` to set the mirror interval time
+	MirrorInterval string `json:"mirror_interval,omitempty"`
+
+	// name of the repository
+	Name string `json:"name,omitempty"`
+
+	// either `true` to make the repository private or `false` to make it public.
+	// Note: you will get a 422 error if the organization restricts changing repository visibility to organization
+	// owners and a non-owner tries to change the value of private.
+	Private bool `json:"private,omitempty"`
+
+	// `repo` to only allow repo-level projects, `owner` to only allow owner projects, `all` to allow both.
+	ProjectsMode string `json:"projects_mode,omitempty"`
+
+	// either `true` to make this repository a template or `false` to make it a normal repository
+	Template bool `json:"template,omitempty"`
+
+	// a URL with more information about the repository.
+	Website string `json:"website,omitempty"`
+
+	// external tracker
+	ExternalTracker *ExternalTracker `json:"external_tracker,omitempty"`
+
+	// external wiki
+	ExternalWiki *ExternalWiki `json:"external_wiki,omitempty"`
+
+	// internal tracker
+	InternalTracker *InternalTracker `json:"internal_tracker,omitempty"`
+}
+
+// Validate validates this edit repo option
+func (m *EditRepoOption) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateExternalTracker(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateExternalWiki(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateInternalTracker(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *EditRepoOption) validateExternalTracker(formats strfmt.Registry) error {
+	if swag.IsZero(m.ExternalTracker) { // not required
+		return nil
+	}
+
+	if m.ExternalTracker != nil {
+		if err := m.ExternalTracker.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("external_tracker")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("external_tracker")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *EditRepoOption) validateExternalWiki(formats strfmt.Registry) error {
+	if swag.IsZero(m.ExternalWiki) { // not required
+		return nil
+	}
+
+	if m.ExternalWiki != nil {
+		if err := m.ExternalWiki.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("external_wiki")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("external_wiki")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *EditRepoOption) validateInternalTracker(formats strfmt.Registry) error {
+	if swag.IsZero(m.InternalTracker) { // not required
+		return nil
+	}
+
+	if m.InternalTracker != nil {
+		if err := m.InternalTracker.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("internal_tracker")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("internal_tracker")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+// ContextValidate validate this edit repo option based on the context it is used
+func (m *EditRepoOption) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.contextValidateExternalTracker(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.contextValidateExternalWiki(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.contextValidateInternalTracker(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *EditRepoOption) contextValidateExternalTracker(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.ExternalTracker != nil {
+
+		if swag.IsZero(m.ExternalTracker) { // not required
+			return nil
+		}
+
+		if err := m.ExternalTracker.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("external_tracker")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("external_tracker")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *EditRepoOption) contextValidateExternalWiki(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.ExternalWiki != nil {
+
+		if swag.IsZero(m.ExternalWiki) { // not required
+			return nil
+		}
+
+		if err := m.ExternalWiki.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("external_wiki")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("external_wiki")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *EditRepoOption) contextValidateInternalTracker(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.InternalTracker != nil {
+
+		if swag.IsZero(m.InternalTracker) { // not required
+			return nil
+		}
+
+		if err := m.InternalTracker.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("internal_tracker")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("internal_tracker")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *EditRepoOption) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *EditRepoOption) UnmarshalBinary(b []byte) error {
+	var res EditRepoOption
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/edit_team_option.go b/bots-common/gitea-generated/models/edit_team_option.go
new file mode 100644
index 0000000..afe278a
--- /dev/null
+++ b/bots-common/gitea-generated/models/edit_team_option.go
@@ -0,0 +1,142 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"encoding/json"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+	"github.com/go-openapi/validate"
+)
+
+// EditTeamOption EditTeamOption options for editing a team
+//
+// swagger:model EditTeamOption
+type EditTeamOption struct {
+
+	// can create org repo
+	CanCreateOrgRepo bool `json:"can_create_org_repo,omitempty"`
+
+	// description
+	Description string `json:"description,omitempty"`
+
+	// includes all repositories
+	IncludesAllRepositories bool `json:"includes_all_repositories,omitempty"`
+
+	// name
+	// Required: true
+	Name *string `json:"name"`
+
+	// permission
+	// Enum: ["read","write","admin"]
+	Permission string `json:"permission,omitempty"`
+
+	// units
+	// Example: ["repo.code","repo.issues","repo.ext_issues","repo.wiki","repo.pulls","repo.releases","repo.projects","repo.ext_wiki"]
+	Units []string `json:"units"`
+
+	// units map
+	// Example: {"repo.code":"read","repo.ext_issues":"none","repo.ext_wiki":"none","repo.issues":"write","repo.projects":"none","repo.pulls":"owner","repo.releases":"none","repo.wiki":"admin"}
+	UnitsMap map[string]string `json:"units_map,omitempty"`
+}
+
+// Validate validates this edit team option
+func (m *EditTeamOption) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateName(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validatePermission(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *EditTeamOption) validateName(formats strfmt.Registry) error {
+
+	if err := validate.Required("name", "body", m.Name); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+var editTeamOptionTypePermissionPropEnum []interface{}
+
+func init() {
+	var res []string
+	if err := json.Unmarshal([]byte(`["read","write","admin"]`), &res); err != nil {
+		panic(err)
+	}
+	for _, v := range res {
+		editTeamOptionTypePermissionPropEnum = append(editTeamOptionTypePermissionPropEnum, v)
+	}
+}
+
+const (
+
+	// EditTeamOptionPermissionRead captures enum value "read"
+	EditTeamOptionPermissionRead string = "read"
+
+	// EditTeamOptionPermissionWrite captures enum value "write"
+	EditTeamOptionPermissionWrite string = "write"
+
+	// EditTeamOptionPermissionAdmin captures enum value "admin"
+	EditTeamOptionPermissionAdmin string = "admin"
+)
+
+// prop value enum
+func (m *EditTeamOption) validatePermissionEnum(path, location string, value string) error {
+	if err := validate.EnumCase(path, location, value, editTeamOptionTypePermissionPropEnum, true); err != nil {
+		return err
+	}
+	return nil
+}
+
+func (m *EditTeamOption) validatePermission(formats strfmt.Registry) error {
+	if swag.IsZero(m.Permission) { // not required
+		return nil
+	}
+
+	// value enum
+	if err := m.validatePermissionEnum("permission", "body", m.Permission); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+// ContextValidate validates this edit team option based on context it is used
+func (m *EditTeamOption) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *EditTeamOption) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *EditTeamOption) UnmarshalBinary(b []byte) error {
+	var res EditTeamOption
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/edit_user_option.go b/bots-common/gitea-generated/models/edit_user_option.go
new file mode 100644
index 0000000..c090073
--- /dev/null
+++ b/bots-common/gitea-generated/models/edit_user_option.go
@@ -0,0 +1,153 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+	"github.com/go-openapi/validate"
+)
+
+// EditUserOption EditUserOption edit user options
+//
+// swagger:model EditUserOption
+type EditUserOption struct {
+
+	// active
+	Active bool `json:"active,omitempty"`
+
+	// admin
+	Admin bool `json:"admin,omitempty"`
+
+	// allow create organization
+	AllowCreateOrganization bool `json:"allow_create_organization,omitempty"`
+
+	// allow git hook
+	AllowGitHook bool `json:"allow_git_hook,omitempty"`
+
+	// allow import local
+	AllowImportLocal bool `json:"allow_import_local,omitempty"`
+
+	// description
+	Description string `json:"description,omitempty"`
+
+	// email
+	// Format: email
+	Email strfmt.Email `json:"email,omitempty"`
+
+	// full name
+	FullName string `json:"full_name,omitempty"`
+
+	// location
+	Location string `json:"location,omitempty"`
+
+	// login name
+	// Required: true
+	LoginName *string `json:"login_name"`
+
+	// max repo creation
+	MaxRepoCreation int64 `json:"max_repo_creation,omitempty"`
+
+	// must change password
+	MustChangePassword bool `json:"must_change_password,omitempty"`
+
+	// password
+	Password string `json:"password,omitempty"`
+
+	// prohibit login
+	ProhibitLogin bool `json:"prohibit_login,omitempty"`
+
+	// restricted
+	Restricted bool `json:"restricted,omitempty"`
+
+	// source ID
+	// Required: true
+	SourceID *int64 `json:"source_id"`
+
+	// visibility
+	Visibility string `json:"visibility,omitempty"`
+
+	// website
+	Website string `json:"website,omitempty"`
+}
+
+// Validate validates this edit user option
+func (m *EditUserOption) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateEmail(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateLoginName(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateSourceID(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *EditUserOption) validateEmail(formats strfmt.Registry) error {
+	if swag.IsZero(m.Email) { // not required
+		return nil
+	}
+
+	if err := validate.FormatOf("email", "body", "email", m.Email.String(), formats); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (m *EditUserOption) validateLoginName(formats strfmt.Registry) error {
+
+	if err := validate.Required("login_name", "body", m.LoginName); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (m *EditUserOption) validateSourceID(formats strfmt.Registry) error {
+
+	if err := validate.Required("source_id", "body", m.SourceID); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+// ContextValidate validates this edit user option based on context it is used
+func (m *EditUserOption) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *EditUserOption) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *EditUserOption) UnmarshalBinary(b []byte) error {
+	var res EditUserOption
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/email.go b/bots-common/gitea-generated/models/email.go
new file mode 100644
index 0000000..7da7333
--- /dev/null
+++ b/bots-common/gitea-generated/models/email.go
@@ -0,0 +1,86 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+	"github.com/go-openapi/validate"
+)
+
+// Email Email an email address belonging to a user
+//
+// swagger:model Email
+type Email struct {
+
+	// email
+	// Format: email
+	Email strfmt.Email `json:"email,omitempty"`
+
+	// primary
+	Primary bool `json:"primary,omitempty"`
+
+	// user ID
+	UserID int64 `json:"user_id,omitempty"`
+
+	// user name
+	UserName string `json:"username,omitempty"`
+
+	// verified
+	Verified bool `json:"verified,omitempty"`
+}
+
+// Validate validates this email
+func (m *Email) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateEmail(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *Email) validateEmail(formats strfmt.Registry) error {
+	if swag.IsZero(m.Email) { // not required
+		return nil
+	}
+
+	if err := validate.FormatOf("email", "body", "email", m.Email.String(), formats); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+// ContextValidate validates this email based on context it is used
+func (m *Email) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *Email) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *Email) UnmarshalBinary(b []byte) error {
+	var res Email
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/external_tracker.go b/bots-common/gitea-generated/models/external_tracker.go
new file mode 100644
index 0000000..6b17a29
--- /dev/null
+++ b/bots-common/gitea-generated/models/external_tracker.go
@@ -0,0 +1,59 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// ExternalTracker ExternalTracker represents settings for external tracker
+//
+// swagger:model ExternalTracker
+type ExternalTracker struct {
+
+	// External Issue Tracker URL Format. Use the placeholders {user}, {repo} and {index} for the username, repository name and issue index.
+	ExternalTrackerFormat string `json:"external_tracker_format,omitempty"`
+
+	// External Issue Tracker issue regular expression
+	ExternalTrackerRegexpPattern string `json:"external_tracker_regexp_pattern,omitempty"`
+
+	// External Issue Tracker Number Format, either `numeric`, `alphanumeric`, or `regexp`
+	ExternalTrackerStyle string `json:"external_tracker_style,omitempty"`
+
+	// URL of external issue tracker.
+	ExternalTrackerURL string `json:"external_tracker_url,omitempty"`
+}
+
+// Validate validates this external tracker
+func (m *ExternalTracker) Validate(formats strfmt.Registry) error {
+	return nil
+}
+
+// ContextValidate validates this external tracker based on context it is used
+func (m *ExternalTracker) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *ExternalTracker) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *ExternalTracker) UnmarshalBinary(b []byte) error {
+	var res ExternalTracker
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/external_wiki.go b/bots-common/gitea-generated/models/external_wiki.go
new file mode 100644
index 0000000..6f1a1a7
--- /dev/null
+++ b/bots-common/gitea-generated/models/external_wiki.go
@@ -0,0 +1,50 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// ExternalWiki ExternalWiki represents setting for external wiki
+//
+// swagger:model ExternalWiki
+type ExternalWiki struct {
+
+	// URL of external wiki.
+	ExternalWikiURL string `json:"external_wiki_url,omitempty"`
+}
+
+// Validate validates this external wiki
+func (m *ExternalWiki) Validate(formats strfmt.Registry) error {
+	return nil
+}
+
+// ContextValidate validates this external wiki based on context it is used
+func (m *ExternalWiki) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *ExternalWiki) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *ExternalWiki) UnmarshalBinary(b []byte) error {
+	var res ExternalWiki
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/file_commit_response.go b/bots-common/gitea-generated/models/file_commit_response.go
new file mode 100644
index 0000000..4191fc1
--- /dev/null
+++ b/bots-common/gitea-generated/models/file_commit_response.go
@@ -0,0 +1,307 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"strconv"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+	"github.com/go-openapi/validate"
+)
+
+// FileCommitResponse FileCommitResponse contains information generated from a Git commit for a repo's file.
+//
+// swagger:model FileCommitResponse
+type FileCommitResponse struct {
+
+	// created
+	// Format: date-time
+	Created strfmt.DateTime `json:"created,omitempty"`
+
+	// HTML URL
+	HTMLURL string `json:"html_url,omitempty"`
+
+	// message
+	Message string `json:"message,omitempty"`
+
+	// parents
+	Parents []*CommitMeta `json:"parents"`
+
+	// s h a
+	SHA string `json:"sha,omitempty"`
+
+	// URL
+	URL string `json:"url,omitempty"`
+
+	// author
+	Author *CommitUser `json:"author,omitempty"`
+
+	// committer
+	Committer *CommitUser `json:"committer,omitempty"`
+
+	// tree
+	Tree *CommitMeta `json:"tree,omitempty"`
+}
+
+// Validate validates this file commit response
+func (m *FileCommitResponse) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateCreated(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateParents(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateAuthor(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateCommitter(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateTree(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *FileCommitResponse) validateCreated(formats strfmt.Registry) error {
+	if swag.IsZero(m.Created) { // not required
+		return nil
+	}
+
+	if err := validate.FormatOf("created", "body", "date-time", m.Created.String(), formats); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (m *FileCommitResponse) validateParents(formats strfmt.Registry) error {
+	if swag.IsZero(m.Parents) { // not required
+		return nil
+	}
+
+	for i := 0; i < len(m.Parents); i++ {
+		if swag.IsZero(m.Parents[i]) { // not required
+			continue
+		}
+
+		if m.Parents[i] != nil {
+			if err := m.Parents[i].Validate(formats); err != nil {
+				if ve, ok := err.(*errors.Validation); ok {
+					return ve.ValidateName("parents" + "." + strconv.Itoa(i))
+				} else if ce, ok := err.(*errors.CompositeError); ok {
+					return ce.ValidateName("parents" + "." + strconv.Itoa(i))
+				}
+				return err
+			}
+		}
+
+	}
+
+	return nil
+}
+
+func (m *FileCommitResponse) validateAuthor(formats strfmt.Registry) error {
+	if swag.IsZero(m.Author) { // not required
+		return nil
+	}
+
+	if m.Author != nil {
+		if err := m.Author.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("author")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("author")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *FileCommitResponse) validateCommitter(formats strfmt.Registry) error {
+	if swag.IsZero(m.Committer) { // not required
+		return nil
+	}
+
+	if m.Committer != nil {
+		if err := m.Committer.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("committer")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("committer")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *FileCommitResponse) validateTree(formats strfmt.Registry) error {
+	if swag.IsZero(m.Tree) { // not required
+		return nil
+	}
+
+	if m.Tree != nil {
+		if err := m.Tree.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("tree")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("tree")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+// ContextValidate validate this file commit response based on the context it is used
+func (m *FileCommitResponse) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.contextValidateParents(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.contextValidateAuthor(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.contextValidateCommitter(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.contextValidateTree(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *FileCommitResponse) contextValidateParents(ctx context.Context, formats strfmt.Registry) error {
+
+	for i := 0; i < len(m.Parents); i++ {
+
+		if m.Parents[i] != nil {
+
+			if swag.IsZero(m.Parents[i]) { // not required
+				return nil
+			}
+
+			if err := m.Parents[i].ContextValidate(ctx, formats); err != nil {
+				if ve, ok := err.(*errors.Validation); ok {
+					return ve.ValidateName("parents" + "." + strconv.Itoa(i))
+				} else if ce, ok := err.(*errors.CompositeError); ok {
+					return ce.ValidateName("parents" + "." + strconv.Itoa(i))
+				}
+				return err
+			}
+		}
+
+	}
+
+	return nil
+}
+
+func (m *FileCommitResponse) contextValidateAuthor(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.Author != nil {
+
+		if swag.IsZero(m.Author) { // not required
+			return nil
+		}
+
+		if err := m.Author.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("author")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("author")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *FileCommitResponse) contextValidateCommitter(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.Committer != nil {
+
+		if swag.IsZero(m.Committer) { // not required
+			return nil
+		}
+
+		if err := m.Committer.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("committer")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("committer")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *FileCommitResponse) contextValidateTree(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.Tree != nil {
+
+		if swag.IsZero(m.Tree) { // not required
+			return nil
+		}
+
+		if err := m.Tree.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("tree")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("tree")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *FileCommitResponse) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *FileCommitResponse) UnmarshalBinary(b []byte) error {
+	var res FileCommitResponse
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/file_delete_response.go b/bots-common/gitea-generated/models/file_delete_response.go
new file mode 100644
index 0000000..cac6e76
--- /dev/null
+++ b/bots-common/gitea-generated/models/file_delete_response.go
@@ -0,0 +1,163 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// FileDeleteResponse FileDeleteResponse contains information about a repo's file that was deleted
+//
+// swagger:model FileDeleteResponse
+type FileDeleteResponse struct {
+
+	// content
+	Content interface{} `json:"content,omitempty"`
+
+	// commit
+	Commit *FileCommitResponse `json:"commit,omitempty"`
+
+	// verification
+	Verification *PayloadCommitVerification `json:"verification,omitempty"`
+}
+
+// Validate validates this file delete response
+func (m *FileDeleteResponse) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateCommit(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateVerification(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *FileDeleteResponse) validateCommit(formats strfmt.Registry) error {
+	if swag.IsZero(m.Commit) { // not required
+		return nil
+	}
+
+	if m.Commit != nil {
+		if err := m.Commit.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("commit")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("commit")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *FileDeleteResponse) validateVerification(formats strfmt.Registry) error {
+	if swag.IsZero(m.Verification) { // not required
+		return nil
+	}
+
+	if m.Verification != nil {
+		if err := m.Verification.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("verification")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("verification")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+// ContextValidate validate this file delete response based on the context it is used
+func (m *FileDeleteResponse) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.contextValidateCommit(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.contextValidateVerification(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *FileDeleteResponse) contextValidateCommit(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.Commit != nil {
+
+		if swag.IsZero(m.Commit) { // not required
+			return nil
+		}
+
+		if err := m.Commit.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("commit")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("commit")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *FileDeleteResponse) contextValidateVerification(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.Verification != nil {
+
+		if swag.IsZero(m.Verification) { // not required
+			return nil
+		}
+
+		if err := m.Verification.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("verification")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("verification")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *FileDeleteResponse) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *FileDeleteResponse) UnmarshalBinary(b []byte) error {
+	var res FileDeleteResponse
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/file_links_response.go b/bots-common/gitea-generated/models/file_links_response.go
new file mode 100644
index 0000000..bb9a197
--- /dev/null
+++ b/bots-common/gitea-generated/models/file_links_response.go
@@ -0,0 +1,56 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// FileLinksResponse FileLinksResponse contains the links for a repo's file
+//
+// swagger:model FileLinksResponse
+type FileLinksResponse struct {
+
+	// git URL
+	GitURL string `json:"git,omitempty"`
+
+	// HTML URL
+	HTMLURL string `json:"html,omitempty"`
+
+	// self
+	Self string `json:"self,omitempty"`
+}
+
+// Validate validates this file links response
+func (m *FileLinksResponse) Validate(formats strfmt.Registry) error {
+	return nil
+}
+
+// ContextValidate validates this file links response based on context it is used
+func (m *FileLinksResponse) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *FileLinksResponse) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *FileLinksResponse) UnmarshalBinary(b []byte) error {
+	var res FileLinksResponse
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/file_response.go b/bots-common/gitea-generated/models/file_response.go
new file mode 100644
index 0000000..fa1a41b
--- /dev/null
+++ b/bots-common/gitea-generated/models/file_response.go
@@ -0,0 +1,211 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// FileResponse FileResponse contains information about a repo's file
+//
+// swagger:model FileResponse
+type FileResponse struct {
+
+	// commit
+	Commit *FileCommitResponse `json:"commit,omitempty"`
+
+	// content
+	Content *ContentsResponse `json:"content,omitempty"`
+
+	// verification
+	Verification *PayloadCommitVerification `json:"verification,omitempty"`
+}
+
+// Validate validates this file response
+func (m *FileResponse) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateCommit(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateContent(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateVerification(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *FileResponse) validateCommit(formats strfmt.Registry) error {
+	if swag.IsZero(m.Commit) { // not required
+		return nil
+	}
+
+	if m.Commit != nil {
+		if err := m.Commit.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("commit")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("commit")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *FileResponse) validateContent(formats strfmt.Registry) error {
+	if swag.IsZero(m.Content) { // not required
+		return nil
+	}
+
+	if m.Content != nil {
+		if err := m.Content.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("content")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("content")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *FileResponse) validateVerification(formats strfmt.Registry) error {
+	if swag.IsZero(m.Verification) { // not required
+		return nil
+	}
+
+	if m.Verification != nil {
+		if err := m.Verification.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("verification")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("verification")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+// ContextValidate validate this file response based on the context it is used
+func (m *FileResponse) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.contextValidateCommit(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.contextValidateContent(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.contextValidateVerification(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *FileResponse) contextValidateCommit(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.Commit != nil {
+
+		if swag.IsZero(m.Commit) { // not required
+			return nil
+		}
+
+		if err := m.Commit.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("commit")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("commit")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *FileResponse) contextValidateContent(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.Content != nil {
+
+		if swag.IsZero(m.Content) { // not required
+			return nil
+		}
+
+		if err := m.Content.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("content")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("content")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *FileResponse) contextValidateVerification(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.Verification != nil {
+
+		if swag.IsZero(m.Verification) { // not required
+			return nil
+		}
+
+		if err := m.Verification.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("verification")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("verification")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *FileResponse) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *FileResponse) UnmarshalBinary(b []byte) error {
+	var res FileResponse
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/files_response.go b/bots-common/gitea-generated/models/files_response.go
new file mode 100644
index 0000000..6336b05
--- /dev/null
+++ b/bots-common/gitea-generated/models/files_response.go
@@ -0,0 +1,223 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"strconv"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// FilesResponse FilesResponse contains information about multiple files from a repo
+//
+// swagger:model FilesResponse
+type FilesResponse struct {
+
+	// files
+	Files []*ContentsResponse `json:"files"`
+
+	// commit
+	Commit *FileCommitResponse `json:"commit,omitempty"`
+
+	// verification
+	Verification *PayloadCommitVerification `json:"verification,omitempty"`
+}
+
+// Validate validates this files response
+func (m *FilesResponse) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateFiles(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateCommit(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateVerification(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *FilesResponse) validateFiles(formats strfmt.Registry) error {
+	if swag.IsZero(m.Files) { // not required
+		return nil
+	}
+
+	for i := 0; i < len(m.Files); i++ {
+		if swag.IsZero(m.Files[i]) { // not required
+			continue
+		}
+
+		if m.Files[i] != nil {
+			if err := m.Files[i].Validate(formats); err != nil {
+				if ve, ok := err.(*errors.Validation); ok {
+					return ve.ValidateName("files" + "." + strconv.Itoa(i))
+				} else if ce, ok := err.(*errors.CompositeError); ok {
+					return ce.ValidateName("files" + "." + strconv.Itoa(i))
+				}
+				return err
+			}
+		}
+
+	}
+
+	return nil
+}
+
+func (m *FilesResponse) validateCommit(formats strfmt.Registry) error {
+	if swag.IsZero(m.Commit) { // not required
+		return nil
+	}
+
+	if m.Commit != nil {
+		if err := m.Commit.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("commit")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("commit")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *FilesResponse) validateVerification(formats strfmt.Registry) error {
+	if swag.IsZero(m.Verification) { // not required
+		return nil
+	}
+
+	if m.Verification != nil {
+		if err := m.Verification.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("verification")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("verification")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+// ContextValidate validate this files response based on the context it is used
+func (m *FilesResponse) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.contextValidateFiles(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.contextValidateCommit(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.contextValidateVerification(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *FilesResponse) contextValidateFiles(ctx context.Context, formats strfmt.Registry) error {
+
+	for i := 0; i < len(m.Files); i++ {
+
+		if m.Files[i] != nil {
+
+			if swag.IsZero(m.Files[i]) { // not required
+				return nil
+			}
+
+			if err := m.Files[i].ContextValidate(ctx, formats); err != nil {
+				if ve, ok := err.(*errors.Validation); ok {
+					return ve.ValidateName("files" + "." + strconv.Itoa(i))
+				} else if ce, ok := err.(*errors.CompositeError); ok {
+					return ce.ValidateName("files" + "." + strconv.Itoa(i))
+				}
+				return err
+			}
+		}
+
+	}
+
+	return nil
+}
+
+func (m *FilesResponse) contextValidateCommit(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.Commit != nil {
+
+		if swag.IsZero(m.Commit) { // not required
+			return nil
+		}
+
+		if err := m.Commit.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("commit")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("commit")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *FilesResponse) contextValidateVerification(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.Verification != nil {
+
+		if swag.IsZero(m.Verification) { // not required
+			return nil
+		}
+
+		if err := m.Verification.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("verification")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("verification")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *FilesResponse) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *FilesResponse) UnmarshalBinary(b []byte) error {
+	var res FilesResponse
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/g_p_g_key.go b/bots-common/gitea-generated/models/g_p_g_key.go
new file mode 100644
index 0000000..b02f20d
--- /dev/null
+++ b/bots-common/gitea-generated/models/g_p_g_key.go
@@ -0,0 +1,251 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"strconv"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+	"github.com/go-openapi/validate"
+)
+
+// GPGKey GPGKey a user GPG key to sign commit and tag in repository
+//
+// swagger:model GPGKey
+type GPGKey struct {
+
+	// can certify
+	CanCertify bool `json:"can_certify,omitempty"`
+
+	// can encrypt comms
+	CanEncryptComms bool `json:"can_encrypt_comms,omitempty"`
+
+	// can encrypt storage
+	CanEncryptStorage bool `json:"can_encrypt_storage,omitempty"`
+
+	// can sign
+	CanSign bool `json:"can_sign,omitempty"`
+
+	// created
+	// Format: date-time
+	Created strfmt.DateTime `json:"created_at,omitempty"`
+
+	// emails
+	Emails []*GPGKeyEmail `json:"emails"`
+
+	// expires
+	// Format: date-time
+	Expires strfmt.DateTime `json:"expires_at,omitempty"`
+
+	// ID
+	ID int64 `json:"id,omitempty"`
+
+	// key ID
+	KeyID string `json:"key_id,omitempty"`
+
+	// primary key ID
+	PrimaryKeyID string `json:"primary_key_id,omitempty"`
+
+	// public key
+	PublicKey string `json:"public_key,omitempty"`
+
+	// subs key
+	SubsKey []*GPGKey `json:"subkeys"`
+
+	// verified
+	Verified bool `json:"verified,omitempty"`
+}
+
+// Validate validates this g p g key
+func (m *GPGKey) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateCreated(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateEmails(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateExpires(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateSubsKey(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *GPGKey) validateCreated(formats strfmt.Registry) error {
+	if swag.IsZero(m.Created) { // not required
+		return nil
+	}
+
+	if err := validate.FormatOf("created_at", "body", "date-time", m.Created.String(), formats); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (m *GPGKey) validateEmails(formats strfmt.Registry) error {
+	if swag.IsZero(m.Emails) { // not required
+		return nil
+	}
+
+	for i := 0; i < len(m.Emails); i++ {
+		if swag.IsZero(m.Emails[i]) { // not required
+			continue
+		}
+
+		if m.Emails[i] != nil {
+			if err := m.Emails[i].Validate(formats); err != nil {
+				if ve, ok := err.(*errors.Validation); ok {
+					return ve.ValidateName("emails" + "." + strconv.Itoa(i))
+				} else if ce, ok := err.(*errors.CompositeError); ok {
+					return ce.ValidateName("emails" + "." + strconv.Itoa(i))
+				}
+				return err
+			}
+		}
+
+	}
+
+	return nil
+}
+
+func (m *GPGKey) validateExpires(formats strfmt.Registry) error {
+	if swag.IsZero(m.Expires) { // not required
+		return nil
+	}
+
+	if err := validate.FormatOf("expires_at", "body", "date-time", m.Expires.String(), formats); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (m *GPGKey) validateSubsKey(formats strfmt.Registry) error {
+	if swag.IsZero(m.SubsKey) { // not required
+		return nil
+	}
+
+	for i := 0; i < len(m.SubsKey); i++ {
+		if swag.IsZero(m.SubsKey[i]) { // not required
+			continue
+		}
+
+		if m.SubsKey[i] != nil {
+			if err := m.SubsKey[i].Validate(formats); err != nil {
+				if ve, ok := err.(*errors.Validation); ok {
+					return ve.ValidateName("subkeys" + "." + strconv.Itoa(i))
+				} else if ce, ok := err.(*errors.CompositeError); ok {
+					return ce.ValidateName("subkeys" + "." + strconv.Itoa(i))
+				}
+				return err
+			}
+		}
+
+	}
+
+	return nil
+}
+
+// ContextValidate validate this g p g key based on the context it is used
+func (m *GPGKey) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.contextValidateEmails(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.contextValidateSubsKey(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *GPGKey) contextValidateEmails(ctx context.Context, formats strfmt.Registry) error {
+
+	for i := 0; i < len(m.Emails); i++ {
+
+		if m.Emails[i] != nil {
+
+			if swag.IsZero(m.Emails[i]) { // not required
+				return nil
+			}
+
+			if err := m.Emails[i].ContextValidate(ctx, formats); err != nil {
+				if ve, ok := err.(*errors.Validation); ok {
+					return ve.ValidateName("emails" + "." + strconv.Itoa(i))
+				} else if ce, ok := err.(*errors.CompositeError); ok {
+					return ce.ValidateName("emails" + "." + strconv.Itoa(i))
+				}
+				return err
+			}
+		}
+
+	}
+
+	return nil
+}
+
+func (m *GPGKey) contextValidateSubsKey(ctx context.Context, formats strfmt.Registry) error {
+
+	for i := 0; i < len(m.SubsKey); i++ {
+
+		if m.SubsKey[i] != nil {
+
+			if swag.IsZero(m.SubsKey[i]) { // not required
+				return nil
+			}
+
+			if err := m.SubsKey[i].ContextValidate(ctx, formats); err != nil {
+				if ve, ok := err.(*errors.Validation); ok {
+					return ve.ValidateName("subkeys" + "." + strconv.Itoa(i))
+				} else if ce, ok := err.(*errors.CompositeError); ok {
+					return ce.ValidateName("subkeys" + "." + strconv.Itoa(i))
+				}
+				return err
+			}
+		}
+
+	}
+
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *GPGKey) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *GPGKey) UnmarshalBinary(b []byte) error {
+	var res GPGKey
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/g_p_g_key_email.go b/bots-common/gitea-generated/models/g_p_g_key_email.go
new file mode 100644
index 0000000..51fdfe4
--- /dev/null
+++ b/bots-common/gitea-generated/models/g_p_g_key_email.go
@@ -0,0 +1,53 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// GPGKeyEmail GPGKeyEmail an email attached to a GPGKey
+//
+// swagger:model GPGKeyEmail
+type GPGKeyEmail struct {
+
+	// email
+	Email string `json:"email,omitempty"`
+
+	// verified
+	Verified bool `json:"verified,omitempty"`
+}
+
+// Validate validates this g p g key email
+func (m *GPGKeyEmail) Validate(formats strfmt.Registry) error {
+	return nil
+}
+
+// ContextValidate validates this g p g key email based on context it is used
+func (m *GPGKeyEmail) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *GPGKeyEmail) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *GPGKeyEmail) UnmarshalBinary(b []byte) error {
+	var res GPGKeyEmail
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/general_api_settings.go b/bots-common/gitea-generated/models/general_api_settings.go
new file mode 100644
index 0000000..1811493
--- /dev/null
+++ b/bots-common/gitea-generated/models/general_api_settings.go
@@ -0,0 +1,59 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// GeneralAPISettings GeneralAPISettings contains global api settings exposed by it
+//
+// swagger:model GeneralAPISettings
+type GeneralAPISettings struct {
+
+	// default git trees per page
+	DefaultGitTreesPerPage int64 `json:"default_git_trees_per_page,omitempty"`
+
+	// default max blob size
+	DefaultMaxBlobSize int64 `json:"default_max_blob_size,omitempty"`
+
+	// default paging num
+	DefaultPagingNum int64 `json:"default_paging_num,omitempty"`
+
+	// max response items
+	MaxResponseItems int64 `json:"max_response_items,omitempty"`
+}
+
+// Validate validates this general API settings
+func (m *GeneralAPISettings) Validate(formats strfmt.Registry) error {
+	return nil
+}
+
+// ContextValidate validates this general API settings based on context it is used
+func (m *GeneralAPISettings) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *GeneralAPISettings) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *GeneralAPISettings) UnmarshalBinary(b []byte) error {
+	var res GeneralAPISettings
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/general_attachment_settings.go b/bots-common/gitea-generated/models/general_attachment_settings.go
new file mode 100644
index 0000000..1440441
--- /dev/null
+++ b/bots-common/gitea-generated/models/general_attachment_settings.go
@@ -0,0 +1,59 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// GeneralAttachmentSettings GeneralAttachmentSettings contains global Attachment settings exposed by API
+//
+// swagger:model GeneralAttachmentSettings
+type GeneralAttachmentSettings struct {
+
+	// allowed types
+	AllowedTypes string `json:"allowed_types,omitempty"`
+
+	// enabled
+	Enabled bool `json:"enabled,omitempty"`
+
+	// max files
+	MaxFiles int64 `json:"max_files,omitempty"`
+
+	// max size
+	MaxSize int64 `json:"max_size,omitempty"`
+}
+
+// Validate validates this general attachment settings
+func (m *GeneralAttachmentSettings) Validate(formats strfmt.Registry) error {
+	return nil
+}
+
+// ContextValidate validates this general attachment settings based on context it is used
+func (m *GeneralAttachmentSettings) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *GeneralAttachmentSettings) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *GeneralAttachmentSettings) UnmarshalBinary(b []byte) error {
+	var res GeneralAttachmentSettings
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/general_repo_settings.go b/bots-common/gitea-generated/models/general_repo_settings.go
new file mode 100644
index 0000000..a6ea833
--- /dev/null
+++ b/bots-common/gitea-generated/models/general_repo_settings.go
@@ -0,0 +1,65 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// GeneralRepoSettings GeneralRepoSettings contains global repository settings exposed by API
+//
+// swagger:model GeneralRepoSettings
+type GeneralRepoSettings struct {
+
+	// HTTP git disabled
+	HTTPGitDisabled bool `json:"http_git_disabled,omitempty"`
+
+	// l f s disabled
+	LFSDisabled bool `json:"lfs_disabled,omitempty"`
+
+	// migrations disabled
+	MigrationsDisabled bool `json:"migrations_disabled,omitempty"`
+
+	// mirrors disabled
+	MirrorsDisabled bool `json:"mirrors_disabled,omitempty"`
+
+	// stars disabled
+	StarsDisabled bool `json:"stars_disabled,omitempty"`
+
+	// time tracking disabled
+	TimeTrackingDisabled bool `json:"time_tracking_disabled,omitempty"`
+}
+
+// Validate validates this general repo settings
+func (m *GeneralRepoSettings) Validate(formats strfmt.Registry) error {
+	return nil
+}
+
+// ContextValidate validates this general repo settings based on context it is used
+func (m *GeneralRepoSettings) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *GeneralRepoSettings) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *GeneralRepoSettings) UnmarshalBinary(b []byte) error {
+	var res GeneralRepoSettings
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/general_ui_settings.go b/bots-common/gitea-generated/models/general_ui_settings.go
new file mode 100644
index 0000000..548ccb9
--- /dev/null
+++ b/bots-common/gitea-generated/models/general_ui_settings.go
@@ -0,0 +1,56 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// GeneralUISettings GeneralUISettings contains global ui settings exposed by API
+//
+// swagger:model GeneralUISettings
+type GeneralUISettings struct {
+
+	// allowed reactions
+	AllowedReactions []string `json:"allowed_reactions"`
+
+	// custom emojis
+	CustomEmojis []string `json:"custom_emojis"`
+
+	// default theme
+	DefaultTheme string `json:"default_theme,omitempty"`
+}
+
+// Validate validates this general UI settings
+func (m *GeneralUISettings) Validate(formats strfmt.Registry) error {
+	return nil
+}
+
+// ContextValidate validates this general UI settings based on context it is used
+func (m *GeneralUISettings) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *GeneralUISettings) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *GeneralUISettings) UnmarshalBinary(b []byte) error {
+	var res GeneralUISettings
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/generate_repo_option.go b/bots-common/gitea-generated/models/generate_repo_option.go
new file mode 100644
index 0000000..4ca5d6b
--- /dev/null
+++ b/bots-common/gitea-generated/models/generate_repo_option.go
@@ -0,0 +1,118 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+	"github.com/go-openapi/validate"
+)
+
+// GenerateRepoOption GenerateRepoOption options when creating repository using a template
+//
+// swagger:model GenerateRepoOption
+type GenerateRepoOption struct {
+
+	// include avatar of the template repo
+	Avatar bool `json:"avatar,omitempty"`
+
+	// Default branch of the new repository
+	DefaultBranch string `json:"default_branch,omitempty"`
+
+	// Description of the repository to create
+	Description string `json:"description,omitempty"`
+
+	// include git content of default branch in template repo
+	GitContent bool `json:"git_content,omitempty"`
+
+	// include git hooks in template repo
+	GitHooks bool `json:"git_hooks,omitempty"`
+
+	// include labels in template repo
+	Labels bool `json:"labels,omitempty"`
+
+	// Name of the repository to create
+	// Required: true
+	Name *string `json:"name"`
+
+	// The organization or person who will own the new repository
+	// Required: true
+	Owner *string `json:"owner"`
+
+	// Whether the repository is private
+	Private bool `json:"private,omitempty"`
+
+	// include protected branches in template repo
+	ProtectedBranch bool `json:"protected_branch,omitempty"`
+
+	// include topics in template repo
+	Topics bool `json:"topics,omitempty"`
+
+	// include webhooks in template repo
+	Webhooks bool `json:"webhooks,omitempty"`
+}
+
+// Validate validates this generate repo option
+func (m *GenerateRepoOption) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateName(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateOwner(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *GenerateRepoOption) validateName(formats strfmt.Registry) error {
+
+	if err := validate.Required("name", "body", m.Name); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (m *GenerateRepoOption) validateOwner(formats strfmt.Registry) error {
+
+	if err := validate.Required("owner", "body", m.Owner); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+// ContextValidate validates this generate repo option based on context it is used
+func (m *GenerateRepoOption) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *GenerateRepoOption) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *GenerateRepoOption) UnmarshalBinary(b []byte) error {
+	var res GenerateRepoOption
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/git_blob_response.go b/bots-common/gitea-generated/models/git_blob_response.go
new file mode 100644
index 0000000..afd75fe
--- /dev/null
+++ b/bots-common/gitea-generated/models/git_blob_response.go
@@ -0,0 +1,62 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// GitBlobResponse GitBlobResponse represents a git blob
+//
+// swagger:model GitBlobResponse
+type GitBlobResponse struct {
+
+	// content
+	Content string `json:"content,omitempty"`
+
+	// encoding
+	Encoding string `json:"encoding,omitempty"`
+
+	// s h a
+	SHA string `json:"sha,omitempty"`
+
+	// size
+	Size int64 `json:"size,omitempty"`
+
+	// URL
+	URL string `json:"url,omitempty"`
+}
+
+// Validate validates this git blob response
+func (m *GitBlobResponse) Validate(formats strfmt.Registry) error {
+	return nil
+}
+
+// ContextValidate validates this git blob response based on context it is used
+func (m *GitBlobResponse) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *GitBlobResponse) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *GitBlobResponse) UnmarshalBinary(b []byte) error {
+	var res GitBlobResponse
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/git_entry.go b/bots-common/gitea-generated/models/git_entry.go
new file mode 100644
index 0000000..8132adc
--- /dev/null
+++ b/bots-common/gitea-generated/models/git_entry.go
@@ -0,0 +1,65 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// GitEntry GitEntry represents a git tree
+//
+// swagger:model GitEntry
+type GitEntry struct {
+
+	// mode
+	Mode string `json:"mode,omitempty"`
+
+	// path
+	Path string `json:"path,omitempty"`
+
+	// s h a
+	SHA string `json:"sha,omitempty"`
+
+	// size
+	Size int64 `json:"size,omitempty"`
+
+	// type
+	Type string `json:"type,omitempty"`
+
+	// URL
+	URL string `json:"url,omitempty"`
+}
+
+// Validate validates this git entry
+func (m *GitEntry) Validate(formats strfmt.Registry) error {
+	return nil
+}
+
+// ContextValidate validates this git entry based on context it is used
+func (m *GitEntry) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *GitEntry) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *GitEntry) UnmarshalBinary(b []byte) error {
+	var res GitEntry
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/git_hook.go b/bots-common/gitea-generated/models/git_hook.go
new file mode 100644
index 0000000..d20a476
--- /dev/null
+++ b/bots-common/gitea-generated/models/git_hook.go
@@ -0,0 +1,56 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// GitHook GitHook represents a Git repository hook
+//
+// swagger:model GitHook
+type GitHook struct {
+
+	// content
+	Content string `json:"content,omitempty"`
+
+	// is active
+	IsActive bool `json:"is_active,omitempty"`
+
+	// name
+	Name string `json:"name,omitempty"`
+}
+
+// Validate validates this git hook
+func (m *GitHook) Validate(formats strfmt.Registry) error {
+	return nil
+}
+
+// ContextValidate validates this git hook based on context it is used
+func (m *GitHook) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *GitHook) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *GitHook) UnmarshalBinary(b []byte) error {
+	var res GitHook
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/git_object.go b/bots-common/gitea-generated/models/git_object.go
new file mode 100644
index 0000000..6aff549
--- /dev/null
+++ b/bots-common/gitea-generated/models/git_object.go
@@ -0,0 +1,56 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// GitObject GitObject represents a Git object.
+//
+// swagger:model GitObject
+type GitObject struct {
+
+	// s h a
+	SHA string `json:"sha,omitempty"`
+
+	// type
+	Type string `json:"type,omitempty"`
+
+	// URL
+	URL string `json:"url,omitempty"`
+}
+
+// Validate validates this git object
+func (m *GitObject) Validate(formats strfmt.Registry) error {
+	return nil
+}
+
+// ContextValidate validates this git object based on context it is used
+func (m *GitObject) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *GitObject) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *GitObject) UnmarshalBinary(b []byte) error {
+	var res GitObject
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/git_tree_response.go b/bots-common/gitea-generated/models/git_tree_response.go
new file mode 100644
index 0000000..d7cbe4a
--- /dev/null
+++ b/bots-common/gitea-generated/models/git_tree_response.go
@@ -0,0 +1,136 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"strconv"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// GitTreeResponse GitTreeResponse returns a git tree
+//
+// swagger:model GitTreeResponse
+type GitTreeResponse struct {
+
+	// entries
+	Entries []*GitEntry `json:"tree"`
+
+	// page
+	Page int64 `json:"page,omitempty"`
+
+	// s h a
+	SHA string `json:"sha,omitempty"`
+
+	// total count
+	TotalCount int64 `json:"total_count,omitempty"`
+
+	// truncated
+	Truncated bool `json:"truncated,omitempty"`
+
+	// URL
+	URL string `json:"url,omitempty"`
+}
+
+// Validate validates this git tree response
+func (m *GitTreeResponse) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateEntries(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *GitTreeResponse) validateEntries(formats strfmt.Registry) error {
+	if swag.IsZero(m.Entries) { // not required
+		return nil
+	}
+
+	for i := 0; i < len(m.Entries); i++ {
+		if swag.IsZero(m.Entries[i]) { // not required
+			continue
+		}
+
+		if m.Entries[i] != nil {
+			if err := m.Entries[i].Validate(formats); err != nil {
+				if ve, ok := err.(*errors.Validation); ok {
+					return ve.ValidateName("tree" + "." + strconv.Itoa(i))
+				} else if ce, ok := err.(*errors.CompositeError); ok {
+					return ce.ValidateName("tree" + "." + strconv.Itoa(i))
+				}
+				return err
+			}
+		}
+
+	}
+
+	return nil
+}
+
+// ContextValidate validate this git tree response based on the context it is used
+func (m *GitTreeResponse) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.contextValidateEntries(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *GitTreeResponse) contextValidateEntries(ctx context.Context, formats strfmt.Registry) error {
+
+	for i := 0; i < len(m.Entries); i++ {
+
+		if m.Entries[i] != nil {
+
+			if swag.IsZero(m.Entries[i]) { // not required
+				return nil
+			}
+
+			if err := m.Entries[i].ContextValidate(ctx, formats); err != nil {
+				if ve, ok := err.(*errors.Validation); ok {
+					return ve.ValidateName("tree" + "." + strconv.Itoa(i))
+				} else if ce, ok := err.(*errors.CompositeError); ok {
+					return ce.ValidateName("tree" + "." + strconv.Itoa(i))
+				}
+				return err
+			}
+		}
+
+	}
+
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *GitTreeResponse) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *GitTreeResponse) UnmarshalBinary(b []byte) error {
+	var res GitTreeResponse
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/gitignore_template_info.go b/bots-common/gitea-generated/models/gitignore_template_info.go
new file mode 100644
index 0000000..f0bec9d
--- /dev/null
+++ b/bots-common/gitea-generated/models/gitignore_template_info.go
@@ -0,0 +1,53 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// GitignoreTemplateInfo GitignoreTemplateInfo name and text of a gitignore template
+//
+// swagger:model GitignoreTemplateInfo
+type GitignoreTemplateInfo struct {
+
+	// name
+	Name string `json:"name,omitempty"`
+
+	// source
+	Source string `json:"source,omitempty"`
+}
+
+// Validate validates this gitignore template info
+func (m *GitignoreTemplateInfo) Validate(formats strfmt.Registry) error {
+	return nil
+}
+
+// ContextValidate validates this gitignore template info based on context it is used
+func (m *GitignoreTemplateInfo) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *GitignoreTemplateInfo) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *GitignoreTemplateInfo) UnmarshalBinary(b []byte) error {
+	var res GitignoreTemplateInfo
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/hook.go b/bots-common/gitea-generated/models/hook.go
new file mode 100644
index 0000000..9f0ba0b
--- /dev/null
+++ b/bots-common/gitea-generated/models/hook.go
@@ -0,0 +1,115 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+	"github.com/go-openapi/validate"
+)
+
+// Hook Hook a hook is a web hook when one repository changed
+//
+// swagger:model Hook
+type Hook struct {
+
+	// active
+	Active bool `json:"active,omitempty"`
+
+	// authorization header
+	AuthorizationHeader string `json:"authorization_header,omitempty"`
+
+	// branch filter
+	BranchFilter string `json:"branch_filter,omitempty"`
+
+	// config
+	Config map[string]string `json:"config,omitempty"`
+
+	// created
+	// Format: date-time
+	Created strfmt.DateTime `json:"created_at,omitempty"`
+
+	// events
+	Events []string `json:"events"`
+
+	// ID
+	ID int64 `json:"id,omitempty"`
+
+	// type
+	Type string `json:"type,omitempty"`
+
+	// updated
+	// Format: date-time
+	Updated strfmt.DateTime `json:"updated_at,omitempty"`
+}
+
+// Validate validates this hook
+func (m *Hook) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateCreated(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateUpdated(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *Hook) validateCreated(formats strfmt.Registry) error {
+	if swag.IsZero(m.Created) { // not required
+		return nil
+	}
+
+	if err := validate.FormatOf("created_at", "body", "date-time", m.Created.String(), formats); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (m *Hook) validateUpdated(formats strfmt.Registry) error {
+	if swag.IsZero(m.Updated) { // not required
+		return nil
+	}
+
+	if err := validate.FormatOf("updated_at", "body", "date-time", m.Updated.String(), formats); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+// ContextValidate validates this hook based on context it is used
+func (m *Hook) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *Hook) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *Hook) UnmarshalBinary(b []byte) error {
+	var res Hook
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/identity.go b/bots-common/gitea-generated/models/identity.go
new file mode 100644
index 0000000..1329658
--- /dev/null
+++ b/bots-common/gitea-generated/models/identity.go
@@ -0,0 +1,77 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+	"github.com/go-openapi/validate"
+)
+
+// Identity Identity for a person's identity like an author or committer
+//
+// swagger:model Identity
+type Identity struct {
+
+	// email
+	// Format: email
+	Email strfmt.Email `json:"email,omitempty"`
+
+	// name
+	Name string `json:"name,omitempty"`
+}
+
+// Validate validates this identity
+func (m *Identity) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateEmail(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *Identity) validateEmail(formats strfmt.Registry) error {
+	if swag.IsZero(m.Email) { // not required
+		return nil
+	}
+
+	if err := validate.FormatOf("email", "body", "email", m.Email.String(), formats); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+// ContextValidate validates this identity based on context it is used
+func (m *Identity) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *Identity) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *Identity) UnmarshalBinary(b []byte) error {
+	var res Identity
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/internal_tracker.go b/bots-common/gitea-generated/models/internal_tracker.go
new file mode 100644
index 0000000..eb35dee
--- /dev/null
+++ b/bots-common/gitea-generated/models/internal_tracker.go
@@ -0,0 +1,56 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// InternalTracker InternalTracker represents settings for internal tracker
+//
+// swagger:model InternalTracker
+type InternalTracker struct {
+
+	// Let only contributors track time (Built-in issue tracker)
+	AllowOnlyContributorsToTrackTime bool `json:"allow_only_contributors_to_track_time,omitempty"`
+
+	// Enable dependencies for issues and pull requests (Built-in issue tracker)
+	EnableIssueDependencies bool `json:"enable_issue_dependencies,omitempty"`
+
+	// Enable time tracking (Built-in issue tracker)
+	EnableTimeTracker bool `json:"enable_time_tracker,omitempty"`
+}
+
+// Validate validates this internal tracker
+func (m *InternalTracker) Validate(formats strfmt.Registry) error {
+	return nil
+}
+
+// ContextValidate validates this internal tracker based on context it is used
+func (m *InternalTracker) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *InternalTracker) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *InternalTracker) UnmarshalBinary(b []byte) error {
+	var res InternalTracker
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/issue.go b/bots-common/gitea-generated/models/issue.go
new file mode 100644
index 0000000..23ddcb9
--- /dev/null
+++ b/bots-common/gitea-generated/models/issue.go
@@ -0,0 +1,663 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"strconv"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+	"github.com/go-openapi/validate"
+)
+
+// Issue Issue represents an issue in a repository
+//
+// swagger:model Issue
+type Issue struct {
+
+	// assignees
+	Assignees []*User `json:"assignees"`
+
+	// attachments
+	Attachments []*Attachment `json:"assets"`
+
+	// body
+	Body string `json:"body,omitempty"`
+
+	// closed
+	// Format: date-time
+	Closed strfmt.DateTime `json:"closed_at,omitempty"`
+
+	// comments
+	Comments int64 `json:"comments,omitempty"`
+
+	// created
+	// Format: date-time
+	Created strfmt.DateTime `json:"created_at,omitempty"`
+
+	// deadline
+	// Format: date-time
+	Deadline strfmt.DateTime `json:"due_date,omitempty"`
+
+	// HTML URL
+	HTMLURL string `json:"html_url,omitempty"`
+
+	// ID
+	ID int64 `json:"id,omitempty"`
+
+	// index
+	Index int64 `json:"number,omitempty"`
+
+	// is locked
+	IsLocked bool `json:"is_locked,omitempty"`
+
+	// labels
+	Labels []*Label `json:"labels"`
+
+	// original author
+	OriginalAuthor string `json:"original_author,omitempty"`
+
+	// original author ID
+	OriginalAuthorID int64 `json:"original_author_id,omitempty"`
+
+	// pin order
+	PinOrder int64 `json:"pin_order,omitempty"`
+
+	// ref
+	Ref string `json:"ref,omitempty"`
+
+	// title
+	Title string `json:"title,omitempty"`
+
+	// URL
+	URL string `json:"url,omitempty"`
+
+	// updated
+	// Format: date-time
+	Updated strfmt.DateTime `json:"updated_at,omitempty"`
+
+	// assignee
+	Assignee *User `json:"assignee,omitempty"`
+
+	// milestone
+	Milestone *Milestone `json:"milestone,omitempty"`
+
+	// pull request
+	PullRequest *PullRequestMeta `json:"pull_request,omitempty"`
+
+	// repository
+	Repository *RepositoryMeta `json:"repository,omitempty"`
+
+	// state
+	State StateType `json:"state,omitempty"`
+
+	// user
+	User *User `json:"user,omitempty"`
+}
+
+// Validate validates this issue
+func (m *Issue) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateAssignees(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateAttachments(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateClosed(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateCreated(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateDeadline(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateLabels(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateUpdated(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateAssignee(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateMilestone(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validatePullRequest(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateRepository(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateState(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateUser(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *Issue) validateAssignees(formats strfmt.Registry) error {
+	if swag.IsZero(m.Assignees) { // not required
+		return nil
+	}
+
+	for i := 0; i < len(m.Assignees); i++ {
+		if swag.IsZero(m.Assignees[i]) { // not required
+			continue
+		}
+
+		if m.Assignees[i] != nil {
+			if err := m.Assignees[i].Validate(formats); err != nil {
+				if ve, ok := err.(*errors.Validation); ok {
+					return ve.ValidateName("assignees" + "." + strconv.Itoa(i))
+				} else if ce, ok := err.(*errors.CompositeError); ok {
+					return ce.ValidateName("assignees" + "." + strconv.Itoa(i))
+				}
+				return err
+			}
+		}
+
+	}
+
+	return nil
+}
+
+func (m *Issue) validateAttachments(formats strfmt.Registry) error {
+	if swag.IsZero(m.Attachments) { // not required
+		return nil
+	}
+
+	for i := 0; i < len(m.Attachments); i++ {
+		if swag.IsZero(m.Attachments[i]) { // not required
+			continue
+		}
+
+		if m.Attachments[i] != nil {
+			if err := m.Attachments[i].Validate(formats); err != nil {
+				if ve, ok := err.(*errors.Validation); ok {
+					return ve.ValidateName("assets" + "." + strconv.Itoa(i))
+				} else if ce, ok := err.(*errors.CompositeError); ok {
+					return ce.ValidateName("assets" + "." + strconv.Itoa(i))
+				}
+				return err
+			}
+		}
+
+	}
+
+	return nil
+}
+
+func (m *Issue) validateClosed(formats strfmt.Registry) error {
+	if swag.IsZero(m.Closed) { // not required
+		return nil
+	}
+
+	if err := validate.FormatOf("closed_at", "body", "date-time", m.Closed.String(), formats); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (m *Issue) validateCreated(formats strfmt.Registry) error {
+	if swag.IsZero(m.Created) { // not required
+		return nil
+	}
+
+	if err := validate.FormatOf("created_at", "body", "date-time", m.Created.String(), formats); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (m *Issue) validateDeadline(formats strfmt.Registry) error {
+	if swag.IsZero(m.Deadline) { // not required
+		return nil
+	}
+
+	if err := validate.FormatOf("due_date", "body", "date-time", m.Deadline.String(), formats); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (m *Issue) validateLabels(formats strfmt.Registry) error {
+	if swag.IsZero(m.Labels) { // not required
+		return nil
+	}
+
+	for i := 0; i < len(m.Labels); i++ {
+		if swag.IsZero(m.Labels[i]) { // not required
+			continue
+		}
+
+		if m.Labels[i] != nil {
+			if err := m.Labels[i].Validate(formats); err != nil {
+				if ve, ok := err.(*errors.Validation); ok {
+					return ve.ValidateName("labels" + "." + strconv.Itoa(i))
+				} else if ce, ok := err.(*errors.CompositeError); ok {
+					return ce.ValidateName("labels" + "." + strconv.Itoa(i))
+				}
+				return err
+			}
+		}
+
+	}
+
+	return nil
+}
+
+func (m *Issue) validateUpdated(formats strfmt.Registry) error {
+	if swag.IsZero(m.Updated) { // not required
+		return nil
+	}
+
+	if err := validate.FormatOf("updated_at", "body", "date-time", m.Updated.String(), formats); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (m *Issue) validateAssignee(formats strfmt.Registry) error {
+	if swag.IsZero(m.Assignee) { // not required
+		return nil
+	}
+
+	if m.Assignee != nil {
+		if err := m.Assignee.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("assignee")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("assignee")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *Issue) validateMilestone(formats strfmt.Registry) error {
+	if swag.IsZero(m.Milestone) { // not required
+		return nil
+	}
+
+	if m.Milestone != nil {
+		if err := m.Milestone.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("milestone")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("milestone")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *Issue) validatePullRequest(formats strfmt.Registry) error {
+	if swag.IsZero(m.PullRequest) { // not required
+		return nil
+	}
+
+	if m.PullRequest != nil {
+		if err := m.PullRequest.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("pull_request")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("pull_request")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *Issue) validateRepository(formats strfmt.Registry) error {
+	if swag.IsZero(m.Repository) { // not required
+		return nil
+	}
+
+	if m.Repository != nil {
+		if err := m.Repository.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("repository")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("repository")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *Issue) validateState(formats strfmt.Registry) error {
+	if swag.IsZero(m.State) { // not required
+		return nil
+	}
+
+	if err := m.State.Validate(formats); err != nil {
+		if ve, ok := err.(*errors.Validation); ok {
+			return ve.ValidateName("state")
+		} else if ce, ok := err.(*errors.CompositeError); ok {
+			return ce.ValidateName("state")
+		}
+		return err
+	}
+
+	return nil
+}
+
+func (m *Issue) validateUser(formats strfmt.Registry) error {
+	if swag.IsZero(m.User) { // not required
+		return nil
+	}
+
+	if m.User != nil {
+		if err := m.User.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("user")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("user")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+// ContextValidate validate this issue based on the context it is used
+func (m *Issue) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.contextValidateAssignees(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.contextValidateAttachments(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.contextValidateLabels(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.contextValidateAssignee(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.contextValidateMilestone(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.contextValidatePullRequest(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.contextValidateRepository(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.contextValidateState(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.contextValidateUser(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *Issue) contextValidateAssignees(ctx context.Context, formats strfmt.Registry) error {
+
+	for i := 0; i < len(m.Assignees); i++ {
+
+		if m.Assignees[i] != nil {
+
+			if swag.IsZero(m.Assignees[i]) { // not required
+				return nil
+			}
+
+			if err := m.Assignees[i].ContextValidate(ctx, formats); err != nil {
+				if ve, ok := err.(*errors.Validation); ok {
+					return ve.ValidateName("assignees" + "." + strconv.Itoa(i))
+				} else if ce, ok := err.(*errors.CompositeError); ok {
+					return ce.ValidateName("assignees" + "." + strconv.Itoa(i))
+				}
+				return err
+			}
+		}
+
+	}
+
+	return nil
+}
+
+func (m *Issue) contextValidateAttachments(ctx context.Context, formats strfmt.Registry) error {
+
+	for i := 0; i < len(m.Attachments); i++ {
+
+		if m.Attachments[i] != nil {
+
+			if swag.IsZero(m.Attachments[i]) { // not required
+				return nil
+			}
+
+			if err := m.Attachments[i].ContextValidate(ctx, formats); err != nil {
+				if ve, ok := err.(*errors.Validation); ok {
+					return ve.ValidateName("assets" + "." + strconv.Itoa(i))
+				} else if ce, ok := err.(*errors.CompositeError); ok {
+					return ce.ValidateName("assets" + "." + strconv.Itoa(i))
+				}
+				return err
+			}
+		}
+
+	}
+
+	return nil
+}
+
+func (m *Issue) contextValidateLabels(ctx context.Context, formats strfmt.Registry) error {
+
+	for i := 0; i < len(m.Labels); i++ {
+
+		if m.Labels[i] != nil {
+
+			if swag.IsZero(m.Labels[i]) { // not required
+				return nil
+			}
+
+			if err := m.Labels[i].ContextValidate(ctx, formats); err != nil {
+				if ve, ok := err.(*errors.Validation); ok {
+					return ve.ValidateName("labels" + "." + strconv.Itoa(i))
+				} else if ce, ok := err.(*errors.CompositeError); ok {
+					return ce.ValidateName("labels" + "." + strconv.Itoa(i))
+				}
+				return err
+			}
+		}
+
+	}
+
+	return nil
+}
+
+func (m *Issue) contextValidateAssignee(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.Assignee != nil {
+
+		if swag.IsZero(m.Assignee) { // not required
+			return nil
+		}
+
+		if err := m.Assignee.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("assignee")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("assignee")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *Issue) contextValidateMilestone(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.Milestone != nil {
+
+		if swag.IsZero(m.Milestone) { // not required
+			return nil
+		}
+
+		if err := m.Milestone.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("milestone")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("milestone")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *Issue) contextValidatePullRequest(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.PullRequest != nil {
+
+		if swag.IsZero(m.PullRequest) { // not required
+			return nil
+		}
+
+		if err := m.PullRequest.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("pull_request")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("pull_request")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *Issue) contextValidateRepository(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.Repository != nil {
+
+		if swag.IsZero(m.Repository) { // not required
+			return nil
+		}
+
+		if err := m.Repository.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("repository")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("repository")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *Issue) contextValidateState(ctx context.Context, formats strfmt.Registry) error {
+
+	if swag.IsZero(m.State) { // not required
+		return nil
+	}
+
+	if err := m.State.ContextValidate(ctx, formats); err != nil {
+		if ve, ok := err.(*errors.Validation); ok {
+			return ve.ValidateName("state")
+		} else if ce, ok := err.(*errors.CompositeError); ok {
+			return ce.ValidateName("state")
+		}
+		return err
+	}
+
+	return nil
+}
+
+func (m *Issue) contextValidateUser(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.User != nil {
+
+		if swag.IsZero(m.User) { // not required
+			return nil
+		}
+
+		if err := m.User.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("user")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("user")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *Issue) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *Issue) UnmarshalBinary(b []byte) error {
+	var res Issue
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/issue_config.go b/bots-common/gitea-generated/models/issue_config.go
new file mode 100644
index 0000000..d69474f
--- /dev/null
+++ b/bots-common/gitea-generated/models/issue_config.go
@@ -0,0 +1,124 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"strconv"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// IssueConfig issue config
+//
+// swagger:model IssueConfig
+type IssueConfig struct {
+
+	// blank issues enabled
+	BlankIssuesEnabled bool `json:"blank_issues_enabled,omitempty"`
+
+	// contact links
+	ContactLinks []*IssueConfigContactLink `json:"contact_links"`
+}
+
+// Validate validates this issue config
+func (m *IssueConfig) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateContactLinks(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *IssueConfig) validateContactLinks(formats strfmt.Registry) error {
+	if swag.IsZero(m.ContactLinks) { // not required
+		return nil
+	}
+
+	for i := 0; i < len(m.ContactLinks); i++ {
+		if swag.IsZero(m.ContactLinks[i]) { // not required
+			continue
+		}
+
+		if m.ContactLinks[i] != nil {
+			if err := m.ContactLinks[i].Validate(formats); err != nil {
+				if ve, ok := err.(*errors.Validation); ok {
+					return ve.ValidateName("contact_links" + "." + strconv.Itoa(i))
+				} else if ce, ok := err.(*errors.CompositeError); ok {
+					return ce.ValidateName("contact_links" + "." + strconv.Itoa(i))
+				}
+				return err
+			}
+		}
+
+	}
+
+	return nil
+}
+
+// ContextValidate validate this issue config based on the context it is used
+func (m *IssueConfig) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.contextValidateContactLinks(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *IssueConfig) contextValidateContactLinks(ctx context.Context, formats strfmt.Registry) error {
+
+	for i := 0; i < len(m.ContactLinks); i++ {
+
+		if m.ContactLinks[i] != nil {
+
+			if swag.IsZero(m.ContactLinks[i]) { // not required
+				return nil
+			}
+
+			if err := m.ContactLinks[i].ContextValidate(ctx, formats); err != nil {
+				if ve, ok := err.(*errors.Validation); ok {
+					return ve.ValidateName("contact_links" + "." + strconv.Itoa(i))
+				} else if ce, ok := err.(*errors.CompositeError); ok {
+					return ce.ValidateName("contact_links" + "." + strconv.Itoa(i))
+				}
+				return err
+			}
+		}
+
+	}
+
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *IssueConfig) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *IssueConfig) UnmarshalBinary(b []byte) error {
+	var res IssueConfig
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/issue_config_contact_link.go b/bots-common/gitea-generated/models/issue_config_contact_link.go
new file mode 100644
index 0000000..c6f8b51
--- /dev/null
+++ b/bots-common/gitea-generated/models/issue_config_contact_link.go
@@ -0,0 +1,56 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// IssueConfigContactLink issue config contact link
+//
+// swagger:model IssueConfigContactLink
+type IssueConfigContactLink struct {
+
+	// about
+	About string `json:"about,omitempty"`
+
+	// name
+	Name string `json:"name,omitempty"`
+
+	// URL
+	URL string `json:"url,omitempty"`
+}
+
+// Validate validates this issue config contact link
+func (m *IssueConfigContactLink) Validate(formats strfmt.Registry) error {
+	return nil
+}
+
+// ContextValidate validates this issue config contact link based on context it is used
+func (m *IssueConfigContactLink) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *IssueConfigContactLink) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *IssueConfigContactLink) UnmarshalBinary(b []byte) error {
+	var res IssueConfigContactLink
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/issue_config_validation.go b/bots-common/gitea-generated/models/issue_config_validation.go
new file mode 100644
index 0000000..d5176ad
--- /dev/null
+++ b/bots-common/gitea-generated/models/issue_config_validation.go
@@ -0,0 +1,53 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// IssueConfigValidation issue config validation
+//
+// swagger:model IssueConfigValidation
+type IssueConfigValidation struct {
+
+	// message
+	Message string `json:"message,omitempty"`
+
+	// valid
+	Valid bool `json:"valid,omitempty"`
+}
+
+// Validate validates this issue config validation
+func (m *IssueConfigValidation) Validate(formats strfmt.Registry) error {
+	return nil
+}
+
+// ContextValidate validates this issue config validation based on context it is used
+func (m *IssueConfigValidation) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *IssueConfigValidation) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *IssueConfigValidation) UnmarshalBinary(b []byte) error {
+	var res IssueConfigValidation
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/issue_deadline.go b/bots-common/gitea-generated/models/issue_deadline.go
new file mode 100644
index 0000000..3759ca8
--- /dev/null
+++ b/bots-common/gitea-generated/models/issue_deadline.go
@@ -0,0 +1,74 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+	"github.com/go-openapi/validate"
+)
+
+// IssueDeadline IssueDeadline represents an issue deadline
+//
+// swagger:model IssueDeadline
+type IssueDeadline struct {
+
+	// deadline
+	// Format: date-time
+	Deadline strfmt.DateTime `json:"due_date,omitempty"`
+}
+
+// Validate validates this issue deadline
+func (m *IssueDeadline) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateDeadline(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *IssueDeadline) validateDeadline(formats strfmt.Registry) error {
+	if swag.IsZero(m.Deadline) { // not required
+		return nil
+	}
+
+	if err := validate.FormatOf("due_date", "body", "date-time", m.Deadline.String(), formats); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+// ContextValidate validates this issue deadline based on context it is used
+func (m *IssueDeadline) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *IssueDeadline) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *IssueDeadline) UnmarshalBinary(b []byte) error {
+	var res IssueDeadline
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/issue_form_field.go b/bots-common/gitea-generated/models/issue_form_field.go
new file mode 100644
index 0000000..08571b1
--- /dev/null
+++ b/bots-common/gitea-generated/models/issue_form_field.go
@@ -0,0 +1,168 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"strconv"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// IssueFormField IssueFormField represents a form field
+//
+// swagger:model IssueFormField
+type IssueFormField struct {
+
+	// attributes
+	Attributes map[string]interface{} `json:"attributes,omitempty"`
+
+	// ID
+	ID string `json:"id,omitempty"`
+
+	// validations
+	Validations map[string]interface{} `json:"validations,omitempty"`
+
+	// visible
+	Visible []IssueFormFieldVisible `json:"visible"`
+
+	// type
+	Type IssueFormFieldType `json:"type,omitempty"`
+}
+
+// Validate validates this issue form field
+func (m *IssueFormField) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateVisible(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateType(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *IssueFormField) validateVisible(formats strfmt.Registry) error {
+	if swag.IsZero(m.Visible) { // not required
+		return nil
+	}
+
+	for i := 0; i < len(m.Visible); i++ {
+
+		if err := m.Visible[i].Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("visible" + "." + strconv.Itoa(i))
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("visible" + "." + strconv.Itoa(i))
+			}
+			return err
+		}
+
+	}
+
+	return nil
+}
+
+func (m *IssueFormField) validateType(formats strfmt.Registry) error {
+	if swag.IsZero(m.Type) { // not required
+		return nil
+	}
+
+	if err := m.Type.Validate(formats); err != nil {
+		if ve, ok := err.(*errors.Validation); ok {
+			return ve.ValidateName("type")
+		} else if ce, ok := err.(*errors.CompositeError); ok {
+			return ce.ValidateName("type")
+		}
+		return err
+	}
+
+	return nil
+}
+
+// ContextValidate validate this issue form field based on the context it is used
+func (m *IssueFormField) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.contextValidateVisible(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.contextValidateType(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *IssueFormField) contextValidateVisible(ctx context.Context, formats strfmt.Registry) error {
+
+	for i := 0; i < len(m.Visible); i++ {
+
+		if swag.IsZero(m.Visible[i]) { // not required
+			return nil
+		}
+
+		if err := m.Visible[i].ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("visible" + "." + strconv.Itoa(i))
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("visible" + "." + strconv.Itoa(i))
+			}
+			return err
+		}
+
+	}
+
+	return nil
+}
+
+func (m *IssueFormField) contextValidateType(ctx context.Context, formats strfmt.Registry) error {
+
+	if swag.IsZero(m.Type) { // not required
+		return nil
+	}
+
+	if err := m.Type.ContextValidate(ctx, formats); err != nil {
+		if ve, ok := err.(*errors.Validation); ok {
+			return ve.ValidateName("type")
+		} else if ce, ok := err.(*errors.CompositeError); ok {
+			return ce.ValidateName("type")
+		}
+		return err
+	}
+
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *IssueFormField) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *IssueFormField) UnmarshalBinary(b []byte) error {
+	var res IssueFormField
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/issue_form_field_type.go b/bots-common/gitea-generated/models/issue_form_field_type.go
new file mode 100644
index 0000000..520201c
--- /dev/null
+++ b/bots-common/gitea-generated/models/issue_form_field_type.go
@@ -0,0 +1,27 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/strfmt"
+)
+
+// IssueFormFieldType IssueFormFieldType defines issue form field type, can be "markdown", "textarea", "input", "dropdown" or "checkboxes"
+//
+// swagger:model IssueFormFieldType
+type IssueFormFieldType string
+
+// Validate validates this issue form field type
+func (m IssueFormFieldType) Validate(formats strfmt.Registry) error {
+	return nil
+}
+
+// ContextValidate validates this issue form field type based on context it is used
+func (m IssueFormFieldType) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/issue_form_field_visible.go b/bots-common/gitea-generated/models/issue_form_field_visible.go
new file mode 100644
index 0000000..2d26938
--- /dev/null
+++ b/bots-common/gitea-generated/models/issue_form_field_visible.go
@@ -0,0 +1,27 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/strfmt"
+)
+
+// IssueFormFieldVisible IssueFormFieldVisible defines issue form field visible
+//
+// swagger:model IssueFormFieldVisible
+type IssueFormFieldVisible string
+
+// Validate validates this issue form field visible
+func (m IssueFormFieldVisible) Validate(formats strfmt.Registry) error {
+	return nil
+}
+
+// ContextValidate validates this issue form field visible based on context it is used
+func (m IssueFormFieldVisible) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/issue_labels_option.go b/bots-common/gitea-generated/models/issue_labels_option.go
new file mode 100644
index 0000000..d61400c
--- /dev/null
+++ b/bots-common/gitea-generated/models/issue_labels_option.go
@@ -0,0 +1,51 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// IssueLabelsOption IssueLabelsOption a collection of labels
+//
+// swagger:model IssueLabelsOption
+type IssueLabelsOption struct {
+
+	// Labels can be a list of integers representing label IDs
+	// or a list of strings representing label names
+	Labels []interface{} `json:"labels"`
+}
+
+// Validate validates this issue labels option
+func (m *IssueLabelsOption) Validate(formats strfmt.Registry) error {
+	return nil
+}
+
+// ContextValidate validates this issue labels option based on context it is used
+func (m *IssueLabelsOption) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *IssueLabelsOption) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *IssueLabelsOption) UnmarshalBinary(b []byte) error {
+	var res IssueLabelsOption
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/issue_meta.go b/bots-common/gitea-generated/models/issue_meta.go
new file mode 100644
index 0000000..8b2101c
--- /dev/null
+++ b/bots-common/gitea-generated/models/issue_meta.go
@@ -0,0 +1,56 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// IssueMeta IssueMeta basic issue information
+//
+// swagger:model IssueMeta
+type IssueMeta struct {
+
+	// index
+	Index int64 `json:"index,omitempty"`
+
+	// name
+	Name string `json:"repo,omitempty"`
+
+	// owner
+	Owner string `json:"owner,omitempty"`
+}
+
+// Validate validates this issue meta
+func (m *IssueMeta) Validate(formats strfmt.Registry) error {
+	return nil
+}
+
+// ContextValidate validates this issue meta based on context it is used
+func (m *IssueMeta) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *IssueMeta) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *IssueMeta) UnmarshalBinary(b []byte) error {
+	var res IssueMeta
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/issue_template.go b/bots-common/gitea-generated/models/issue_template.go
new file mode 100644
index 0000000..a56a667
--- /dev/null
+++ b/bots-common/gitea-generated/models/issue_template.go
@@ -0,0 +1,181 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"strconv"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// IssueTemplate IssueTemplate represents an issue template for a repository
+//
+// swagger:model IssueTemplate
+type IssueTemplate struct {
+
+	// about
+	About string `json:"about,omitempty"`
+
+	// content
+	Content string `json:"content,omitempty"`
+
+	// fields
+	Fields []*IssueFormField `json:"body"`
+
+	// file name
+	FileName string `json:"file_name,omitempty"`
+
+	// name
+	Name string `json:"name,omitempty"`
+
+	// ref
+	Ref string `json:"ref,omitempty"`
+
+	// title
+	Title string `json:"title,omitempty"`
+
+	// labels
+	Labels IssueTemplateLabels `json:"labels,omitempty"`
+}
+
+// Validate validates this issue template
+func (m *IssueTemplate) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateFields(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateLabels(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *IssueTemplate) validateFields(formats strfmt.Registry) error {
+	if swag.IsZero(m.Fields) { // not required
+		return nil
+	}
+
+	for i := 0; i < len(m.Fields); i++ {
+		if swag.IsZero(m.Fields[i]) { // not required
+			continue
+		}
+
+		if m.Fields[i] != nil {
+			if err := m.Fields[i].Validate(formats); err != nil {
+				if ve, ok := err.(*errors.Validation); ok {
+					return ve.ValidateName("body" + "." + strconv.Itoa(i))
+				} else if ce, ok := err.(*errors.CompositeError); ok {
+					return ce.ValidateName("body" + "." + strconv.Itoa(i))
+				}
+				return err
+			}
+		}
+
+	}
+
+	return nil
+}
+
+func (m *IssueTemplate) validateLabels(formats strfmt.Registry) error {
+	if swag.IsZero(m.Labels) { // not required
+		return nil
+	}
+
+	if err := m.Labels.Validate(formats); err != nil {
+		if ve, ok := err.(*errors.Validation); ok {
+			return ve.ValidateName("labels")
+		} else if ce, ok := err.(*errors.CompositeError); ok {
+			return ce.ValidateName("labels")
+		}
+		return err
+	}
+
+	return nil
+}
+
+// ContextValidate validate this issue template based on the context it is used
+func (m *IssueTemplate) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.contextValidateFields(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.contextValidateLabels(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *IssueTemplate) contextValidateFields(ctx context.Context, formats strfmt.Registry) error {
+
+	for i := 0; i < len(m.Fields); i++ {
+
+		if m.Fields[i] != nil {
+
+			if swag.IsZero(m.Fields[i]) { // not required
+				return nil
+			}
+
+			if err := m.Fields[i].ContextValidate(ctx, formats); err != nil {
+				if ve, ok := err.(*errors.Validation); ok {
+					return ve.ValidateName("body" + "." + strconv.Itoa(i))
+				} else if ce, ok := err.(*errors.CompositeError); ok {
+					return ce.ValidateName("body" + "." + strconv.Itoa(i))
+				}
+				return err
+			}
+		}
+
+	}
+
+	return nil
+}
+
+func (m *IssueTemplate) contextValidateLabels(ctx context.Context, formats strfmt.Registry) error {
+
+	if err := m.Labels.ContextValidate(ctx, formats); err != nil {
+		if ve, ok := err.(*errors.Validation); ok {
+			return ve.ValidateName("labels")
+		} else if ce, ok := err.(*errors.CompositeError); ok {
+			return ce.ValidateName("labels")
+		}
+		return err
+	}
+
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *IssueTemplate) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *IssueTemplate) UnmarshalBinary(b []byte) error {
+	var res IssueTemplate
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/issue_template_labels.go b/bots-common/gitea-generated/models/issue_template_labels.go
new file mode 100644
index 0000000..d2f776e
--- /dev/null
+++ b/bots-common/gitea-generated/models/issue_template_labels.go
@@ -0,0 +1,27 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/strfmt"
+)
+
+// IssueTemplateLabels issue template labels
+//
+// swagger:model IssueTemplateLabels
+type IssueTemplateLabels []string
+
+// Validate validates this issue template labels
+func (m IssueTemplateLabels) Validate(formats strfmt.Registry) error {
+	return nil
+}
+
+// ContextValidate validates this issue template labels based on context it is used
+func (m IssueTemplateLabels) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/label.go b/bots-common/gitea-generated/models/label.go
new file mode 100644
index 0000000..cb3d7ac
--- /dev/null
+++ b/bots-common/gitea-generated/models/label.go
@@ -0,0 +1,71 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// Label Label a label to an issue or a pr
+//
+// swagger:model Label
+type Label struct {
+
+	// color
+	// Example: 00aabb
+	Color string `json:"color,omitempty"`
+
+	// description
+	Description string `json:"description,omitempty"`
+
+	// exclusive
+	// Example: false
+	Exclusive bool `json:"exclusive,omitempty"`
+
+	// ID
+	ID int64 `json:"id,omitempty"`
+
+	// is archived
+	// Example: false
+	IsArchived bool `json:"is_archived,omitempty"`
+
+	// name
+	Name string `json:"name,omitempty"`
+
+	// URL
+	URL string `json:"url,omitempty"`
+}
+
+// Validate validates this label
+func (m *Label) Validate(formats strfmt.Registry) error {
+	return nil
+}
+
+// ContextValidate validates this label based on context it is used
+func (m *Label) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *Label) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *Label) UnmarshalBinary(b []byte) error {
+	var res Label
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/label_template.go b/bots-common/gitea-generated/models/label_template.go
new file mode 100644
index 0000000..af43660
--- /dev/null
+++ b/bots-common/gitea-generated/models/label_template.go
@@ -0,0 +1,61 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// LabelTemplate LabelTemplate info of a Label template
+//
+// swagger:model LabelTemplate
+type LabelTemplate struct {
+
+	// color
+	// Example: 00aabb
+	Color string `json:"color,omitempty"`
+
+	// description
+	Description string `json:"description,omitempty"`
+
+	// exclusive
+	// Example: false
+	Exclusive bool `json:"exclusive,omitempty"`
+
+	// name
+	Name string `json:"name,omitempty"`
+}
+
+// Validate validates this label template
+func (m *LabelTemplate) Validate(formats strfmt.Registry) error {
+	return nil
+}
+
+// ContextValidate validates this label template based on context it is used
+func (m *LabelTemplate) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *LabelTemplate) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *LabelTemplate) UnmarshalBinary(b []byte) error {
+	var res LabelTemplate
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/license_template_info.go b/bots-common/gitea-generated/models/license_template_info.go
new file mode 100644
index 0000000..0be3f94
--- /dev/null
+++ b/bots-common/gitea-generated/models/license_template_info.go
@@ -0,0 +1,62 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// LicenseTemplateInfo LicensesInfo contains information about a License
+//
+// swagger:model LicenseTemplateInfo
+type LicenseTemplateInfo struct {
+
+	// body
+	Body string `json:"body,omitempty"`
+
+	// implementation
+	Implementation string `json:"implementation,omitempty"`
+
+	// key
+	Key string `json:"key,omitempty"`
+
+	// name
+	Name string `json:"name,omitempty"`
+
+	// URL
+	URL string `json:"url,omitempty"`
+}
+
+// Validate validates this license template info
+func (m *LicenseTemplateInfo) Validate(formats strfmt.Registry) error {
+	return nil
+}
+
+// ContextValidate validates this license template info based on context it is used
+func (m *LicenseTemplateInfo) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *LicenseTemplateInfo) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *LicenseTemplateInfo) UnmarshalBinary(b []byte) error {
+	var res LicenseTemplateInfo
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/licenses_template_list_entry.go b/bots-common/gitea-generated/models/licenses_template_list_entry.go
new file mode 100644
index 0000000..5592d81
--- /dev/null
+++ b/bots-common/gitea-generated/models/licenses_template_list_entry.go
@@ -0,0 +1,56 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// LicensesTemplateListEntry LicensesListEntry is used for the API
+//
+// swagger:model LicensesTemplateListEntry
+type LicensesTemplateListEntry struct {
+
+	// key
+	Key string `json:"key,omitempty"`
+
+	// name
+	Name string `json:"name,omitempty"`
+
+	// URL
+	URL string `json:"url,omitempty"`
+}
+
+// Validate validates this licenses template list entry
+func (m *LicensesTemplateListEntry) Validate(formats strfmt.Registry) error {
+	return nil
+}
+
+// ContextValidate validates this licenses template list entry based on context it is used
+func (m *LicensesTemplateListEntry) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *LicensesTemplateListEntry) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *LicensesTemplateListEntry) UnmarshalBinary(b []byte) error {
+	var res LicensesTemplateListEntry
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/markdown_option.go b/bots-common/gitea-generated/models/markdown_option.go
new file mode 100644
index 0000000..26ec73f
--- /dev/null
+++ b/bots-common/gitea-generated/models/markdown_option.go
@@ -0,0 +1,68 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// MarkdownOption MarkdownOption markdown options
+//
+// swagger:model MarkdownOption
+type MarkdownOption struct {
+
+	// URL path for rendering issue, media and file links
+	// Expected format: /subpath/{user}/{repo}/src/{branch, commit, tag}/{identifier/path}/{file/dir}
+	//
+	// in: body
+	Context string `json:"Context,omitempty"`
+
+	// Mode to render (comment, gfm, markdown)
+	//
+	// in: body
+	Mode string `json:"Mode,omitempty"`
+
+	// Text markdown to render
+	//
+	// in: body
+	Text string `json:"Text,omitempty"`
+
+	// Is it a wiki page ?
+	//
+	// in: body
+	Wiki bool `json:"Wiki,omitempty"`
+}
+
+// Validate validates this markdown option
+func (m *MarkdownOption) Validate(formats strfmt.Registry) error {
+	return nil
+}
+
+// ContextValidate validates this markdown option based on context it is used
+func (m *MarkdownOption) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *MarkdownOption) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *MarkdownOption) UnmarshalBinary(b []byte) error {
+	var res MarkdownOption
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/markup_option.go b/bots-common/gitea-generated/models/markup_option.go
new file mode 100644
index 0000000..7847a8c
--- /dev/null
+++ b/bots-common/gitea-generated/models/markup_option.go
@@ -0,0 +1,73 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// MarkupOption MarkupOption markup options
+//
+// swagger:model MarkupOption
+type MarkupOption struct {
+
+	// URL path for rendering issue, media and file links
+	// Expected format: /subpath/{user}/{repo}/src/{branch, commit, tag}/{identifier/path}/{file/dir}
+	//
+	// in: body
+	Context string `json:"Context,omitempty"`
+
+	// File path for detecting extension in file mode
+	//
+	// in: body
+	FilePath string `json:"FilePath,omitempty"`
+
+	// Mode to render (comment, gfm, markdown, file)
+	//
+	// in: body
+	Mode string `json:"Mode,omitempty"`
+
+	// Text markup to render
+	//
+	// in: body
+	Text string `json:"Text,omitempty"`
+
+	// Is it a wiki page ?
+	//
+	// in: body
+	Wiki bool `json:"Wiki,omitempty"`
+}
+
+// Validate validates this markup option
+func (m *MarkupOption) Validate(formats strfmt.Registry) error {
+	return nil
+}
+
+// ContextValidate validates this markup option based on context it is used
+func (m *MarkupOption) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *MarkupOption) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *MarkupOption) UnmarshalBinary(b []byte) error {
+	var res MarkupOption
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/merge_pull_request_form.go b/bots-common/gitea-generated/models/merge_pull_request_form.go
new file mode 100644
index 0000000..e826506
--- /dev/null
+++ b/bots-common/gitea-generated/models/merge_pull_request_form.go
@@ -0,0 +1,140 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"encoding/json"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+	"github.com/go-openapi/validate"
+)
+
+// MergePullRequestForm MergePullRequestForm form for merging Pull Request
+//
+// swagger:model MergePullRequestForm
+type MergePullRequestForm struct {
+
+	// delete branch after merge
+	DeleteBranchAfterMerge bool `json:"delete_branch_after_merge,omitempty"`
+
+	// do
+	// Required: true
+	// Enum: ["merge","rebase","rebase-merge","squash","fast-forward-only","manually-merged"]
+	Do *string `json:"Do"`
+
+	// force merge
+	ForceMerge bool `json:"force_merge,omitempty"`
+
+	// head commit ID
+	HeadCommitID string `json:"head_commit_id,omitempty"`
+
+	// merge commit ID
+	MergeCommitID string `json:"MergeCommitID,omitempty"`
+
+	// merge message field
+	MergeMessageField string `json:"MergeMessageField,omitempty"`
+
+	// merge title field
+	MergeTitleField string `json:"MergeTitleField,omitempty"`
+
+	// merge when checks succeed
+	MergeWhenChecksSucceed bool `json:"merge_when_checks_succeed,omitempty"`
+}
+
+// Validate validates this merge pull request form
+func (m *MergePullRequestForm) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateDo(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+var mergePullRequestFormTypeDoPropEnum []interface{}
+
+func init() {
+	var res []string
+	if err := json.Unmarshal([]byte(`["merge","rebase","rebase-merge","squash","fast-forward-only","manually-merged"]`), &res); err != nil {
+		panic(err)
+	}
+	for _, v := range res {
+		mergePullRequestFormTypeDoPropEnum = append(mergePullRequestFormTypeDoPropEnum, v)
+	}
+}
+
+const (
+
+	// MergePullRequestFormDoMerge captures enum value "merge"
+	MergePullRequestFormDoMerge string = "merge"
+
+	// MergePullRequestFormDoRebase captures enum value "rebase"
+	MergePullRequestFormDoRebase string = "rebase"
+
+	// MergePullRequestFormDoRebaseDashMerge captures enum value "rebase-merge"
+	MergePullRequestFormDoRebaseDashMerge string = "rebase-merge"
+
+	// MergePullRequestFormDoSquash captures enum value "squash"
+	MergePullRequestFormDoSquash string = "squash"
+
+	// MergePullRequestFormDoFastDashForwardDashOnly captures enum value "fast-forward-only"
+	MergePullRequestFormDoFastDashForwardDashOnly string = "fast-forward-only"
+
+	// MergePullRequestFormDoManuallyDashMerged captures enum value "manually-merged"
+	MergePullRequestFormDoManuallyDashMerged string = "manually-merged"
+)
+
+// prop value enum
+func (m *MergePullRequestForm) validateDoEnum(path, location string, value string) error {
+	if err := validate.EnumCase(path, location, value, mergePullRequestFormTypeDoPropEnum, true); err != nil {
+		return err
+	}
+	return nil
+}
+
+func (m *MergePullRequestForm) validateDo(formats strfmt.Registry) error {
+
+	if err := validate.Required("Do", "body", m.Do); err != nil {
+		return err
+	}
+
+	// value enum
+	if err := m.validateDoEnum("Do", "body", *m.Do); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+// ContextValidate validates this merge pull request form based on context it is used
+func (m *MergePullRequestForm) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *MergePullRequestForm) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *MergePullRequestForm) UnmarshalBinary(b []byte) error {
+	var res MergePullRequestForm
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/migrate_repo_options.go b/bots-common/gitea-generated/models/migrate_repo_options.go
new file mode 100644
index 0000000..bfa43aa
--- /dev/null
+++ b/bots-common/gitea-generated/models/migrate_repo_options.go
@@ -0,0 +1,209 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"encoding/json"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+	"github.com/go-openapi/validate"
+)
+
+// MigrateRepoOptions MigrateRepoOptions options for migrating repository's
+// this is used to interact with api v1
+//
+// swagger:model MigrateRepoOptions
+type MigrateRepoOptions struct {
+
+	// auth password
+	AuthPassword string `json:"auth_password,omitempty"`
+
+	// auth token
+	AuthToken string `json:"auth_token,omitempty"`
+
+	// auth username
+	AuthUsername string `json:"auth_username,omitempty"`
+
+	// clone addr
+	// Required: true
+	CloneAddr *string `json:"clone_addr"`
+
+	// description
+	Description string `json:"description,omitempty"`
+
+	// issues
+	Issues bool `json:"issues,omitempty"`
+
+	// l f s
+	LFS bool `json:"lfs,omitempty"`
+
+	// l f s endpoint
+	LFSEndpoint string `json:"lfs_endpoint,omitempty"`
+
+	// labels
+	Labels bool `json:"labels,omitempty"`
+
+	// milestones
+	Milestones bool `json:"milestones,omitempty"`
+
+	// mirror
+	Mirror bool `json:"mirror,omitempty"`
+
+	// mirror interval
+	MirrorInterval string `json:"mirror_interval,omitempty"`
+
+	// private
+	Private bool `json:"private,omitempty"`
+
+	// pull requests
+	PullRequests bool `json:"pull_requests,omitempty"`
+
+	// releases
+	Releases bool `json:"releases,omitempty"`
+
+	// repo name
+	// Required: true
+	RepoName *string `json:"repo_name"`
+
+	// Name of User or Organisation who will own Repo after migration
+	RepoOwner string `json:"repo_owner,omitempty"`
+
+	// deprecated (only for backwards compatibility)
+	RepoOwnerID int64 `json:"uid,omitempty"`
+
+	// service
+	// Enum: ["git","github","gitea","gitlab","gogs","onedev","gitbucket","codebase"]
+	Service string `json:"service,omitempty"`
+
+	// wiki
+	Wiki bool `json:"wiki,omitempty"`
+}
+
+// Validate validates this migrate repo options
+func (m *MigrateRepoOptions) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateCloneAddr(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateRepoName(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateService(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *MigrateRepoOptions) validateCloneAddr(formats strfmt.Registry) error {
+
+	if err := validate.Required("clone_addr", "body", m.CloneAddr); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (m *MigrateRepoOptions) validateRepoName(formats strfmt.Registry) error {
+
+	if err := validate.Required("repo_name", "body", m.RepoName); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+var migrateRepoOptionsTypeServicePropEnum []interface{}
+
+func init() {
+	var res []string
+	if err := json.Unmarshal([]byte(`["git","github","gitea","gitlab","gogs","onedev","gitbucket","codebase"]`), &res); err != nil {
+		panic(err)
+	}
+	for _, v := range res {
+		migrateRepoOptionsTypeServicePropEnum = append(migrateRepoOptionsTypeServicePropEnum, v)
+	}
+}
+
+const (
+
+	// MigrateRepoOptionsServiceGit captures enum value "git"
+	MigrateRepoOptionsServiceGit string = "git"
+
+	// MigrateRepoOptionsServiceGithub captures enum value "github"
+	MigrateRepoOptionsServiceGithub string = "github"
+
+	// MigrateRepoOptionsServiceGitea captures enum value "gitea"
+	MigrateRepoOptionsServiceGitea string = "gitea"
+
+	// MigrateRepoOptionsServiceGitlab captures enum value "gitlab"
+	MigrateRepoOptionsServiceGitlab string = "gitlab"
+
+	// MigrateRepoOptionsServiceGogs captures enum value "gogs"
+	MigrateRepoOptionsServiceGogs string = "gogs"
+
+	// MigrateRepoOptionsServiceOnedev captures enum value "onedev"
+	MigrateRepoOptionsServiceOnedev string = "onedev"
+
+	// MigrateRepoOptionsServiceGitbucket captures enum value "gitbucket"
+	MigrateRepoOptionsServiceGitbucket string = "gitbucket"
+
+	// MigrateRepoOptionsServiceCodebase captures enum value "codebase"
+	MigrateRepoOptionsServiceCodebase string = "codebase"
+)
+
+// prop value enum
+func (m *MigrateRepoOptions) validateServiceEnum(path, location string, value string) error {
+	if err := validate.EnumCase(path, location, value, migrateRepoOptionsTypeServicePropEnum, true); err != nil {
+		return err
+	}
+	return nil
+}
+
+func (m *MigrateRepoOptions) validateService(formats strfmt.Registry) error {
+	if swag.IsZero(m.Service) { // not required
+		return nil
+	}
+
+	// value enum
+	if err := m.validateServiceEnum("service", "body", m.Service); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+// ContextValidate validates this migrate repo options based on context it is used
+func (m *MigrateRepoOptions) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *MigrateRepoOptions) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *MigrateRepoOptions) UnmarshalBinary(b []byte) error {
+	var res MigrateRepoOptions
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/milestone.go b/bots-common/gitea-generated/models/milestone.go
new file mode 100644
index 0000000..197ed15
--- /dev/null
+++ b/bots-common/gitea-generated/models/milestone.go
@@ -0,0 +1,200 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+	"github.com/go-openapi/validate"
+)
+
+// Milestone Milestone milestone is a collection of issues on one repository
+//
+// swagger:model Milestone
+type Milestone struct {
+
+	// closed
+	// Format: date-time
+	Closed strfmt.DateTime `json:"closed_at,omitempty"`
+
+	// closed issues
+	ClosedIssues int64 `json:"closed_issues,omitempty"`
+
+	// created
+	// Format: date-time
+	Created strfmt.DateTime `json:"created_at,omitempty"`
+
+	// deadline
+	// Format: date-time
+	Deadline strfmt.DateTime `json:"due_on,omitempty"`
+
+	// description
+	Description string `json:"description,omitempty"`
+
+	// ID
+	ID int64 `json:"id,omitempty"`
+
+	// open issues
+	OpenIssues int64 `json:"open_issues,omitempty"`
+
+	// title
+	Title string `json:"title,omitempty"`
+
+	// updated
+	// Format: date-time
+	Updated strfmt.DateTime `json:"updated_at,omitempty"`
+
+	// state
+	State StateType `json:"state,omitempty"`
+}
+
+// Validate validates this milestone
+func (m *Milestone) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateClosed(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateCreated(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateDeadline(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateUpdated(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateState(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *Milestone) validateClosed(formats strfmt.Registry) error {
+	if swag.IsZero(m.Closed) { // not required
+		return nil
+	}
+
+	if err := validate.FormatOf("closed_at", "body", "date-time", m.Closed.String(), formats); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (m *Milestone) validateCreated(formats strfmt.Registry) error {
+	if swag.IsZero(m.Created) { // not required
+		return nil
+	}
+
+	if err := validate.FormatOf("created_at", "body", "date-time", m.Created.String(), formats); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (m *Milestone) validateDeadline(formats strfmt.Registry) error {
+	if swag.IsZero(m.Deadline) { // not required
+		return nil
+	}
+
+	if err := validate.FormatOf("due_on", "body", "date-time", m.Deadline.String(), formats); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (m *Milestone) validateUpdated(formats strfmt.Registry) error {
+	if swag.IsZero(m.Updated) { // not required
+		return nil
+	}
+
+	if err := validate.FormatOf("updated_at", "body", "date-time", m.Updated.String(), formats); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (m *Milestone) validateState(formats strfmt.Registry) error {
+	if swag.IsZero(m.State) { // not required
+		return nil
+	}
+
+	if err := m.State.Validate(formats); err != nil {
+		if ve, ok := err.(*errors.Validation); ok {
+			return ve.ValidateName("state")
+		} else if ce, ok := err.(*errors.CompositeError); ok {
+			return ce.ValidateName("state")
+		}
+		return err
+	}
+
+	return nil
+}
+
+// ContextValidate validate this milestone based on the context it is used
+func (m *Milestone) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.contextValidateState(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *Milestone) contextValidateState(ctx context.Context, formats strfmt.Registry) error {
+
+	if swag.IsZero(m.State) { // not required
+		return nil
+	}
+
+	if err := m.State.ContextValidate(ctx, formats); err != nil {
+		if ve, ok := err.(*errors.Validation); ok {
+			return ve.ValidateName("state")
+		} else if ce, ok := err.(*errors.CompositeError); ok {
+			return ce.ValidateName("state")
+		}
+		return err
+	}
+
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *Milestone) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *Milestone) UnmarshalBinary(b []byte) error {
+	var res Milestone
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/new_issue_pins_allowed.go b/bots-common/gitea-generated/models/new_issue_pins_allowed.go
new file mode 100644
index 0000000..db30c06
--- /dev/null
+++ b/bots-common/gitea-generated/models/new_issue_pins_allowed.go
@@ -0,0 +1,53 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NewIssuePinsAllowed NewIssuePinsAllowed represents an API response that says if new Issue Pins are allowed
+//
+// swagger:model NewIssuePinsAllowed
+type NewIssuePinsAllowed struct {
+
+	// issues
+	Issues bool `json:"issues,omitempty"`
+
+	// pull requests
+	PullRequests bool `json:"pull_requests,omitempty"`
+}
+
+// Validate validates this new issue pins allowed
+func (m *NewIssuePinsAllowed) Validate(formats strfmt.Registry) error {
+	return nil
+}
+
+// ContextValidate validates this new issue pins allowed based on context it is used
+func (m *NewIssuePinsAllowed) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *NewIssuePinsAllowed) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *NewIssuePinsAllowed) UnmarshalBinary(b []byte) error {
+	var res NewIssuePinsAllowed
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/node_info.go b/bots-common/gitea-generated/models/node_info.go
new file mode 100644
index 0000000..eb4f48c
--- /dev/null
+++ b/bots-common/gitea-generated/models/node_info.go
@@ -0,0 +1,223 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NodeInfo NodeInfo contains standardized way of exposing metadata about a server running one of the distributed social networks
+//
+// swagger:model NodeInfo
+type NodeInfo struct {
+
+	// metadata
+	Metadata interface{} `json:"metadata,omitempty"`
+
+	// open registrations
+	OpenRegistrations bool `json:"openRegistrations,omitempty"`
+
+	// protocols
+	Protocols []string `json:"protocols"`
+
+	// version
+	Version string `json:"version,omitempty"`
+
+	// services
+	Services *NodeInfoServices `json:"services,omitempty"`
+
+	// software
+	Software *NodeInfoSoftware `json:"software,omitempty"`
+
+	// usage
+	Usage *NodeInfoUsage `json:"usage,omitempty"`
+}
+
+// Validate validates this node info
+func (m *NodeInfo) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateServices(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateSoftware(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateUsage(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *NodeInfo) validateServices(formats strfmt.Registry) error {
+	if swag.IsZero(m.Services) { // not required
+		return nil
+	}
+
+	if m.Services != nil {
+		if err := m.Services.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("services")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("services")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *NodeInfo) validateSoftware(formats strfmt.Registry) error {
+	if swag.IsZero(m.Software) { // not required
+		return nil
+	}
+
+	if m.Software != nil {
+		if err := m.Software.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("software")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("software")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *NodeInfo) validateUsage(formats strfmt.Registry) error {
+	if swag.IsZero(m.Usage) { // not required
+		return nil
+	}
+
+	if m.Usage != nil {
+		if err := m.Usage.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("usage")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("usage")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+// ContextValidate validate this node info based on the context it is used
+func (m *NodeInfo) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.contextValidateServices(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.contextValidateSoftware(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.contextValidateUsage(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *NodeInfo) contextValidateServices(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.Services != nil {
+
+		if swag.IsZero(m.Services) { // not required
+			return nil
+		}
+
+		if err := m.Services.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("services")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("services")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *NodeInfo) contextValidateSoftware(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.Software != nil {
+
+		if swag.IsZero(m.Software) { // not required
+			return nil
+		}
+
+		if err := m.Software.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("software")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("software")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *NodeInfo) contextValidateUsage(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.Usage != nil {
+
+		if swag.IsZero(m.Usage) { // not required
+			return nil
+		}
+
+		if err := m.Usage.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("usage")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("usage")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *NodeInfo) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *NodeInfo) UnmarshalBinary(b []byte) error {
+	var res NodeInfo
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/node_info_services.go b/bots-common/gitea-generated/models/node_info_services.go
new file mode 100644
index 0000000..0de2651
--- /dev/null
+++ b/bots-common/gitea-generated/models/node_info_services.go
@@ -0,0 +1,53 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NodeInfoServices NodeInfoServices contains the third party sites this server can connect to via their application API
+//
+// swagger:model NodeInfoServices
+type NodeInfoServices struct {
+
+	// inbound
+	Inbound []string `json:"inbound"`
+
+	// outbound
+	Outbound []string `json:"outbound"`
+}
+
+// Validate validates this node info services
+func (m *NodeInfoServices) Validate(formats strfmt.Registry) error {
+	return nil
+}
+
+// ContextValidate validates this node info services based on context it is used
+func (m *NodeInfoServices) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *NodeInfoServices) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *NodeInfoServices) UnmarshalBinary(b []byte) error {
+	var res NodeInfoServices
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/node_info_software.go b/bots-common/gitea-generated/models/node_info_software.go
new file mode 100644
index 0000000..793efef
--- /dev/null
+++ b/bots-common/gitea-generated/models/node_info_software.go
@@ -0,0 +1,59 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NodeInfoSoftware NodeInfoSoftware contains Metadata about server software in use
+//
+// swagger:model NodeInfoSoftware
+type NodeInfoSoftware struct {
+
+	// homepage
+	Homepage string `json:"homepage,omitempty"`
+
+	// name
+	Name string `json:"name,omitempty"`
+
+	// repository
+	Repository string `json:"repository,omitempty"`
+
+	// version
+	Version string `json:"version,omitempty"`
+}
+
+// Validate validates this node info software
+func (m *NodeInfoSoftware) Validate(formats strfmt.Registry) error {
+	return nil
+}
+
+// ContextValidate validates this node info software based on context it is used
+func (m *NodeInfoSoftware) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *NodeInfoSoftware) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *NodeInfoSoftware) UnmarshalBinary(b []byte) error {
+	var res NodeInfoSoftware
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/node_info_usage.go b/bots-common/gitea-generated/models/node_info_usage.go
new file mode 100644
index 0000000..116a8db
--- /dev/null
+++ b/bots-common/gitea-generated/models/node_info_usage.go
@@ -0,0 +1,115 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NodeInfoUsage NodeInfoUsage contains usage statistics for this server
+//
+// swagger:model NodeInfoUsage
+type NodeInfoUsage struct {
+
+	// local comments
+	LocalComments int64 `json:"localComments,omitempty"`
+
+	// local posts
+	LocalPosts int64 `json:"localPosts,omitempty"`
+
+	// users
+	Users *NodeInfoUsageUsers `json:"users,omitempty"`
+}
+
+// Validate validates this node info usage
+func (m *NodeInfoUsage) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateUsers(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *NodeInfoUsage) validateUsers(formats strfmt.Registry) error {
+	if swag.IsZero(m.Users) { // not required
+		return nil
+	}
+
+	if m.Users != nil {
+		if err := m.Users.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("users")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("users")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+// ContextValidate validate this node info usage based on the context it is used
+func (m *NodeInfoUsage) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.contextValidateUsers(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *NodeInfoUsage) contextValidateUsers(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.Users != nil {
+
+		if swag.IsZero(m.Users) { // not required
+			return nil
+		}
+
+		if err := m.Users.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("users")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("users")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *NodeInfoUsage) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *NodeInfoUsage) UnmarshalBinary(b []byte) error {
+	var res NodeInfoUsage
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/node_info_usage_users.go b/bots-common/gitea-generated/models/node_info_usage_users.go
new file mode 100644
index 0000000..bb69535
--- /dev/null
+++ b/bots-common/gitea-generated/models/node_info_usage_users.go
@@ -0,0 +1,56 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NodeInfoUsageUsers NodeInfoUsageUsers contains statistics about the users of this server
+//
+// swagger:model NodeInfoUsageUsers
+type NodeInfoUsageUsers struct {
+
+	// active halfyear
+	ActiveHalfyear int64 `json:"activeHalfyear,omitempty"`
+
+	// active month
+	ActiveMonth int64 `json:"activeMonth,omitempty"`
+
+	// total
+	Total int64 `json:"total,omitempty"`
+}
+
+// Validate validates this node info usage users
+func (m *NodeInfoUsageUsers) Validate(formats strfmt.Registry) error {
+	return nil
+}
+
+// ContextValidate validates this node info usage users based on context it is used
+func (m *NodeInfoUsageUsers) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *NodeInfoUsageUsers) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *NodeInfoUsageUsers) UnmarshalBinary(b []byte) error {
+	var res NodeInfoUsageUsers
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/note.go b/bots-common/gitea-generated/models/note.go
new file mode 100644
index 0000000..ebcf96b
--- /dev/null
+++ b/bots-common/gitea-generated/models/note.go
@@ -0,0 +1,112 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// Note Note contains information related to a git note
+//
+// swagger:model Note
+type Note struct {
+
+	// message
+	Message string `json:"message,omitempty"`
+
+	// commit
+	Commit *Commit `json:"commit,omitempty"`
+}
+
+// Validate validates this note
+func (m *Note) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateCommit(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *Note) validateCommit(formats strfmt.Registry) error {
+	if swag.IsZero(m.Commit) { // not required
+		return nil
+	}
+
+	if m.Commit != nil {
+		if err := m.Commit.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("commit")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("commit")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+// ContextValidate validate this note based on the context it is used
+func (m *Note) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.contextValidateCommit(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *Note) contextValidateCommit(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.Commit != nil {
+
+		if swag.IsZero(m.Commit) { // not required
+			return nil
+		}
+
+		if err := m.Commit.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("commit")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("commit")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *Note) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *Note) UnmarshalBinary(b []byte) error {
+	var res Note
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/notification_count.go b/bots-common/gitea-generated/models/notification_count.go
new file mode 100644
index 0000000..5b1553b
--- /dev/null
+++ b/bots-common/gitea-generated/models/notification_count.go
@@ -0,0 +1,50 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NotificationCount NotificationCount number of unread notifications
+//
+// swagger:model NotificationCount
+type NotificationCount struct {
+
+	// new
+	New int64 `json:"new,omitempty"`
+}
+
+// Validate validates this notification count
+func (m *NotificationCount) Validate(formats strfmt.Registry) error {
+	return nil
+}
+
+// ContextValidate validates this notification count based on context it is used
+func (m *NotificationCount) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *NotificationCount) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *NotificationCount) UnmarshalBinary(b []byte) error {
+	var res NotificationCount
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/notification_subject.go b/bots-common/gitea-generated/models/notification_subject.go
new file mode 100644
index 0000000..a719eb3
--- /dev/null
+++ b/bots-common/gitea-generated/models/notification_subject.go
@@ -0,0 +1,165 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// NotificationSubject NotificationSubject contains the notification subject (Issue/Pull/Commit)
+//
+// swagger:model NotificationSubject
+type NotificationSubject struct {
+
+	// HTML URL
+	HTMLURL string `json:"html_url,omitempty"`
+
+	// latest comment HTML URL
+	LatestCommentHTMLURL string `json:"latest_comment_html_url,omitempty"`
+
+	// latest comment URL
+	LatestCommentURL string `json:"latest_comment_url,omitempty"`
+
+	// title
+	Title string `json:"title,omitempty"`
+
+	// URL
+	URL string `json:"url,omitempty"`
+
+	// state
+	State StateType `json:"state,omitempty"`
+
+	// type
+	Type NotifySubjectType `json:"type,omitempty"`
+}
+
+// Validate validates this notification subject
+func (m *NotificationSubject) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateState(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateType(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *NotificationSubject) validateState(formats strfmt.Registry) error {
+	if swag.IsZero(m.State) { // not required
+		return nil
+	}
+
+	if err := m.State.Validate(formats); err != nil {
+		if ve, ok := err.(*errors.Validation); ok {
+			return ve.ValidateName("state")
+		} else if ce, ok := err.(*errors.CompositeError); ok {
+			return ce.ValidateName("state")
+		}
+		return err
+	}
+
+	return nil
+}
+
+func (m *NotificationSubject) validateType(formats strfmt.Registry) error {
+	if swag.IsZero(m.Type) { // not required
+		return nil
+	}
+
+	if err := m.Type.Validate(formats); err != nil {
+		if ve, ok := err.(*errors.Validation); ok {
+			return ve.ValidateName("type")
+		} else if ce, ok := err.(*errors.CompositeError); ok {
+			return ce.ValidateName("type")
+		}
+		return err
+	}
+
+	return nil
+}
+
+// ContextValidate validate this notification subject based on the context it is used
+func (m *NotificationSubject) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.contextValidateState(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.contextValidateType(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *NotificationSubject) contextValidateState(ctx context.Context, formats strfmt.Registry) error {
+
+	if swag.IsZero(m.State) { // not required
+		return nil
+	}
+
+	if err := m.State.ContextValidate(ctx, formats); err != nil {
+		if ve, ok := err.(*errors.Validation); ok {
+			return ve.ValidateName("state")
+		} else if ce, ok := err.(*errors.CompositeError); ok {
+			return ce.ValidateName("state")
+		}
+		return err
+	}
+
+	return nil
+}
+
+func (m *NotificationSubject) contextValidateType(ctx context.Context, formats strfmt.Registry) error {
+
+	if swag.IsZero(m.Type) { // not required
+		return nil
+	}
+
+	if err := m.Type.ContextValidate(ctx, formats); err != nil {
+		if ve, ok := err.(*errors.Validation); ok {
+			return ve.ValidateName("type")
+		} else if ce, ok := err.(*errors.CompositeError); ok {
+			return ce.ValidateName("type")
+		}
+		return err
+	}
+
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *NotificationSubject) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *NotificationSubject) UnmarshalBinary(b []byte) error {
+	var res NotificationSubject
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/notification_thread.go b/bots-common/gitea-generated/models/notification_thread.go
new file mode 100644
index 0000000..150fb3f
--- /dev/null
+++ b/bots-common/gitea-generated/models/notification_thread.go
@@ -0,0 +1,193 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+	"github.com/go-openapi/validate"
+)
+
+// NotificationThread NotificationThread expose Notification on API
+//
+// swagger:model NotificationThread
+type NotificationThread struct {
+
+	// ID
+	ID int64 `json:"id,omitempty"`
+
+	// pinned
+	Pinned bool `json:"pinned,omitempty"`
+
+	// URL
+	URL string `json:"url,omitempty"`
+
+	// unread
+	Unread bool `json:"unread,omitempty"`
+
+	// updated at
+	// Format: date-time
+	UpdatedAt strfmt.DateTime `json:"updated_at,omitempty"`
+
+	// repository
+	Repository *Repository `json:"repository,omitempty"`
+
+	// subject
+	Subject *NotificationSubject `json:"subject,omitempty"`
+}
+
+// Validate validates this notification thread
+func (m *NotificationThread) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateUpdatedAt(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateRepository(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateSubject(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *NotificationThread) validateUpdatedAt(formats strfmt.Registry) error {
+	if swag.IsZero(m.UpdatedAt) { // not required
+		return nil
+	}
+
+	if err := validate.FormatOf("updated_at", "body", "date-time", m.UpdatedAt.String(), formats); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (m *NotificationThread) validateRepository(formats strfmt.Registry) error {
+	if swag.IsZero(m.Repository) { // not required
+		return nil
+	}
+
+	if m.Repository != nil {
+		if err := m.Repository.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("repository")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("repository")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *NotificationThread) validateSubject(formats strfmt.Registry) error {
+	if swag.IsZero(m.Subject) { // not required
+		return nil
+	}
+
+	if m.Subject != nil {
+		if err := m.Subject.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("subject")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("subject")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+// ContextValidate validate this notification thread based on the context it is used
+func (m *NotificationThread) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.contextValidateRepository(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.contextValidateSubject(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *NotificationThread) contextValidateRepository(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.Repository != nil {
+
+		if swag.IsZero(m.Repository) { // not required
+			return nil
+		}
+
+		if err := m.Repository.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("repository")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("repository")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *NotificationThread) contextValidateSubject(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.Subject != nil {
+
+		if swag.IsZero(m.Subject) { // not required
+			return nil
+		}
+
+		if err := m.Subject.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("subject")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("subject")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *NotificationThread) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *NotificationThread) UnmarshalBinary(b []byte) error {
+	var res NotificationThread
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/notify_subject_type.go b/bots-common/gitea-generated/models/notify_subject_type.go
new file mode 100644
index 0000000..42ab72f
--- /dev/null
+++ b/bots-common/gitea-generated/models/notify_subject_type.go
@@ -0,0 +1,27 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/strfmt"
+)
+
+// NotifySubjectType NotifySubjectType represent type of notification subject
+//
+// swagger:model NotifySubjectType
+type NotifySubjectType string
+
+// Validate validates this notify subject type
+func (m NotifySubjectType) Validate(formats strfmt.Registry) error {
+	return nil
+}
+
+// ContextValidate validates this notify subject type based on context it is used
+func (m NotifySubjectType) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/o_auth2_application.go b/bots-common/gitea-generated/models/o_auth2_application.go
new file mode 100644
index 0000000..1e15979
--- /dev/null
+++ b/bots-common/gitea-generated/models/o_auth2_application.go
@@ -0,0 +1,92 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+	"github.com/go-openapi/validate"
+)
+
+// OAuth2Application OAuth2Application represents an OAuth2 application.
+//
+// swagger:model OAuth2Application
+type OAuth2Application struct {
+
+	// client ID
+	ClientID string `json:"client_id,omitempty"`
+
+	// client secret
+	ClientSecret string `json:"client_secret,omitempty"`
+
+	// confidential client
+	ConfidentialClient bool `json:"confidential_client,omitempty"`
+
+	// created
+	// Format: date-time
+	Created strfmt.DateTime `json:"created,omitempty"`
+
+	// ID
+	ID int64 `json:"id,omitempty"`
+
+	// name
+	Name string `json:"name,omitempty"`
+
+	// redirect u r is
+	RedirectURIs []string `json:"redirect_uris"`
+}
+
+// Validate validates this o auth2 application
+func (m *OAuth2Application) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateCreated(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *OAuth2Application) validateCreated(formats strfmt.Registry) error {
+	if swag.IsZero(m.Created) { // not required
+		return nil
+	}
+
+	if err := validate.FormatOf("created", "body", "date-time", m.Created.String(), formats); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+// ContextValidate validates this o auth2 application based on context it is used
+func (m *OAuth2Application) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *OAuth2Application) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *OAuth2Application) UnmarshalBinary(b []byte) error {
+	var res OAuth2Application
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/organization.go b/bots-common/gitea-generated/models/organization.go
new file mode 100644
index 0000000..7215caa
--- /dev/null
+++ b/bots-common/gitea-generated/models/organization.go
@@ -0,0 +1,80 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// Organization Organization represents an organization
+//
+// swagger:model Organization
+type Organization struct {
+
+	// avatar URL
+	AvatarURL string `json:"avatar_url,omitempty"`
+
+	// description
+	Description string `json:"description,omitempty"`
+
+	// email
+	Email string `json:"email,omitempty"`
+
+	// full name
+	FullName string `json:"full_name,omitempty"`
+
+	// ID
+	ID int64 `json:"id,omitempty"`
+
+	// location
+	Location string `json:"location,omitempty"`
+
+	// name
+	Name string `json:"name,omitempty"`
+
+	// repo admin change team access
+	RepoAdminChangeTeamAccess bool `json:"repo_admin_change_team_access,omitempty"`
+
+	// deprecated
+	UserName string `json:"username,omitempty"`
+
+	// visibility
+	Visibility string `json:"visibility,omitempty"`
+
+	// website
+	Website string `json:"website,omitempty"`
+}
+
+// Validate validates this organization
+func (m *Organization) Validate(formats strfmt.Registry) error {
+	return nil
+}
+
+// ContextValidate validates this organization based on context it is used
+func (m *Organization) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *Organization) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *Organization) UnmarshalBinary(b []byte) error {
+	var res Organization
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/organization_permissions.go b/bots-common/gitea-generated/models/organization_permissions.go
new file mode 100644
index 0000000..eafcccf
--- /dev/null
+++ b/bots-common/gitea-generated/models/organization_permissions.go
@@ -0,0 +1,62 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// OrganizationPermissions OrganizationPermissions list different users permissions on an organization
+//
+// swagger:model OrganizationPermissions
+type OrganizationPermissions struct {
+
+	// can create repository
+	CanCreateRepository bool `json:"can_create_repository,omitempty"`
+
+	// can read
+	CanRead bool `json:"can_read,omitempty"`
+
+	// can write
+	CanWrite bool `json:"can_write,omitempty"`
+
+	// is admin
+	IsAdmin bool `json:"is_admin,omitempty"`
+
+	// is owner
+	IsOwner bool `json:"is_owner,omitempty"`
+}
+
+// Validate validates this organization permissions
+func (m *OrganizationPermissions) Validate(formats strfmt.Registry) error {
+	return nil
+}
+
+// ContextValidate validates this organization permissions based on context it is used
+func (m *OrganizationPermissions) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *OrganizationPermissions) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *OrganizationPermissions) UnmarshalBinary(b []byte) error {
+	var res OrganizationPermissions
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/p_r_branch_info.go b/bots-common/gitea-generated/models/p_r_branch_info.go
new file mode 100644
index 0000000..80bc528
--- /dev/null
+++ b/bots-common/gitea-generated/models/p_r_branch_info.go
@@ -0,0 +1,121 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// PRBranchInfo PRBranchInfo information about a branch
+//
+// swagger:model PRBranchInfo
+type PRBranchInfo struct {
+
+	// name
+	Name string `json:"label,omitempty"`
+
+	// ref
+	Ref string `json:"ref,omitempty"`
+
+	// repo ID
+	RepoID int64 `json:"repo_id,omitempty"`
+
+	// sha
+	Sha string `json:"sha,omitempty"`
+
+	// repo
+	Repo *Repository `json:"repo,omitempty"`
+}
+
+// Validate validates this p r branch info
+func (m *PRBranchInfo) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateRepo(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *PRBranchInfo) validateRepo(formats strfmt.Registry) error {
+	if swag.IsZero(m.Repo) { // not required
+		return nil
+	}
+
+	if m.Repo != nil {
+		if err := m.Repo.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("repo")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("repo")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+// ContextValidate validate this p r branch info based on the context it is used
+func (m *PRBranchInfo) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.contextValidateRepo(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *PRBranchInfo) contextValidateRepo(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.Repo != nil {
+
+		if swag.IsZero(m.Repo) { // not required
+			return nil
+		}
+
+		if err := m.Repo.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("repo")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("repo")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *PRBranchInfo) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *PRBranchInfo) UnmarshalBinary(b []byte) error {
+	var res PRBranchInfo
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/package.go b/bots-common/gitea-generated/models/package.go
new file mode 100644
index 0000000..13544bb
--- /dev/null
+++ b/bots-common/gitea-generated/models/package.go
@@ -0,0 +1,247 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+	"github.com/go-openapi/validate"
+)
+
+// Package Package represents a package
+//
+// swagger:model Package
+type Package struct {
+
+	// created at
+	// Format: date-time
+	CreatedAt strfmt.DateTime `json:"created_at,omitempty"`
+
+	// HTML URL
+	HTMLURL string `json:"html_url,omitempty"`
+
+	// ID
+	ID int64 `json:"id,omitempty"`
+
+	// name
+	Name string `json:"name,omitempty"`
+
+	// type
+	Type string `json:"type,omitempty"`
+
+	// version
+	Version string `json:"version,omitempty"`
+
+	// creator
+	Creator *User `json:"creator,omitempty"`
+
+	// owner
+	Owner *User `json:"owner,omitempty"`
+
+	// repository
+	Repository *Repository `json:"repository,omitempty"`
+}
+
+// Validate validates this package
+func (m *Package) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateCreatedAt(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateCreator(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateOwner(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateRepository(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *Package) validateCreatedAt(formats strfmt.Registry) error {
+	if swag.IsZero(m.CreatedAt) { // not required
+		return nil
+	}
+
+	if err := validate.FormatOf("created_at", "body", "date-time", m.CreatedAt.String(), formats); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (m *Package) validateCreator(formats strfmt.Registry) error {
+	if swag.IsZero(m.Creator) { // not required
+		return nil
+	}
+
+	if m.Creator != nil {
+		if err := m.Creator.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("creator")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("creator")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *Package) validateOwner(formats strfmt.Registry) error {
+	if swag.IsZero(m.Owner) { // not required
+		return nil
+	}
+
+	if m.Owner != nil {
+		if err := m.Owner.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("owner")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("owner")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *Package) validateRepository(formats strfmt.Registry) error {
+	if swag.IsZero(m.Repository) { // not required
+		return nil
+	}
+
+	if m.Repository != nil {
+		if err := m.Repository.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("repository")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("repository")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+// ContextValidate validate this package based on the context it is used
+func (m *Package) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.contextValidateCreator(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.contextValidateOwner(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.contextValidateRepository(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *Package) contextValidateCreator(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.Creator != nil {
+
+		if swag.IsZero(m.Creator) { // not required
+			return nil
+		}
+
+		if err := m.Creator.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("creator")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("creator")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *Package) contextValidateOwner(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.Owner != nil {
+
+		if swag.IsZero(m.Owner) { // not required
+			return nil
+		}
+
+		if err := m.Owner.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("owner")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("owner")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *Package) contextValidateRepository(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.Repository != nil {
+
+		if swag.IsZero(m.Repository) { // not required
+			return nil
+		}
+
+		if err := m.Repository.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("repository")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("repository")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *Package) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *Package) UnmarshalBinary(b []byte) error {
+	var res Package
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/package_file.go b/bots-common/gitea-generated/models/package_file.go
new file mode 100644
index 0000000..66412c7
--- /dev/null
+++ b/bots-common/gitea-generated/models/package_file.go
@@ -0,0 +1,68 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// PackageFile PackageFile represents a package file
+//
+// swagger:model PackageFile
+type PackageFile struct {
+
+	// hash m d5
+	HashMD5 string `json:"md5,omitempty"`
+
+	// hash s h a1
+	HashSHA1 string `json:"sha1,omitempty"`
+
+	// hash s h a256
+	HashSHA256 string `json:"sha256,omitempty"`
+
+	// hash s h a512
+	HashSHA512 string `json:"sha512,omitempty"`
+
+	// ID
+	ID int64 `json:"id,omitempty"`
+
+	// name
+	Name string `json:"name,omitempty"`
+
+	// size
+	Size int64 `json:"Size,omitempty"`
+}
+
+// Validate validates this package file
+func (m *PackageFile) Validate(formats strfmt.Registry) error {
+	return nil
+}
+
+// ContextValidate validates this package file based on context it is used
+func (m *PackageFile) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *PackageFile) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *PackageFile) UnmarshalBinary(b []byte) error {
+	var res PackageFile
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/payload_commit.go b/bots-common/gitea-generated/models/payload_commit.go
new file mode 100644
index 0000000..90b8af8
--- /dev/null
+++ b/bots-common/gitea-generated/models/payload_commit.go
@@ -0,0 +1,250 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+	"github.com/go-openapi/validate"
+)
+
+// PayloadCommit PayloadCommit represents a commit
+//
+// swagger:model PayloadCommit
+type PayloadCommit struct {
+
+	// added
+	Added []string `json:"added"`
+
+	// sha1 hash of the commit
+	ID string `json:"id,omitempty"`
+
+	// message
+	Message string `json:"message,omitempty"`
+
+	// modified
+	Modified []string `json:"modified"`
+
+	// removed
+	Removed []string `json:"removed"`
+
+	// timestamp
+	// Format: date-time
+	Timestamp strfmt.DateTime `json:"timestamp,omitempty"`
+
+	// URL
+	URL string `json:"url,omitempty"`
+
+	// author
+	Author *PayloadUser `json:"author,omitempty"`
+
+	// committer
+	Committer *PayloadUser `json:"committer,omitempty"`
+
+	// verification
+	Verification *PayloadCommitVerification `json:"verification,omitempty"`
+}
+
+// Validate validates this payload commit
+func (m *PayloadCommit) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateTimestamp(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateAuthor(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateCommitter(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateVerification(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *PayloadCommit) validateTimestamp(formats strfmt.Registry) error {
+	if swag.IsZero(m.Timestamp) { // not required
+		return nil
+	}
+
+	if err := validate.FormatOf("timestamp", "body", "date-time", m.Timestamp.String(), formats); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (m *PayloadCommit) validateAuthor(formats strfmt.Registry) error {
+	if swag.IsZero(m.Author) { // not required
+		return nil
+	}
+
+	if m.Author != nil {
+		if err := m.Author.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("author")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("author")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *PayloadCommit) validateCommitter(formats strfmt.Registry) error {
+	if swag.IsZero(m.Committer) { // not required
+		return nil
+	}
+
+	if m.Committer != nil {
+		if err := m.Committer.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("committer")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("committer")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *PayloadCommit) validateVerification(formats strfmt.Registry) error {
+	if swag.IsZero(m.Verification) { // not required
+		return nil
+	}
+
+	if m.Verification != nil {
+		if err := m.Verification.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("verification")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("verification")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+// ContextValidate validate this payload commit based on the context it is used
+func (m *PayloadCommit) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.contextValidateAuthor(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.contextValidateCommitter(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.contextValidateVerification(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *PayloadCommit) contextValidateAuthor(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.Author != nil {
+
+		if swag.IsZero(m.Author) { // not required
+			return nil
+		}
+
+		if err := m.Author.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("author")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("author")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *PayloadCommit) contextValidateCommitter(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.Committer != nil {
+
+		if swag.IsZero(m.Committer) { // not required
+			return nil
+		}
+
+		if err := m.Committer.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("committer")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("committer")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *PayloadCommit) contextValidateVerification(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.Verification != nil {
+
+		if swag.IsZero(m.Verification) { // not required
+			return nil
+		}
+
+		if err := m.Verification.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("verification")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("verification")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *PayloadCommit) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *PayloadCommit) UnmarshalBinary(b []byte) error {
+	var res PayloadCommit
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/payload_commit_verification.go b/bots-common/gitea-generated/models/payload_commit_verification.go
new file mode 100644
index 0000000..5dd7ea0
--- /dev/null
+++ b/bots-common/gitea-generated/models/payload_commit_verification.go
@@ -0,0 +1,121 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// PayloadCommitVerification PayloadCommitVerification represents the GPG verification of a commit
+//
+// swagger:model PayloadCommitVerification
+type PayloadCommitVerification struct {
+
+	// payload
+	Payload string `json:"payload,omitempty"`
+
+	// reason
+	Reason string `json:"reason,omitempty"`
+
+	// signature
+	Signature string `json:"signature,omitempty"`
+
+	// verified
+	Verified bool `json:"verified,omitempty"`
+
+	// signer
+	Signer *PayloadUser `json:"signer,omitempty"`
+}
+
+// Validate validates this payload commit verification
+func (m *PayloadCommitVerification) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateSigner(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *PayloadCommitVerification) validateSigner(formats strfmt.Registry) error {
+	if swag.IsZero(m.Signer) { // not required
+		return nil
+	}
+
+	if m.Signer != nil {
+		if err := m.Signer.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("signer")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("signer")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+// ContextValidate validate this payload commit verification based on the context it is used
+func (m *PayloadCommitVerification) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.contextValidateSigner(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *PayloadCommitVerification) contextValidateSigner(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.Signer != nil {
+
+		if swag.IsZero(m.Signer) { // not required
+			return nil
+		}
+
+		if err := m.Signer.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("signer")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("signer")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *PayloadCommitVerification) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *PayloadCommitVerification) UnmarshalBinary(b []byte) error {
+	var res PayloadCommitVerification
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/payload_user.go b/bots-common/gitea-generated/models/payload_user.go
new file mode 100644
index 0000000..5418cf9
--- /dev/null
+++ b/bots-common/gitea-generated/models/payload_user.go
@@ -0,0 +1,80 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+	"github.com/go-openapi/validate"
+)
+
+// PayloadUser PayloadUser represents the author or committer of a commit
+//
+// swagger:model PayloadUser
+type PayloadUser struct {
+
+	// email
+	// Format: email
+	Email strfmt.Email `json:"email,omitempty"`
+
+	// Full name of the commit author
+	Name string `json:"name,omitempty"`
+
+	// user name
+	UserName string `json:"username,omitempty"`
+}
+
+// Validate validates this payload user
+func (m *PayloadUser) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateEmail(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *PayloadUser) validateEmail(formats strfmt.Registry) error {
+	if swag.IsZero(m.Email) { // not required
+		return nil
+	}
+
+	if err := validate.FormatOf("email", "body", "email", m.Email.String(), formats); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+// ContextValidate validates this payload user based on context it is used
+func (m *PayloadUser) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *PayloadUser) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *PayloadUser) UnmarshalBinary(b []byte) error {
+	var res PayloadUser
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/permission.go b/bots-common/gitea-generated/models/permission.go
new file mode 100644
index 0000000..7c222e3
--- /dev/null
+++ b/bots-common/gitea-generated/models/permission.go
@@ -0,0 +1,56 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// Permission Permission represents a set of permissions
+//
+// swagger:model Permission
+type Permission struct {
+
+	// admin
+	Admin bool `json:"admin,omitempty"`
+
+	// pull
+	Pull bool `json:"pull,omitempty"`
+
+	// push
+	Push bool `json:"push,omitempty"`
+}
+
+// Validate validates this permission
+func (m *Permission) Validate(formats strfmt.Registry) error {
+	return nil
+}
+
+// ContextValidate validates this permission based on context it is used
+func (m *Permission) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *Permission) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *Permission) UnmarshalBinary(b []byte) error {
+	var res Permission
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/public_key.go b/bots-common/gitea-generated/models/public_key.go
new file mode 100644
index 0000000..a666f80
--- /dev/null
+++ b/bots-common/gitea-generated/models/public_key.go
@@ -0,0 +1,151 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+	"github.com/go-openapi/validate"
+)
+
+// PublicKey PublicKey publickey is a user key to push code to repository
+//
+// swagger:model PublicKey
+type PublicKey struct {
+
+	// created
+	// Format: date-time
+	Created strfmt.DateTime `json:"created_at,omitempty"`
+
+	// fingerprint
+	Fingerprint string `json:"fingerprint,omitempty"`
+
+	// ID
+	ID int64 `json:"id,omitempty"`
+
+	// key
+	Key string `json:"key,omitempty"`
+
+	// key type
+	KeyType string `json:"key_type,omitempty"`
+
+	// read only
+	ReadOnly bool `json:"read_only,omitempty"`
+
+	// title
+	Title string `json:"title,omitempty"`
+
+	// URL
+	URL string `json:"url,omitempty"`
+
+	// user
+	User *User `json:"user,omitempty"`
+}
+
+// Validate validates this public key
+func (m *PublicKey) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateCreated(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateUser(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *PublicKey) validateCreated(formats strfmt.Registry) error {
+	if swag.IsZero(m.Created) { // not required
+		return nil
+	}
+
+	if err := validate.FormatOf("created_at", "body", "date-time", m.Created.String(), formats); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (m *PublicKey) validateUser(formats strfmt.Registry) error {
+	if swag.IsZero(m.User) { // not required
+		return nil
+	}
+
+	if m.User != nil {
+		if err := m.User.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("user")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("user")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+// ContextValidate validate this public key based on the context it is used
+func (m *PublicKey) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.contextValidateUser(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *PublicKey) contextValidateUser(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.User != nil {
+
+		if swag.IsZero(m.User) { // not required
+			return nil
+		}
+
+		if err := m.User.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("user")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("user")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *PublicKey) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *PublicKey) UnmarshalBinary(b []byte) error {
+	var res PublicKey
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/pull_request.go b/bots-common/gitea-generated/models/pull_request.go
new file mode 100644
index 0000000..607707d
--- /dev/null
+++ b/bots-common/gitea-generated/models/pull_request.go
@@ -0,0 +1,761 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"strconv"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+	"github.com/go-openapi/validate"
+)
+
+// PullRequest PullRequest represents a pull request
+//
+// swagger:model PullRequest
+type PullRequest struct {
+
+	// additions
+	Additions int64 `json:"additions,omitempty"`
+
+	// allow maintainer edit
+	AllowMaintainerEdit bool `json:"allow_maintainer_edit,omitempty"`
+
+	// assignees
+	Assignees []*User `json:"assignees"`
+
+	// body
+	Body string `json:"body,omitempty"`
+
+	// changed files
+	ChangedFiles int64 `json:"changed_files,omitempty"`
+
+	// closed
+	// Format: date-time
+	Closed strfmt.DateTime `json:"closed_at,omitempty"`
+
+	// comments
+	Comments int64 `json:"comments,omitempty"`
+
+	// created
+	// Format: date-time
+	Created strfmt.DateTime `json:"created_at,omitempty"`
+
+	// deadline
+	// Format: date-time
+	Deadline strfmt.DateTime `json:"due_date,omitempty"`
+
+	// deletions
+	Deletions int64 `json:"deletions,omitempty"`
+
+	// diff URL
+	DiffURL string `json:"diff_url,omitempty"`
+
+	// draft
+	Draft bool `json:"draft,omitempty"`
+
+	// HTML URL
+	HTMLURL string `json:"html_url,omitempty"`
+
+	// has merged
+	HasMerged bool `json:"merged,omitempty"`
+
+	// ID
+	ID int64 `json:"id,omitempty"`
+
+	// index
+	Index int64 `json:"number,omitempty"`
+
+	// is locked
+	IsLocked bool `json:"is_locked,omitempty"`
+
+	// labels
+	Labels []*Label `json:"labels"`
+
+	// merge base
+	MergeBase string `json:"merge_base,omitempty"`
+
+	// mergeable
+	Mergeable bool `json:"mergeable,omitempty"`
+
+	// merged
+	// Format: date-time
+	Merged strfmt.DateTime `json:"merged_at,omitempty"`
+
+	// merged commit ID
+	MergedCommitID string `json:"merge_commit_sha,omitempty"`
+
+	// patch URL
+	PatchURL string `json:"patch_url,omitempty"`
+
+	// pin order
+	PinOrder int64 `json:"pin_order,omitempty"`
+
+	// requested reviewers
+	RequestedReviewers []*User `json:"requested_reviewers"`
+
+	// number of review comments made on the diff of a PR review (not including comments on commits or issues in a PR)
+	ReviewComments int64 `json:"review_comments,omitempty"`
+
+	// title
+	Title string `json:"title,omitempty"`
+
+	// URL
+	URL string `json:"url,omitempty"`
+
+	// updated
+	// Format: date-time
+	Updated strfmt.DateTime `json:"updated_at,omitempty"`
+
+	// assignee
+	Assignee *User `json:"assignee,omitempty"`
+
+	// base
+	Base *PRBranchInfo `json:"base,omitempty"`
+
+	// head
+	Head *PRBranchInfo `json:"head,omitempty"`
+
+	// merged by
+	MergedBy *User `json:"merged_by,omitempty"`
+
+	// milestone
+	Milestone *Milestone `json:"milestone,omitempty"`
+
+	// state
+	State StateType `json:"state,omitempty"`
+
+	// user
+	User *User `json:"user,omitempty"`
+}
+
+// Validate validates this pull request
+func (m *PullRequest) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateAssignees(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateClosed(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateCreated(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateDeadline(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateLabels(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateMerged(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateRequestedReviewers(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateUpdated(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateAssignee(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateBase(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateHead(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateMergedBy(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateMilestone(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateState(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateUser(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *PullRequest) validateAssignees(formats strfmt.Registry) error {
+	if swag.IsZero(m.Assignees) { // not required
+		return nil
+	}
+
+	for i := 0; i < len(m.Assignees); i++ {
+		if swag.IsZero(m.Assignees[i]) { // not required
+			continue
+		}
+
+		if m.Assignees[i] != nil {
+			if err := m.Assignees[i].Validate(formats); err != nil {
+				if ve, ok := err.(*errors.Validation); ok {
+					return ve.ValidateName("assignees" + "." + strconv.Itoa(i))
+				} else if ce, ok := err.(*errors.CompositeError); ok {
+					return ce.ValidateName("assignees" + "." + strconv.Itoa(i))
+				}
+				return err
+			}
+		}
+
+	}
+
+	return nil
+}
+
+func (m *PullRequest) validateClosed(formats strfmt.Registry) error {
+	if swag.IsZero(m.Closed) { // not required
+		return nil
+	}
+
+	if err := validate.FormatOf("closed_at", "body", "date-time", m.Closed.String(), formats); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (m *PullRequest) validateCreated(formats strfmt.Registry) error {
+	if swag.IsZero(m.Created) { // not required
+		return nil
+	}
+
+	if err := validate.FormatOf("created_at", "body", "date-time", m.Created.String(), formats); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (m *PullRequest) validateDeadline(formats strfmt.Registry) error {
+	if swag.IsZero(m.Deadline) { // not required
+		return nil
+	}
+
+	if err := validate.FormatOf("due_date", "body", "date-time", m.Deadline.String(), formats); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (m *PullRequest) validateLabels(formats strfmt.Registry) error {
+	if swag.IsZero(m.Labels) { // not required
+		return nil
+	}
+
+	for i := 0; i < len(m.Labels); i++ {
+		if swag.IsZero(m.Labels[i]) { // not required
+			continue
+		}
+
+		if m.Labels[i] != nil {
+			if err := m.Labels[i].Validate(formats); err != nil {
+				if ve, ok := err.(*errors.Validation); ok {
+					return ve.ValidateName("labels" + "." + strconv.Itoa(i))
+				} else if ce, ok := err.(*errors.CompositeError); ok {
+					return ce.ValidateName("labels" + "." + strconv.Itoa(i))
+				}
+				return err
+			}
+		}
+
+	}
+
+	return nil
+}
+
+func (m *PullRequest) validateMerged(formats strfmt.Registry) error {
+	if swag.IsZero(m.Merged) { // not required
+		return nil
+	}
+
+	if err := validate.FormatOf("merged_at", "body", "date-time", m.Merged.String(), formats); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (m *PullRequest) validateRequestedReviewers(formats strfmt.Registry) error {
+	if swag.IsZero(m.RequestedReviewers) { // not required
+		return nil
+	}
+
+	for i := 0; i < len(m.RequestedReviewers); i++ {
+		if swag.IsZero(m.RequestedReviewers[i]) { // not required
+			continue
+		}
+
+		if m.RequestedReviewers[i] != nil {
+			if err := m.RequestedReviewers[i].Validate(formats); err != nil {
+				if ve, ok := err.(*errors.Validation); ok {
+					return ve.ValidateName("requested_reviewers" + "." + strconv.Itoa(i))
+				} else if ce, ok := err.(*errors.CompositeError); ok {
+					return ce.ValidateName("requested_reviewers" + "." + strconv.Itoa(i))
+				}
+				return err
+			}
+		}
+
+	}
+
+	return nil
+}
+
+func (m *PullRequest) validateUpdated(formats strfmt.Registry) error {
+	if swag.IsZero(m.Updated) { // not required
+		return nil
+	}
+
+	if err := validate.FormatOf("updated_at", "body", "date-time", m.Updated.String(), formats); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (m *PullRequest) validateAssignee(formats strfmt.Registry) error {
+	if swag.IsZero(m.Assignee) { // not required
+		return nil
+	}
+
+	if m.Assignee != nil {
+		if err := m.Assignee.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("assignee")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("assignee")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *PullRequest) validateBase(formats strfmt.Registry) error {
+	if swag.IsZero(m.Base) { // not required
+		return nil
+	}
+
+	if m.Base != nil {
+		if err := m.Base.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("base")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("base")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *PullRequest) validateHead(formats strfmt.Registry) error {
+	if swag.IsZero(m.Head) { // not required
+		return nil
+	}
+
+	if m.Head != nil {
+		if err := m.Head.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("head")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("head")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *PullRequest) validateMergedBy(formats strfmt.Registry) error {
+	if swag.IsZero(m.MergedBy) { // not required
+		return nil
+	}
+
+	if m.MergedBy != nil {
+		if err := m.MergedBy.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("merged_by")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("merged_by")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *PullRequest) validateMilestone(formats strfmt.Registry) error {
+	if swag.IsZero(m.Milestone) { // not required
+		return nil
+	}
+
+	if m.Milestone != nil {
+		if err := m.Milestone.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("milestone")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("milestone")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *PullRequest) validateState(formats strfmt.Registry) error {
+	if swag.IsZero(m.State) { // not required
+		return nil
+	}
+
+	if err := m.State.Validate(formats); err != nil {
+		if ve, ok := err.(*errors.Validation); ok {
+			return ve.ValidateName("state")
+		} else if ce, ok := err.(*errors.CompositeError); ok {
+			return ce.ValidateName("state")
+		}
+		return err
+	}
+
+	return nil
+}
+
+func (m *PullRequest) validateUser(formats strfmt.Registry) error {
+	if swag.IsZero(m.User) { // not required
+		return nil
+	}
+
+	if m.User != nil {
+		if err := m.User.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("user")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("user")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+// ContextValidate validate this pull request based on the context it is used
+func (m *PullRequest) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.contextValidateAssignees(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.contextValidateLabels(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.contextValidateRequestedReviewers(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.contextValidateAssignee(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.contextValidateBase(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.contextValidateHead(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.contextValidateMergedBy(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.contextValidateMilestone(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.contextValidateState(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.contextValidateUser(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *PullRequest) contextValidateAssignees(ctx context.Context, formats strfmt.Registry) error {
+
+	for i := 0; i < len(m.Assignees); i++ {
+
+		if m.Assignees[i] != nil {
+
+			if swag.IsZero(m.Assignees[i]) { // not required
+				return nil
+			}
+
+			if err := m.Assignees[i].ContextValidate(ctx, formats); err != nil {
+				if ve, ok := err.(*errors.Validation); ok {
+					return ve.ValidateName("assignees" + "." + strconv.Itoa(i))
+				} else if ce, ok := err.(*errors.CompositeError); ok {
+					return ce.ValidateName("assignees" + "." + strconv.Itoa(i))
+				}
+				return err
+			}
+		}
+
+	}
+
+	return nil
+}
+
+func (m *PullRequest) contextValidateLabels(ctx context.Context, formats strfmt.Registry) error {
+
+	for i := 0; i < len(m.Labels); i++ {
+
+		if m.Labels[i] != nil {
+
+			if swag.IsZero(m.Labels[i]) { // not required
+				return nil
+			}
+
+			if err := m.Labels[i].ContextValidate(ctx, formats); err != nil {
+				if ve, ok := err.(*errors.Validation); ok {
+					return ve.ValidateName("labels" + "." + strconv.Itoa(i))
+				} else if ce, ok := err.(*errors.CompositeError); ok {
+					return ce.ValidateName("labels" + "." + strconv.Itoa(i))
+				}
+				return err
+			}
+		}
+
+	}
+
+	return nil
+}
+
+func (m *PullRequest) contextValidateRequestedReviewers(ctx context.Context, formats strfmt.Registry) error {
+
+	for i := 0; i < len(m.RequestedReviewers); i++ {
+
+		if m.RequestedReviewers[i] != nil {
+
+			if swag.IsZero(m.RequestedReviewers[i]) { // not required
+				return nil
+			}
+
+			if err := m.RequestedReviewers[i].ContextValidate(ctx, formats); err != nil {
+				if ve, ok := err.(*errors.Validation); ok {
+					return ve.ValidateName("requested_reviewers" + "." + strconv.Itoa(i))
+				} else if ce, ok := err.(*errors.CompositeError); ok {
+					return ce.ValidateName("requested_reviewers" + "." + strconv.Itoa(i))
+				}
+				return err
+			}
+		}
+
+	}
+
+	return nil
+}
+
+func (m *PullRequest) contextValidateAssignee(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.Assignee != nil {
+
+		if swag.IsZero(m.Assignee) { // not required
+			return nil
+		}
+
+		if err := m.Assignee.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("assignee")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("assignee")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *PullRequest) contextValidateBase(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.Base != nil {
+
+		if swag.IsZero(m.Base) { // not required
+			return nil
+		}
+
+		if err := m.Base.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("base")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("base")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *PullRequest) contextValidateHead(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.Head != nil {
+
+		if swag.IsZero(m.Head) { // not required
+			return nil
+		}
+
+		if err := m.Head.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("head")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("head")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *PullRequest) contextValidateMergedBy(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.MergedBy != nil {
+
+		if swag.IsZero(m.MergedBy) { // not required
+			return nil
+		}
+
+		if err := m.MergedBy.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("merged_by")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("merged_by")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *PullRequest) contextValidateMilestone(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.Milestone != nil {
+
+		if swag.IsZero(m.Milestone) { // not required
+			return nil
+		}
+
+		if err := m.Milestone.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("milestone")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("milestone")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *PullRequest) contextValidateState(ctx context.Context, formats strfmt.Registry) error {
+
+	if swag.IsZero(m.State) { // not required
+		return nil
+	}
+
+	if err := m.State.ContextValidate(ctx, formats); err != nil {
+		if ve, ok := err.(*errors.Validation); ok {
+			return ve.ValidateName("state")
+		} else if ce, ok := err.(*errors.CompositeError); ok {
+			return ce.ValidateName("state")
+		}
+		return err
+	}
+
+	return nil
+}
+
+func (m *PullRequest) contextValidateUser(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.User != nil {
+
+		if swag.IsZero(m.User) { // not required
+			return nil
+		}
+
+		if err := m.User.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("user")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("user")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *PullRequest) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *PullRequest) UnmarshalBinary(b []byte) error {
+	var res PullRequest
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/pull_request_meta.go b/bots-common/gitea-generated/models/pull_request_meta.go
new file mode 100644
index 0000000..72a656c
--- /dev/null
+++ b/bots-common/gitea-generated/models/pull_request_meta.go
@@ -0,0 +1,83 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+	"github.com/go-openapi/validate"
+)
+
+// PullRequestMeta PullRequestMeta PR info if an issue is a PR
+//
+// swagger:model PullRequestMeta
+type PullRequestMeta struct {
+
+	// HTML URL
+	HTMLURL string `json:"html_url,omitempty"`
+
+	// has merged
+	HasMerged bool `json:"merged,omitempty"`
+
+	// is work in progress
+	IsWorkInProgress bool `json:"draft,omitempty"`
+
+	// merged
+	// Format: date-time
+	Merged strfmt.DateTime `json:"merged_at,omitempty"`
+}
+
+// Validate validates this pull request meta
+func (m *PullRequestMeta) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateMerged(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *PullRequestMeta) validateMerged(formats strfmt.Registry) error {
+	if swag.IsZero(m.Merged) { // not required
+		return nil
+	}
+
+	if err := validate.FormatOf("merged_at", "body", "date-time", m.Merged.String(), formats); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+// ContextValidate validates this pull request meta based on context it is used
+func (m *PullRequestMeta) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *PullRequestMeta) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *PullRequestMeta) UnmarshalBinary(b []byte) error {
+	var res PullRequestMeta
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/pull_review.go b/bots-common/gitea-generated/models/pull_review.go
new file mode 100644
index 0000000..141f0a6
--- /dev/null
+++ b/bots-common/gitea-generated/models/pull_review.go
@@ -0,0 +1,274 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+	"github.com/go-openapi/validate"
+)
+
+// PullReview PullReview represents a pull request review
+//
+// swagger:model PullReview
+type PullReview struct {
+
+	// body
+	Body string `json:"body,omitempty"`
+
+	// code comments count
+	CodeCommentsCount int64 `json:"comments_count,omitempty"`
+
+	// commit ID
+	CommitID string `json:"commit_id,omitempty"`
+
+	// dismissed
+	Dismissed bool `json:"dismissed,omitempty"`
+
+	// HTML pull URL
+	HTMLPullURL string `json:"pull_request_url,omitempty"`
+
+	// HTML URL
+	HTMLURL string `json:"html_url,omitempty"`
+
+	// ID
+	ID int64 `json:"id,omitempty"`
+
+	// official
+	Official bool `json:"official,omitempty"`
+
+	// stale
+	Stale bool `json:"stale,omitempty"`
+
+	// submitted
+	// Format: date-time
+	Submitted strfmt.DateTime `json:"submitted_at,omitempty"`
+
+	// updated
+	// Format: date-time
+	Updated strfmt.DateTime `json:"updated_at,omitempty"`
+
+	// state
+	State ReviewStateType `json:"state,omitempty"`
+
+	// team
+	Team *Team `json:"team,omitempty"`
+
+	// user
+	User *User `json:"user,omitempty"`
+}
+
+// Validate validates this pull review
+func (m *PullReview) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateSubmitted(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateUpdated(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateState(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateTeam(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateUser(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *PullReview) validateSubmitted(formats strfmt.Registry) error {
+	if swag.IsZero(m.Submitted) { // not required
+		return nil
+	}
+
+	if err := validate.FormatOf("submitted_at", "body", "date-time", m.Submitted.String(), formats); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (m *PullReview) validateUpdated(formats strfmt.Registry) error {
+	if swag.IsZero(m.Updated) { // not required
+		return nil
+	}
+
+	if err := validate.FormatOf("updated_at", "body", "date-time", m.Updated.String(), formats); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (m *PullReview) validateState(formats strfmt.Registry) error {
+	if swag.IsZero(m.State) { // not required
+		return nil
+	}
+
+	if err := m.State.Validate(formats); err != nil {
+		if ve, ok := err.(*errors.Validation); ok {
+			return ve.ValidateName("state")
+		} else if ce, ok := err.(*errors.CompositeError); ok {
+			return ce.ValidateName("state")
+		}
+		return err
+	}
+
+	return nil
+}
+
+func (m *PullReview) validateTeam(formats strfmt.Registry) error {
+	if swag.IsZero(m.Team) { // not required
+		return nil
+	}
+
+	if m.Team != nil {
+		if err := m.Team.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("team")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("team")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *PullReview) validateUser(formats strfmt.Registry) error {
+	if swag.IsZero(m.User) { // not required
+		return nil
+	}
+
+	if m.User != nil {
+		if err := m.User.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("user")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("user")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+// ContextValidate validate this pull review based on the context it is used
+func (m *PullReview) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.contextValidateState(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.contextValidateTeam(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.contextValidateUser(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *PullReview) contextValidateState(ctx context.Context, formats strfmt.Registry) error {
+
+	if swag.IsZero(m.State) { // not required
+		return nil
+	}
+
+	if err := m.State.ContextValidate(ctx, formats); err != nil {
+		if ve, ok := err.(*errors.Validation); ok {
+			return ve.ValidateName("state")
+		} else if ce, ok := err.(*errors.CompositeError); ok {
+			return ce.ValidateName("state")
+		}
+		return err
+	}
+
+	return nil
+}
+
+func (m *PullReview) contextValidateTeam(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.Team != nil {
+
+		if swag.IsZero(m.Team) { // not required
+			return nil
+		}
+
+		if err := m.Team.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("team")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("team")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *PullReview) contextValidateUser(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.User != nil {
+
+		if swag.IsZero(m.User) { // not required
+			return nil
+		}
+
+		if err := m.User.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("user")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("user")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *PullReview) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *PullReview) UnmarshalBinary(b []byte) error {
+	var res PullReview
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/pull_review_comment.go b/bots-common/gitea-generated/models/pull_review_comment.go
new file mode 100644
index 0000000..bf193bb
--- /dev/null
+++ b/bots-common/gitea-generated/models/pull_review_comment.go
@@ -0,0 +1,234 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+	"github.com/go-openapi/validate"
+)
+
+// PullReviewComment PullReviewComment represents a comment on a pull request review
+//
+// swagger:model PullReviewComment
+type PullReviewComment struct {
+
+	// body
+	Body string `json:"body,omitempty"`
+
+	// commit ID
+	CommitID string `json:"commit_id,omitempty"`
+
+	// created
+	// Format: date-time
+	Created strfmt.DateTime `json:"created_at,omitempty"`
+
+	// diff hunk
+	DiffHunk string `json:"diff_hunk,omitempty"`
+
+	// HTML pull URL
+	HTMLPullURL string `json:"pull_request_url,omitempty"`
+
+	// HTML URL
+	HTMLURL string `json:"html_url,omitempty"`
+
+	// ID
+	ID int64 `json:"id,omitempty"`
+
+	// line num
+	LineNum uint64 `json:"position,omitempty"`
+
+	// old line num
+	OldLineNum uint64 `json:"original_position,omitempty"`
+
+	// orig commit ID
+	OrigCommitID string `json:"original_commit_id,omitempty"`
+
+	// path
+	Path string `json:"path,omitempty"`
+
+	// review ID
+	ReviewID int64 `json:"pull_request_review_id,omitempty"`
+
+	// updated
+	// Format: date-time
+	Updated strfmt.DateTime `json:"updated_at,omitempty"`
+
+	// resolver
+	Resolver *User `json:"resolver,omitempty"`
+
+	// user
+	User *User `json:"user,omitempty"`
+}
+
+// Validate validates this pull review comment
+func (m *PullReviewComment) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateCreated(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateUpdated(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateResolver(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateUser(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *PullReviewComment) validateCreated(formats strfmt.Registry) error {
+	if swag.IsZero(m.Created) { // not required
+		return nil
+	}
+
+	if err := validate.FormatOf("created_at", "body", "date-time", m.Created.String(), formats); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (m *PullReviewComment) validateUpdated(formats strfmt.Registry) error {
+	if swag.IsZero(m.Updated) { // not required
+		return nil
+	}
+
+	if err := validate.FormatOf("updated_at", "body", "date-time", m.Updated.String(), formats); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (m *PullReviewComment) validateResolver(formats strfmt.Registry) error {
+	if swag.IsZero(m.Resolver) { // not required
+		return nil
+	}
+
+	if m.Resolver != nil {
+		if err := m.Resolver.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("resolver")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("resolver")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *PullReviewComment) validateUser(formats strfmt.Registry) error {
+	if swag.IsZero(m.User) { // not required
+		return nil
+	}
+
+	if m.User != nil {
+		if err := m.User.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("user")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("user")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+// ContextValidate validate this pull review comment based on the context it is used
+func (m *PullReviewComment) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.contextValidateResolver(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.contextValidateUser(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *PullReviewComment) contextValidateResolver(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.Resolver != nil {
+
+		if swag.IsZero(m.Resolver) { // not required
+			return nil
+		}
+
+		if err := m.Resolver.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("resolver")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("resolver")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *PullReviewComment) contextValidateUser(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.User != nil {
+
+		if swag.IsZero(m.User) { // not required
+			return nil
+		}
+
+		if err := m.User.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("user")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("user")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *PullReviewComment) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *PullReviewComment) UnmarshalBinary(b []byte) error {
+	var res PullReviewComment
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/pull_review_request_options.go b/bots-common/gitea-generated/models/pull_review_request_options.go
new file mode 100644
index 0000000..f1dea22
--- /dev/null
+++ b/bots-common/gitea-generated/models/pull_review_request_options.go
@@ -0,0 +1,53 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// PullReviewRequestOptions PullReviewRequestOptions are options to add or remove pull review requests
+//
+// swagger:model PullReviewRequestOptions
+type PullReviewRequestOptions struct {
+
+	// reviewers
+	Reviewers []string `json:"reviewers"`
+
+	// team reviewers
+	TeamReviewers []string `json:"team_reviewers"`
+}
+
+// Validate validates this pull review request options
+func (m *PullReviewRequestOptions) Validate(formats strfmt.Registry) error {
+	return nil
+}
+
+// ContextValidate validates this pull review request options based on context it is used
+func (m *PullReviewRequestOptions) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *PullReviewRequestOptions) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *PullReviewRequestOptions) UnmarshalBinary(b []byte) error {
+	var res PullReviewRequestOptions
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/push_mirror.go b/bots-common/gitea-generated/models/push_mirror.go
new file mode 100644
index 0000000..127ab49
--- /dev/null
+++ b/bots-common/gitea-generated/models/push_mirror.go
@@ -0,0 +1,112 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+	"github.com/go-openapi/validate"
+)
+
+// PushMirror PushMirror represents information of a push mirror
+//
+// swagger:model PushMirror
+type PushMirror struct {
+
+	// created unix
+	// Format: date-time
+	CreatedUnix strfmt.DateTime `json:"created,omitempty"`
+
+	// interval
+	Interval string `json:"interval,omitempty"`
+
+	// last error
+	LastError string `json:"last_error,omitempty"`
+
+	// last update unix
+	// Format: date-time
+	LastUpdateUnix strfmt.DateTime `json:"last_update,omitempty"`
+
+	// remote address
+	RemoteAddress string `json:"remote_address,omitempty"`
+
+	// remote name
+	RemoteName string `json:"remote_name,omitempty"`
+
+	// repo name
+	RepoName string `json:"repo_name,omitempty"`
+
+	// sync on commit
+	SyncOnCommit bool `json:"sync_on_commit,omitempty"`
+}
+
+// Validate validates this push mirror
+func (m *PushMirror) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateCreatedUnix(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateLastUpdateUnix(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *PushMirror) validateCreatedUnix(formats strfmt.Registry) error {
+	if swag.IsZero(m.CreatedUnix) { // not required
+		return nil
+	}
+
+	if err := validate.FormatOf("created", "body", "date-time", m.CreatedUnix.String(), formats); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (m *PushMirror) validateLastUpdateUnix(formats strfmt.Registry) error {
+	if swag.IsZero(m.LastUpdateUnix) { // not required
+		return nil
+	}
+
+	if err := validate.FormatOf("last_update", "body", "date-time", m.LastUpdateUnix.String(), formats); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+// ContextValidate validates this push mirror based on context it is used
+func (m *PushMirror) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *PushMirror) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *PushMirror) UnmarshalBinary(b []byte) error {
+	var res PushMirror
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/reaction.go b/bots-common/gitea-generated/models/reaction.go
new file mode 100644
index 0000000..711cb3b
--- /dev/null
+++ b/bots-common/gitea-generated/models/reaction.go
@@ -0,0 +1,133 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+	"github.com/go-openapi/validate"
+)
+
+// Reaction Reaction contain one reaction
+//
+// swagger:model Reaction
+type Reaction struct {
+
+	// created
+	// Format: date-time
+	Created strfmt.DateTime `json:"created_at,omitempty"`
+
+	// reaction
+	Reaction string `json:"content,omitempty"`
+
+	// user
+	User *User `json:"user,omitempty"`
+}
+
+// Validate validates this reaction
+func (m *Reaction) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateCreated(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateUser(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *Reaction) validateCreated(formats strfmt.Registry) error {
+	if swag.IsZero(m.Created) { // not required
+		return nil
+	}
+
+	if err := validate.FormatOf("created_at", "body", "date-time", m.Created.String(), formats); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (m *Reaction) validateUser(formats strfmt.Registry) error {
+	if swag.IsZero(m.User) { // not required
+		return nil
+	}
+
+	if m.User != nil {
+		if err := m.User.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("user")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("user")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+// ContextValidate validate this reaction based on the context it is used
+func (m *Reaction) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.contextValidateUser(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *Reaction) contextValidateUser(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.User != nil {
+
+		if swag.IsZero(m.User) { // not required
+			return nil
+		}
+
+		if err := m.User.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("user")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("user")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *Reaction) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *Reaction) UnmarshalBinary(b []byte) error {
+	var res Reaction
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/reference.go b/bots-common/gitea-generated/models/reference.go
new file mode 100644
index 0000000..2933d27
--- /dev/null
+++ b/bots-common/gitea-generated/models/reference.go
@@ -0,0 +1,115 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// Reference Reference represents a Git reference.
+//
+// swagger:model Reference
+type Reference struct {
+
+	// ref
+	Ref string `json:"ref,omitempty"`
+
+	// URL
+	URL string `json:"url,omitempty"`
+
+	// object
+	Object *GitObject `json:"object,omitempty"`
+}
+
+// Validate validates this reference
+func (m *Reference) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateObject(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *Reference) validateObject(formats strfmt.Registry) error {
+	if swag.IsZero(m.Object) { // not required
+		return nil
+	}
+
+	if m.Object != nil {
+		if err := m.Object.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("object")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("object")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+// ContextValidate validate this reference based on the context it is used
+func (m *Reference) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.contextValidateObject(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *Reference) contextValidateObject(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.Object != nil {
+
+		if swag.IsZero(m.Object) { // not required
+			return nil
+		}
+
+		if err := m.Object.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("object")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("object")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *Reference) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *Reference) UnmarshalBinary(b []byte) error {
+	var res Reference
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/release.go b/bots-common/gitea-generated/models/release.go
new file mode 100644
index 0000000..d32f506
--- /dev/null
+++ b/bots-common/gitea-generated/models/release.go
@@ -0,0 +1,249 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"strconv"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+	"github.com/go-openapi/validate"
+)
+
+// Release Release represents a repository release
+//
+// swagger:model Release
+type Release struct {
+
+	// attachments
+	Attachments []*Attachment `json:"assets"`
+
+	// created at
+	// Format: date-time
+	CreatedAt strfmt.DateTime `json:"created_at,omitempty"`
+
+	// HTML URL
+	HTMLURL string `json:"html_url,omitempty"`
+
+	// ID
+	ID int64 `json:"id,omitempty"`
+
+	// is draft
+	IsDraft bool `json:"draft,omitempty"`
+
+	// is prerelease
+	IsPrerelease bool `json:"prerelease,omitempty"`
+
+	// note
+	Note string `json:"body,omitempty"`
+
+	// published at
+	// Format: date-time
+	PublishedAt strfmt.DateTime `json:"published_at,omitempty"`
+
+	// tag name
+	TagName string `json:"tag_name,omitempty"`
+
+	// tar URL
+	TarURL string `json:"tarball_url,omitempty"`
+
+	// target
+	Target string `json:"target_commitish,omitempty"`
+
+	// title
+	Title string `json:"name,omitempty"`
+
+	// URL
+	URL string `json:"url,omitempty"`
+
+	// upload URL
+	UploadURL string `json:"upload_url,omitempty"`
+
+	// zip URL
+	ZipURL string `json:"zipball_url,omitempty"`
+
+	// author
+	Author *User `json:"author,omitempty"`
+}
+
+// Validate validates this release
+func (m *Release) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateAttachments(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateCreatedAt(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validatePublishedAt(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateAuthor(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *Release) validateAttachments(formats strfmt.Registry) error {
+	if swag.IsZero(m.Attachments) { // not required
+		return nil
+	}
+
+	for i := 0; i < len(m.Attachments); i++ {
+		if swag.IsZero(m.Attachments[i]) { // not required
+			continue
+		}
+
+		if m.Attachments[i] != nil {
+			if err := m.Attachments[i].Validate(formats); err != nil {
+				if ve, ok := err.(*errors.Validation); ok {
+					return ve.ValidateName("assets" + "." + strconv.Itoa(i))
+				} else if ce, ok := err.(*errors.CompositeError); ok {
+					return ce.ValidateName("assets" + "." + strconv.Itoa(i))
+				}
+				return err
+			}
+		}
+
+	}
+
+	return nil
+}
+
+func (m *Release) validateCreatedAt(formats strfmt.Registry) error {
+	if swag.IsZero(m.CreatedAt) { // not required
+		return nil
+	}
+
+	if err := validate.FormatOf("created_at", "body", "date-time", m.CreatedAt.String(), formats); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (m *Release) validatePublishedAt(formats strfmt.Registry) error {
+	if swag.IsZero(m.PublishedAt) { // not required
+		return nil
+	}
+
+	if err := validate.FormatOf("published_at", "body", "date-time", m.PublishedAt.String(), formats); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (m *Release) validateAuthor(formats strfmt.Registry) error {
+	if swag.IsZero(m.Author) { // not required
+		return nil
+	}
+
+	if m.Author != nil {
+		if err := m.Author.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("author")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("author")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+// ContextValidate validate this release based on the context it is used
+func (m *Release) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.contextValidateAttachments(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.contextValidateAuthor(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *Release) contextValidateAttachments(ctx context.Context, formats strfmt.Registry) error {
+
+	for i := 0; i < len(m.Attachments); i++ {
+
+		if m.Attachments[i] != nil {
+
+			if swag.IsZero(m.Attachments[i]) { // not required
+				return nil
+			}
+
+			if err := m.Attachments[i].ContextValidate(ctx, formats); err != nil {
+				if ve, ok := err.(*errors.Validation); ok {
+					return ve.ValidateName("assets" + "." + strconv.Itoa(i))
+				} else if ce, ok := err.(*errors.CompositeError); ok {
+					return ce.ValidateName("assets" + "." + strconv.Itoa(i))
+				}
+				return err
+			}
+		}
+
+	}
+
+	return nil
+}
+
+func (m *Release) contextValidateAuthor(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.Author != nil {
+
+		if swag.IsZero(m.Author) { // not required
+			return nil
+		}
+
+		if err := m.Author.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("author")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("author")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *Release) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *Release) UnmarshalBinary(b []byte) error {
+	var res Release
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/rename_user_option.go b/bots-common/gitea-generated/models/rename_user_option.go
new file mode 100644
index 0000000..7c42887
--- /dev/null
+++ b/bots-common/gitea-generated/models/rename_user_option.go
@@ -0,0 +1,71 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+	"github.com/go-openapi/validate"
+)
+
+// RenameUserOption RenameUserOption options when renaming a user
+//
+// swagger:model RenameUserOption
+type RenameUserOption struct {
+
+	// New username for this user. This name cannot be in use yet by any other user.
+	// Required: true
+	NewName *string `json:"new_username"`
+}
+
+// Validate validates this rename user option
+func (m *RenameUserOption) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateNewName(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *RenameUserOption) validateNewName(formats strfmt.Registry) error {
+
+	if err := validate.Required("new_username", "body", m.NewName); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+// ContextValidate validates this rename user option based on context it is used
+func (m *RenameUserOption) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *RenameUserOption) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *RenameUserOption) UnmarshalBinary(b []byte) error {
+	var res RenameUserOption
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/repo_collaborator_permission.go b/bots-common/gitea-generated/models/repo_collaborator_permission.go
new file mode 100644
index 0000000..6a27cde
--- /dev/null
+++ b/bots-common/gitea-generated/models/repo_collaborator_permission.go
@@ -0,0 +1,115 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// RepoCollaboratorPermission RepoCollaboratorPermission to get repository permission for a collaborator
+//
+// swagger:model RepoCollaboratorPermission
+type RepoCollaboratorPermission struct {
+
+	// permission
+	Permission string `json:"permission,omitempty"`
+
+	// role name
+	RoleName string `json:"role_name,omitempty"`
+
+	// user
+	User *User `json:"user,omitempty"`
+}
+
+// Validate validates this repo collaborator permission
+func (m *RepoCollaboratorPermission) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateUser(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *RepoCollaboratorPermission) validateUser(formats strfmt.Registry) error {
+	if swag.IsZero(m.User) { // not required
+		return nil
+	}
+
+	if m.User != nil {
+		if err := m.User.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("user")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("user")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+// ContextValidate validate this repo collaborator permission based on the context it is used
+func (m *RepoCollaboratorPermission) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.contextValidateUser(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *RepoCollaboratorPermission) contextValidateUser(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.User != nil {
+
+		if swag.IsZero(m.User) { // not required
+			return nil
+		}
+
+		if err := m.User.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("user")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("user")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *RepoCollaboratorPermission) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *RepoCollaboratorPermission) UnmarshalBinary(b []byte) error {
+	var res RepoCollaboratorPermission
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/repo_commit.go b/bots-common/gitea-generated/models/repo_commit.go
new file mode 100644
index 0000000..c47f759
--- /dev/null
+++ b/bots-common/gitea-generated/models/repo_commit.go
@@ -0,0 +1,268 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// RepoCommit RepoCommit contains information of a commit in the context of a repository.
+//
+// swagger:model RepoCommit
+type RepoCommit struct {
+
+	// message
+	Message string `json:"message,omitempty"`
+
+	// URL
+	URL string `json:"url,omitempty"`
+
+	// author
+	Author *CommitUser `json:"author,omitempty"`
+
+	// committer
+	Committer *CommitUser `json:"committer,omitempty"`
+
+	// tree
+	Tree *CommitMeta `json:"tree,omitempty"`
+
+	// verification
+	Verification *PayloadCommitVerification `json:"verification,omitempty"`
+}
+
+// Validate validates this repo commit
+func (m *RepoCommit) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateAuthor(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateCommitter(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateTree(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateVerification(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *RepoCommit) validateAuthor(formats strfmt.Registry) error {
+	if swag.IsZero(m.Author) { // not required
+		return nil
+	}
+
+	if m.Author != nil {
+		if err := m.Author.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("author")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("author")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *RepoCommit) validateCommitter(formats strfmt.Registry) error {
+	if swag.IsZero(m.Committer) { // not required
+		return nil
+	}
+
+	if m.Committer != nil {
+		if err := m.Committer.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("committer")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("committer")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *RepoCommit) validateTree(formats strfmt.Registry) error {
+	if swag.IsZero(m.Tree) { // not required
+		return nil
+	}
+
+	if m.Tree != nil {
+		if err := m.Tree.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("tree")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("tree")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *RepoCommit) validateVerification(formats strfmt.Registry) error {
+	if swag.IsZero(m.Verification) { // not required
+		return nil
+	}
+
+	if m.Verification != nil {
+		if err := m.Verification.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("verification")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("verification")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+// ContextValidate validate this repo commit based on the context it is used
+func (m *RepoCommit) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.contextValidateAuthor(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.contextValidateCommitter(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.contextValidateTree(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.contextValidateVerification(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *RepoCommit) contextValidateAuthor(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.Author != nil {
+
+		if swag.IsZero(m.Author) { // not required
+			return nil
+		}
+
+		if err := m.Author.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("author")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("author")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *RepoCommit) contextValidateCommitter(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.Committer != nil {
+
+		if swag.IsZero(m.Committer) { // not required
+			return nil
+		}
+
+		if err := m.Committer.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("committer")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("committer")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *RepoCommit) contextValidateTree(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.Tree != nil {
+
+		if swag.IsZero(m.Tree) { // not required
+			return nil
+		}
+
+		if err := m.Tree.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("tree")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("tree")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *RepoCommit) contextValidateVerification(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.Verification != nil {
+
+		if swag.IsZero(m.Verification) { // not required
+			return nil
+		}
+
+		if err := m.Verification.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("verification")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("verification")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *RepoCommit) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *RepoCommit) UnmarshalBinary(b []byte) error {
+	var res RepoCommit
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/repo_topic_options.go b/bots-common/gitea-generated/models/repo_topic_options.go
new file mode 100644
index 0000000..cc4b26e
--- /dev/null
+++ b/bots-common/gitea-generated/models/repo_topic_options.go
@@ -0,0 +1,50 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// RepoTopicOptions RepoTopicOptions a collection of repo topic names
+//
+// swagger:model RepoTopicOptions
+type RepoTopicOptions struct {
+
+	// list of topic names
+	Topics []string `json:"topics"`
+}
+
+// Validate validates this repo topic options
+func (m *RepoTopicOptions) Validate(formats strfmt.Registry) error {
+	return nil
+}
+
+// ContextValidate validates this repo topic options based on context it is used
+func (m *RepoTopicOptions) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *RepoTopicOptions) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *RepoTopicOptions) UnmarshalBinary(b []byte) error {
+	var res RepoTopicOptions
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/repo_transfer.go b/bots-common/gitea-generated/models/repo_transfer.go
new file mode 100644
index 0000000..c162826
--- /dev/null
+++ b/bots-common/gitea-generated/models/repo_transfer.go
@@ -0,0 +1,223 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"strconv"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// RepoTransfer RepoTransfer represents a pending repo transfer
+//
+// swagger:model RepoTransfer
+type RepoTransfer struct {
+
+	// teams
+	Teams []*Team `json:"teams"`
+
+	// doer
+	Doer *User `json:"doer,omitempty"`
+
+	// recipient
+	Recipient *User `json:"recipient,omitempty"`
+}
+
+// Validate validates this repo transfer
+func (m *RepoTransfer) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateTeams(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateDoer(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateRecipient(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *RepoTransfer) validateTeams(formats strfmt.Registry) error {
+	if swag.IsZero(m.Teams) { // not required
+		return nil
+	}
+
+	for i := 0; i < len(m.Teams); i++ {
+		if swag.IsZero(m.Teams[i]) { // not required
+			continue
+		}
+
+		if m.Teams[i] != nil {
+			if err := m.Teams[i].Validate(formats); err != nil {
+				if ve, ok := err.(*errors.Validation); ok {
+					return ve.ValidateName("teams" + "." + strconv.Itoa(i))
+				} else if ce, ok := err.(*errors.CompositeError); ok {
+					return ce.ValidateName("teams" + "." + strconv.Itoa(i))
+				}
+				return err
+			}
+		}
+
+	}
+
+	return nil
+}
+
+func (m *RepoTransfer) validateDoer(formats strfmt.Registry) error {
+	if swag.IsZero(m.Doer) { // not required
+		return nil
+	}
+
+	if m.Doer != nil {
+		if err := m.Doer.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("doer")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("doer")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *RepoTransfer) validateRecipient(formats strfmt.Registry) error {
+	if swag.IsZero(m.Recipient) { // not required
+		return nil
+	}
+
+	if m.Recipient != nil {
+		if err := m.Recipient.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("recipient")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("recipient")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+// ContextValidate validate this repo transfer based on the context it is used
+func (m *RepoTransfer) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.contextValidateTeams(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.contextValidateDoer(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.contextValidateRecipient(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *RepoTransfer) contextValidateTeams(ctx context.Context, formats strfmt.Registry) error {
+
+	for i := 0; i < len(m.Teams); i++ {
+
+		if m.Teams[i] != nil {
+
+			if swag.IsZero(m.Teams[i]) { // not required
+				return nil
+			}
+
+			if err := m.Teams[i].ContextValidate(ctx, formats); err != nil {
+				if ve, ok := err.(*errors.Validation); ok {
+					return ve.ValidateName("teams" + "." + strconv.Itoa(i))
+				} else if ce, ok := err.(*errors.CompositeError); ok {
+					return ce.ValidateName("teams" + "." + strconv.Itoa(i))
+				}
+				return err
+			}
+		}
+
+	}
+
+	return nil
+}
+
+func (m *RepoTransfer) contextValidateDoer(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.Doer != nil {
+
+		if swag.IsZero(m.Doer) { // not required
+			return nil
+		}
+
+		if err := m.Doer.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("doer")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("doer")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *RepoTransfer) contextValidateRecipient(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.Recipient != nil {
+
+		if swag.IsZero(m.Recipient) { // not required
+			return nil
+		}
+
+		if err := m.Recipient.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("recipient")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("recipient")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *RepoTransfer) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *RepoTransfer) UnmarshalBinary(b []byte) error {
+	var res RepoTransfer
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/repository.go b/bots-common/gitea-generated/models/repository.go
new file mode 100644
index 0000000..cd5ca4f
--- /dev/null
+++ b/bots-common/gitea-generated/models/repository.go
@@ -0,0 +1,691 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"encoding/json"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+	"github.com/go-openapi/validate"
+)
+
+// Repository Repository represents a repository
+//
+// swagger:model Repository
+type Repository struct {
+
+	// allow fast forward only
+	AllowFastForwardOnly bool `json:"allow_fast_forward_only_merge,omitempty"`
+
+	// allow merge
+	AllowMerge bool `json:"allow_merge_commits,omitempty"`
+
+	// allow rebase
+	AllowRebase bool `json:"allow_rebase,omitempty"`
+
+	// allow rebase merge
+	AllowRebaseMerge bool `json:"allow_rebase_explicit,omitempty"`
+
+	// allow rebase update
+	AllowRebaseUpdate bool `json:"allow_rebase_update,omitempty"`
+
+	// allow squash
+	AllowSquash bool `json:"allow_squash_merge,omitempty"`
+
+	// archived
+	Archived bool `json:"archived,omitempty"`
+
+	// archived at
+	// Format: date-time
+	ArchivedAt strfmt.DateTime `json:"archived_at,omitempty"`
+
+	// avatar URL
+	AvatarURL string `json:"avatar_url,omitempty"`
+
+	// clone URL
+	CloneURL string `json:"clone_url,omitempty"`
+
+	// created
+	// Format: date-time
+	Created strfmt.DateTime `json:"created_at,omitempty"`
+
+	// default allow maintainer edit
+	DefaultAllowMaintainerEdit bool `json:"default_allow_maintainer_edit,omitempty"`
+
+	// default branch
+	DefaultBranch string `json:"default_branch,omitempty"`
+
+	// default delete branch after merge
+	DefaultDeleteBranchAfterMerge bool `json:"default_delete_branch_after_merge,omitempty"`
+
+	// default merge style
+	DefaultMergeStyle string `json:"default_merge_style,omitempty"`
+
+	// description
+	Description string `json:"description,omitempty"`
+
+	// empty
+	Empty bool `json:"empty,omitempty"`
+
+	// fork
+	Fork bool `json:"fork,omitempty"`
+
+	// forks
+	Forks int64 `json:"forks_count,omitempty"`
+
+	// full name
+	FullName string `json:"full_name,omitempty"`
+
+	// HTML URL
+	HTMLURL string `json:"html_url,omitempty"`
+
+	// has actions
+	HasActions bool `json:"has_actions,omitempty"`
+
+	// has issues
+	HasIssues bool `json:"has_issues,omitempty"`
+
+	// has packages
+	HasPackages bool `json:"has_packages,omitempty"`
+
+	// has projects
+	HasProjects bool `json:"has_projects,omitempty"`
+
+	// has pull requests
+	HasPullRequests bool `json:"has_pull_requests,omitempty"`
+
+	// has releases
+	HasReleases bool `json:"has_releases,omitempty"`
+
+	// has wiki
+	HasWiki bool `json:"has_wiki,omitempty"`
+
+	// ID
+	ID int64 `json:"id,omitempty"`
+
+	// ignore whitespace conflicts
+	IgnoreWhitespaceConflicts bool `json:"ignore_whitespace_conflicts,omitempty"`
+
+	// internal
+	Internal bool `json:"internal,omitempty"`
+
+	// language
+	Language string `json:"language,omitempty"`
+
+	// languages URL
+	LanguagesURL string `json:"languages_url,omitempty"`
+
+	// link
+	Link string `json:"link,omitempty"`
+
+	// mirror
+	Mirror bool `json:"mirror,omitempty"`
+
+	// mirror interval
+	MirrorInterval string `json:"mirror_interval,omitempty"`
+
+	// mirror updated
+	// Format: date-time
+	MirrorUpdated strfmt.DateTime `json:"mirror_updated,omitempty"`
+
+	// name
+	Name string `json:"name,omitempty"`
+
+	// ObjectFormatName of the underlying git repository
+	// Enum: ["sha1","sha256"]
+	ObjectFormatName string `json:"object_format_name,omitempty"`
+
+	// open issues
+	OpenIssues int64 `json:"open_issues_count,omitempty"`
+
+	// open pulls
+	OpenPulls int64 `json:"open_pr_counter,omitempty"`
+
+	// original URL
+	OriginalURL string `json:"original_url,omitempty"`
+
+	// private
+	Private bool `json:"private,omitempty"`
+
+	// projects mode
+	ProjectsMode string `json:"projects_mode,omitempty"`
+
+	// releases
+	Releases int64 `json:"release_counter,omitempty"`
+
+	// SSH URL
+	SSHURL string `json:"ssh_url,omitempty"`
+
+	// size
+	Size int64 `json:"size,omitempty"`
+
+	// stars
+	Stars int64 `json:"stars_count,omitempty"`
+
+	// template
+	Template bool `json:"template,omitempty"`
+
+	// URL
+	URL string `json:"url,omitempty"`
+
+	// updated
+	// Format: date-time
+	Updated strfmt.DateTime `json:"updated_at,omitempty"`
+
+	// watchers
+	Watchers int64 `json:"watchers_count,omitempty"`
+
+	// website
+	Website string `json:"website,omitempty"`
+
+	// external tracker
+	ExternalTracker *ExternalTracker `json:"external_tracker,omitempty"`
+
+	// external wiki
+	ExternalWiki *ExternalWiki `json:"external_wiki,omitempty"`
+
+	// internal tracker
+	InternalTracker *InternalTracker `json:"internal_tracker,omitempty"`
+
+	// owner
+	Owner *User `json:"owner,omitempty"`
+
+	// parent
+	Parent *Repository `json:"parent,omitempty"`
+
+	// permissions
+	Permissions *Permission `json:"permissions,omitempty"`
+
+	// repo transfer
+	RepoTransfer *RepoTransfer `json:"repo_transfer,omitempty"`
+}
+
+// Validate validates this repository
+func (m *Repository) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateArchivedAt(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateCreated(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateMirrorUpdated(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateObjectFormatName(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateUpdated(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateExternalTracker(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateExternalWiki(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateInternalTracker(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateOwner(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateParent(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validatePermissions(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateRepoTransfer(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *Repository) validateArchivedAt(formats strfmt.Registry) error {
+	if swag.IsZero(m.ArchivedAt) { // not required
+		return nil
+	}
+
+	if err := validate.FormatOf("archived_at", "body", "date-time", m.ArchivedAt.String(), formats); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (m *Repository) validateCreated(formats strfmt.Registry) error {
+	if swag.IsZero(m.Created) { // not required
+		return nil
+	}
+
+	if err := validate.FormatOf("created_at", "body", "date-time", m.Created.String(), formats); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (m *Repository) validateMirrorUpdated(formats strfmt.Registry) error {
+	if swag.IsZero(m.MirrorUpdated) { // not required
+		return nil
+	}
+
+	if err := validate.FormatOf("mirror_updated", "body", "date-time", m.MirrorUpdated.String(), formats); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+var repositoryTypeObjectFormatNamePropEnum []interface{}
+
+func init() {
+	var res []string
+	if err := json.Unmarshal([]byte(`["sha1","sha256"]`), &res); err != nil {
+		panic(err)
+	}
+	for _, v := range res {
+		repositoryTypeObjectFormatNamePropEnum = append(repositoryTypeObjectFormatNamePropEnum, v)
+	}
+}
+
+const (
+
+	// RepositoryObjectFormatNameSha1 captures enum value "sha1"
+	RepositoryObjectFormatNameSha1 string = "sha1"
+
+	// RepositoryObjectFormatNameSha256 captures enum value "sha256"
+	RepositoryObjectFormatNameSha256 string = "sha256"
+)
+
+// prop value enum
+func (m *Repository) validateObjectFormatNameEnum(path, location string, value string) error {
+	if err := validate.EnumCase(path, location, value, repositoryTypeObjectFormatNamePropEnum, true); err != nil {
+		return err
+	}
+	return nil
+}
+
+func (m *Repository) validateObjectFormatName(formats strfmt.Registry) error {
+	if swag.IsZero(m.ObjectFormatName) { // not required
+		return nil
+	}
+
+	// value enum
+	if err := m.validateObjectFormatNameEnum("object_format_name", "body", m.ObjectFormatName); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (m *Repository) validateUpdated(formats strfmt.Registry) error {
+	if swag.IsZero(m.Updated) { // not required
+		return nil
+	}
+
+	if err := validate.FormatOf("updated_at", "body", "date-time", m.Updated.String(), formats); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (m *Repository) validateExternalTracker(formats strfmt.Registry) error {
+	if swag.IsZero(m.ExternalTracker) { // not required
+		return nil
+	}
+
+	if m.ExternalTracker != nil {
+		if err := m.ExternalTracker.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("external_tracker")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("external_tracker")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *Repository) validateExternalWiki(formats strfmt.Registry) error {
+	if swag.IsZero(m.ExternalWiki) { // not required
+		return nil
+	}
+
+	if m.ExternalWiki != nil {
+		if err := m.ExternalWiki.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("external_wiki")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("external_wiki")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *Repository) validateInternalTracker(formats strfmt.Registry) error {
+	if swag.IsZero(m.InternalTracker) { // not required
+		return nil
+	}
+
+	if m.InternalTracker != nil {
+		if err := m.InternalTracker.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("internal_tracker")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("internal_tracker")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *Repository) validateOwner(formats strfmt.Registry) error {
+	if swag.IsZero(m.Owner) { // not required
+		return nil
+	}
+
+	if m.Owner != nil {
+		if err := m.Owner.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("owner")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("owner")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *Repository) validateParent(formats strfmt.Registry) error {
+	if swag.IsZero(m.Parent) { // not required
+		return nil
+	}
+
+	if m.Parent != nil {
+		if err := m.Parent.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("parent")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("parent")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *Repository) validatePermissions(formats strfmt.Registry) error {
+	if swag.IsZero(m.Permissions) { // not required
+		return nil
+	}
+
+	if m.Permissions != nil {
+		if err := m.Permissions.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("permissions")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("permissions")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *Repository) validateRepoTransfer(formats strfmt.Registry) error {
+	if swag.IsZero(m.RepoTransfer) { // not required
+		return nil
+	}
+
+	if m.RepoTransfer != nil {
+		if err := m.RepoTransfer.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("repo_transfer")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("repo_transfer")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+// ContextValidate validate this repository based on the context it is used
+func (m *Repository) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.contextValidateExternalTracker(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.contextValidateExternalWiki(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.contextValidateInternalTracker(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.contextValidateOwner(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.contextValidateParent(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.contextValidatePermissions(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.contextValidateRepoTransfer(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *Repository) contextValidateExternalTracker(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.ExternalTracker != nil {
+
+		if swag.IsZero(m.ExternalTracker) { // not required
+			return nil
+		}
+
+		if err := m.ExternalTracker.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("external_tracker")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("external_tracker")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *Repository) contextValidateExternalWiki(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.ExternalWiki != nil {
+
+		if swag.IsZero(m.ExternalWiki) { // not required
+			return nil
+		}
+
+		if err := m.ExternalWiki.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("external_wiki")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("external_wiki")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *Repository) contextValidateInternalTracker(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.InternalTracker != nil {
+
+		if swag.IsZero(m.InternalTracker) { // not required
+			return nil
+		}
+
+		if err := m.InternalTracker.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("internal_tracker")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("internal_tracker")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *Repository) contextValidateOwner(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.Owner != nil {
+
+		if swag.IsZero(m.Owner) { // not required
+			return nil
+		}
+
+		if err := m.Owner.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("owner")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("owner")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *Repository) contextValidateParent(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.Parent != nil {
+
+		if swag.IsZero(m.Parent) { // not required
+			return nil
+		}
+
+		if err := m.Parent.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("parent")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("parent")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *Repository) contextValidatePermissions(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.Permissions != nil {
+
+		if swag.IsZero(m.Permissions) { // not required
+			return nil
+		}
+
+		if err := m.Permissions.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("permissions")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("permissions")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *Repository) contextValidateRepoTransfer(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.RepoTransfer != nil {
+
+		if swag.IsZero(m.RepoTransfer) { // not required
+			return nil
+		}
+
+		if err := m.RepoTransfer.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("repo_transfer")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("repo_transfer")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *Repository) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *Repository) UnmarshalBinary(b []byte) error {
+	var res Repository
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/repository_meta.go b/bots-common/gitea-generated/models/repository_meta.go
new file mode 100644
index 0000000..20f6fc0
--- /dev/null
+++ b/bots-common/gitea-generated/models/repository_meta.go
@@ -0,0 +1,59 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// RepositoryMeta RepositoryMeta basic repository information
+//
+// swagger:model RepositoryMeta
+type RepositoryMeta struct {
+
+	// full name
+	FullName string `json:"full_name,omitempty"`
+
+	// ID
+	ID int64 `json:"id,omitempty"`
+
+	// name
+	Name string `json:"name,omitempty"`
+
+	// owner
+	Owner string `json:"owner,omitempty"`
+}
+
+// Validate validates this repository meta
+func (m *RepositoryMeta) Validate(formats strfmt.Registry) error {
+	return nil
+}
+
+// ContextValidate validates this repository meta based on context it is used
+func (m *RepositoryMeta) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *RepositoryMeta) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *RepositoryMeta) UnmarshalBinary(b []byte) error {
+	var res RepositoryMeta
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/review_state_type.go b/bots-common/gitea-generated/models/review_state_type.go
new file mode 100644
index 0000000..ed29472
--- /dev/null
+++ b/bots-common/gitea-generated/models/review_state_type.go
@@ -0,0 +1,27 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/strfmt"
+)
+
+// ReviewStateType ReviewStateType review state type
+//
+// swagger:model ReviewStateType
+type ReviewStateType string
+
+// Validate validates this review state type
+func (m ReviewStateType) Validate(formats strfmt.Registry) error {
+	return nil
+}
+
+// ContextValidate validates this review state type based on context it is used
+func (m ReviewStateType) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/search_results.go b/bots-common/gitea-generated/models/search_results.go
new file mode 100644
index 0000000..001436f
--- /dev/null
+++ b/bots-common/gitea-generated/models/search_results.go
@@ -0,0 +1,124 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"strconv"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// SearchResults SearchResults results of a successful search
+//
+// swagger:model SearchResults
+type SearchResults struct {
+
+	// data
+	Data []*Repository `json:"data"`
+
+	// o k
+	OK bool `json:"ok,omitempty"`
+}
+
+// Validate validates this search results
+func (m *SearchResults) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateData(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *SearchResults) validateData(formats strfmt.Registry) error {
+	if swag.IsZero(m.Data) { // not required
+		return nil
+	}
+
+	for i := 0; i < len(m.Data); i++ {
+		if swag.IsZero(m.Data[i]) { // not required
+			continue
+		}
+
+		if m.Data[i] != nil {
+			if err := m.Data[i].Validate(formats); err != nil {
+				if ve, ok := err.(*errors.Validation); ok {
+					return ve.ValidateName("data" + "." + strconv.Itoa(i))
+				} else if ce, ok := err.(*errors.CompositeError); ok {
+					return ce.ValidateName("data" + "." + strconv.Itoa(i))
+				}
+				return err
+			}
+		}
+
+	}
+
+	return nil
+}
+
+// ContextValidate validate this search results based on the context it is used
+func (m *SearchResults) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.contextValidateData(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *SearchResults) contextValidateData(ctx context.Context, formats strfmt.Registry) error {
+
+	for i := 0; i < len(m.Data); i++ {
+
+		if m.Data[i] != nil {
+
+			if swag.IsZero(m.Data[i]) { // not required
+				return nil
+			}
+
+			if err := m.Data[i].ContextValidate(ctx, formats); err != nil {
+				if ve, ok := err.(*errors.Validation); ok {
+					return ve.ValidateName("data" + "." + strconv.Itoa(i))
+				} else if ce, ok := err.(*errors.CompositeError); ok {
+					return ce.ValidateName("data" + "." + strconv.Itoa(i))
+				}
+				return err
+			}
+		}
+
+	}
+
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *SearchResults) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *SearchResults) UnmarshalBinary(b []byte) error {
+	var res SearchResults
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/secret.go b/bots-common/gitea-generated/models/secret.go
new file mode 100644
index 0000000..9210d50
--- /dev/null
+++ b/bots-common/gitea-generated/models/secret.go
@@ -0,0 +1,77 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+	"github.com/go-openapi/validate"
+)
+
+// Secret Secret represents a secret
+//
+// swagger:model Secret
+type Secret struct {
+
+	// created
+	// Format: date-time
+	Created strfmt.DateTime `json:"created_at,omitempty"`
+
+	// the secret's name
+	Name string `json:"name,omitempty"`
+}
+
+// Validate validates this secret
+func (m *Secret) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateCreated(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *Secret) validateCreated(formats strfmt.Registry) error {
+	if swag.IsZero(m.Created) { // not required
+		return nil
+	}
+
+	if err := validate.FormatOf("created_at", "body", "date-time", m.Created.String(), formats); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+// ContextValidate validates this secret based on context it is used
+func (m *Secret) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *Secret) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *Secret) UnmarshalBinary(b []byte) error {
+	var res Secret
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/server_version.go b/bots-common/gitea-generated/models/server_version.go
new file mode 100644
index 0000000..33b1373
--- /dev/null
+++ b/bots-common/gitea-generated/models/server_version.go
@@ -0,0 +1,50 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// ServerVersion ServerVersion wraps the version of the server
+//
+// swagger:model ServerVersion
+type ServerVersion struct {
+
+	// version
+	Version string `json:"version,omitempty"`
+}
+
+// Validate validates this server version
+func (m *ServerVersion) Validate(formats strfmt.Registry) error {
+	return nil
+}
+
+// ContextValidate validates this server version based on context it is used
+func (m *ServerVersion) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *ServerVersion) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *ServerVersion) UnmarshalBinary(b []byte) error {
+	var res ServerVersion
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/state_type.go b/bots-common/gitea-generated/models/state_type.go
new file mode 100644
index 0000000..7a8d529
--- /dev/null
+++ b/bots-common/gitea-generated/models/state_type.go
@@ -0,0 +1,27 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/strfmt"
+)
+
+// StateType StateType issue state type
+//
+// swagger:model StateType
+type StateType string
+
+// Validate validates this state type
+func (m StateType) Validate(formats strfmt.Registry) error {
+	return nil
+}
+
+// ContextValidate validates this state type based on context it is used
+func (m StateType) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/stop_watch.go b/bots-common/gitea-generated/models/stop_watch.go
new file mode 100644
index 0000000..8603932
--- /dev/null
+++ b/bots-common/gitea-generated/models/stop_watch.go
@@ -0,0 +1,92 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+	"github.com/go-openapi/validate"
+)
+
+// StopWatch StopWatch represent a running stopwatch
+//
+// swagger:model StopWatch
+type StopWatch struct {
+
+	// created
+	// Format: date-time
+	Created strfmt.DateTime `json:"created,omitempty"`
+
+	// duration
+	Duration string `json:"duration,omitempty"`
+
+	// issue index
+	IssueIndex int64 `json:"issue_index,omitempty"`
+
+	// issue title
+	IssueTitle string `json:"issue_title,omitempty"`
+
+	// repo name
+	RepoName string `json:"repo_name,omitempty"`
+
+	// repo owner name
+	RepoOwnerName string `json:"repo_owner_name,omitempty"`
+
+	// seconds
+	Seconds int64 `json:"seconds,omitempty"`
+}
+
+// Validate validates this stop watch
+func (m *StopWatch) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateCreated(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *StopWatch) validateCreated(formats strfmt.Registry) error {
+	if swag.IsZero(m.Created) { // not required
+		return nil
+	}
+
+	if err := validate.FormatOf("created", "body", "date-time", m.Created.String(), formats); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+// ContextValidate validates this stop watch based on context it is used
+func (m *StopWatch) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *StopWatch) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *StopWatch) UnmarshalBinary(b []byte) error {
+	var res StopWatch
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/submit_pull_review_options.go b/bots-common/gitea-generated/models/submit_pull_review_options.go
new file mode 100644
index 0000000..ffdcdcb
--- /dev/null
+++ b/bots-common/gitea-generated/models/submit_pull_review_options.go
@@ -0,0 +1,107 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// SubmitPullReviewOptions SubmitPullReviewOptions are options to submit a pending pull review
+//
+// swagger:model SubmitPullReviewOptions
+type SubmitPullReviewOptions struct {
+
+	// body
+	Body string `json:"body,omitempty"`
+
+	// event
+	Event ReviewStateType `json:"event,omitempty"`
+}
+
+// Validate validates this submit pull review options
+func (m *SubmitPullReviewOptions) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateEvent(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *SubmitPullReviewOptions) validateEvent(formats strfmt.Registry) error {
+	if swag.IsZero(m.Event) { // not required
+		return nil
+	}
+
+	if err := m.Event.Validate(formats); err != nil {
+		if ve, ok := err.(*errors.Validation); ok {
+			return ve.ValidateName("event")
+		} else if ce, ok := err.(*errors.CompositeError); ok {
+			return ce.ValidateName("event")
+		}
+		return err
+	}
+
+	return nil
+}
+
+// ContextValidate validate this submit pull review options based on the context it is used
+func (m *SubmitPullReviewOptions) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.contextValidateEvent(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *SubmitPullReviewOptions) contextValidateEvent(ctx context.Context, formats strfmt.Registry) error {
+
+	if swag.IsZero(m.Event) { // not required
+		return nil
+	}
+
+	if err := m.Event.ContextValidate(ctx, formats); err != nil {
+		if ve, ok := err.(*errors.Validation); ok {
+			return ve.ValidateName("event")
+		} else if ce, ok := err.(*errors.CompositeError); ok {
+			return ce.ValidateName("event")
+		}
+		return err
+	}
+
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *SubmitPullReviewOptions) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *SubmitPullReviewOptions) UnmarshalBinary(b []byte) error {
+	var res SubmitPullReviewOptions
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/tag.go b/bots-common/gitea-generated/models/tag.go
new file mode 100644
index 0000000..9abb110
--- /dev/null
+++ b/bots-common/gitea-generated/models/tag.go
@@ -0,0 +1,124 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// Tag Tag represents a repository tag
+//
+// swagger:model Tag
+type Tag struct {
+
+	// ID
+	ID string `json:"id,omitempty"`
+
+	// message
+	Message string `json:"message,omitempty"`
+
+	// name
+	Name string `json:"name,omitempty"`
+
+	// tarball URL
+	TarballURL string `json:"tarball_url,omitempty"`
+
+	// zipball URL
+	ZipballURL string `json:"zipball_url,omitempty"`
+
+	// commit
+	Commit *CommitMeta `json:"commit,omitempty"`
+}
+
+// Validate validates this tag
+func (m *Tag) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateCommit(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *Tag) validateCommit(formats strfmt.Registry) error {
+	if swag.IsZero(m.Commit) { // not required
+		return nil
+	}
+
+	if m.Commit != nil {
+		if err := m.Commit.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("commit")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("commit")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+// ContextValidate validate this tag based on the context it is used
+func (m *Tag) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.contextValidateCommit(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *Tag) contextValidateCommit(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.Commit != nil {
+
+		if swag.IsZero(m.Commit) { // not required
+			return nil
+		}
+
+		if err := m.Commit.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("commit")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("commit")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *Tag) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *Tag) UnmarshalBinary(b []byte) error {
+	var res Tag
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/team.go b/bots-common/gitea-generated/models/team.go
new file mode 100644
index 0000000..dc33270
--- /dev/null
+++ b/bots-common/gitea-generated/models/team.go
@@ -0,0 +1,193 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"encoding/json"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+	"github.com/go-openapi/validate"
+)
+
+// Team Team represents a team in an organization
+//
+// swagger:model Team
+type Team struct {
+
+	// can create org repo
+	CanCreateOrgRepo bool `json:"can_create_org_repo,omitempty"`
+
+	// description
+	Description string `json:"description,omitempty"`
+
+	// ID
+	ID int64 `json:"id,omitempty"`
+
+	// includes all repositories
+	IncludesAllRepositories bool `json:"includes_all_repositories,omitempty"`
+
+	// name
+	Name string `json:"name,omitempty"`
+
+	// permission
+	// Enum: ["none","read","write","admin","owner"]
+	Permission string `json:"permission,omitempty"`
+
+	// units
+	// Example: ["repo.code","repo.issues","repo.ext_issues","repo.wiki","repo.pulls","repo.releases","repo.projects","repo.ext_wiki"]
+	Units []string `json:"units"`
+
+	// units map
+	// Example: {"repo.code":"read","repo.ext_issues":"none","repo.ext_wiki":"none","repo.issues":"write","repo.projects":"none","repo.pulls":"owner","repo.releases":"none","repo.wiki":"admin"}
+	UnitsMap map[string]string `json:"units_map,omitempty"`
+
+	// organization
+	Organization *Organization `json:"organization,omitempty"`
+}
+
+// Validate validates this team
+func (m *Team) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validatePermission(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateOrganization(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+var teamTypePermissionPropEnum []interface{}
+
+func init() {
+	var res []string
+	if err := json.Unmarshal([]byte(`["none","read","write","admin","owner"]`), &res); err != nil {
+		panic(err)
+	}
+	for _, v := range res {
+		teamTypePermissionPropEnum = append(teamTypePermissionPropEnum, v)
+	}
+}
+
+const (
+
+	// TeamPermissionNone captures enum value "none"
+	TeamPermissionNone string = "none"
+
+	// TeamPermissionRead captures enum value "read"
+	TeamPermissionRead string = "read"
+
+	// TeamPermissionWrite captures enum value "write"
+	TeamPermissionWrite string = "write"
+
+	// TeamPermissionAdmin captures enum value "admin"
+	TeamPermissionAdmin string = "admin"
+
+	// TeamPermissionOwner captures enum value "owner"
+	TeamPermissionOwner string = "owner"
+)
+
+// prop value enum
+func (m *Team) validatePermissionEnum(path, location string, value string) error {
+	if err := validate.EnumCase(path, location, value, teamTypePermissionPropEnum, true); err != nil {
+		return err
+	}
+	return nil
+}
+
+func (m *Team) validatePermission(formats strfmt.Registry) error {
+	if swag.IsZero(m.Permission) { // not required
+		return nil
+	}
+
+	// value enum
+	if err := m.validatePermissionEnum("permission", "body", m.Permission); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (m *Team) validateOrganization(formats strfmt.Registry) error {
+	if swag.IsZero(m.Organization) { // not required
+		return nil
+	}
+
+	if m.Organization != nil {
+		if err := m.Organization.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("organization")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("organization")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+// ContextValidate validate this team based on the context it is used
+func (m *Team) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.contextValidateOrganization(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *Team) contextValidateOrganization(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.Organization != nil {
+
+		if swag.IsZero(m.Organization) { // not required
+			return nil
+		}
+
+		if err := m.Organization.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("organization")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("organization")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *Team) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *Team) UnmarshalBinary(b []byte) error {
+	var res Team
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/time_stamp.go b/bots-common/gitea-generated/models/time_stamp.go
new file mode 100644
index 0000000..e788617
--- /dev/null
+++ b/bots-common/gitea-generated/models/time_stamp.go
@@ -0,0 +1,27 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/strfmt"
+)
+
+// TimeStamp TimeStamp defines a timestamp
+//
+// swagger:model TimeStamp
+type TimeStamp int64
+
+// Validate validates this time stamp
+func (m TimeStamp) Validate(formats strfmt.Registry) error {
+	return nil
+}
+
+// ContextValidate validates this time stamp based on context it is used
+func (m TimeStamp) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/timeline_comment.go b/bots-common/gitea-generated/models/timeline_comment.go
new file mode 100644
index 0000000..fb875c7
--- /dev/null
+++ b/bots-common/gitea-generated/models/timeline_comment.go
@@ -0,0 +1,708 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+	"github.com/go-openapi/validate"
+)
+
+// TimelineComment TimelineComment represents a timeline comment (comment of any type) on a commit or issue
+//
+// swagger:model TimelineComment
+type TimelineComment struct {
+
+	// body
+	Body string `json:"body,omitempty"`
+
+	// created
+	// Format: date-time
+	Created strfmt.DateTime `json:"created_at,omitempty"`
+
+	// HTML URL
+	HTMLURL string `json:"html_url,omitempty"`
+
+	// ID
+	ID int64 `json:"id,omitempty"`
+
+	// issue URL
+	IssueURL string `json:"issue_url,omitempty"`
+
+	// new ref
+	NewRef string `json:"new_ref,omitempty"`
+
+	// new title
+	NewTitle string `json:"new_title,omitempty"`
+
+	// old project ID
+	OldProjectID int64 `json:"old_project_id,omitempty"`
+
+	// old ref
+	OldRef string `json:"old_ref,omitempty"`
+
+	// old title
+	OldTitle string `json:"old_title,omitempty"`
+
+	// p r URL
+	PRURL string `json:"pull_request_url,omitempty"`
+
+	// project ID
+	ProjectID int64 `json:"project_id,omitempty"`
+
+	// ref action
+	RefAction string `json:"ref_action,omitempty"`
+
+	// commit SHA where issue/PR was referenced
+	RefCommitSHA string `json:"ref_commit_sha,omitempty"`
+
+	// whether the assignees were removed or added
+	RemovedAssignee bool `json:"removed_assignee,omitempty"`
+
+	// review ID
+	ReviewID int64 `json:"review_id,omitempty"`
+
+	// type
+	Type string `json:"type,omitempty"`
+
+	// updated
+	// Format: date-time
+	Updated strfmt.DateTime `json:"updated_at,omitempty"`
+
+	// assignee
+	Assignee *User `json:"assignee,omitempty"`
+
+	// assignee team
+	AssigneeTeam *Team `json:"assignee_team,omitempty"`
+
+	// dependent issue
+	DependentIssue *Issue `json:"dependent_issue,omitempty"`
+
+	// label
+	Label *Label `json:"label,omitempty"`
+
+	// milestone
+	Milestone *Milestone `json:"milestone,omitempty"`
+
+	// old milestone
+	OldMilestone *Milestone `json:"old_milestone,omitempty"`
+
+	// ref comment
+	RefComment *Comment `json:"ref_comment,omitempty"`
+
+	// ref issue
+	RefIssue *Issue `json:"ref_issue,omitempty"`
+
+	// resolve doer
+	ResolveDoer *User `json:"resolve_doer,omitempty"`
+
+	// tracked time
+	TrackedTime *TrackedTime `json:"tracked_time,omitempty"`
+
+	// user
+	User *User `json:"user,omitempty"`
+}
+
+// Validate validates this timeline comment
+func (m *TimelineComment) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateCreated(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateUpdated(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateAssignee(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateAssigneeTeam(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateDependentIssue(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateLabel(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateMilestone(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateOldMilestone(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateRefComment(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateRefIssue(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateResolveDoer(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateTrackedTime(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateUser(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *TimelineComment) validateCreated(formats strfmt.Registry) error {
+	if swag.IsZero(m.Created) { // not required
+		return nil
+	}
+
+	if err := validate.FormatOf("created_at", "body", "date-time", m.Created.String(), formats); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (m *TimelineComment) validateUpdated(formats strfmt.Registry) error {
+	if swag.IsZero(m.Updated) { // not required
+		return nil
+	}
+
+	if err := validate.FormatOf("updated_at", "body", "date-time", m.Updated.String(), formats); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (m *TimelineComment) validateAssignee(formats strfmt.Registry) error {
+	if swag.IsZero(m.Assignee) { // not required
+		return nil
+	}
+
+	if m.Assignee != nil {
+		if err := m.Assignee.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("assignee")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("assignee")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *TimelineComment) validateAssigneeTeam(formats strfmt.Registry) error {
+	if swag.IsZero(m.AssigneeTeam) { // not required
+		return nil
+	}
+
+	if m.AssigneeTeam != nil {
+		if err := m.AssigneeTeam.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("assignee_team")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("assignee_team")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *TimelineComment) validateDependentIssue(formats strfmt.Registry) error {
+	if swag.IsZero(m.DependentIssue) { // not required
+		return nil
+	}
+
+	if m.DependentIssue != nil {
+		if err := m.DependentIssue.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("dependent_issue")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("dependent_issue")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *TimelineComment) validateLabel(formats strfmt.Registry) error {
+	if swag.IsZero(m.Label) { // not required
+		return nil
+	}
+
+	if m.Label != nil {
+		if err := m.Label.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("label")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("label")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *TimelineComment) validateMilestone(formats strfmt.Registry) error {
+	if swag.IsZero(m.Milestone) { // not required
+		return nil
+	}
+
+	if m.Milestone != nil {
+		if err := m.Milestone.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("milestone")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("milestone")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *TimelineComment) validateOldMilestone(formats strfmt.Registry) error {
+	if swag.IsZero(m.OldMilestone) { // not required
+		return nil
+	}
+
+	if m.OldMilestone != nil {
+		if err := m.OldMilestone.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("old_milestone")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("old_milestone")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *TimelineComment) validateRefComment(formats strfmt.Registry) error {
+	if swag.IsZero(m.RefComment) { // not required
+		return nil
+	}
+
+	if m.RefComment != nil {
+		if err := m.RefComment.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("ref_comment")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("ref_comment")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *TimelineComment) validateRefIssue(formats strfmt.Registry) error {
+	if swag.IsZero(m.RefIssue) { // not required
+		return nil
+	}
+
+	if m.RefIssue != nil {
+		if err := m.RefIssue.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("ref_issue")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("ref_issue")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *TimelineComment) validateResolveDoer(formats strfmt.Registry) error {
+	if swag.IsZero(m.ResolveDoer) { // not required
+		return nil
+	}
+
+	if m.ResolveDoer != nil {
+		if err := m.ResolveDoer.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("resolve_doer")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("resolve_doer")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *TimelineComment) validateTrackedTime(formats strfmt.Registry) error {
+	if swag.IsZero(m.TrackedTime) { // not required
+		return nil
+	}
+
+	if m.TrackedTime != nil {
+		if err := m.TrackedTime.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("tracked_time")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("tracked_time")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *TimelineComment) validateUser(formats strfmt.Registry) error {
+	if swag.IsZero(m.User) { // not required
+		return nil
+	}
+
+	if m.User != nil {
+		if err := m.User.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("user")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("user")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+// ContextValidate validate this timeline comment based on the context it is used
+func (m *TimelineComment) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.contextValidateAssignee(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.contextValidateAssigneeTeam(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.contextValidateDependentIssue(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.contextValidateLabel(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.contextValidateMilestone(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.contextValidateOldMilestone(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.contextValidateRefComment(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.contextValidateRefIssue(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.contextValidateResolveDoer(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.contextValidateTrackedTime(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.contextValidateUser(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *TimelineComment) contextValidateAssignee(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.Assignee != nil {
+
+		if swag.IsZero(m.Assignee) { // not required
+			return nil
+		}
+
+		if err := m.Assignee.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("assignee")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("assignee")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *TimelineComment) contextValidateAssigneeTeam(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.AssigneeTeam != nil {
+
+		if swag.IsZero(m.AssigneeTeam) { // not required
+			return nil
+		}
+
+		if err := m.AssigneeTeam.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("assignee_team")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("assignee_team")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *TimelineComment) contextValidateDependentIssue(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.DependentIssue != nil {
+
+		if swag.IsZero(m.DependentIssue) { // not required
+			return nil
+		}
+
+		if err := m.DependentIssue.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("dependent_issue")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("dependent_issue")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *TimelineComment) contextValidateLabel(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.Label != nil {
+
+		if swag.IsZero(m.Label) { // not required
+			return nil
+		}
+
+		if err := m.Label.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("label")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("label")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *TimelineComment) contextValidateMilestone(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.Milestone != nil {
+
+		if swag.IsZero(m.Milestone) { // not required
+			return nil
+		}
+
+		if err := m.Milestone.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("milestone")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("milestone")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *TimelineComment) contextValidateOldMilestone(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.OldMilestone != nil {
+
+		if swag.IsZero(m.OldMilestone) { // not required
+			return nil
+		}
+
+		if err := m.OldMilestone.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("old_milestone")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("old_milestone")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *TimelineComment) contextValidateRefComment(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.RefComment != nil {
+
+		if swag.IsZero(m.RefComment) { // not required
+			return nil
+		}
+
+		if err := m.RefComment.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("ref_comment")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("ref_comment")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *TimelineComment) contextValidateRefIssue(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.RefIssue != nil {
+
+		if swag.IsZero(m.RefIssue) { // not required
+			return nil
+		}
+
+		if err := m.RefIssue.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("ref_issue")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("ref_issue")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *TimelineComment) contextValidateResolveDoer(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.ResolveDoer != nil {
+
+		if swag.IsZero(m.ResolveDoer) { // not required
+			return nil
+		}
+
+		if err := m.ResolveDoer.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("resolve_doer")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("resolve_doer")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *TimelineComment) contextValidateTrackedTime(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.TrackedTime != nil {
+
+		if swag.IsZero(m.TrackedTime) { // not required
+			return nil
+		}
+
+		if err := m.TrackedTime.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("tracked_time")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("tracked_time")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *TimelineComment) contextValidateUser(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.User != nil {
+
+		if swag.IsZero(m.User) { // not required
+			return nil
+		}
+
+		if err := m.User.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("user")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("user")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *TimelineComment) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *TimelineComment) UnmarshalBinary(b []byte) error {
+	var res TimelineComment
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/topic_name.go b/bots-common/gitea-generated/models/topic_name.go
new file mode 100644
index 0000000..0cb174b
--- /dev/null
+++ b/bots-common/gitea-generated/models/topic_name.go
@@ -0,0 +1,50 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// TopicName TopicName a list of repo topic names
+//
+// swagger:model TopicName
+type TopicName struct {
+
+	// topic names
+	TopicNames []string `json:"topics"`
+}
+
+// Validate validates this topic name
+func (m *TopicName) Validate(formats strfmt.Registry) error {
+	return nil
+}
+
+// ContextValidate validates this topic name based on context it is used
+func (m *TopicName) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *TopicName) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *TopicName) UnmarshalBinary(b []byte) error {
+	var res TopicName
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/topic_response.go b/bots-common/gitea-generated/models/topic_response.go
new file mode 100644
index 0000000..420b2af
--- /dev/null
+++ b/bots-common/gitea-generated/models/topic_response.go
@@ -0,0 +1,103 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+	"github.com/go-openapi/validate"
+)
+
+// TopicResponse TopicResponse for returning topics
+//
+// swagger:model TopicResponse
+type TopicResponse struct {
+
+	// created
+	// Format: date-time
+	Created strfmt.DateTime `json:"created,omitempty"`
+
+	// ID
+	ID int64 `json:"id,omitempty"`
+
+	// name
+	Name string `json:"topic_name,omitempty"`
+
+	// repo count
+	RepoCount int64 `json:"repo_count,omitempty"`
+
+	// updated
+	// Format: date-time
+	Updated strfmt.DateTime `json:"updated,omitempty"`
+}
+
+// Validate validates this topic response
+func (m *TopicResponse) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateCreated(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateUpdated(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *TopicResponse) validateCreated(formats strfmt.Registry) error {
+	if swag.IsZero(m.Created) { // not required
+		return nil
+	}
+
+	if err := validate.FormatOf("created", "body", "date-time", m.Created.String(), formats); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (m *TopicResponse) validateUpdated(formats strfmt.Registry) error {
+	if swag.IsZero(m.Updated) { // not required
+		return nil
+	}
+
+	if err := validate.FormatOf("updated", "body", "date-time", m.Updated.String(), formats); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+// ContextValidate validates this topic response based on context it is used
+func (m *TopicResponse) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *TopicResponse) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *TopicResponse) UnmarshalBinary(b []byte) error {
+	var res TopicResponse
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/tracked_time.go b/bots-common/gitea-generated/models/tracked_time.go
new file mode 100644
index 0000000..a2919f6
--- /dev/null
+++ b/bots-common/gitea-generated/models/tracked_time.go
@@ -0,0 +1,145 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+	"github.com/go-openapi/validate"
+)
+
+// TrackedTime TrackedTime worked time for an issue / pr
+//
+// swagger:model TrackedTime
+type TrackedTime struct {
+
+	// created
+	// Format: date-time
+	Created strfmt.DateTime `json:"created,omitempty"`
+
+	// ID
+	ID int64 `json:"id,omitempty"`
+
+	// deprecated (only for backwards compatibility)
+	IssueID int64 `json:"issue_id,omitempty"`
+
+	// Time in seconds
+	Time int64 `json:"time,omitempty"`
+
+	// deprecated (only for backwards compatibility)
+	UserID int64 `json:"user_id,omitempty"`
+
+	// user name
+	UserName string `json:"user_name,omitempty"`
+
+	// issue
+	Issue *Issue `json:"issue,omitempty"`
+}
+
+// Validate validates this tracked time
+func (m *TrackedTime) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateCreated(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateIssue(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *TrackedTime) validateCreated(formats strfmt.Registry) error {
+	if swag.IsZero(m.Created) { // not required
+		return nil
+	}
+
+	if err := validate.FormatOf("created", "body", "date-time", m.Created.String(), formats); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (m *TrackedTime) validateIssue(formats strfmt.Registry) error {
+	if swag.IsZero(m.Issue) { // not required
+		return nil
+	}
+
+	if m.Issue != nil {
+		if err := m.Issue.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("issue")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("issue")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+// ContextValidate validate this tracked time based on the context it is used
+func (m *TrackedTime) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.contextValidateIssue(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *TrackedTime) contextValidateIssue(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.Issue != nil {
+
+		if swag.IsZero(m.Issue) { // not required
+			return nil
+		}
+
+		if err := m.Issue.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("issue")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("issue")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *TrackedTime) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *TrackedTime) UnmarshalBinary(b []byte) error {
+	var res TrackedTime
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/transfer_repo_option.go b/bots-common/gitea-generated/models/transfer_repo_option.go
new file mode 100644
index 0000000..fffedfe
--- /dev/null
+++ b/bots-common/gitea-generated/models/transfer_repo_option.go
@@ -0,0 +1,74 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+	"github.com/go-openapi/validate"
+)
+
+// TransferRepoOption TransferRepoOption options when transfer a repository's ownership
+//
+// swagger:model TransferRepoOption
+type TransferRepoOption struct {
+
+	// new owner
+	// Required: true
+	NewOwner *string `json:"new_owner"`
+
+	// ID of the team or teams to add to the repository. Teams can only be added to organization-owned repositories.
+	TeamIDs []int64 `json:"team_ids"`
+}
+
+// Validate validates this transfer repo option
+func (m *TransferRepoOption) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateNewOwner(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *TransferRepoOption) validateNewOwner(formats strfmt.Registry) error {
+
+	if err := validate.Required("new_owner", "body", m.NewOwner); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+// ContextValidate validates this transfer repo option based on context it is used
+func (m *TransferRepoOption) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *TransferRepoOption) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *TransferRepoOption) UnmarshalBinary(b []byte) error {
+	var res TransferRepoOption
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/update_file_options.go b/bots-common/gitea-generated/models/update_file_options.go
new file mode 100644
index 0000000..167e855
--- /dev/null
+++ b/bots-common/gitea-generated/models/update_file_options.go
@@ -0,0 +1,262 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+	"github.com/go-openapi/validate"
+)
+
+// UpdateFileOptions UpdateFileOptions options for updating files
+// Note: `author` and `committer` are optional (if only one is given, it will be used for the other, otherwise the authenticated user will be used)
+//
+// swagger:model UpdateFileOptions
+type UpdateFileOptions struct {
+
+	// branch (optional) to base this file from. if not given, the default branch is used
+	BranchName string `json:"branch,omitempty"`
+
+	// content must be base64 encoded
+	// Required: true
+	ContentBase64 *string `json:"content"`
+
+	// from_path (optional) is the path of the original file which will be moved/renamed to the path in the URL
+	FromPath string `json:"from_path,omitempty"`
+
+	// message (optional) for the commit of this file. if not supplied, a default message will be used
+	Message string `json:"message,omitempty"`
+
+	// new_branch (optional) will make a new branch from `branch` before creating the file
+	NewBranchName string `json:"new_branch,omitempty"`
+
+	// sha is the SHA for the file that already exists
+	// Required: true
+	SHA *string `json:"sha"`
+
+	// Add a Signed-off-by trailer by the committer at the end of the commit log message.
+	Signoff bool `json:"signoff,omitempty"`
+
+	// author
+	Author *Identity `json:"author,omitempty"`
+
+	// committer
+	Committer *Identity `json:"committer,omitempty"`
+
+	// dates
+	Dates *CommitDateOptions `json:"dates,omitempty"`
+}
+
+// Validate validates this update file options
+func (m *UpdateFileOptions) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateContentBase64(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateSHA(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateAuthor(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateCommitter(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateDates(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *UpdateFileOptions) validateContentBase64(formats strfmt.Registry) error {
+
+	if err := validate.Required("content", "body", m.ContentBase64); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (m *UpdateFileOptions) validateSHA(formats strfmt.Registry) error {
+
+	if err := validate.Required("sha", "body", m.SHA); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (m *UpdateFileOptions) validateAuthor(formats strfmt.Registry) error {
+	if swag.IsZero(m.Author) { // not required
+		return nil
+	}
+
+	if m.Author != nil {
+		if err := m.Author.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("author")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("author")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *UpdateFileOptions) validateCommitter(formats strfmt.Registry) error {
+	if swag.IsZero(m.Committer) { // not required
+		return nil
+	}
+
+	if m.Committer != nil {
+		if err := m.Committer.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("committer")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("committer")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *UpdateFileOptions) validateDates(formats strfmt.Registry) error {
+	if swag.IsZero(m.Dates) { // not required
+		return nil
+	}
+
+	if m.Dates != nil {
+		if err := m.Dates.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("dates")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("dates")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+// ContextValidate validate this update file options based on the context it is used
+func (m *UpdateFileOptions) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.contextValidateAuthor(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.contextValidateCommitter(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.contextValidateDates(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *UpdateFileOptions) contextValidateAuthor(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.Author != nil {
+
+		if swag.IsZero(m.Author) { // not required
+			return nil
+		}
+
+		if err := m.Author.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("author")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("author")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *UpdateFileOptions) contextValidateCommitter(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.Committer != nil {
+
+		if swag.IsZero(m.Committer) { // not required
+			return nil
+		}
+
+		if err := m.Committer.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("committer")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("committer")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *UpdateFileOptions) contextValidateDates(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.Dates != nil {
+
+		if swag.IsZero(m.Dates) { // not required
+			return nil
+		}
+
+		if err := m.Dates.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("dates")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("dates")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *UpdateFileOptions) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *UpdateFileOptions) UnmarshalBinary(b []byte) error {
+	var res UpdateFileOptions
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/update_repo_avatar_option.go b/bots-common/gitea-generated/models/update_repo_avatar_option.go
new file mode 100644
index 0000000..a12be90
--- /dev/null
+++ b/bots-common/gitea-generated/models/update_repo_avatar_option.go
@@ -0,0 +1,50 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// UpdateRepoAvatarOption UpdateRepoAvatarUserOption options when updating the repo avatar
+//
+// swagger:model UpdateRepoAvatarOption
+type UpdateRepoAvatarOption struct {
+
+	// image must be base64 encoded
+	Image string `json:"image,omitempty"`
+}
+
+// Validate validates this update repo avatar option
+func (m *UpdateRepoAvatarOption) Validate(formats strfmt.Registry) error {
+	return nil
+}
+
+// ContextValidate validates this update repo avatar option based on context it is used
+func (m *UpdateRepoAvatarOption) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *UpdateRepoAvatarOption) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *UpdateRepoAvatarOption) UnmarshalBinary(b []byte) error {
+	var res UpdateRepoAvatarOption
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/update_user_avatar_option.go b/bots-common/gitea-generated/models/update_user_avatar_option.go
new file mode 100644
index 0000000..a6986ef
--- /dev/null
+++ b/bots-common/gitea-generated/models/update_user_avatar_option.go
@@ -0,0 +1,50 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// UpdateUserAvatarOption UpdateUserAvatarUserOption options when updating the user avatar
+//
+// swagger:model UpdateUserAvatarOption
+type UpdateUserAvatarOption struct {
+
+	// image must be base64 encoded
+	Image string `json:"image,omitempty"`
+}
+
+// Validate validates this update user avatar option
+func (m *UpdateUserAvatarOption) Validate(formats strfmt.Registry) error {
+	return nil
+}
+
+// ContextValidate validates this update user avatar option based on context it is used
+func (m *UpdateUserAvatarOption) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *UpdateUserAvatarOption) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *UpdateUserAvatarOption) UnmarshalBinary(b []byte) error {
+	var res UpdateUserAvatarOption
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/update_variable_option.go b/bots-common/gitea-generated/models/update_variable_option.go
new file mode 100644
index 0000000..d238741
--- /dev/null
+++ b/bots-common/gitea-generated/models/update_variable_option.go
@@ -0,0 +1,74 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+	"github.com/go-openapi/validate"
+)
+
+// UpdateVariableOption UpdateVariableOption the option when updating variable
+//
+// swagger:model UpdateVariableOption
+type UpdateVariableOption struct {
+
+	// New name for the variable. If the field is empty, the variable name won't be updated.
+	Name string `json:"name,omitempty"`
+
+	// Value of the variable to update
+	// Required: true
+	Value *string `json:"value"`
+}
+
+// Validate validates this update variable option
+func (m *UpdateVariableOption) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateValue(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *UpdateVariableOption) validateValue(formats strfmt.Registry) error {
+
+	if err := validate.Required("value", "body", m.Value); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+// ContextValidate validates this update variable option based on context it is used
+func (m *UpdateVariableOption) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *UpdateVariableOption) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *UpdateVariableOption) UnmarshalBinary(b []byte) error {
+	var res UpdateVariableOption
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/user.go b/bots-common/gitea-generated/models/user.go
new file mode 100644
index 0000000..1a7b279
--- /dev/null
+++ b/bots-common/gitea-generated/models/user.go
@@ -0,0 +1,171 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+	"github.com/go-openapi/validate"
+)
+
+// User User represents a user
+//
+// swagger:model User
+type User struct {
+
+	// URL to the user's avatar
+	AvatarURL string `json:"avatar_url,omitempty"`
+
+	// created
+	// Format: date-time
+	Created strfmt.DateTime `json:"created,omitempty"`
+
+	// the user's description
+	Description string `json:"description,omitempty"`
+
+	// email
+	// Format: email
+	Email strfmt.Email `json:"email,omitempty"`
+
+	// user counts
+	Followers int64 `json:"followers_count,omitempty"`
+
+	// following
+	Following int64 `json:"following_count,omitempty"`
+
+	// the user's full name
+	FullName string `json:"full_name,omitempty"`
+
+	// URL to the user's gitea page
+	HTMLURL string `json:"html_url,omitempty"`
+
+	// the user's id
+	ID int64 `json:"id,omitempty"`
+
+	// Is user active
+	IsActive bool `json:"active,omitempty"`
+
+	// Is the user an administrator
+	IsAdmin bool `json:"is_admin,omitempty"`
+
+	// User locale
+	Language string `json:"language,omitempty"`
+
+	// last login
+	// Format: date-time
+	LastLogin strfmt.DateTime `json:"last_login,omitempty"`
+
+	// the user's location
+	Location string `json:"location,omitempty"`
+
+	// the user's authentication sign-in name.
+	LoginName *string `json:"login_name,omitempty"`
+
+	// Is user login prohibited
+	ProhibitLogin bool `json:"prohibit_login,omitempty"`
+
+	// Is user restricted
+	Restricted bool `json:"restricted,omitempty"`
+
+	// The ID of the user's Authentication Source
+	SourceID int64 `json:"source_id,omitempty"`
+
+	// starred repos
+	StarredRepos int64 `json:"starred_repos_count,omitempty"`
+
+	// the user's username
+	UserName string `json:"login,omitempty"`
+
+	// User visibility level option: public, limited, private
+	Visibility string `json:"visibility,omitempty"`
+
+	// the user's website
+	Website string `json:"website,omitempty"`
+}
+
+// Validate validates this user
+func (m *User) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateCreated(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateEmail(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateLastLogin(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *User) validateCreated(formats strfmt.Registry) error {
+	if swag.IsZero(m.Created) { // not required
+		return nil
+	}
+
+	if err := validate.FormatOf("created", "body", "date-time", m.Created.String(), formats); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (m *User) validateEmail(formats strfmt.Registry) error {
+	if swag.IsZero(m.Email) { // not required
+		return nil
+	}
+
+	if err := validate.FormatOf("email", "body", "email", m.Email.String(), formats); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (m *User) validateLastLogin(formats strfmt.Registry) error {
+	if swag.IsZero(m.LastLogin) { // not required
+		return nil
+	}
+
+	if err := validate.FormatOf("last_login", "body", "date-time", m.LastLogin.String(), formats); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+// ContextValidate validates this user based on context it is used
+func (m *User) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *User) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *User) UnmarshalBinary(b []byte) error {
+	var res User
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/user_badge_option.go b/bots-common/gitea-generated/models/user_badge_option.go
new file mode 100644
index 0000000..252cfde
--- /dev/null
+++ b/bots-common/gitea-generated/models/user_badge_option.go
@@ -0,0 +1,51 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// UserBadgeOption UserBadgeOption options for link between users and badges
+//
+// swagger:model UserBadgeOption
+type UserBadgeOption struct {
+
+	// badge slugs
+	// Example: ["badge1","badge2"]
+	BadgeSlugs []string `json:"badge_slugs"`
+}
+
+// Validate validates this user badge option
+func (m *UserBadgeOption) Validate(formats strfmt.Registry) error {
+	return nil
+}
+
+// ContextValidate validates this user badge option based on context it is used
+func (m *UserBadgeOption) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *UserBadgeOption) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *UserBadgeOption) UnmarshalBinary(b []byte) error {
+	var res UserBadgeOption
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/user_heatmap_data.go b/bots-common/gitea-generated/models/user_heatmap_data.go
new file mode 100644
index 0000000..136075a
--- /dev/null
+++ b/bots-common/gitea-generated/models/user_heatmap_data.go
@@ -0,0 +1,107 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// UserHeatmapData UserHeatmapData represents the data needed to create a heatmap
+//
+// swagger:model UserHeatmapData
+type UserHeatmapData struct {
+
+	// contributions
+	Contributions int64 `json:"contributions,omitempty"`
+
+	// timestamp
+	Timestamp TimeStamp `json:"timestamp,omitempty"`
+}
+
+// Validate validates this user heatmap data
+func (m *UserHeatmapData) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateTimestamp(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *UserHeatmapData) validateTimestamp(formats strfmt.Registry) error {
+	if swag.IsZero(m.Timestamp) { // not required
+		return nil
+	}
+
+	if err := m.Timestamp.Validate(formats); err != nil {
+		if ve, ok := err.(*errors.Validation); ok {
+			return ve.ValidateName("timestamp")
+		} else if ce, ok := err.(*errors.CompositeError); ok {
+			return ce.ValidateName("timestamp")
+		}
+		return err
+	}
+
+	return nil
+}
+
+// ContextValidate validate this user heatmap data based on the context it is used
+func (m *UserHeatmapData) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.contextValidateTimestamp(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *UserHeatmapData) contextValidateTimestamp(ctx context.Context, formats strfmt.Registry) error {
+
+	if swag.IsZero(m.Timestamp) { // not required
+		return nil
+	}
+
+	if err := m.Timestamp.ContextValidate(ctx, formats); err != nil {
+		if ve, ok := err.(*errors.Validation); ok {
+			return ve.ValidateName("timestamp")
+		} else if ce, ok := err.(*errors.CompositeError); ok {
+			return ce.ValidateName("timestamp")
+		}
+		return err
+	}
+
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *UserHeatmapData) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *UserHeatmapData) UnmarshalBinary(b []byte) error {
+	var res UserHeatmapData
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/user_settings.go b/bots-common/gitea-generated/models/user_settings.go
new file mode 100644
index 0000000..1b06edf
--- /dev/null
+++ b/bots-common/gitea-generated/models/user_settings.go
@@ -0,0 +1,74 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// UserSettings UserSettings represents user settings
+//
+// swagger:model UserSettings
+type UserSettings struct {
+
+	// description
+	Description string `json:"description,omitempty"`
+
+	// diff view style
+	DiffViewStyle string `json:"diff_view_style,omitempty"`
+
+	// full name
+	FullName string `json:"full_name,omitempty"`
+
+	// hide activity
+	HideActivity bool `json:"hide_activity,omitempty"`
+
+	// Privacy
+	HideEmail bool `json:"hide_email,omitempty"`
+
+	// language
+	Language string `json:"language,omitempty"`
+
+	// location
+	Location string `json:"location,omitempty"`
+
+	// theme
+	Theme string `json:"theme,omitempty"`
+
+	// website
+	Website string `json:"website,omitempty"`
+}
+
+// Validate validates this user settings
+func (m *UserSettings) Validate(formats strfmt.Registry) error {
+	return nil
+}
+
+// ContextValidate validates this user settings based on context it is used
+func (m *UserSettings) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *UserSettings) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *UserSettings) UnmarshalBinary(b []byte) error {
+	var res UserSettings
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/user_settings_options.go b/bots-common/gitea-generated/models/user_settings_options.go
new file mode 100644
index 0000000..cfda4ec
--- /dev/null
+++ b/bots-common/gitea-generated/models/user_settings_options.go
@@ -0,0 +1,74 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// UserSettingsOptions UserSettingsOptions represents options to change user settings
+//
+// swagger:model UserSettingsOptions
+type UserSettingsOptions struct {
+
+	// description
+	Description string `json:"description,omitempty"`
+
+	// diff view style
+	DiffViewStyle string `json:"diff_view_style,omitempty"`
+
+	// full name
+	FullName string `json:"full_name,omitempty"`
+
+	// hide activity
+	HideActivity bool `json:"hide_activity,omitempty"`
+
+	// Privacy
+	HideEmail bool `json:"hide_email,omitempty"`
+
+	// language
+	Language string `json:"language,omitempty"`
+
+	// location
+	Location string `json:"location,omitempty"`
+
+	// theme
+	Theme string `json:"theme,omitempty"`
+
+	// website
+	Website string `json:"website,omitempty"`
+}
+
+// Validate validates this user settings options
+func (m *UserSettingsOptions) Validate(formats strfmt.Registry) error {
+	return nil
+}
+
+// ContextValidate validates this user settings options based on context it is used
+func (m *UserSettingsOptions) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *UserSettingsOptions) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *UserSettingsOptions) UnmarshalBinary(b []byte) error {
+	var res UserSettingsOptions
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/watch_info.go b/bots-common/gitea-generated/models/watch_info.go
new file mode 100644
index 0000000..c5ee8a1
--- /dev/null
+++ b/bots-common/gitea-generated/models/watch_info.go
@@ -0,0 +1,89 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+	"github.com/go-openapi/validate"
+)
+
+// WatchInfo WatchInfo represents an API watch status of one repository
+//
+// swagger:model WatchInfo
+type WatchInfo struct {
+
+	// created at
+	// Format: date-time
+	CreatedAt strfmt.DateTime `json:"created_at,omitempty"`
+
+	// ignored
+	Ignored bool `json:"ignored,omitempty"`
+
+	// reason
+	Reason interface{} `json:"reason,omitempty"`
+
+	// repository URL
+	RepositoryURL string `json:"repository_url,omitempty"`
+
+	// subscribed
+	Subscribed bool `json:"subscribed,omitempty"`
+
+	// URL
+	URL string `json:"url,omitempty"`
+}
+
+// Validate validates this watch info
+func (m *WatchInfo) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateCreatedAt(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *WatchInfo) validateCreatedAt(formats strfmt.Registry) error {
+	if swag.IsZero(m.CreatedAt) { // not required
+		return nil
+	}
+
+	if err := validate.FormatOf("created_at", "body", "date-time", m.CreatedAt.String(), formats); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+// ContextValidate validates this watch info based on context it is used
+func (m *WatchInfo) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *WatchInfo) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *WatchInfo) UnmarshalBinary(b []byte) error {
+	var res WatchInfo
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/wiki_commit.go b/bots-common/gitea-generated/models/wiki_commit.go
new file mode 100644
index 0000000..1d36049
--- /dev/null
+++ b/bots-common/gitea-generated/models/wiki_commit.go
@@ -0,0 +1,166 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// WikiCommit WikiCommit page commit/revision
+//
+// swagger:model WikiCommit
+type WikiCommit struct {
+
+	// ID
+	ID string `json:"sha,omitempty"`
+
+	// message
+	Message string `json:"message,omitempty"`
+
+	// author
+	Author *CommitUser `json:"author,omitempty"`
+
+	// commiter
+	Commiter *CommitUser `json:"commiter,omitempty"`
+}
+
+// Validate validates this wiki commit
+func (m *WikiCommit) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateAuthor(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.validateCommiter(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *WikiCommit) validateAuthor(formats strfmt.Registry) error {
+	if swag.IsZero(m.Author) { // not required
+		return nil
+	}
+
+	if m.Author != nil {
+		if err := m.Author.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("author")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("author")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *WikiCommit) validateCommiter(formats strfmt.Registry) error {
+	if swag.IsZero(m.Commiter) { // not required
+		return nil
+	}
+
+	if m.Commiter != nil {
+		if err := m.Commiter.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("commiter")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("commiter")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+// ContextValidate validate this wiki commit based on the context it is used
+func (m *WikiCommit) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.contextValidateAuthor(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if err := m.contextValidateCommiter(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *WikiCommit) contextValidateAuthor(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.Author != nil {
+
+		if swag.IsZero(m.Author) { // not required
+			return nil
+		}
+
+		if err := m.Author.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("author")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("author")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (m *WikiCommit) contextValidateCommiter(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.Commiter != nil {
+
+		if swag.IsZero(m.Commiter) { // not required
+			return nil
+		}
+
+		if err := m.Commiter.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("commiter")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("commiter")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *WikiCommit) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *WikiCommit) UnmarshalBinary(b []byte) error {
+	var res WikiCommit
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/wiki_commit_list.go b/bots-common/gitea-generated/models/wiki_commit_list.go
new file mode 100644
index 0000000..8a15d10
--- /dev/null
+++ b/bots-common/gitea-generated/models/wiki_commit_list.go
@@ -0,0 +1,124 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+	"strconv"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// WikiCommitList WikiCommitList commit/revision list
+//
+// swagger:model WikiCommitList
+type WikiCommitList struct {
+
+	// count
+	Count int64 `json:"count,omitempty"`
+
+	// wiki commits
+	WikiCommits []*WikiCommit `json:"commits"`
+}
+
+// Validate validates this wiki commit list
+func (m *WikiCommitList) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateWikiCommits(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *WikiCommitList) validateWikiCommits(formats strfmt.Registry) error {
+	if swag.IsZero(m.WikiCommits) { // not required
+		return nil
+	}
+
+	for i := 0; i < len(m.WikiCommits); i++ {
+		if swag.IsZero(m.WikiCommits[i]) { // not required
+			continue
+		}
+
+		if m.WikiCommits[i] != nil {
+			if err := m.WikiCommits[i].Validate(formats); err != nil {
+				if ve, ok := err.(*errors.Validation); ok {
+					return ve.ValidateName("commits" + "." + strconv.Itoa(i))
+				} else if ce, ok := err.(*errors.CompositeError); ok {
+					return ce.ValidateName("commits" + "." + strconv.Itoa(i))
+				}
+				return err
+			}
+		}
+
+	}
+
+	return nil
+}
+
+// ContextValidate validate this wiki commit list based on the context it is used
+func (m *WikiCommitList) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.contextValidateWikiCommits(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *WikiCommitList) contextValidateWikiCommits(ctx context.Context, formats strfmt.Registry) error {
+
+	for i := 0; i < len(m.WikiCommits); i++ {
+
+		if m.WikiCommits[i] != nil {
+
+			if swag.IsZero(m.WikiCommits[i]) { // not required
+				return nil
+			}
+
+			if err := m.WikiCommits[i].ContextValidate(ctx, formats); err != nil {
+				if ve, ok := err.(*errors.Validation); ok {
+					return ve.ValidateName("commits" + "." + strconv.Itoa(i))
+				} else if ce, ok := err.(*errors.CompositeError); ok {
+					return ce.ValidateName("commits" + "." + strconv.Itoa(i))
+				}
+				return err
+			}
+		}
+
+	}
+
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *WikiCommitList) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *WikiCommitList) UnmarshalBinary(b []byte) error {
+	var res WikiCommitList
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/wiki_page.go b/bots-common/gitea-generated/models/wiki_page.go
new file mode 100644
index 0000000..3a69b85
--- /dev/null
+++ b/bots-common/gitea-generated/models/wiki_page.go
@@ -0,0 +1,130 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// WikiPage WikiPage a wiki page
+//
+// swagger:model WikiPage
+type WikiPage struct {
+
+	// commit count
+	CommitCount int64 `json:"commit_count,omitempty"`
+
+	// Page content, base64 encoded
+	ContentBase64 string `json:"content_base64,omitempty"`
+
+	// footer
+	Footer string `json:"footer,omitempty"`
+
+	// HTML URL
+	HTMLURL string `json:"html_url,omitempty"`
+
+	// sidebar
+	Sidebar string `json:"sidebar,omitempty"`
+
+	// sub URL
+	SubURL string `json:"sub_url,omitempty"`
+
+	// title
+	Title string `json:"title,omitempty"`
+
+	// last commit
+	LastCommit *WikiCommit `json:"last_commit,omitempty"`
+}
+
+// Validate validates this wiki page
+func (m *WikiPage) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateLastCommit(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *WikiPage) validateLastCommit(formats strfmt.Registry) error {
+	if swag.IsZero(m.LastCommit) { // not required
+		return nil
+	}
+
+	if m.LastCommit != nil {
+		if err := m.LastCommit.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("last_commit")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("last_commit")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+// ContextValidate validate this wiki page based on the context it is used
+func (m *WikiPage) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.contextValidateLastCommit(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *WikiPage) contextValidateLastCommit(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.LastCommit != nil {
+
+		if swag.IsZero(m.LastCommit) { // not required
+			return nil
+		}
+
+		if err := m.LastCommit.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("last_commit")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("last_commit")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *WikiPage) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *WikiPage) UnmarshalBinary(b []byte) error {
+	var res WikiPage
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea-generated/models/wiki_page_meta_data.go b/bots-common/gitea-generated/models/wiki_page_meta_data.go
new file mode 100644
index 0000000..4496ecd
--- /dev/null
+++ b/bots-common/gitea-generated/models/wiki_page_meta_data.go
@@ -0,0 +1,118 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+	"context"
+
+	"github.com/go-openapi/errors"
+	"github.com/go-openapi/strfmt"
+	"github.com/go-openapi/swag"
+)
+
+// WikiPageMetaData WikiPageMetaData wiki page meta information
+//
+// swagger:model WikiPageMetaData
+type WikiPageMetaData struct {
+
+	// HTML URL
+	HTMLURL string `json:"html_url,omitempty"`
+
+	// sub URL
+	SubURL string `json:"sub_url,omitempty"`
+
+	// title
+	Title string `json:"title,omitempty"`
+
+	// last commit
+	LastCommit *WikiCommit `json:"last_commit,omitempty"`
+}
+
+// Validate validates this wiki page meta data
+func (m *WikiPageMetaData) Validate(formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.validateLastCommit(formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *WikiPageMetaData) validateLastCommit(formats strfmt.Registry) error {
+	if swag.IsZero(m.LastCommit) { // not required
+		return nil
+	}
+
+	if m.LastCommit != nil {
+		if err := m.LastCommit.Validate(formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("last_commit")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("last_commit")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+// ContextValidate validate this wiki page meta data based on the context it is used
+func (m *WikiPageMetaData) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
+	var res []error
+
+	if err := m.contextValidateLastCommit(ctx, formats); err != nil {
+		res = append(res, err)
+	}
+
+	if len(res) > 0 {
+		return errors.CompositeValidationError(res...)
+	}
+	return nil
+}
+
+func (m *WikiPageMetaData) contextValidateLastCommit(ctx context.Context, formats strfmt.Registry) error {
+
+	if m.LastCommit != nil {
+
+		if swag.IsZero(m.LastCommit) { // not required
+			return nil
+		}
+
+		if err := m.LastCommit.ContextValidate(ctx, formats); err != nil {
+			if ve, ok := err.(*errors.Validation); ok {
+				return ve.ValidateName("last_commit")
+			} else if ce, ok := err.(*errors.CompositeError); ok {
+				return ce.ValidateName("last_commit")
+			}
+			return err
+		}
+	}
+
+	return nil
+}
+
+// MarshalBinary interface implementation
+func (m *WikiPageMetaData) MarshalBinary() ([]byte, error) {
+	if m == nil {
+		return nil, nil
+	}
+	return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *WikiPageMetaData) UnmarshalBinary(b []byte) error {
+	var res WikiPageMetaData
+	if err := swag.ReadJSON(b, &res); err != nil {
+		return err
+	}
+	*m = res
+	return nil
+}
diff --git a/bots-common/gitea_utils.go b/bots-common/gitea_utils.go
new file mode 100644
index 0000000..86dc3e9
--- /dev/null
+++ b/bots-common/gitea_utils.go
@@ -0,0 +1,88 @@
+package common
+
+import (
+	"io"
+	"os"
+	"path/filepath"
+
+	transport "github.com/go-openapi/runtime/client"
+	apiclient "src.opensuse.org/autogits/common/gitea-generated/client"
+	"src.opensuse.org/autogits/common/gitea-generated/client/organization"
+	"src.opensuse.org/autogits/common/gitea-generated/client/repository"
+	"src.opensuse.org/autogits/common/gitea-generated/models"
+)
+
+func (h *RequestHandler) CreateRepositoryIfNotExist(org Organization, repoName string) *models.Repository {
+	if h.HasError() {
+		return nil
+	}
+
+	r := transport.New("src.opensuse.org", apiclient.DefaultBasePath, [](string){"https"})
+	r.DefaultAuthentication = transport.BearerToken(h.GiteaToken)
+	// r.SetDebug(true)
+	client := apiclient.New(r, nil)
+
+	repo, err := client.Repository.RepoGet(
+		repository.NewRepoGetParams().WithDefaults().WithOwner(org.Username).WithRepo(repoName),
+		r.DefaultAuthentication)
+
+	if err != nil {
+		switch err.(type) {
+		case *repository.RepoGetNotFound:
+			h.Log("repo '%s' does not exist. Trying to create it ....", repoName)
+
+			repo, err := client.Organization.CreateOrgRepo(
+				organization.NewCreateOrgRepoParams().WithDefaults().WithBody(
+					&models.CreateRepoOption{
+						AutoInit:         false,
+						Name:             &repoName,
+						ObjectFormatName: models.CreateRepoOptionObjectFormatNameSha256,
+					},
+				).WithOrg(org.Username),
+				nil,
+			)
+
+			if err != nil {
+				switch err.(type) {
+				case *organization.CreateOrgRepoCreated:
+					h.Log("repo '%s' created, with notification error?", repoName)
+				default:
+					h.Error = err
+					h.LogError("error creating repo '%s' under '%s': %s", repoName, org.Username, err.Error())
+					return nil
+				}
+			} else {
+				h.Log("repo '%s' created", repoName)
+			}
+
+			// initialize repository
+			h.Error = os.Mkdir(filepath.Join(h.GitPath, DefaultGitPrj), 0700)
+			if h.HasError() {
+				return nil
+			}
+			h.GitExec(DefaultGitPrj, "init", "--object-format="+repo.Payload.ObjectFormatName)
+			h.GitExec(DefaultGitPrj, "checkout", "-b", repo.Payload.DefaultBranch)
+			if h.HasError() {
+				return nil
+			}
+			readmeFilename := filepath.Join(h.GitPath, DefaultGitPrj, "README.md")
+			{
+				file, _ := os.Create(readmeFilename)
+				defer file.Close()
+
+				io.WriteString(file, ReadmeBoilerplate)
+			}
+			h.GitExec(DefaultGitPrj, "add", "README.md")
+			h.GitExec(DefaultGitPrj, "commit", "-m", "Automatic devel project creation")
+			h.GitExec(DefaultGitPrj, "remote", "add", "origin", repo.Payload.SSHURL)
+
+			return repo.Payload
+		default:
+			h.Error = err
+			h.LogError("cannot fetch repo data for '%s' / '%s' : %w", org.Username, repoName, err)
+		}
+	}
+
+	return repo.Payload
+}
+
diff --git a/bots-common/go.mod b/bots-common/go.mod
new file mode 100644
index 0000000..39a828e
--- /dev/null
+++ b/bots-common/go.mod
@@ -0,0 +1,36 @@
+module src.opensuse.org/autogits/common
+
+go 1.22.3
+
+require (
+	github.com/go-openapi/errors v0.22.0
+	github.com/go-openapi/runtime v0.28.0
+	github.com/go-openapi/strfmt v0.23.0
+	github.com/go-openapi/swag v0.23.0
+	github.com/go-openapi/validate v0.24.0
+)
+
+require (
+	github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect
+	github.com/go-logr/logr v1.4.1 // indirect
+	github.com/go-logr/stdr v1.2.2 // indirect
+	github.com/go-openapi/analysis v0.23.0 // indirect
+	github.com/go-openapi/jsonpointer v0.21.0 // indirect
+	github.com/go-openapi/jsonreference v0.21.0 // indirect
+	github.com/go-openapi/loads v0.22.0 // indirect
+	github.com/go-openapi/spec v0.21.0 // indirect
+	github.com/google/uuid v1.6.0 // indirect
+	github.com/josharian/intern v1.0.0 // indirect
+	github.com/mailru/easyjson v0.7.7 // indirect
+	github.com/mitchellh/mapstructure v1.5.0 // indirect
+	github.com/oklog/ulid v1.3.1 // indirect
+	github.com/opentracing/opentracing-go v1.2.0 // indirect
+	github.com/rogpeppe/go-internal v1.12.0 // indirect
+	go.mongodb.org/mongo-driver v1.14.0 // indirect
+	go.opentelemetry.io/otel v1.24.0 // indirect
+	go.opentelemetry.io/otel/metric v1.24.0 // indirect
+	go.opentelemetry.io/otel/trace v1.24.0 // indirect
+	golang.org/x/sync v0.7.0 // indirect
+	golang.org/x/sys v0.20.0 // indirect
+	gopkg.in/yaml.v3 v3.0.1 // indirect
+)
diff --git a/bots-common/go.sum b/bots-common/go.sum
new file mode 100644
index 0000000..b1db529
--- /dev/null
+++ b/bots-common/go.sum
@@ -0,0 +1,75 @@
+github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3dyBCFEj5IhUbnKptjxatkF07cF2ak3yi77so=
+github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw=
+github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
+github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=
+github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
+github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
+github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
+github.com/go-openapi/analysis v0.23.0 h1:aGday7OWupfMs+LbmLZG4k0MYXIANxcuBTYUC03zFCU=
+github.com/go-openapi/analysis v0.23.0/go.mod h1:9mz9ZWaSlV8TvjQHLl2mUW2PbZtemkE8yA5v22ohupo=
+github.com/go-openapi/errors v0.22.0 h1:c4xY/OLxUBSTiepAg3j/MHuAv5mJhnf53LLMWFB+u/w=
+github.com/go-openapi/errors v0.22.0/go.mod h1:J3DmZScxCDufmIMsdOuDHxJbdOGC0xtUynjIx092vXE=
+github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ=
+github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY=
+github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ=
+github.com/go-openapi/jsonreference v0.21.0/go.mod h1:LmZmgsrTkVg9LG4EaHeY8cBDslNPMo06cago5JNLkm4=
+github.com/go-openapi/loads v0.22.0 h1:ECPGd4jX1U6NApCGG1We+uEozOAvXvJSF4nnwHZ8Aco=
+github.com/go-openapi/loads v0.22.0/go.mod h1:yLsaTCS92mnSAZX5WWoxszLj0u+Ojl+Zs5Stn1oF+rs=
+github.com/go-openapi/runtime v0.28.0 h1:gpPPmWSNGo214l6n8hzdXYhPuJcGtziTOgUpvsFWGIQ=
+github.com/go-openapi/runtime v0.28.0/go.mod h1:QN7OzcS+XuYmkQLw05akXk0jRH/eZ3kb18+1KwW9gyc=
+github.com/go-openapi/spec v0.21.0 h1:LTVzPc3p/RzRnkQqLRndbAzjY0d0BCL72A6j3CdL9ZY=
+github.com/go-openapi/spec v0.21.0/go.mod h1:78u6VdPw81XU44qEWGhtr982gJ5BWg2c0I5XwVMotYk=
+github.com/go-openapi/strfmt v0.23.0 h1:nlUS6BCqcnAk0pyhi9Y+kdDVZdZMHfEKQiS4HaMgO/c=
+github.com/go-openapi/strfmt v0.23.0/go.mod h1:NrtIpfKtWIygRkKVsxh7XQMDQW5HKQl6S5ik2elW+K4=
+github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE=
+github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ=
+github.com/go-openapi/validate v0.24.0 h1:LdfDKwNbpB6Vn40xhTdNZAnfLECL81w+VX3BumrGD58=
+github.com/go-openapi/validate v0.24.0/go.mod h1:iyeX1sEufmv3nPbBdX3ieNviWnOZaJ1+zquzJEf2BAQ=
+github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
+github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
+github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
+github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
+github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
+github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
+github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
+github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
+github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
+github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
+github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
+github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
+github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
+github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4=
+github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
+github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs=
+github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc=
+github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=
+github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=
+github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
+github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
+github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
+go.mongodb.org/mongo-driver v1.14.0 h1:P98w8egYRjYe3XDjxhYJagTokP/H6HzlsnojRgZRd80=
+go.mongodb.org/mongo-driver v1.14.0/go.mod h1:Vzb0Mk/pa7e6cWw85R4F/endUC3u0U9jGcNU603k65c=
+go.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo=
+go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo=
+go.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI=
+go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco=
+go.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw=
+go.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg=
+go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI=
+go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU=
+golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M=
+golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
+golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y=
+golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
+gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
+gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
+gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
diff --git a/bots-common/log.go b/bots-common/log.go
new file mode 100644
index 0000000..1b4167c
--- /dev/null
+++ b/bots-common/log.go
@@ -0,0 +1,81 @@
+package common
+
+import (
+	"fmt"
+	"io"
+	"time"
+)
+
+type Logger interface {
+	LogPlainError(err error) (int, error)
+	LogError(str string, fmt ...any) (int, error)
+	Log(str string, fmt ...any) (int, error)
+}
+
+type StdoutLogging struct {
+	Id             uint
+	Stdout, Stderr io.StringWriter
+	Date           time.Time
+}
+
+var id uint
+
+func CreateStdoutLogger(stdout io.StringWriter, stderr io.StringWriter) Logger {
+	id++
+
+	log := &StdoutLogging{
+		Id:     id,
+		Stdout: stdout,
+		Stderr: stderr,
+		Date:   time.Now(),
+	}
+
+	return log
+}
+
+func prepareMsg(time time.Duration, id uint, str string, params ...any) string {
+	var allParams []any = []any{
+		id,
+		time.String(),
+	}
+	allParams = append(allParams, params...)
+
+	return fmt.Sprintf("[%x] [%s]: "+str+"\n", allParams...)
+}
+
+func (s *StdoutLogging) LogPlainError(err error) (int, error) {
+	return s.Stderr.WriteString(prepareMsg(time.Since(s.Date), s.Id, "%#v\n", err))
+}
+
+func (s *StdoutLogging) LogError(str string, params ...any) (int, error) {
+	return s.Stderr.WriteString(prepareMsg(time.Since(s.Date),s.Id, str, params...))
+}
+
+func (s *StdoutLogging) Log(str string, params ...any) (int, error) {
+	return s.Stdout.WriteString(prepareMsg(time.Since(s.Date), s.Id, str, params...))
+}
+
+type LoggingWriteCloser struct {
+	err bool
+	*StdoutLogging
+}
+
+func (l *LoggingWriteCloser) Write(data []byte) (int, error) {
+	if l.err {
+		return l.LogError("%s", data)
+	}
+
+	return l.Log("%s", data)
+}
+
+func (l *LoggingWriteCloser) Close() error {
+	return nil
+}
+
+func (s *StdoutLogging) CreateLogWriter(err bool) io.WriteCloser {
+	logger := new(LoggingWriteCloser)
+	logger.StdoutLogging = s
+	logger.err = err
+
+	return logger
+}
diff --git a/bots-common/log_test.go b/bots-common/log_test.go
new file mode 100644
index 0000000..76dc01b
--- /dev/null
+++ b/bots-common/log_test.go
@@ -0,0 +1,46 @@
+package common
+
+import (
+	"regexp"
+	"testing"
+)
+
+type TestWriter struct {
+	str string
+}
+
+func (s *TestWriter) WriteString(str2 string) (int, error) {
+	s.str += str2
+	return len(s.str), nil
+}
+
+func TestLogging(t *testing.T) {
+	t.Run("basic logging", func(t *testing.T) {
+		var strWriter, errWriter TestWriter
+
+		if len(strWriter.str) != 0 || len(errWriter.str) != 0 {
+			t.Fatal("non-null empty logging?")
+		}
+
+		logger := CreateStdoutLogger(&strWriter, &errWriter)
+		logger.LogError("%d", 100)
+		logger.Log("OKA %d Done", 77)
+		logger.Log("Another line")
+
+		const prefixMatch = `\[\d+\] \[[^\]]+\]: `
+
+		if ok, err := regexp.MatchString("^"+prefixMatch+"100\n$", errWriter.str); !ok {
+			if err != nil {
+				t.Logf("err: %v", err)
+			}
+			t.Fatal(errWriter)
+		}
+		if ok, err := regexp.MatchString("^"+prefixMatch+"OKA 77 Done\n"+prefixMatch+"Another line\n$", strWriter.str); !ok {
+			if err != nil {
+				t.Logf("err: %v", err)
+			}
+			t.Fatal(strWriter.str)
+		}
+	})
+}
+
diff --git a/bots-common/obs.api.yaml b/bots-common/obs.api.yaml
new file mode 100644
index 0000000..acd2167
--- /dev/null
+++ b/bots-common/obs.api.yaml
@@ -0,0 +1,47328 @@
+---
+openapi: 3.0.0
+servers:
+- url: "/"
+tags:
+- name: Announcements
+- name: Attribute Namespaces
+- name: Attributes
+- name: Build
+- name: Comments
+- name: Configuration
+- name: Distributions
+- name: General Information
+- name: Groups
+- name: Issue Trackers
+- name: Notifications
+- name: Person
+- name: Published Binaries
+- name: Requests
+- name: Search
+  description: |
+    All endpoints besides the owner search listed in the search group use Xpath expressions. The `match` query parameter is used
+    to pass the Xpath predicate. The individual endpoints refer to different objects like Packages, Projects, Issues and more...
+    Please refer to the documentation of the individual search endpoints to know which attributes can be accessed through the predicate,
+    and which extra query parameters are supported or might be required in order to run the search.
+
+
+    These functions can be used with the predicates: `boolean`, `contains`, `not`, `starts_with`, `ends_with`.
+
+    _Example_:
+
+    For a list of all projects where the name starts with "OBS:".
+
+    `/search/project?match=starts_with(@name,'OBS:')`
+
+
+    More than one predicate can be combined with the following operators: `eq`, `and`, `or`, `neq`, `gt`, `lt`, `gteq`, `lteq`.
+
+    _Example_:
+
+    To receive details about the package "obs-server" that is part of the project "OBS:Server:Unstable".
+
+    `/search/package?match=@name='obs-server'+and+@project='OBS:Server:Unstable'`
+- name: Sources
+- name: Sources - Projects
+- name: Sources - Packages
+- name: Sources - Files
+- name: Staging Workflow
+- name: Statistics
+- name: Status Messages
+- name: Status Project
+- name: Status Reports
+- name: Status Reports - Required Checks
+- name: Trigger
+- name: Workers
+info:
+  description: |
+    The _Open Build Service API_ is an XML API. To make sure you are querying the API and not the Web User Interface, provide the `Accept: application/xml; charset=utf-8` header in your API requests.
+
+    To authenticate, use [HTTP basic authentication](https://en.wikipedia.org/wiki/Basic_access_authentication) by passing the _Authorization_ header in the form of `Authorization: Basic <credentials>`.
+
+    There is no API versioning, since there is no need for it right now.
+
+    Only rudimentary rate limiting is implemented, so please be gentle when using the API concurrently, especially with potentially expensive operations.
+
+    Your OBS Admin might have implemented other authentication schemes or stricter rate limiting in front of the application. Check the [site main page](/) for details.
+
+    For command-line users, we recommend using [osc](https://github.com/openSUSE/osc) with its _api_ command to interact with the API.
+    It's as simple as this example: `osc api /about` (_about_ is one of the endpoints documented below)
+
+    In order to make sure that the XML that is send in a requests body is in the expected format, the API validates it.
+    Either against a XML Schema Definition (`.xsd`) or a RELAX NG Schema (`.rng`). The schemas are mentioned
+    in the endpoint documentation. If there is no schema file mentioned, no validation of the XML is done.
+    In case the XML is not valid, a validation error is reported.
+
+    The legacy API documentation is reachable [here](https://api.opensuse.org/apidocs-old/index).
+  version: 2.10.50
+  title: Open Build Service API
+  contact:
+    url: https://openbuildservice.org/
+    name: Open Build Service
+  license:
+    url: https://github.com/openSUSE/open-build-service/blob/master/COPYING
+    name: GNU General Public License v2.0
+paths:
+  "/about":
+    get:
+      summary: Get information about API.
+      description: Get generic information about the API.
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [about.xsd](../schema/about.xsd)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                required:
+                - title
+                - description
+                - revision
+                properties:
+                  title:
+                    type: string
+                    example: Open Build Service API
+                  description:
+                    type: string
+                    example: API to the Open Build Service
+                  revision:
+                    type: string
+                    example: 2.11~alpha.20201110T101235.7b5d82e614
+                  last_deployment:
+                    type: string
+                    example: '2020-11-10 15:07:02 +0000'
+                  commit:
+                    type: string
+                    example: 7b5d82e6143442a8eb8459f35cc94d2fbe263ebe
+                xml:
+                  name: about
+      tags:
+      - General Information
+  "/announcements":
+    get:
+      deprecated: true
+      summary: List all announcements.
+      description: List all messages from type announcement.
+      security:
+      - basic_authentication: []
+      responses:
+        '200':
+          description: OK. The request has succeeded.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  status_message:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        id:
+                          type: integer
+                          xml:
+                            attribute: true
+                        message:
+                          type: string
+                        user:
+                          type: string
+                        severity:
+                          type: string
+                        scope:
+                          type: string
+                        created_at:
+                          type: string
+                      xml:
+                        name: status_message
+                  count:
+                    type: integer
+                    xml:
+                      attribute: true
+                xml:
+                  name: status_messages
+              example:
+                count: 2
+                status_message:
+                - id: 2
+                  message: OBS 3.0 is released!
+                  user: Iggy
+                  severity: announcement
+                  scope: all_users
+                  created_at: 2021-10-15 13:28:22 UTC
+                - id: 1
+                  message: Feature number 42 was implemented!
+                  user: Iggy
+                  severity: announcement
+                  scope: all_users
+                  created_at: 2021-10-12 11:18:12 UTC
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+      tags:
+      - Announcements
+    post:
+      deprecated: true
+      summary: Create an announcement.
+      description: |
+        Create an announcement.
+
+        This is only for users with roles "Admin" or "Staff".
+      security:
+      - basic_authentication: []
+      requestBody:
+        description: Announcement definition.
+        content:
+          application/xml; charset=utf-8:
+            schema:
+              type: object
+              properties:
+                title:
+                  type: string
+                content:
+                  type: string
+              xml:
+                name: announcement
+            example:
+              title: OBS 3.0 released!
+              content: We are glad to announce that OBS 3.0 is released.
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '400':
+          description: |
+            Invalid Announcement.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                message_cant_be_blank:
+                  summary: Message can't be blank
+                  value:
+                    code: invalid_announcement
+                    summary: '["Message can''t be blank"]'
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+      tags:
+      - Announcements
+  "/announcements/{announcement_id}":
+    get:
+      deprecated: true
+      summary: Show an announcement.
+      description: Show the content of an announcement.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: announcement_id
+        schema:
+          type: integer
+        required: true
+        description: The id of the announcement.
+        example: 16
+      responses:
+        '200':
+          description: OK. The request has succeded.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  id:
+                    type: integer
+                    xml:
+                      attribute: true
+                  message:
+                    type: string
+                  user:
+                    type: string
+                  severity:
+                    type: string
+                  scope:
+                    type: string
+                  created_at:
+                    type: string
+                xml:
+                  name: status_message
+              example:
+                id: 16
+                message: Feature number 42 was implemented!
+                user: Iggy
+                severity: announcement
+                scope: all_users
+                created_at: 2021-10-12 11:18:12 UTC
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: Not found.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: not_found
+                summary: Couldn't find StatusMessage with 'id'=0 [WHERE `status_messages`.`severity`
+                  = ?]
+      tags:
+      - Announcements
+    put:
+      deprecated: true
+      summary: Update an announcement.
+      description: |
+        Update the content of an announcement.
+
+        This is only for users with roles "Admin" or "Staff".
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: announcement_id
+        schema:
+          type: integer
+        required: true
+        description: The id of the announcement.
+        example: 16
+      requestBody:
+        description: Announcement definition.
+        content:
+          application/xml; charset=utf-8:
+            schema:
+              type: object
+              properties:
+                title:
+                  type: string
+                content:
+                  type: string
+              xml:
+                name: announcement
+            examples:
+              update_title:
+                summary: Update only the title
+                value:
+                  title: New title!
+              update_title_and_content:
+                summary: Update title and content
+                value:
+                  title: New title!
+                  content: New content.
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '400':
+          description: |
+            Invalid Announcement.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                message_cant_be_blank:
+                  summary: Message can't be blank
+                  value:
+                    code: invalid_announcement
+                    summary: '["Message can''t be blank"]'
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: Not found.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: not_found
+                summary: Couldn't find StatusMessage with 'id'=0 [WHERE `status_messages`.`severity`
+                  = ?]
+      tags:
+      - Announcements
+    delete:
+      deprecated: true
+      summary: Delete an announcement.
+      description: |
+        Delete an announcement.
+
+        This is only for users with roles "Admin" or "Staff".
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: announcement_id
+        schema:
+          type: integer
+        required: true
+        description: The id of the announcement.
+        example: 16
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: Not found.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: not_found
+                summary: Couldn't find StatusMessage with 'id'=0 [WHERE `status_messages`.`severity`
+                  = ?]
+      tags:
+      - Announcements
+  "/architectures":
+    get:
+      summary: List all known architectures.
+      description: |
+        Get a list of all known architectures known to OBS in general.
+        This is not the list of architectures provided by this instance. Check the
+        schedulers element from the `/configuration` route for this.
+      security:
+      - basic_authentication: []
+      responses:
+        '200':
+          description: OK. The request has succeeded.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  count:
+                    type: integer
+                    xml:
+                      attribute: true
+                  name:
+                    type: string
+                    xml:
+                      attribute: true
+                  rev:
+                    type: string
+                    xml:
+                      attribute: true
+                  vrev:
+                    type: string
+                    xml:
+                      attribute: true
+                  srcmd5:
+                    type: string
+                    xml:
+                      attribute: true
+                  entry:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        name:
+                          type: string
+                          xml:
+                            attribute: true
+                        md5:
+                          type: string
+                          xml:
+                            attribute: true
+                        size:
+                          type: string
+                          xml:
+                            attribute: true
+                        mtime:
+                          type: string
+                          xml:
+                            attribute: true
+                xml:
+                  name: directory
+              example:
+                count: '4'
+                entry:
+                - name: aarch64
+                - name: armv7l
+                - name: s390x
+                - name: x86_64
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+      tags:
+      - General Information
+  "/architectures/{architecture_name}":
+    get:
+      summary: Show one architecture.
+      description: Show information about one architecture.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: architecture_name
+        schema:
+          type: string
+        required: true
+        description: Architecture name
+        example: x86_64
+      responses:
+        '200':
+          description: OK. The request has succeeded.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  name:
+                    type: string
+                    xml:
+                      attribute: true
+                xml:
+                  name: architecture
+                example:
+                  name: x86_64
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: Not Found.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: unknown_architecture
+                summary: 'Architecture does not exist: x999'
+      tags:
+      - General Information
+  "/attribute":
+    get:
+      summary: List all attribute namespaces.
+      description: List all attribute namespaces.
+      security:
+      - basic_authentication: []
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [directory.xsd](../schema/directory.xsd)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  count:
+                    type: integer
+                    xml:
+                      attribute: true
+                  name:
+                    type: string
+                    xml:
+                      attribute: true
+                  rev:
+                    type: string
+                    xml:
+                      attribute: true
+                  vrev:
+                    type: string
+                    xml:
+                      attribute: true
+                  srcmd5:
+                    type: string
+                    xml:
+                      attribute: true
+                  entry:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        name:
+                          type: string
+                          xml:
+                            attribute: true
+                        md5:
+                          type: string
+                          xml:
+                            attribute: true
+                        size:
+                          type: string
+                          xml:
+                            attribute: true
+                        mtime:
+                          type: string
+                          xml:
+                            attribute: true
+                xml:
+                  name: directory
+              example:
+                count: '2'
+                entry:
+                - name: OBS
+                - name: openSUSE
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+      tags:
+      - Attribute Namespaces
+  "/attribute/{namespace}":
+    get:
+      summary: List all attributes below a namespace.
+      description: List all attributes under a given attribute namespace.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: namespace
+        schema:
+          type: string
+        required: true
+        description: The namespace
+        example: OBS_TEST
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [directory.xsd](../schema/directory.xsd)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  count:
+                    type: integer
+                    xml:
+                      attribute: true
+                  name:
+                    type: string
+                    xml:
+                      attribute: true
+                  rev:
+                    type: string
+                    xml:
+                      attribute: true
+                  vrev:
+                    type: string
+                    xml:
+                      attribute: true
+                  srcmd5:
+                    type: string
+                    xml:
+                      attribute: true
+                  entry:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        name:
+                          type: string
+                          xml:
+                            attribute: true
+                        md5:
+                          type: string
+                          xml:
+                            attribute: true
+                        size:
+                          type: string
+                          xml:
+                            attribute: true
+                        mtime:
+                          type: string
+                          xml:
+                            attribute: true
+                xml:
+                  name: directory
+              example:
+                count: '2'
+                entry:
+                - name: AutoCleanup
+                - name: OwnerRootProject
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: Not Found.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: not_found
+                summary: Couldn't find AttribNamespace
+      tags:
+      - Attributes
+    delete:
+      summary: Delete an attribute namespace and all attributes below.
+      description: |
+        Delete an attribute namespace and all attributes below.
+
+        This operation is the same as the one defined with [DELETE /attribute/{namespace}/_meta](#/Attributes/delete_attribute__namespace___meta).
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: namespace
+        schema:
+          type: string
+        required: true
+        description: The namespace
+        example: OBS_TEST
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+      tags:
+      - Attribute Namespaces
+  "/attribute/{namespace}/_meta":
+    get:
+      summary: Show attribute namespace.
+      description: Shows attribute namespace.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: namespace
+        schema:
+          type: string
+        required: true
+        description: The namespace
+        example: OBS_TEST
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [attribute_namespace_meta.xsd](../schema/attribute_namespace_meta.xsd)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  name:
+                    type: string
+                    example: OBS_TEST
+                    xml:
+                      attribute: true
+                  modifiable_by:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        user:
+                          type: string
+                          example: user_login_name
+                          xml:
+                            attribute: true
+                xml:
+                  name: namespace
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: Not Found.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: not_found
+                summary: Couldn't find AttribNamespace
+      tags:
+      - Attribute Namespaces
+    post:
+      summary: Change attribute namespace. Create an attribute namespace if it doesn't
+        exist.
+      description: |
+        This endpoint can be used for both, creating an attribute namespace and updating it:
+          * If the attribute namespace passed as parameter doesn't exist, it will create the attribute namespace.
+          * If the attribute namespace passed as parameter already exists, it will update the namespace attribute.
+
+        This operation is the same as the one defined with [PUT](#/Attributes/put_attribute__namespace___meta).
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: namespace
+        schema:
+          type: string
+        required: true
+        description: The namespace
+        example: OBS_TEST
+      requestBody:
+        description: |
+          Attribute namespace definition.
+
+          XML Schema used for body validation: [attribute_namespace_meta.xsd](../schema/attribute_namespace_meta.xsd)
+        required: true
+        content:
+          application/xml; charset=utf-8:
+            schema:
+              type: object
+              properties:
+                name:
+                  type: string
+                  example: OBS_TEST
+                  xml:
+                    attribute: true
+                modifiable_by:
+                  type: array
+                  items:
+                    type: object
+                    properties:
+                      user:
+                        type: string
+                        example: user_login_name
+                        xml:
+                          attribute: true
+              xml:
+                name: namespace
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '400':
+          description: Validation Failed.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                empty_body:
+                  value:
+                    code: validation_failed
+                    summary: Document is empty, not allowed for attribute_namespace_meta
+                  summary: Validation Failed (Empty Body)
+                wrong_xml_element:
+                  value:
+                    code: validation_failed
+                    summary: 'attribute_namespace_meta validation error: 1:0: ERROR:
+                      Element ''foo'': No matching global declaration available for
+                      the validation root.'
+                  summary: Validation Failed (Wrong XML Element)
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: Not Found.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                namespace:
+                  value:
+                    code: not_found
+                    summary: Couldn't find AttribNamespace
+                  summary: Not Found (Namespace)
+                user:
+                  value:
+                    code: not_found
+                    summary: Couldn't find User with login = user_login_name
+                  summary: Not Found (User)
+      tags:
+      - Attribute Namespaces
+    put:
+      summary: Change attribute namespace. Create an attribute namespace if it doesn't
+        exist.
+      description: |
+        This endpoint can be used for both, creating an attribute namespace and updating it:
+          * If the attribute namespace passed as parameter doesn't exist, it will create the attribute namespace.
+          * If the attribute namespace passed as parameter already exists, it will update the namespace attribute.
+
+        This operation is the same as the one defined with [POST](#/Attributes/post_attribute__namespace___meta).
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: namespace
+        schema:
+          type: string
+        required: true
+        description: The namespace
+        example: OBS_TEST
+      requestBody:
+        description: |
+          Attribute namespace definition.
+
+          XML Schema used for body validation: [attribute_namespace_meta.xsd](../schema/attribute_namespace_meta.xsd)
+        required: true
+        content:
+          application/xml; charset=utf-8:
+            schema:
+              type: object
+              properties:
+                name:
+                  type: string
+                  example: OBS_TEST
+                  xml:
+                    attribute: true
+                modifiable_by:
+                  type: array
+                  items:
+                    type: object
+                    properties:
+                      user:
+                        type: string
+                        example: user_login_name
+                        xml:
+                          attribute: true
+              xml:
+                name: namespace
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '400':
+          description: Validation Failed.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                empty_body:
+                  value:
+                    code: validation_failed
+                    summary: Document is empty, not allowed for attribute_namespace_meta
+                  summary: Validation Failed (Empty Body)
+                wrong_xml_element:
+                  value:
+                    code: validation_failed
+                    summary: 'attribute_namespace_meta validation error: 1:0: ERROR:
+                      Element ''foo'': No matching global declaration available for
+                      the validation root.'
+                  summary: Validation Failed (Wrong XML Element)
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: Not Found.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                namespace:
+                  value:
+                    code: not_found
+                    summary: Couldn't find AttribNamespace
+                  summary: Not Found (Namespace)
+                user:
+                  value:
+                    code: not_found
+                    summary: Couldn't find User with login = user_login_name
+                  summary: Not Found (User)
+      tags:
+      - Attribute Namespaces
+    delete:
+      summary: Delete an attribute namespace and all attributes below.
+      description: |
+        Delete an attribute namespace and all attributes below.
+
+        This operation is the same as the one defined with [DELETE /attribute/{namespace}](#/Attributes/delete_attribute__namespace_).
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: namespace
+        schema:
+          type: string
+        required: true
+        description: The namespace
+        example: OBS_TEST
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+      tags:
+      - Attribute Namespaces
+  "/attribute/{namespace}/{attribute_name}":
+    delete:
+      summary: Delete an attribute and all its values in projects or packages.
+      description: |
+        Delete an attribute and all its values in projects or packages.
+
+        This operation is the same as the one defined with [DELETE /attribute/{namespace}/{attribute_name}/_meta](#/Attributes/delete_attribute__namespace___attribute_name___meta)
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: namespace
+        schema:
+          type: string
+        required: true
+        description: The namespace
+        example: OBS_TEST
+      - in: path
+        name: attribute_name
+        schema:
+          type: string
+        required: true
+        description: The name of the attribute
+        example: OBS:OwnerRootProjectTest
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: Not Found.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                namespace:
+                  value:
+                    code: not_found
+                    summary: Couldn't find AttribNamespace
+                  summary: Not Found (Namespace)
+      tags:
+      - Attributes
+  "/attribute/{namespace}/{attribute_name}/_meta":
+    get:
+      summary: Shows attribute.
+      description: Shows attribute.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: namespace
+        schema:
+          type: string
+        required: true
+        description: The namespace
+        example: OBS_TEST
+      - in: path
+        name: attribute_name
+        schema:
+          type: string
+        required: true
+        description: The name of the attribute
+        example: OBS:OwnerRootProjectTest
+      responses:
+        '200':
+          description: OK. The request has succeeded.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  name:
+                    type: string
+                    example: OBS_TEST
+                    xml:
+                      attribute: true
+                  namespace:
+                    type: string
+                    example: OwnerRootProjectTest
+                    xml:
+                      attribute: true
+                  description:
+                    type: string
+                    example: An example description for an attribute.
+                  allowed:
+                    type: object
+                    properties:
+                      value:
+                        type: array
+                        items:
+                          type: string
+                        example:
+                        - DisableDevelTest
+                        - BugownerOnlyTest
+                  count:
+                    type: integer
+                    example: 0
+                  modifiable_by:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        user:
+                          type: string
+                          example: user_login_name
+                          xml:
+                            attribute: true
+                xml:
+                  name: definition
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: Not Found.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                namespace:
+                  value:
+                    code: not_found
+                    summary: Couldn't find AttribNamespace
+                  summary: Not Found (Namespace)
+                unknown_attribute:
+                  value:
+                    code: unknown_attribute
+                    summary: Unknown attribute 'OBS_TEST':'OwnerRootProjectTest'
+                  summary: Unknown Attribute
+      tags:
+      - Attributes
+    post:
+      summary: Change attribute data. Create an attribute if it doesn't exist.
+      description: |
+        This endpoint can be used for both, creating an attribute and updating it:
+          * If the attribute passed as parameter doesn't exist, it will create the attribute.
+          * If the attribute passed as parameter already exists, it will update the attribute.
+
+        This operation is the same as the one defined with [PUT](#/Attributes/put_attribute__namespace___attribute_name___meta).
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: namespace
+        schema:
+          type: string
+        required: true
+        description: The namespace
+        example: OBS_TEST
+      - in: path
+        name: attribute_name
+        schema:
+          type: string
+        required: true
+        description: The name of the attribute
+        example: OBS:OwnerRootProjectTest
+      requestBody:
+        description: Attribute definition.
+        required: true
+        content:
+          application/xml; charset=utf-8:
+            schema:
+              type: object
+              properties:
+                name:
+                  type: string
+                  example: OBS_TEST
+                  xml:
+                    attribute: true
+                namespace:
+                  type: string
+                  example: OwnerRootProjectTest
+                  xml:
+                    attribute: true
+                description:
+                  type: string
+                  example: An example description for an attribute.
+                allowed:
+                  type: object
+                  properties:
+                    value:
+                      type: array
+                      items:
+                        type: string
+                      example:
+                      - DisableDevelTest
+                      - BugownerOnlyTest
+                count:
+                  type: integer
+                  example: 0
+                modifiable_by:
+                  type: array
+                  items:
+                    type: object
+                    properties:
+                      user:
+                        type: string
+                        example: user_login_name
+                        xml:
+                          attribute: true
+              xml:
+                name: definition
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '400':
+          description: Validation Failed.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                empty_body:
+                  value:
+                    code: validation_failed
+                    summary: Document is empty, not allowed for attrib_type
+                  summary: Validation Failed (Empty Body)
+                wrong_xml_element:
+                  value:
+                    code: validation_failed
+                    summary: 'attrib_type validation error: 1:0: ERROR: Element definition
+                      failed to validate attributes'
+                  summary: Validation Failed (Wrong XML Attributes)
+                illegal_request:
+                  value:
+                    code: illegal_request
+                    summary: 'Illegal request: PUT/POST /attribute/OBS_TEST/OwnerRootProjectTest/_meta:
+                      path does not match content'
+                  summary: Illegal Request
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: Not Found.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                namespace:
+                  value:
+                    code: not_found
+                    summary: Couldn't find AttribNamespace
+                  summary: Not Found (Namespace)
+                unknown_attribute:
+                  value:
+                    code: unknown_attribute
+                    summary: Unknown attribute 'OBS_TEST':'OwnerRootProjectTest'
+                  summary: Unknown Attribute
+      tags:
+      - Attributes
+    put:
+      summary: Change attribute data. Create an attribute if it doesn't exist.
+      description: |
+        This endpoint can be used for both, creating an attribute and updating it:
+          * If the attribute passed as parameter doesn't exist, it will create the attribute.
+          * If the attribute passed as parameter already exists, it will update the attribute.
+
+        This operation is the same as the one defined with [POST](#/Attributes/post_attribute__namespace___attribute_name___meta).
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: namespace
+        schema:
+          type: string
+        required: true
+        description: The namespace
+        example: OBS_TEST
+      - in: path
+        name: attribute_name
+        schema:
+          type: string
+        required: true
+        description: The name of the attribute
+        example: OBS:OwnerRootProjectTest
+      requestBody:
+        description: Attribute definition.
+        required: true
+        content:
+          application/xml; charset=utf-8:
+            schema:
+              type: object
+              properties:
+                name:
+                  type: string
+                  example: OBS_TEST
+                  xml:
+                    attribute: true
+                namespace:
+                  type: string
+                  example: OwnerRootProjectTest
+                  xml:
+                    attribute: true
+                description:
+                  type: string
+                  example: An example description for an attribute.
+                allowed:
+                  type: object
+                  properties:
+                    value:
+                      type: array
+                      items:
+                        type: string
+                      example:
+                      - DisableDevelTest
+                      - BugownerOnlyTest
+                count:
+                  type: integer
+                  example: 0
+                modifiable_by:
+                  type: array
+                  items:
+                    type: object
+                    properties:
+                      user:
+                        type: string
+                        example: user_login_name
+                        xml:
+                          attribute: true
+              xml:
+                name: definition
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '400':
+          description: Validation Failed.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                empty_body:
+                  value:
+                    code: validation_failed
+                    summary: Document is empty, not allowed for attrib_type
+                  summary: Validation Failed (Empty Body)
+                wrong_xml_element:
+                  value:
+                    code: validation_failed
+                    summary: 'attrib_type validation error: 1:0: ERROR: Element definition
+                      failed to validate attributes'
+                  summary: Validation Failed (Wrong XML Attributes)
+                illegal_request:
+                  value:
+                    code: illegal_request
+                    summary: 'Illegal request: PUT/POST /attribute/OBS_TEST/OwnerRootProjectTest/_meta:
+                      path does not match content'
+                  summary: Illegal Request
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: Not Found.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                namespace:
+                  value:
+                    code: not_found
+                    summary: Couldn't find AttribNamespace
+                  summary: Not Found (Namespace)
+                unknown_attribute:
+                  value:
+                    code: unknown_attribute
+                    summary: Unknown attribute 'OBS_TEST':'OwnerRootProjectTest'
+                  summary: Unknown Attribute
+      tags:
+      - Attributes
+    delete:
+      summary: Delete an attribute and all its values in projects or packages.
+      description: |
+        Delete an attribute and all its values in projects or packages.
+
+        This operation is the same as the one defined with [DELETE /attribute/{namespace}/{attribute_name}](#/Attributes/delete_attribute__namespace___attribute_name_)
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: namespace
+        schema:
+          type: string
+        required: true
+        description: The namespace
+        example: OBS_TEST
+      - in: path
+        name: attribute_name
+        schema:
+          type: string
+        required: true
+        description: The name of the attribute
+        example: OBS:OwnerRootProjectTest
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: Not Found.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                namespace:
+                  value:
+                    code: not_found
+                    summary: Couldn't find AttribNamespace
+                  summary: Not Found (Namespace)
+      tags:
+      - Attributes
+  "/build":
+    get:
+      summary: Get a simple directory listing of all projects
+      description: Get a simple directory listing of all projects
+      security:
+      - basic_authentication: []
+      responses:
+        '200':
+          description: |
+            OK
+
+            XML Schema used for body validation: [directory.xsd](../schema/directory.xsd)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  count:
+                    type: integer
+                    xml:
+                      attribute: true
+                  name:
+                    type: string
+                    xml:
+                      attribute: true
+                  rev:
+                    type: string
+                    xml:
+                      attribute: true
+                  vrev:
+                    type: string
+                    xml:
+                      attribute: true
+                  srcmd5:
+                    type: string
+                    xml:
+                      attribute: true
+                  entry:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        name:
+                          type: string
+                          xml:
+                            attribute: true
+                        md5:
+                          type: string
+                          xml:
+                            attribute: true
+                        size:
+                          type: string
+                          xml:
+                            attribute: true
+                        mtime:
+                          type: string
+                          xml:
+                            attribute: true
+                xml:
+                  name: directory
+              example:
+                entry:
+                - name: openSUSE:Leap:15.1
+                - name: openSUSE:Leap:15.2
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+      tags:
+      - Build
+  "/build/_workerstatus":
+    get:
+      deprecated: true
+      summary: Lists status of workers, jobs, backend services and general statistics.
+      description: |
+        Lists status of workers, running jobs, waiting jobs, status of the backend services and general statistics.
+
+        This endpoint is exactly the same as `GET /worker/_status`, please use that one.
+      security:
+      - basic_authentication: []
+      responses:
+        '200':
+          description: OK
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  clients:
+                    type: integer
+                    xml:
+                      attribute: true
+                  idle:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        workerid:
+                          type: string
+                          xml:
+                            attribute: true
+                        hostarch:
+                          type: string
+                          xml:
+                            attribute: true
+                  building:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        repository:
+                          type: string
+                          xml:
+                            attribute: true
+                        arch:
+                          type: string
+                          xml:
+                            attribute: true
+                        project:
+                          type: string
+                          xml:
+                            attribute: true
+                        package:
+                          type: string
+                          xml:
+                            attribute: true
+                        starttime:
+                          type: string
+                          xml:
+                            attribute: true
+                        workerid:
+                          type: string
+                          xml:
+                            attribute: true
+                        hostarch:
+                          type: string
+                          xml:
+                            attribute: true
+                  down:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        workerid:
+                          type: string
+                          xml:
+                            attribute: true
+                        hostarch:
+                          type: string
+                          xml:
+                            attribute: true
+                  waiting:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        arch:
+                          type: string
+                          xml:
+                            attribute: true
+                        jobs:
+                          type: string
+                          xml:
+                            attribute: true
+                  blocked:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        arch:
+                          type: string
+                          xml:
+                            attribute: true
+                        jobs:
+                          type: string
+                          xml:
+                            attribute: true
+                  buildavg:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        arch:
+                          type: string
+                          xml:
+                            attribute: true
+                        buildavg:
+                          type: string
+                          xml:
+                            attribute: true
+                  partition:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        name:
+                          type: string
+                          xml:
+                            attribute: true
+                        daemon:
+                          type: array
+                          items:
+                            type: object
+                            properties:
+                              type:
+                                type: string
+                                xml:
+                                  attribute: true
+                              state:
+                                type: string
+                                xml:
+                                  attribute: true
+                              starttime:
+                                type: string
+                                xml:
+                                  attribute: true
+                              arch:
+                                type: string
+                                xml:
+                                  attribute: true
+                              queue:
+                                type: object
+                                properties:
+                                  high:
+                                    type: string
+                                    xml:
+                                      attribute: true
+                                  med:
+                                    type: string
+                                    xml:
+                                      attribute: true
+                                  low:
+                                    type: string
+                                    xml:
+                                      attribute: true
+                                  next:
+                                    type: string
+                                    xml:
+                                      attribute: true
+                xml:
+                  name: workerstatus
+              example:
+                clients: '2'
+                idle:
+                - workerid: 1a1f67b948b6:1
+                  hostarch: x86_64
+                building:
+                - repository: openSUSE_11.3_Update
+                  arch: x86_64
+                  project: home:enzokiel
+                  package: android-sdk
+                  starttime: '1289838671'
+                  workerid: 1a1f67b948b6:2
+                  hostarch: x86_64
+                down:
+                - workerid: armbuild03:1
+                  hostarch: aarch64
+                waiting:
+                - arch: i586
+                  jobs: '0'
+                - arch: x86_64
+                  jobs: '0'
+                blocked:
+                - arch: i586
+                  jobs: '0'
+                - arch: x86_64
+                  jobs: '0'
+                buildavg:
+                - arch: i586
+                  buildavg: '1200'
+                - arch: x86_64
+                  buildavg: '1200'
+                partition:
+                - daemon:
+                  - type: srcserver
+                    state: running
+                    starttime: '1617711138'
+                  - type: servicedispatch
+                    state: running
+                    starttime: '1617711144'
+                  - type: service
+                    state: running
+                    starttime: '1617711144'
+                  - type: clouduploadserver
+                    state: running
+                    starttime: '1617711145'
+                  - type: clouduploadworker
+                    state: running
+                    starttime: '1617711144'
+                  - type: scheduler
+                    arch: i586
+                    state: running
+                    starttime: '1617711145'
+                    queue:
+                      high: '0'
+                      med: '0'
+                      low: '11'
+                      next: '0'
+                  - type: scheduler
+                    arch: x86_64
+                    state: running
+                    starttime: '1617711145'
+                    queue:
+                      high: '0'
+                      med: '0'
+                      low: '11'
+                      next: '0'
+                  - type: repserver
+                    state: running
+                    starttime: '1617711143'
+                  - type: dispatcher
+                    state: running
+                    starttime: '1617711144'
+                  - type: publisher
+                    state: running
+                    starttime: '1617711145'
+                  - type: signer
+                    state: running
+                    starttime: '1617711146'
+                - name: back-main
+                  daemon:
+                  - type: scheduler
+                    arch: aarch64
+                    state: running
+                    starttime: '1617148925'
+                    queue:
+                      high: '0'
+                      med: '1'
+                      low: '4'
+                      next: '22'
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+      tags:
+      - Build
+  "/build/{project_name}":
+    get:
+      summary: Get a simple directory listing of all repositories for the specified
+        project
+      description: Get a simple directory listing of all repositories for the specified
+        project
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      responses:
+        '200':
+          description: |
+            OK
+
+            XML Schema used for body validation: [directory.xsd](../schema/directory.xsd)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  count:
+                    type: integer
+                    xml:
+                      attribute: true
+                  name:
+                    type: string
+                    xml:
+                      attribute: true
+                  rev:
+                    type: string
+                    xml:
+                      attribute: true
+                  vrev:
+                    type: string
+                    xml:
+                      attribute: true
+                  srcmd5:
+                    type: string
+                    xml:
+                      attribute: true
+                  entry:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        name:
+                          type: string
+                          xml:
+                            attribute: true
+                        md5:
+                          type: string
+                          xml:
+                            attribute: true
+                        size:
+                          type: string
+                          xml:
+                            attribute: true
+                        mtime:
+                          type: string
+                          xml:
+                            attribute: true
+                xml:
+                  name: directory
+              example:
+                entry:
+                - name: openSUSE_Tumbleweed
+                - name: openSUSE_Leap_15.3
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: |
+            Unknown project.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: <some project>.'
+      tags:
+      - Build
+    post:
+      summary: Apply different actions on builds/build processes of the specified
+        project
+      description: Apply different actions on builds/build processes of the specified
+        project
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: query
+        name: package
+        schema:
+          type: string
+        description: Name of the package. Scope the commands to the specified package.
+        example: firefox
+      - in: query
+        name: arch
+        schema:
+          type: string
+        description: Name of the build architecture. Scope the commands to the specified
+          architectures.
+        example: x86_64
+      - in: query
+        name: repository
+        schema:
+          type: string
+        description: Name of the repository. Scope the commands to the specified repository.
+        example: openSUSE_Leap_15.2
+      - in: query
+        name: cmd
+        required: true
+        schema:
+          type: string
+          enum:
+          - wipe
+          - restartbuild
+          - killbuild
+          - abortbuild
+          - rebuild
+          - unpublish
+          - sendsysrq
+        description: |
+          **NOTE**: All commands described below, can be scoped to a package within the project by setting the `package`
+          parameter.
+
+          * `wipe`: Delete all binaries build by the project.
+          * `restartbuild`: Restart all running build processes inside the project.
+          * `rebuild`: Trigger a rebuild of all packages inside the project.
+          * `abortbuild`: Abort all running build processes for the specified project, marking them as failed.
+          * `killbuild`: Alias for `abortbuild`.
+          * `unpublish`: Delete all published package binaries, for the specified project, from the download repository.
+          * `sendsysrq`: Send a single sysrq character to the kernel of a running build. Character need to be specified
+                         through the `sysrq` parameter. Only a subset of debugging requests are supported (eg. 9, t or w).
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '400':
+          description: |
+            Illegal request.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Illegal Request:
+                  value:
+                    code: illegal_request
+                    summary: unsupported POST command '<some command>' to <some url>.
+        '403':
+          description: |
+            Execute command no permission.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Execute cmd no permission:
+                  value:
+                    code: execute_cmd_no_permission
+                    summary: No permission to execute command on package <some package>
+                      in project <some project>
+        '404':
+          description: |
+            Unknown project.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: <some project>.'
+      tags:
+      - Build
+  "/build/{project_name}/_result":
+    get:
+      summary: Get the build results for packages, architectures and repositories
+        of the specified project.
+      description: Get the build results for packages, architectures and repositories
+        of the specified project.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: query
+        name: view
+        schema:
+          type: string
+          enum:
+          - status
+          - summary
+          - binarylist
+        default: status
+        description: |
+          Specify which sections should be included in the result list.
+
+          * `status`: Include detailed infos about the build status.
+          * `summary`: Include the summary of the status values.
+          * `binarylist`: Include a list of generated binary files.
+      - in: query
+        name: package
+        schema:
+          type: string
+        description: Name of the package. Limit results to the specified package.
+        example: obs-server
+      - in: query
+        name: arch
+        schema:
+          type: string
+        description: Name of the build architecture. Limit results to the specified
+          build architecture.
+        example: x86_64
+      - in: query
+        name: repository
+        schema:
+          type: string
+        description: Name of the repository. Limit results to the specified repository.
+        example: openSUSE_Leap_15.2
+      - in: query
+        name: lastbuild
+        schema:
+          type: string
+        description: Set to `1` to show the last build result (excludes current building
+          job states).
+        enum:
+        - 0
+        - 1
+        default: 0
+        example: 1
+      - in: query
+        name: locallink
+        schema:
+          type: string
+        description: Set to `1` to include build results from packages with project
+          local links.
+        enum:
+        - 0
+        - 1
+        default: 0
+        example: 1
+      - in: query
+        name: multibuild
+        schema:
+          type: string
+        description: Set to `1` to include build results from _multibuild definitions.
+        enum:
+        - 0
+        - 1
+        default: 0
+        example: 1
+      responses:
+        '200':
+          description: |
+            OK.
+
+            XML Schema used for body validation: [buildresult.rng](../schema/buildresult.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  state:
+                    type: string
+                    example: e096d16554264fa553ca0aa3226cf189
+                    xml:
+                      attribute: true
+                  result:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        project:
+                          type: string
+                          example: home:foo
+                          xml:
+                            attribute: true
+                        repository:
+                          type: string
+                          example: openSUSE_Leap_15.3
+                          xml:
+                            attribute: true
+                        arch:
+                          type: string
+                          example: x86_64
+                          xml:
+                            attribute: true
+                        code:
+                          type: string
+                          example: published
+                          xml:
+                            attribute: true
+                        state:
+                          type: string
+                          example: published
+                          xml:
+                            attribute: true
+                        status:
+                          type: array
+                          items:
+                            type: object
+                            properties:
+                              package:
+                                type: string
+                                example: ctris
+                                xml:
+                                  attribute: true
+                              code:
+                                type: string
+                                example: succeeded
+                                xml:
+                                  attribute: true
+                              details:
+                                type: string
+                                example: package whitelist
+                        binarylist:
+                          type: array
+                          items:
+                            type: object
+                            properties:
+                              package:
+                                type: string
+                                example: ctris
+                                xml:
+                                  attribute: true
+                              binary:
+                                type: array
+                                items:
+                                  type: object
+                                  properties:
+                                    filename:
+                                      type: string
+                                      example: hello-2.10-3.1.x86_64.rpm
+                                      xml:
+                                        attribute: true
+                                    size:
+                                      type: string
+                                      example: '58352'
+                                      xml:
+                                        attribute: true
+                                    mtime:
+                                      type: string
+                                      example: '1617270174'
+                                      xml:
+                                        attribute: true
+                        summary:
+                          type: object
+                          properties:
+                            statuscount:
+                              type: array
+                              items:
+                                type: object
+                                properties:
+                                  code:
+                                    type: string
+                                    example: disabled
+                                    xml:
+                                      attribute: true
+                                  count:
+                                    type: string
+                                    example: '2'
+                                    xml:
+                                      attribute: true
+                xml:
+                  name: resultlist
+        '400':
+          description: Bad Request.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Not Boolean:
+                  description: Passing a value different than `0` or `1` to `multibuild`,
+                    for example.
+                  value:
+                    code: 400
+                    summary: not boolean
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: |
+            Unknown project.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: <some project>.'
+      tags:
+      - Build
+  "/build/{project_name}/{repository_name}":
+    get:
+      summary: List of all architectures the specified project builds against a given
+        repository.
+      description: List of all architectures the specified project builds against
+        a given repository.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: repository_name
+        schema:
+          type: string
+        required: true
+        description: Repository name
+        example: openSUSE_Tumbleweed
+      responses:
+        '200':
+          description: |
+            OK
+
+            XML Schema used for body validation: [directory.xsd](../schema/directory.xsd)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  count:
+                    type: integer
+                    xml:
+                      attribute: true
+                  name:
+                    type: string
+                    xml:
+                      attribute: true
+                  rev:
+                    type: string
+                    xml:
+                      attribute: true
+                  vrev:
+                    type: string
+                    xml:
+                      attribute: true
+                  srcmd5:
+                    type: string
+                    xml:
+                      attribute: true
+                  entry:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        name:
+                          type: string
+                          xml:
+                            attribute: true
+                        md5:
+                          type: string
+                          xml:
+                            attribute: true
+                        size:
+                          type: string
+                          xml:
+                            attribute: true
+                        mtime:
+                          type: string
+                          xml:
+                            attribute: true
+                xml:
+                  name: directory
+              example:
+                entry:
+                - name: x86_64
+                - name: i586
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: Not Found.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: 404
+                summary: project '<project_name>' has no repository '<repository_name>'
+                details: 404 project '<project_name>' has no repository '<repository_name>'
+      tags:
+      - Build
+  "/build/{project_name}/{repository_name}/_buildconfig":
+    get:
+      summary: Show the build configuration for the specified repository.
+      description: |
+        Show the build configuration for the specified repository. Includes all base package
+        requirements, mappings and macros.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: repository_name
+        schema:
+          type: string
+        required: true
+        description: Repository name
+        example: openSUSE_Tumbleweed
+      responses:
+        '200':
+          description: OK
+          content:
+            text/plain:
+              example: |
+                %define _project home:Admin
+
+                ### from openSUSE.org:openSUSE:Leap:15.2
+                %define _repository standard
+
+                Macros:
+                %vendor obs://build.some.where/home:Admin
+                %_project home:Admin
+
+                ### from openSUSE.org:openSUSE:Leap:15.2
+
+                %_repository standard
+                :Macros
+
+
+                Release: <CI_CNT>.<B_CNT> spec:lp152.<CI_CNT>.<B_CNT>
+                %define gcc_version 7
+
+                # testing new cycle algorithm
+                BuildFlags: genmetaalgo:1
+
+                # abort the build if the log file didn't move in an hour (seen in libreoffice builds)
+                BuildFlags: logidlelimit:3600
+
+                PublishFlags: ympdist:openSUSE%20Leap%2015.2
+
+                # Help with the switch to the gcc7 provided libs
+                Prefer: -libstdc++6-gcc7 -libtsan0-gcc7 -libgomp1-gcc7 -libgcc_s1-gcc7 -libatomic1-gcc7 -libcilkrts5-gcc7 -libitm1-gcc7
+                Prefer: -liblsan0-gcc7 -libmpx2-gcc7 -libubsan0-gcc7
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: |
+            Unknown project.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: <some project>.'
+      tags:
+      - Build
+  "/build/{project_name}/{repository_name}/{architecture_name}/_builddepinfo":
+    get:
+      summary: Show the build dependencies of packages that are part of the project.
+      description: |
+        Show the build dependencies of packages that are part of the project,
+        for a given repository and architecture.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: repository_name
+        schema:
+          type: string
+        required: true
+        description: Repository name
+        example: openSUSE_Tumbleweed
+      - in: path
+        name: architecture_name
+        schema:
+          type: string
+        required: true
+        description: Architecture name
+        example: x86_64
+      - in: query
+        name: package
+        schema:
+          type: string
+        description: Name of the package. Limit results to the specified package.
+        example: obs-server
+      - in: query
+        name: view
+        schema:
+          type: string
+          enum:
+          - pkgnames
+          - revpkgnames
+          - order
+        description: |
+          * `pkgnames`: Show whole package dependencies, instead of individual binaries.
+          * `revpkgnames`: Show which packages depend on the provided project/package for
+            the given repository/architecture, and therefore a rebuild gets triggered on change.
+          * `order`: Show packages ordered by dependencies.
+      responses:
+        '200':
+          description: OK
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  package:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        name:
+                          type: string
+                          example: memcached
+                          xml:
+                            attribute: true
+                        source:
+                          type: string
+                          example: memcached
+                        pkgdep:
+                          type: array
+                          items:
+                            type: string
+                            example:
+                            - gzip
+                            - obs-server
+                        subpkg:
+                          type: array
+                          items:
+                            type: string
+                            example:
+                            - memcached-devel
+                            - memcached-debugsource
+                xml:
+                  name: builddepinfo
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: |
+            Unknown project.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: <some project>.'
+      tags:
+      - Build
+  "/build/{project_name}/{repository_name}/{architecture_name}/_jobhistory":
+    get:
+      summary: Get the build log of all finished builds.
+      description: Get the build log of all finished builds, for a given project,
+        repository and architecture.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: repository_name
+        schema:
+          type: string
+        required: true
+        description: Repository name
+        example: openSUSE_Tumbleweed
+      - in: path
+        name: architecture_name
+        schema:
+          type: string
+        required: true
+        description: Architecture name
+        example: x86_64
+      - in: query
+        name: code
+        schema:
+          type: string
+        description: 'Filter results by finished build code: `failed`, `succeeded`,
+          `unchanged`.'
+        example: succeeded
+      - in: query
+        name: endtime_end
+        schema:
+          type: integer
+        description: Show builds which finished before given time.
+        example: 1714135617
+      - in: query
+        name: endtime_start
+        schema:
+          type: integer
+        description: Show builds which finished after given time.
+        example: 1714130617
+      - in: query
+        name: limit
+        schema:
+          type: integer
+        description: Limit the number of retrieved results elements to the specified
+          number.
+        example: 10
+      - in: query
+        name: package
+        schema:
+          type: string
+        description: Name of the package. Limit results to the specified package.
+        example: obs-server
+      responses:
+        '200':
+          description: OK
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: array
+                items:
+                  type: object
+                  properties:
+                    package:
+                      type: string
+                      xml:
+                        attribute: true
+                    rev:
+                      type: string
+                      xml:
+                        attribute: true
+                    srcmd5:
+                      type: string
+                      xml:
+                        attribute: true
+                    versrel:
+                      type: string
+                      xml:
+                        attribute: true
+                    bcnt:
+                      type: integer
+                      xml:
+                        attribute: true
+                    readytime:
+                      type: integer
+                      xml:
+                        attribute: true
+                    starttime:
+                      type: integer
+                      xml:
+                        attribute: true
+                    endtime:
+                      type: integer
+                      xml:
+                        attribute: true
+                    code:
+                      type: string
+                      xml:
+                        attribute: true
+                    uri:
+                      type: string
+                      xml:
+                        attribute: true
+                    workerid:
+                      type: string
+                      xml:
+                        attribute: true
+                    hostarch:
+                      type: string
+                      xml:
+                        attribute: true
+                    reason:
+                      type: string
+                      xml:
+                        attribute: true
+                    verifymd5:
+                      type: string
+                      xml:
+                        attribute: true
+                  xml:
+                    name: jobhist
+                xml:
+                  wrapped: true
+                  name: jobhistlist
+              example:
+              - package: obs-server
+                rev: 17367
+                srcmd5: e2fc6b9e014441f3f8a33beb62446215
+                versrel: 2.11~alpha.20240426T143809.ab0551f7-16803
+                bcnt: 1
+                readytime: 1714135430
+                starttime: 1714135490
+                endtime: 1714135617
+                code: succeeded
+                uri: http://192.168.2.130:42344
+                workerid: i02-ch1d:21
+                hostarch: x86_64
+                reason: source change
+                verifymd5: 518a4d1c0e95fe3c04117aafba722a1f
+              - package: obs-server:obs-bundled-gems
+                rev: 17368
+                srcmd5: feac17ca9cf334d57d719f3ba52a300f
+                versrel: 2.11~alpha.20240426T150958.ca259016-16804
+                bcnt: 1
+                readytime: 1714137054
+                starttime: 1714137078
+                endtime: 1714137296
+                code: succeeded
+                uri: http://192.168.2.130:42344
+                workerid: i04-ch4d:9
+                hostarch: x86_64
+                reason: source change
+                verifymd5: f81504abf10aaca978a8acea9eaa5bf5
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: |
+            Unknown project.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: <some project>.'
+      tags:
+      - Build
+  "/build/{project_name}/{repository_name}/{architecture_name}/_repository":
+    get:
+      summary: List all binaries (produced by all packages of the given project).
+      description: |
+        List all binaries (produced by all packages of the given project) for the specified
+        repository and architecture.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: repository_name
+        schema:
+          type: string
+        required: true
+        description: Repository name
+        example: openSUSE_Tumbleweed
+      - in: path
+        name: architecture_name
+        schema:
+          type: string
+        required: true
+        description: Architecture name
+        example: x86_64
+      responses:
+        '200':
+          description: OK.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  binary:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        filename:
+                          type: string
+                          example: hello-2.10-3.1.x86_64.rpm
+                          xml:
+                            attribute: true
+                        size:
+                          type: string
+                          example: '58352'
+                          xml:
+                            attribute: true
+                        mtime:
+                          type: string
+                          example: '1617270174'
+                          xml:
+                            attribute: true
+                xml:
+                  name: binarylist
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: |
+            Unknown project.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: <some project>.'
+      tags:
+      - Build
+  "/build/{project_name}/{repository_name}/{architecture_name}/{package_name}":
+    get:
+      summary: List binaries built by the sources of the specified package.
+      description: List binaries built by the sources of the specified package.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: repository_name
+        schema:
+          type: string
+        required: true
+        description: Repository name
+        example: openSUSE_Tumbleweed
+      - in: path
+        name: architecture_name
+        schema:
+          type: string
+        required: true
+        description: Architecture name
+        example: x86_64
+      - in: path
+        name: package_name
+        schema:
+          type: string
+        required: true
+        description: Package name
+        example: ctris
+      responses:
+        '200':
+          description: OK.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  binary:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        filename:
+                          type: string
+                          example: hello-2.10-3.1.x86_64.rpm
+                          xml:
+                            attribute: true
+                        size:
+                          type: string
+                          example: '58352'
+                          xml:
+                            attribute: true
+                        mtime:
+                          type: string
+                          example: '1617270174'
+                          xml:
+                            attribute: true
+                xml:
+                  name: binarylist
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: |
+            Unknown project.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: <some project>.'
+      tags:
+      - Build
+  "/build/{project_name}/{repository_name}/{architecture_name}/{package_name}/_buildenv":
+    get:
+      summary: Return the environment information for the last performed build.
+      description: Get specifics of the environment information for the last performed
+        build.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: repository_name
+        schema:
+          type: string
+        required: true
+        description: Repository name
+        example: openSUSE_Tumbleweed
+      - in: path
+        name: architecture_name
+        schema:
+          type: string
+        required: true
+        description: Architecture name
+        example: x86_64
+      - in: path
+        name: package_name
+        schema:
+          type: string
+        required: true
+        description: Package name
+        example: ctris
+      responses:
+        '200':
+          description: OK. The request has succeeded.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  project:
+                    type: string
+                    example: home:Admin
+                    xml:
+                      attribute: true
+                  repository:
+                    type: string
+                    example: openSUSE_Tumbleweed
+                    xml:
+                      attribute: true
+                  package:
+                    type: string
+                    example: ctris
+                    xml:
+                      attribute: true
+                  arch:
+                    type: string
+                    example: i586
+                  srcmd5:
+                    type: string
+                    example: 6b7c8d9cb5c5d36453c1dc8e102016b1
+                  verifymd5:
+                    type: string
+                    example: 6b7c8d9cb5c5d36453c1dc8e102016b1
+                  versrel:
+                    type: string
+                    example: 0.42.1-3
+                  bcnt:
+                    type: string
+                    example: '2'
+                  release:
+                    type: string
+                    example: '3.2'
+                  config:
+                    type: string
+                    example: |
+                      %define _project home:enavarro_suse
+
+                      ### from openSUSE:Factory
+                      %define _repository ports
+
+                      Macros:
+                      %vendor obs://build.opensuse.org/home:enavarro_suse
+                      %_download_url https://download.opensuse.org/repositories
+                      %_project home:enavarro_suse
+                  bdep:
+                    type: object
+                    properties:
+                      name:
+                        type: string
+                        example: liblua5_4-5
+                        xml:
+                          attribute: true
+                      hdrmd5:
+                        type: string
+                        example: 4f50c1ea427e184620686ded4baa3097
+                        xml:
+                          attribute: true
+                      project:
+                        type: string
+                        example: openSUSE:Tumbleweed
+                        xml:
+                          attribute: true
+                      repository:
+                        type: string
+                        example: dod
+                        xml:
+                          attribute: true
+                xml:
+                  name: buildinfo
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: |
+            Error: Not Found
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: unknown_project
+                summary: 'Project not found: 1'
+      tags:
+      - Build
+  "/build/{project_name}/{repository_name}/{architecture_name}/{package_name}/_buildinfo":
+    get:
+      summary: Return build information about a build description would produce.
+      description: |
+        Get build information using the default spec file.
+
+        To use other file than the default spec file, use this same endpoint path with the `POST` action.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: repository_name
+        schema:
+          type: string
+        required: true
+        description: Repository name
+        example: openSUSE_Tumbleweed
+      - in: path
+        name: architecture_name
+        schema:
+          type: string
+        required: true
+        description: Architecture name
+        example: x86_64
+      - in: path
+        name: package_name
+        schema:
+          type: string
+        required: true
+        description: Package name
+        example: ctris
+      - name: add
+        in: query
+        schema:
+          type: array
+          items:
+            type: string
+        description: Add a list of build dependencies (`BuildRequires`) to the build.
+        example:
+        - less
+        - vim
+      - name: debug
+        in: query
+        schema:
+          type: string
+        description: Set to `1` to add debug information about dependencies. This
+          information is added inside an `expandeddebug` xml element.
+        example: 0
+      responses:
+        '200':
+          description: Returns the artifact building information.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  project:
+                    type: string
+                    example: home:Admin
+                    xml:
+                      attribute: true
+                  repository:
+                    type: string
+                    example: openSUSE_Tumbleweed
+                    xml:
+                      attribute: true
+                  package:
+                    type: string
+                    example: ctris
+                    xml:
+                      attribute: true
+                  arch:
+                    type: string
+                    example: i586
+                  srcmd5:
+                    type: string
+                    example: 6b7c8d9cb5c5d36453c1dc8e102016b1
+                  verifymd5:
+                    type: string
+                    example: 6b7c8d9cb5c5d36453c1dc8e102016b1
+                  rev:
+                    type: integer
+                    example: 3
+                  specfile:
+                    type: string
+                    example: ctris.spec
+                  file:
+                    type: string
+                    example: ctris.spec
+                  versrel:
+                    type: string
+                    example: 0.42.1-3
+                  bcnt:
+                    type: string
+                    example: '2'
+                  release:
+                    type: string
+                    example: '3.2'
+                  debuginfo:
+                    type: integer
+                    example: 0
+                  subpack:
+                    type: string
+                    example: ctris
+                  bdep:
+                    type: object
+                    properties:
+                      name:
+                        type: string
+                        example: liblua5_4-5
+                        xml:
+                          attribute: true
+                      preinstall:
+                        type: string
+                        example: '1'
+                        xml:
+                          attribute: true
+                      notmeta:
+                        type: string
+                        example: '1'
+                        xml:
+                          attribute: true
+                      version:
+                        type: string
+                        example: 5.4.2
+                        xml:
+                          attribute: true
+                      release:
+                        type: string
+                        example: '3.1'
+                        xml:
+                          attribute: true
+                      arch:
+                        type: string
+                        example: i586
+                        xml:
+                          attribute: true
+                      project:
+                        type: string
+                        example: openSUSE.org:openSUSE:Tumbleweed
+                        xml:
+                          attribute: true
+                      repository:
+                        type: string
+                        example: dod
+                        xml:
+                          attribute: true
+                  path:
+                    type: object
+                    properties:
+                      project:
+                        type: string
+                        example: home:Admin
+                        xml:
+                          attribute: true
+                      repository:
+                        type: string
+                        example: openSUSE_Tumbleweed
+                        xml:
+                          attribute: true
+                      url:
+                        type: string
+                        example: https://download.opensuse.org/repositories/home:/enavarro_suse/openSUSE_Tumbleweed/
+                        xml:
+                          attribute: true
+                  expanddebug:
+                    type: string
+                    example: |
+                      === meta deps expansion
+                      expand args: rpm-build gcc-PIE
+                      added rpm-build@openSUSE:Tumbleweed/dod because of (direct):rpm-build
+                      added gcc-PIE@openSUSE:Tumbleweed/dod because of (direct):gcc-PIE
+                      --- now doing normal dependencies
+                      added glibc@openSUSE:Tumbleweed/dod because of rpm-build:libc.so.6(GLIBC_2.34)(64bit)
+                      added glibc@openSUSE:Tumbleweed/dod because of rpm-build:libc.so.6(GLIBC_2.4)(64bit)
+                xml:
+                  name: buildinfo
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: |
+            Error: Not Found
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: unknown_project
+                summary: 'Project not found: 1'
+      tags:
+      - Build
+    post:
+      summary: Return build information about a build description would produce.
+      description: |
+        Get build information using the file passed in the request body.
+
+        Despite using the method `POST`, this endpoint doesn't alter any data.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: repository_name
+        schema:
+          type: string
+        required: true
+        description: Repository name
+        example: openSUSE_Tumbleweed
+      - in: path
+        name: architecture_name
+        schema:
+          type: string
+        required: true
+        description: Architecture name
+        example: x86_64
+      - in: path
+        name: package_name
+        schema:
+          type: string
+        required: true
+        description: |
+          Package name.
+
+          It can take the value `_repository`, if the designated package does not exist yet in the server.
+          This is useful for testing a build locally before committing a package.
+        examples:
+          Normal Package Name:
+            value: ctris
+          No Package Yet:
+            value: _repository
+      - name: add
+        in: query
+        schema:
+          type: array
+          items:
+            type: string
+        description: Add a list of build dependencies (`BuildRequires`) to the build.
+        example:
+        - less
+        - vim
+      - name: debug
+        in: query
+        schema:
+          type: string
+        description: Set to `1` to add debug information about dependencies. This
+          information is added inside an `expandeddebug` xml element.
+        example: 0
+      requestBody:
+        description: A RPM specfile or a Debian "dsc" file.
+        required: true
+        content:
+          text/plain:
+            schema:
+              type: string
+            example: |
+              Name:       hello_world
+              Version:    1
+              Release:    1
+              Summary:    Most simple RPM package
+              License:    CC0-1.0
+
+              %build
+              cat > hello_world.sh <<EOF
+              #!/usr/bin/bash
+              echo Hello world
+              EOF
+
+              %install
+              mkdir -p %{buildroot}/usr/bin/
+              install -m 755 hello_world.sh %{buildroot}/usr/bin/hello_world.sh
+
+              %files
+              /usr/bin/hello_world.sh
+      responses:
+        '200':
+          description: Returns the artifact building information.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  project:
+                    type: string
+                    example: home:Admin
+                    xml:
+                      attribute: true
+                  repository:
+                    type: string
+                    example: openSUSE_Tumbleweed
+                    xml:
+                      attribute: true
+                  package:
+                    type: string
+                    example: ctris
+                    xml:
+                      attribute: true
+                  arch:
+                    type: string
+                    example: i586
+                  srcmd5:
+                    type: string
+                    example: 6b7c8d9cb5c5d36453c1dc8e102016b1
+                  verifymd5:
+                    type: string
+                    example: 6b7c8d9cb5c5d36453c1dc8e102016b1
+                  rev:
+                    type: integer
+                    example: 3
+                  specfile:
+                    type: string
+                    example: ctris.spec
+                  file:
+                    type: string
+                    example: ctris.spec
+                  versrel:
+                    type: string
+                    example: 0.42.1-3
+                  bcnt:
+                    type: string
+                    example: '2'
+                  release:
+                    type: string
+                    example: '3.2'
+                  debuginfo:
+                    type: integer
+                    example: 0
+                  subpack:
+                    type: string
+                    example: ctris
+                  bdep:
+                    type: object
+                    properties:
+                      name:
+                        type: string
+                        example: liblua5_4-5
+                        xml:
+                          attribute: true
+                      preinstall:
+                        type: string
+                        example: '1'
+                        xml:
+                          attribute: true
+                      notmeta:
+                        type: string
+                        example: '1'
+                        xml:
+                          attribute: true
+                      version:
+                        type: string
+                        example: 5.4.2
+                        xml:
+                          attribute: true
+                      release:
+                        type: string
+                        example: '3.1'
+                        xml:
+                          attribute: true
+                      arch:
+                        type: string
+                        example: i586
+                        xml:
+                          attribute: true
+                      project:
+                        type: string
+                        example: openSUSE.org:openSUSE:Tumbleweed
+                        xml:
+                          attribute: true
+                      repository:
+                        type: string
+                        example: dod
+                        xml:
+                          attribute: true
+                  path:
+                    type: object
+                    properties:
+                      project:
+                        type: string
+                        example: home:Admin
+                        xml:
+                          attribute: true
+                      repository:
+                        type: string
+                        example: openSUSE_Tumbleweed
+                        xml:
+                          attribute: true
+                      url:
+                        type: string
+                        example: https://download.opensuse.org/repositories/home:/enavarro_suse/openSUSE_Tumbleweed/
+                        xml:
+                          attribute: true
+                  expanddebug:
+                    type: string
+                    example: |
+                      === meta deps expansion
+                      expand args: rpm-build gcc-PIE
+                      added rpm-build@openSUSE:Tumbleweed/dod because of (direct):rpm-build
+                      added gcc-PIE@openSUSE:Tumbleweed/dod because of (direct):gcc-PIE
+                      --- now doing normal dependencies
+                      added glibc@openSUSE:Tumbleweed/dod because of rpm-build:libc.so.6(GLIBC_2.34)(64bit)
+                      added glibc@openSUSE:Tumbleweed/dod because of rpm-build:libc.so.6(GLIBC_2.4)(64bit)
+                xml:
+                  name: buildinfo
+        '400':
+          description: |
+            Bad Request.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: 400
+                origin: backend
+                details: '400 remote error: could not parse name in build description
+                  (spec) (http://backend:5252/build/home:Admin/openSUSE_Tumbleweed/x86_64/hello_world/_buildinfo)'
+                summary: 'remote error: could not parse name in build description
+                  (spec) (http://backend:5252/build/home:Admin/openSUSE_Tumbleweed/x86_64/hello_world/_buildinfo)'
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: |
+            Error: Not Found
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: unknown_project
+                summary: 'Project not found: 1'
+      tags:
+      - Build
+  "/build/{project_name}/{repository_name}/{architecture_name}/{package_name}/_history":
+    get:
+      description: This endpoint returns the build history for a specific artifact
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: repository_name
+        schema:
+          type: string
+        required: true
+        description: Repository name
+        example: openSUSE_Tumbleweed
+      - in: path
+        name: architecture_name
+        schema:
+          type: string
+        required: true
+        description: Architecture name
+        example: x86_64
+      - in: path
+        name: package_name
+        schema:
+          type: string
+        required: true
+        description: Package name
+        example: ctris
+      responses:
+        '200':
+          description: Returns ok when the build status is ok
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  entry:
+                    type: object
+                    properties:
+                      rev:
+                        type: string
+                        example: '4'
+                        xml:
+                          attribute: true
+                      srcmd5:
+                        type: string
+                        example: 63a6f075d3d420c6c1160a7b5dc31354
+                        xml:
+                          attribute: true
+                      versrel:
+                        type: string
+                        example: 0.42.1-4
+                        xml:
+                          attribute: true
+                      bcnt:
+                        type: string
+                        example: '1'
+                        xml:
+                          attribute: true
+                      time:
+                        type: string
+                        example: '1617812788'
+                        xml:
+                          attribute: true
+                      duration:
+                        type: string
+                        example: '222'
+                        xml:
+                          attribute: true
+                xml:
+                  name: buildhistory
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: |
+            Error: Not Found
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: unknown_project
+                summary: 'Project not found: 1'
+      tags:
+      - Build
+  "/build/{project_name}/{repository_name}/{architecture_name}/{package_name}/_jobstatus":
+    get:
+      summary: Show the build status of a currently running build job.
+      description: |
+        Show the build status of a currently running build job. Shows an empty
+        result if no build job is running.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: repository_name
+        schema:
+          type: string
+        required: true
+        description: Repository name
+        example: openSUSE_Tumbleweed
+      - in: path
+        name: architecture_name
+        schema:
+          type: string
+        required: true
+        description: Architecture name
+        example: x86_64
+      - in: path
+        name: package_name
+        schema:
+          type: string
+        required: true
+        description: Package name
+        example: ctris
+      responses:
+        '200':
+          description: |
+            OK.
+
+            XML Schema used for body validation: [jobstatus.rng](../schema/jobstatus.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    example: building
+                    xml:
+                      attribute: true
+                  starttime:
+                    type: string
+                    example: '1618222900'
+                  lastduration:
+                    type: string
+                    example: '43'
+                  hostarch:
+                    type: string
+                    example: x86_64
+                  uri:
+                    type: string
+                    example: http://172.18.0.5:38963
+                  jobid:
+                    type: string
+                    example: 17c8d25b92da67f6ec428ea51a9b5342
+                xml:
+                  name: jobstatus
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: |
+            Unknown project.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: <some project>.'
+      tags:
+      - Build
+  "/build/{project_name}/{repository_name}/{architecture_name}/{package_name}/_log":
+    get:
+      description: This endpoint returns the last log file for a specific build artifact
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: repository_name
+        schema:
+          type: string
+        required: true
+        description: Repository name
+        example: openSUSE_Tumbleweed
+      - in: path
+        name: architecture_name
+        schema:
+          type: string
+        required: true
+        description: Architecture name
+        example: x86_64
+      - in: path
+        name: package_name
+        schema:
+          type: string
+        required: true
+        description: Package name
+        example: ctris
+      responses:
+        '200':
+          description: This endpoint returns the log file content
+          content:
+            text/plain:
+              example: "[    0s] Memory limit set to 23077696KB\n[    0s] Using BUILD_ROOT=/var/cache/obs/worker/root_2\n[
+                \   0s] Using BUILD_ARCH=i586:i486:i386\n[    0s] \n[    0s] \n[    0s]
+                5d0262043f4a started \"build ctris.spec\" at Tue Apr  6 12:27:31 UTC
+                2021.\n[    0s] \n[    0s] Building ctris for project 'home:Admin'
+                repository 'openSUSE_Tumbleweed' arch 'i586' srcmd5 '6b7c8d9cb5c5d36453c1dc8e102016b1'\n"
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '403':
+          description: |
+            Error: Not Acceptable
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: download_binary_no_permission
+                summary: No permission to download binaries from package ctris, project
+                  home:Admin
+        '404':
+          description: |
+            Error: Not Found
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: unknown_project
+                summary: 'Project not found: 1'
+      tags:
+      - Build
+  "/build/{project_name}/{repository_name}/{architecture_name}/{package_name}/_reason":
+    get:
+      summary: Show the reason for the lastly triggered build.
+      description: Details about the reason of the lastly triggered build.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: repository_name
+        schema:
+          type: string
+        required: true
+        description: Repository name
+        example: openSUSE_Tumbleweed
+      - in: path
+        name: architecture_name
+        schema:
+          type: string
+        required: true
+        description: Architecture name
+        example: x86_64
+      - in: path
+        name: package_name
+        schema:
+          type: string
+        required: true
+        description: Package name
+        example: ctris
+      responses:
+        '200':
+          description: OK
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  explain:
+                    type: string
+                    example: source change
+                  time:
+                    type: string
+                    example: '1617982407'
+                  oldsource:
+                    type: string
+                    example: da9ebc6a12b6da45f9ead3fc2f924889
+                xml:
+                  name: reason
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: |
+            Unknown project.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: <some project>.'
+      tags:
+      - Build
+  "/build/{project_name}/{repository_name}/{architecture_name}/{package_name}/_statistics":
+    get:
+      summary: Return build statistics from the last performed build.
+      description: Get specifics of build statistics from the last performed build.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: repository_name
+        schema:
+          type: string
+        required: true
+        description: Repository name
+        example: openSUSE_Tumbleweed
+      - in: path
+        name: architecture_name
+        schema:
+          type: string
+        required: true
+        description: Architecture name
+        example: x86_64
+      - in: path
+        name: package_name
+        schema:
+          type: string
+        required: true
+        description: Package name
+        example: ctris
+      responses:
+        '200':
+          description: OK. The request has succeeded.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  disk:
+                    type: object
+                    properties:
+                      usage:
+                        type: object
+                        properties:
+                          size:
+                            type: object
+                            properties:
+                              unit:
+                                type: string
+                                xml:
+                                  attribute: true
+                          io_requests:
+                            type: string
+                          io_sectors:
+                            type: string
+                  memory:
+                    type: object
+                    properties:
+                      usage:
+                        type: object
+                        properties:
+                          size:
+                            type: object
+                            properties:
+                              unit:
+                                type: string
+                                xml:
+                                  attribute: true
+                  times:
+                    type: object
+                    properties:
+                      total:
+                        type: object
+                        properties:
+                          time:
+                            type: object
+                            properties:
+                              unit:
+                                type: string
+                                xml:
+                                  attribute: true
+                      preinstall:
+                        type: object
+                        properties:
+                          time:
+                            type: object
+                            properties:
+                              unit:
+                                type: string
+                                xml:
+                                  attribute: true
+                      install:
+                        type: object
+                        properties:
+                          time:
+                            type: object
+                            properties:
+                              unit:
+                                type: string
+                                xml:
+                                  attribute: true
+                      main:
+                        type: object
+                        properties:
+                          time:
+                            type: object
+                            properties:
+                              unit:
+                                type: string
+                                xml:
+                                  attribute: true
+                      postchecks:
+                        type: object
+                        properties:
+                          time:
+                            type: object
+                            properties:
+                              unit:
+                                type: string
+                                xml:
+                                  attribute: true
+                      rpmlint:
+                        type: object
+                        properties:
+                          time:
+                            type: object
+                            properties:
+                              unit:
+                                type: string
+                                xml:
+                                  attribute: true
+                      buildcmp:
+                        type: object
+                        properties:
+                          time:
+                            type: object
+                            properties:
+                              unit:
+                                type: string
+                                xml:
+                                  attribute: true
+                      deltarpms:
+                        type: object
+                        properties:
+                          time:
+                            type: object
+                            properties:
+                              unit:
+                                type: string
+                                xml:
+                                  attribute: true
+                      download:
+                        type: object
+                        properties:
+                          time:
+                            type: object
+                            properties:
+                              unit:
+                                type: string
+                                xml:
+                                  attribute: true
+                      cpusteal:
+                        type: object
+                        properties:
+                          time:
+                            type: object
+                            properties:
+                              unit:
+                                type: string
+                                xml:
+                                  attribute: true
+                  download:
+                    type: object
+                    properties:
+                      size:
+                        type: object
+                        properties:
+                          unit:
+                            type: string
+                            xml:
+                              attribute: true
+                      binaries:
+                        type: string
+                      cachehits:
+                        type: string
+                xml:
+                  name: buildstatistics
+              example:
+                disk:
+                  usage:
+                    size:
+                      unit: M
+                    io_requests: 7750
+                    io_sectors: 1248010
+                memory:
+                  usage:
+                    size:
+                      unit: M
+                times:
+                  total:
+                    time:
+                      unit: s
+                  preinstall:
+                    time:
+                      unit: s
+                download:
+                  size:
+                    unit: k
+                  binaries: 5
+                  cachehits: 131
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: |
+            Error: Not Found
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: unknown_project
+                summary: 'Project not found: 1'
+      tags:
+      - Build
+  "/build/{project_name}/{repository_name}/{architecture_name}/{package_name}/_status":
+    get:
+      description: This endpoint returns the building status for a specific artifact
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: repository_name
+        schema:
+          type: string
+        required: true
+        description: Repository name
+        example: openSUSE_Tumbleweed
+      - in: path
+        name: architecture_name
+        schema:
+          type: string
+        required: true
+        description: Architecture name
+        example: x86_64
+      - in: path
+        name: package_name
+        schema:
+          type: string
+        required: true
+        description: Package name
+        example: ctris
+      responses:
+        '200':
+          description: Returns ok when the build status is ok
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  package:
+                    type: string
+                    example: ctris
+                    xml:
+                      attribute: true
+                  code:
+                    type: string
+                    example: failed
+                    xml:
+                      attribute: true
+                xml:
+                  name: status
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: |
+            Error: Not Found
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: unknown_project
+                summary: 'Project not found: 1'
+      tags:
+      - Build
+  "/build/{project_name}/{repository_name}/{architecture_name}/{package_name}/{file_name}":
+    get:
+      summary: Return a specific artifact file contents
+      description: Given a project, repository, architecture and package, retrieve
+        the given file's content.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: repository_name
+        schema:
+          type: string
+        required: true
+        description: Repository name
+        example: openSUSE_Tumbleweed
+      - in: path
+        name: architecture_name
+        schema:
+          type: string
+        required: true
+        description: Architecture name
+        example: x86_64
+      - in: path
+        name: package_name
+        schema:
+          type: string
+        required: true
+        description: Package name
+        example: ctris
+      - in: path
+        name: file_name
+        schema:
+          type: string
+        required: true
+        description: The file name
+        example: ctris-0.42.1-4.1.x86_64.rpm
+      responses:
+        '200':
+          description: Returns the artifact's actual file contents
+          content:
+            application/*:
+              schema:
+                type: string
+                format: binary
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: |
+            Error: Not Found
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: '404'
+                summary: project 'home:Admin' has no repository '4'
+                details: 404 project 'home:Admin' has no repository '4'
+      tags:
+      - Build
+    put:
+      summary: Update a specific artifact file contents
+      description: |
+        Given a project, repository, architecture and package, update the given file's content.
+
+        This is for Admins only.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: repository_name
+        schema:
+          type: string
+        required: true
+        description: Repository name
+        example: openSUSE_Tumbleweed
+      - in: path
+        name: architecture_name
+        schema:
+          type: string
+        required: true
+        description: Architecture name
+        example: x86_64
+      - name: package_name
+        in: path
+        schema:
+          type: array
+          items:
+            type: string
+            enum:
+            - _repository
+        required: true
+        description: Package name
+      - in: path
+        name: file_name
+        schema:
+          type: string
+        required: true
+        description: The file name
+        example: ctris-0.42.1-4.1.x86_64.rpm
+      requestBody:
+        content:
+          plain/text:
+            schema:
+              type: string
+              properties:
+                file:
+                  type: string
+                  format: binary
+      responses:
+        '200':
+          description: Updates the artifact's file contents
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '403':
+          description: No permission to upload binaries for this project
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: upload_binary_no_permission
+                summary: No permission to upload binaries.
+        '404':
+          description: |
+            Error: Not Found
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: '404'
+                summary: project 'home:Admin' has no repository '4'
+                details: 404 project 'home:Admin' has no repository '4'
+      tags:
+      - Build
+    delete:
+      summary: Delete an existing repository artifact
+      description: |
+        Given a project, repository and architecture delete the given file in the repository.
+
+        The user needs to have write permissions into the artifact
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: repository_name
+        schema:
+          type: string
+        required: true
+        description: Repository name
+        example: openSUSE_Tumbleweed
+      - in: path
+        name: architecture_name
+        schema:
+          type: string
+        required: true
+        description: Architecture name
+        example: x86_64
+      - name: package_name
+        in: path
+        schema:
+          type: array
+          items:
+            type: string
+            enum:
+            - _repository
+        required: true
+        description: Package name. '_repository' is the only posible value.
+      - in: path
+        name: file_name
+        schema:
+          type: string
+        required: true
+        description: The file name
+        example: ctris-0.42.1-4.1.x86_64.rpm
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '400':
+          description: Operation is not allowed
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: invalid_operation
+                summary: Delete operation of build results is not allowed
+        '403':
+          description: No permission to delete binaries from this project
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: delete_binary_no_permission
+                summary: No permission to delete binaries from project home:Admin.
+        '404':
+          description: |
+            Error: Not Found
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: '404'
+                summary: project 'home:Admin' has no repository '4'
+      tags:
+      - Build
+  "/build/{project_name}/{repository_name}/{architecture_name}/{package_name}/{file_name}?view=fileinfo":
+    get:
+      summary: This endpoint returns details about an specific artifact
+      description: Given a project, repository, architecture and package, retrieve
+        the given artifact's details.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: repository_name
+        schema:
+          type: string
+        required: true
+        description: Repository name
+        example: openSUSE_Tumbleweed
+      - in: path
+        name: architecture_name
+        schema:
+          type: string
+        required: true
+        description: Architecture name
+        example: x86_64
+      - in: path
+        name: package_name
+        schema:
+          type: string
+        required: true
+        description: Package name
+        example: ctris
+      - in: path
+        name: file_name
+        schema:
+          type: string
+        required: true
+        description: The file name
+        example: ctris-0.42.1-4.1.x86_64.rpm
+      - name: view
+        in: query
+        required: true
+        schema:
+          type: array
+          items:
+            type: string
+            enum:
+            - fileinfo
+            - fileinfo_ext
+      responses:
+        '200':
+          description: Returns details about the artifact
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  filename:
+                    type: string
+                    xml:
+                      attribute: true
+                  name:
+                    type: string
+                  version:
+                    type: string
+                  release:
+                    type: string
+                  arch:
+                    type: string
+                  source:
+                    type: string
+                  summary:
+                    type: string
+                  description:
+                    type: string
+                  size:
+                    type: string
+                  mtime:
+                    type: string
+                  provides:
+                    type: array
+                    items:
+                      type: string
+                  requires:
+                    type: array
+                    items:
+                      type: string
+                  provides_ext:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        dep:
+                          type: string
+                          xml:
+                            attribute: true
+                  requires_ext:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        dep:
+                          type: string
+                          xml:
+                            attribute: true
+                        provided_by:
+                          type: object
+                          properties:
+                            name:
+                              type: string
+                              xml:
+                                attribute: true
+                            version:
+                              type: string
+                              xml:
+                                attribute: true
+                            release:
+                              type: string
+                              xml:
+                                attribute: true
+                            arch:
+                              type: string
+                              xml:
+                                attribute: true
+                            project:
+                              type: string
+                              xml:
+                                attribute: true
+                            repository:
+                              type: string
+                              xml:
+                                attribute: true
+                xml:
+                  name: fileinfo
+              examples:
+                fileinfo:
+                  summary: view=fileinfo
+                  value:
+                    filename: ctris-0.42.1-4.1.x86_64.rpm
+                    name: ctris
+                    version: 0.42.1
+                    release: '4.1'
+                    arch: x86_64
+                    summary: Console based tetris clone
+                    description: ctris is a colorized, small and flexible Tetris(TM)-clone
+                      for the console. Go play!
+                    size: '765725'
+                    mtime: '1617270174'
+                    provides:
+                    - ctris = 0.42.1-6.2
+                    - ctris(x86-64) = 0.42.1-6.2
+                    requires:
+                    - libc.so.6()(64bit)
+                    - libc.so.6(GLIBC_2.2.5)(64bit)
+                fileinfo_ext:
+                  summary: view=fileinfo_ext
+                  value:
+                    filename: ctris-0.42.1-4.2.x86_64.rpm
+                    name: ctris
+                    version: 0.42.1
+                    release: '4.1'
+                    arch: x86_64
+                    source: ctris
+                    summary: Console based tetris clone
+                    description: ctris is a colorized, small and flexible Tetris(TM)-clone
+                      for the console. Go play!
+                    size: '765725'
+                    mtime: '1617270174'
+                    provides:
+                    - ctris = 0.42.1-6.2
+                    - ctris(x86-64) = 0.42.1-6.2
+                    requires:
+                    - libc.so.6()(64bit)
+                    - libc.so.6(GLIBC_2.2.5)(64bit)
+                    provides_ext:
+                      dep: ctris(x86-64) = 0.42.1-6.2
+                    requires_ext:
+                      dep: libc.so.6()(64bit)
+                      provided_by:
+                        name: glibc
+                        version: '2.33'
+                        release: '4.1'
+                        arch: x86_64
+                        project: openSUSE.org:openSUSE:Tumbleweed
+                        repository: dod
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: |
+            Error: Not Found
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: '404'
+                summary: project 'home:Admin' has no repository '4'
+                details: 404 project 'home:Admin' has no repository '4'
+      tags:
+      - Build
+  "/comment/{comment_id}":
+    delete:
+      summary: Delete a comment
+      description: Delete a given comment based on its id.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: comment_id
+        schema:
+          type: integer
+        required: true
+        description: Id of the comment.
+        example: 1124
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '403':
+          description: Forbidden
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: delete_comment_not_authorized
+                summary: Sorry, you are not authorized to delete this comment
+        '404':
+          description: Not Found
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: not_found
+                summary: Couldn't find Comment with id '1124'
+      tags:
+      - Comments
+  "/comment/{comment_id}/history":
+    get:
+      summary: List the history of a comment
+      description: |
+        List the versions of a edited comment.
+
+        **(Beta/Unstable)** This endpoint is currently behind the `content_moderation` beta flag.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: comment_id
+        schema:
+          type: integer
+        required: true
+        description: Id of the comment.
+        example: 5
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+            XML Schema used for body validation: [comment_history.rng](../schema/comment_history.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  comment:
+                    type: integer
+                    xml:
+                      attribute: true
+                xml:
+                  name: comment_history
+              example: |
+                <comment_history comment="6">
+                  <comment who="bar" when="2024-02-28 16:12:45 UTC" id="6">First version of comment</comment>
+                  <comment who="bar" when="2024-02-28 16:15:27 UTC" id="6">UHH DONT LIKE MY COMMENT</comment>
+                </comment_history>
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '403':
+          description: Forbidden
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: history_comment_not_authorized
+                summary: Sorry, you are not authorized to history this comment.
+        '404':
+          description: Not Found
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: not_found
+                summary: Couldn't find Comment with 'id'=67
+      tags:
+      - Comments
+  "/comments/user":
+    get:
+      summary: List all the logged in user's comments
+      description: List all the comments for the currently logged in user.
+      security:
+      - basic_authentication: []
+      responses:
+        '200':
+          description: OK. The request has succeeded.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  comment:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        id:
+                          type: integer
+                          xml:
+                            attribute: true
+                        who:
+                          type: string
+                          xml:
+                            attribute: true
+                        when:
+                          type: string
+                          xml:
+                            attribute: true
+                        parent:
+                          type: integer
+                          xml:
+                            attribute: true
+                        bsrequest:
+                          type: integer
+                          xml:
+                            attribute: true
+                        project:
+                          type: string
+                          xml:
+                            attribute: true
+                        package:
+                          type: string
+                          xml:
+                            attribute: true
+                  request:
+                    type: integer
+                    xml:
+                      attribute: true
+                  package:
+                    type: string
+                    xml:
+                      attribute: true
+                  project:
+                    type: string
+                    xml:
+                      attribute: true
+                  user:
+                    type: string
+                    xml:
+                      attribute: true
+                xml:
+                  name: comments
+              example: |
+                <comments user="Iggy">
+                  <comment who="Iggy" when="2021-10-15 13:28:22 UTC" id="1" bsrequest="115">This is a pretty cool request!</comment>
+                  <comment who="Iggy" when="2021-10-15 13:49:39 UTC" id="2" project="home:Admin">This is a pretty cool project!</comment>
+                  <comment who="Iggy" when="2021-10-15 13:54:38 UTC" id="3" project="home:Admin" package="0ad">This is a pretty cool package!</comment>
+                </comments>
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+      tags:
+      - Comments
+  "/comments/request/{id}":
+    get:
+      summary: List all the request's comments
+      description: List all the comments for the request.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: id
+        schema:
+          type: integer
+        required: true
+        description: Id of the choosen request.
+        example: 743
+      responses:
+        '200':
+          description: OK. The request has succeeded.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  comment:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        id:
+                          type: integer
+                          xml:
+                            attribute: true
+                        who:
+                          type: string
+                          xml:
+                            attribute: true
+                        when:
+                          type: string
+                          xml:
+                            attribute: true
+                        parent:
+                          type: integer
+                          xml:
+                            attribute: true
+                        bsrequest:
+                          type: integer
+                          xml:
+                            attribute: true
+                        project:
+                          type: string
+                          xml:
+                            attribute: true
+                        package:
+                          type: string
+                          xml:
+                            attribute: true
+                  request:
+                    type: integer
+                    xml:
+                      attribute: true
+                  package:
+                    type: string
+                    xml:
+                      attribute: true
+                  project:
+                    type: string
+                    xml:
+                      attribute: true
+                  user:
+                    type: string
+                    xml:
+                      attribute: true
+                xml:
+                  name: comments
+              example: |
+                <comments request="115">
+                  <comment who="Iggy" when="2021-10-15 13:28:22 UTC" id="1">This is a pretty cool comment!</comment>
+                </comments>
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: |
+            Not found.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                not_found:
+                  summary: Couldn't find Request with number '1234'
+                  value:
+                    code: not_found
+                    summary: Couldn't find Request with number '1234'
+      tags:
+      - Comments
+    post:
+      summary: Create a request comment
+      description: Create a comment for the request.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: id
+        schema:
+          type: integer
+        required: true
+        description: Id of the choosen request.
+        example: 743
+      - in: query
+        name: parent_id
+        schema:
+          type: integer
+        description: Id of the comment to reply to
+        example: 10401
+      requestBody:
+        description: Content of the comment
+        required: true
+        content:
+          text/plain:
+            schema:
+              type: string
+            example: This is a very valuable comment
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '400':
+          description: |
+            Invalid Comment.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                invalid_record:
+                  summary: Parent belongs to different object
+                  value:
+                    code: invalid_record
+                    summary: Parent belongs to different object
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: |
+            Not found.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                not_found:
+                  summary: Couldn't find Request with number '1234'
+                  value:
+                    code: not_found
+                    summary: Couldn't find Request with number '1234'
+      tags:
+      - Comments
+  "/comments/project/{project_name}":
+    get:
+      summary: List all the project's comments
+      description: List all the comments for the project.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      responses:
+        '200':
+          description: OK. The request has succeeded.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  comment:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        id:
+                          type: integer
+                          xml:
+                            attribute: true
+                        who:
+                          type: string
+                          xml:
+                            attribute: true
+                        when:
+                          type: string
+                          xml:
+                            attribute: true
+                        parent:
+                          type: integer
+                          xml:
+                            attribute: true
+                        bsrequest:
+                          type: integer
+                          xml:
+                            attribute: true
+                        project:
+                          type: string
+                          xml:
+                            attribute: true
+                        package:
+                          type: string
+                          xml:
+                            attribute: true
+                  request:
+                    type: integer
+                    xml:
+                      attribute: true
+                  package:
+                    type: string
+                    xml:
+                      attribute: true
+                  project:
+                    type: string
+                    xml:
+                      attribute: true
+                  user:
+                    type: string
+                    xml:
+                      attribute: true
+                xml:
+                  name: comments
+              example: |
+                <comments project="home:Admin">
+                  <comment who="Iggy" when="2021-10-15 13:28:22 UTC" id="1">This is a pretty cool comment!</comment>
+                </comments>
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: |
+            Not found.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                not_found:
+                  summary: 'Project not found: notaproject'
+                  value:
+                    code: not_found
+                    summary: 'Project not found: notaproject'
+      tags:
+      - Comments
+    post:
+      summary: Create a project comment
+      description: Create a comment for the project.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: query
+        name: parent_id
+        schema:
+          type: integer
+        description: Id of the comment to reply to
+        example: 10401
+      requestBody:
+        description: Content of the comment
+        required: true
+        content:
+          text/plain:
+            schema:
+              type: string
+            example: This is a very valuable comment
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '400':
+          description: |
+            Invalid Comment.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                invalid_record:
+                  summary: Parent belongs to different object
+                  value:
+                    code: invalid_record
+                    summary: Parent belongs to different object
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: |
+            Not found.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                not_found:
+                  value:
+                    code: not_found
+      tags:
+      - Comments
+  "/comments/package/{project_name}/{package_name}":
+    get:
+      summary: List all the package's comments
+      description: List all the comments for the package.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: package_name
+        schema:
+          type: string
+        required: true
+        description: Package name
+        example: ctris
+      responses:
+        '200':
+          description: OK. The request has succeeded.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  comment:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        id:
+                          type: integer
+                          xml:
+                            attribute: true
+                        who:
+                          type: string
+                          xml:
+                            attribute: true
+                        when:
+                          type: string
+                          xml:
+                            attribute: true
+                        parent:
+                          type: integer
+                          xml:
+                            attribute: true
+                        bsrequest:
+                          type: integer
+                          xml:
+                            attribute: true
+                        project:
+                          type: string
+                          xml:
+                            attribute: true
+                        package:
+                          type: string
+                          xml:
+                            attribute: true
+                  request:
+                    type: integer
+                    xml:
+                      attribute: true
+                  package:
+                    type: string
+                    xml:
+                      attribute: true
+                  project:
+                    type: string
+                    xml:
+                      attribute: true
+                  user:
+                    type: string
+                    xml:
+                      attribute: true
+                xml:
+                  name: comments
+              example: |
+                <comments project="home:Admin" package="0ad">
+                  <comment who="Iggy" when="2021-10-15 13:28:22 UTC" id="1">This is a pretty cool comment!</comment>
+                </comments>
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: |
+            Not found.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                not_found:
+                  summary: 'Package not found: home:Admin/notapackage'
+                  value:
+                    code: not_found
+                    summary: 'Package not found: home:Admin/notapackage'
+      tags:
+      - Comments
+    post:
+      summary: Create a package comment
+      description: Create a comment for the package.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: package_name
+        schema:
+          type: string
+        required: true
+        description: Package name
+        example: ctris
+      - in: query
+        name: parent_id
+        schema:
+          type: integer
+        description: Id of the comment to reply to
+        example: 10401
+      requestBody:
+        description: Content of the comment
+        required: true
+        content:
+          text/plain:
+            schema:
+              type: string
+            example: This is a very valuable comment
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '400':
+          description: |
+            Invalid Comment.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                invalid_record:
+                  summary: Parent belongs to different object
+                  value:
+                    code: invalid_record
+                    summary: Parent belongs to different object
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: |
+            Not found.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                not_found:
+                  summary: 'Package not found: openSUSE:Factory/eeee'
+                  value:
+                    code: not_found
+                    summary: 'Package not found: openSUSE:Factory/eeee'
+      tags:
+      - Comments
+  "/configuration":
+    get:
+      summary: Display the configuration of this Open Build Service instance
+      description: Display the configuration of this Open Build Service instance.
+      security:
+      - basic_authentication: []
+      responses:
+        '200':
+          description: OK. The request has succeeded.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  title:
+                    type: string
+                    example: Open Build Service
+                  description:
+                    type: string
+                    example: The openSUSE Build Service is the public instance of
+                      the Open Build Service (OBS)
+                  name:
+                    type: string
+                    example: private
+                  download_on_demand:
+                    type: string
+                    example: true
+                  enforce_project_keys:
+                    type: string
+                    example: false
+                  anonymous:
+                    type: string
+                    example: true
+                  registration:
+                    type: string
+                    example: allow
+                  default_access_disabled:
+                    type: string
+                    example: false
+                  allow_user_to_create_home_project:
+                    type: string
+                    example: true
+                  disallow_group_creation:
+                    type: string
+                    example: false
+                  change_password:
+                    type: string
+                    example: true
+                  obs_url:
+                    type: string
+                    example: https://unconfigured.openbuildservice.org
+                  tos_url:
+                    type: string
+                    example: https://en.opensuse.org/Terms_of_site
+                  hide_private_options:
+                    type: string
+                    example: false
+                  gravatar:
+                    type: string
+                    example: true
+                  cleanup_empty_projects:
+                    type: string
+                    example: true
+                  disable_publish_for_branches:
+                    type: string
+                    example: true
+                  admin_email:
+                    type: string
+                    example: unconfigured@openbuildservice.org
+                  unlisted_projects_filter:
+                    type: string
+                    example: "^home:.+"
+                  unlisted_projects_filter_description:
+                    type: string
+                    example: home projects
+                  default_tracker:
+                    type: string
+                    example: bnc
+                  code_of_conduct:
+                    type: string
+                    example: |
+                      This is an example of a "Code of Conduct".
+
+                      1. First point.
+
+                      2. Second point.
+                  schedulers:
+                    type: object
+                    properties:
+                      arch:
+                        type: array
+                        items:
+                          type: string
+                        example:
+                        - armv7l
+                        - i586
+                        - x86_64
+                xml:
+                  name: configuration
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+      tags:
+      - Configuration
+    put:
+      summary: Update the configuration of this Open Build Service instance
+      description: |
+        Update the configuration of this Open Build Service instance.
+
+        This is for admins only.
+      security:
+      - basic_authentication: []
+      requestBody:
+        description: Configuration definition.
+        content:
+          application/xml; charset=utf-8:
+            schema:
+              type: object
+              properties:
+                title:
+                  type: string
+                  example: Open Build Service
+                description:
+                  type: string
+                  example: The openSUSE Build Service is the public instance of the
+                    Open Build Service (OBS)
+                name:
+                  type: string
+                  example: private
+                download_on_demand:
+                  type: string
+                  example: true
+                enforce_project_keys:
+                  type: string
+                  example: false
+                anonymous:
+                  type: string
+                  example: true
+                registration:
+                  type: string
+                  example: allow
+                default_access_disabled:
+                  type: string
+                  example: false
+                allow_user_to_create_home_project:
+                  type: string
+                  example: true
+                disallow_group_creation:
+                  type: string
+                  example: false
+                change_password:
+                  type: string
+                  example: true
+                obs_url:
+                  type: string
+                  example: https://unconfigured.openbuildservice.org
+                tos_url:
+                  type: string
+                  example: https://en.opensuse.org/Terms_of_site
+                hide_private_options:
+                  type: string
+                  example: false
+                gravatar:
+                  type: string
+                  example: true
+                cleanup_empty_projects:
+                  type: string
+                  example: true
+                disable_publish_for_branches:
+                  type: string
+                  example: true
+                admin_email:
+                  type: string
+                  example: unconfigured@openbuildservice.org
+                unlisted_projects_filter:
+                  type: string
+                  example: "^home:.+"
+                unlisted_projects_filter_description:
+                  type: string
+                  example: home projects
+                default_tracker:
+                  type: string
+                  example: bnc
+                code_of_conduct:
+                  type: string
+                  example: |
+                    This is an example of a "Code of Conduct".
+
+                    1. First point.
+
+                    2. Second point.
+                schedulers:
+                  type: object
+                  properties:
+                    arch:
+                      type: array
+                      items:
+                        type: string
+                      example:
+                      - armv7l
+                      - i586
+                      - x86_64
+              xml:
+                name: configuration
+      responses:
+        '200':
+          description: OK. The request has succeeded.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  title:
+                    type: string
+                    example: Open Build Service
+                  description:
+                    type: string
+                    example: The openSUSE Build Service is the public instance of
+                      the Open Build Service (OBS)
+                  name:
+                    type: string
+                    example: private
+                  download_on_demand:
+                    type: string
+                    example: true
+                  enforce_project_keys:
+                    type: string
+                    example: false
+                  anonymous:
+                    type: string
+                    example: true
+                  registration:
+                    type: string
+                    example: allow
+                  default_access_disabled:
+                    type: string
+                    example: false
+                  allow_user_to_create_home_project:
+                    type: string
+                    example: true
+                  disallow_group_creation:
+                    type: string
+                    example: false
+                  change_password:
+                    type: string
+                    example: true
+                  obs_url:
+                    type: string
+                    example: https://unconfigured.openbuildservice.org
+                  tos_url:
+                    type: string
+                    example: https://en.opensuse.org/Terms_of_site
+                  hide_private_options:
+                    type: string
+                    example: false
+                  gravatar:
+                    type: string
+                    example: true
+                  cleanup_empty_projects:
+                    type: string
+                    example: true
+                  disable_publish_for_branches:
+                    type: string
+                    example: true
+                  admin_email:
+                    type: string
+                    example: unconfigured@openbuildservice.org
+                  unlisted_projects_filter:
+                    type: string
+                    example: "^home:.+"
+                  unlisted_projects_filter_description:
+                    type: string
+                    example: home projects
+                  default_tracker:
+                    type: string
+                    example: bnc
+                  code_of_conduct:
+                    type: string
+                    example: |
+                      This is an example of a "Code of Conduct".
+
+                      1. First point.
+
+                      2. Second point.
+                  schedulers:
+                    type: object
+                    properties:
+                      arch:
+                        type: array
+                        items:
+                          type: string
+                        example:
+                        - armv7l
+                        - i586
+                        - x86_64
+                xml:
+                  name: configuration
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '403':
+          description: |
+            Forbidden.
+
+            In the example below, _default_access_disabled_ is one of the possible configuration options which is set in the options.yml file.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: no_permission_to_change
+                summary: The api has a different value for default_access_disabled
+                  configured in options.yml file. Remove it there first
+      tags:
+      - Configuration
+  "/distributions":
+    get:
+      summary: List all distributions.
+      description: |
+        List all distributions that can be build against.
+        This will not list distributions that are available via [interconnect](https://openbuildservice.org/help/manuals/obs-user-guide/cha.obs.concepts.html#id-1.5.10.3.5).
+        Check /distributions/include_remotes for this.
+      security:
+      - basic_authentication: []
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [distributions.rng](../schema/distributions.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  distribution:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        id:
+                          type: integer
+                          example: 16626
+                          xml:
+                            attribute: true
+                        vendor:
+                          type: string
+                          example: opensuse
+                          xml:
+                            attribute: true
+                        version:
+                          type: string
+                          example: Tumbleweed
+                          xml:
+                            attribute: true
+                        name:
+                          type: string
+                          example: openSUSE Tumbleweed
+                        project:
+                          type: string
+                          example: openSUSE:Factory
+                        repository:
+                          type: string
+                          example: snapshot
+                        reponame:
+                          type: string
+                          example: openSUSE_Tumbleweed
+                        link:
+                          type: string
+                          example: http://www.opensuse.org/
+                        architecture:
+                          type: array
+                          example:
+                          - i586
+                          - x86_64
+                          items:
+                            type: string
+                        icon:
+                          type: array
+                          example:
+                          - width: 8
+                            height: 8
+                            url: https://static.opensuse.org/distributions/logos/opensuse.png
+                          - width: 16
+                            height: 16
+                            url: https://static.opensuse.org/distributions/logos/opensuse.png
+                          items:
+                            type: object
+                            properties:
+                              width:
+                                type: integer
+                                xml:
+                                  attribute: true
+                              height:
+                                type: integer
+                                xml:
+                                  attribute: true
+                              url:
+                                type: string
+                                xml:
+                                  attribute: true
+                xml:
+                  name: distributions
+              example:
+                distribution:
+                - vendor: opensuse
+                  version: Tumbleweed
+                  id: 16626
+                  name: openSUSE Tumbleweed
+                  project: openSUSE:Factory
+                  reponame: openSUSE_Tumbleweed
+                  repository: snapshot
+                  link: http://www.opensuse.org/
+                  icon:
+                  - url: https://static.opensuse.org/distributions/logos/opensuse.png
+                    width: 8
+                    height: 8
+                  - url: https://static.opensuse.org/distributions/logos/opensuse.png
+                    width: 16
+                    height: 16
+                  architecture:
+                  - i586
+                  - x86_64
+                - vendor: openSUSE
+                  version: '15.3'
+                  id: 16629
+                  name: openSUSE Leap 15.3
+                  project: openSUSE:Leap:15.3
+                  reponame: openSUSE_Leap_15.3
+                  repository: standard
+                  link: http://www.opensuse.org/
+                  icon:
+                  - url: https://static.opensuse.org/distributions/logos/opensuse.png
+                    width: 8
+                    height: 8
+                  - url: https://static.opensuse.org/distributions/logos/opensuse.png
+                    width: 16
+                    height: 16
+                  architecture: x86_64
+                - vendor: Fedora
+                  version: '33'
+                  id: 16731
+                  name: Fedora 33
+                  project: Fedora:33
+                  reponame: Fedora_33
+                  repository: standard
+                  link: http://www.fedoraproject.org/
+                  icon:
+                  - url: https://static.opensuse.org/distributions/logos/fedora.png
+                    width: 8
+                    height: 8
+                  - url: https://static.opensuse.org/distributions/logos/fedora.png
+                    width: 16
+                    height: 16
+                  architecture:
+                  - i586
+                  - x86_64
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+      tags:
+      - Distributions
+    post:
+      summary: Create a distribution.
+      description: |
+        Create a distribution.
+
+        This is only for admins.
+      security:
+      - basic_authentication: []
+      requestBody:
+        description: Distribution definition
+        content:
+          application/xml; charset=utf-8:
+            schema:
+              type: object
+              properties:
+                id:
+                  type: integer
+                  example: 16626
+                  xml:
+                    attribute: true
+                vendor:
+                  type: string
+                  example: opensuse
+                  xml:
+                    attribute: true
+                version:
+                  type: string
+                  example: Tumbleweed
+                  xml:
+                    attribute: true
+                name:
+                  type: string
+                  example: openSUSE Tumbleweed
+                project:
+                  type: string
+                  example: openSUSE:Factory
+                repository:
+                  type: string
+                  example: snapshot
+                reponame:
+                  type: string
+                  example: openSUSE_Tumbleweed
+                link:
+                  type: string
+                  example: http://www.opensuse.org/
+                architecture:
+                  type: array
+                  example:
+                  - i586
+                  - x86_64
+                  items:
+                    type: string
+                icon:
+                  type: array
+                  example:
+                  - width: 8
+                    height: 8
+                    url: https://static.opensuse.org/distributions/logos/opensuse.png
+                  - width: 16
+                    height: 16
+                    url: https://static.opensuse.org/distributions/logos/opensuse.png
+                  items:
+                    type: object
+                    properties:
+                      width:
+                        type: integer
+                        xml:
+                          attribute: true
+                      height:
+                        type: integer
+                        xml:
+                          attribute: true
+                      url:
+                        type: string
+                        xml:
+                          attribute: true
+              xml:
+                name: distribution
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [distribution.rng](../schema/distribution.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  id:
+                    type: integer
+                    example: 16626
+                    xml:
+                      attribute: true
+                  vendor:
+                    type: string
+                    example: opensuse
+                    xml:
+                      attribute: true
+                  version:
+                    type: string
+                    example: Tumbleweed
+                    xml:
+                      attribute: true
+                  name:
+                    type: string
+                    example: openSUSE Tumbleweed
+                  project:
+                    type: string
+                    example: openSUSE:Factory
+                  repository:
+                    type: string
+                    example: snapshot
+                  reponame:
+                    type: string
+                    example: openSUSE_Tumbleweed
+                  link:
+                    type: string
+                    example: http://www.opensuse.org/
+                  architecture:
+                    type: array
+                    example:
+                    - i586
+                    - x86_64
+                    items:
+                      type: string
+                  icon:
+                    type: array
+                    example:
+                    - width: 8
+                      height: 8
+                      url: https://static.opensuse.org/distributions/logos/opensuse.png
+                    - width: 16
+                      height: 16
+                      url: https://static.opensuse.org/distributions/logos/opensuse.png
+                    items:
+                      type: object
+                      properties:
+                        width:
+                          type: integer
+                          xml:
+                            attribute: true
+                        height:
+                          type: integer
+                          xml:
+                            attribute: true
+                        url:
+                          type: string
+                          xml:
+                            attribute: true
+                xml:
+                  name: distribution
+              example:
+                distribution:
+                - vendor: opensuse
+                  version: Tumbleweed
+                  id: 16626
+                  name: openSUSE Tumbleweed
+                  project: openSUSE:Factory
+                  reponame: openSUSE_Tumbleweed
+                  repository: snapshot
+                  link: http://www.opensuse.org/
+                  icon:
+                  - url: https://static.opensuse.org/distributions/logos/opensuse.png
+                    width: 8
+                    height: 8
+                  - url: https://static.opensuse.org/distributions/logos/opensuse.png
+                    width: 16
+                    height: 16
+                  architecture:
+                  - i586
+                  - x86_64
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+      tags:
+      - Distributions
+  "/distributions/include_remotes":
+    get:
+      summary: List all distributions including remote.
+      description: List all distributions that can be build against, including the
+        ones provided by the interconnect.
+      security:
+      - basic_authentication: []
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [distributions.rng](../schema/distributions.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  distribution:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        id:
+                          type: integer
+                          example: 16626
+                          xml:
+                            attribute: true
+                        vendor:
+                          type: string
+                          example: opensuse
+                          xml:
+                            attribute: true
+                        version:
+                          type: string
+                          example: Tumbleweed
+                          xml:
+                            attribute: true
+                        name:
+                          type: string
+                          example: openSUSE Tumbleweed
+                        project:
+                          type: string
+                          example: openSUSE:Factory
+                        repository:
+                          type: string
+                          example: snapshot
+                        reponame:
+                          type: string
+                          example: openSUSE_Tumbleweed
+                        link:
+                          type: string
+                          example: http://www.opensuse.org/
+                        architecture:
+                          type: array
+                          example:
+                          - i586
+                          - x86_64
+                          items:
+                            type: string
+                        icon:
+                          type: array
+                          example:
+                          - width: 8
+                            height: 8
+                            url: https://static.opensuse.org/distributions/logos/opensuse.png
+                          - width: 16
+                            height: 16
+                            url: https://static.opensuse.org/distributions/logos/opensuse.png
+                          items:
+                            type: object
+                            properties:
+                              width:
+                                type: integer
+                                xml:
+                                  attribute: true
+                              height:
+                                type: integer
+                                xml:
+                                  attribute: true
+                              url:
+                                type: string
+                                xml:
+                                  attribute: true
+                xml:
+                  name: distributions
+              example:
+                distribution:
+                - vendor: opensuse
+                  version: Tumbleweed
+                  id: 16626
+                  name: openSUSE Tumbleweed
+                  project: openSUSE:Factory
+                  reponame: openSUSE_Tumbleweed
+                  repository: snapshot
+                  link: http://www.opensuse.org/
+                  icon:
+                  - url: https://static.opensuse.org/distributions/logos/opensuse.png
+                    width: 8
+                    height: 8
+                  - url: https://static.opensuse.org/distributions/logos/opensuse.png
+                    width: 16
+                    height: 16
+                  architecture:
+                  - i586
+                  - x86_64
+                - vendor: openSUSE
+                  version: '15.3'
+                  id: 16629
+                  name: openSUSE Leap 15.3
+                  project: openSUSE:Leap:15.3
+                  reponame: openSUSE_Leap_15.3
+                  repository: standard
+                  link: http://www.opensuse.org/
+                  icon:
+                  - url: https://static.opensuse.org/distributions/logos/opensuse.png
+                    width: 8
+                    height: 8
+                  - url: https://static.opensuse.org/distributions/logos/opensuse.png
+                    width: 16
+                    height: 16
+                  architecture: x86_64
+                - vendor: Fedora
+                  version: '33'
+                  id: 16731
+                  name: Fedora 33
+                  project: Fedora:33
+                  reponame: Fedora_33
+                  repository: standard
+                  link: http://www.fedoraproject.org/
+                  icon:
+                  - url: https://static.opensuse.org/distributions/logos/fedora.png
+                    width: 8
+                    height: 8
+                  - url: https://static.opensuse.org/distributions/logos/fedora.png
+                    width: 16
+                    height: 16
+                  architecture:
+                  - i586
+                  - x86_64
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+      tags:
+      - Distributions
+  "/distributions/{distribution_id}":
+    get:
+      summary: Show a distribution.
+      description: Show a distribution that can be build against.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: distribution_id
+        schema:
+          type: integer
+        required: true
+        description: The id of the distribution
+        example: 16626
+      responses:
+        '200':
+          description: OK. The request has succeded.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  id:
+                    type: integer
+                    example: 16626
+                    xml:
+                      attribute: true
+                  vendor:
+                    type: string
+                    example: opensuse
+                    xml:
+                      attribute: true
+                  version:
+                    type: string
+                    example: Tumbleweed
+                    xml:
+                      attribute: true
+                  name:
+                    type: string
+                    example: openSUSE Tumbleweed
+                  project:
+                    type: string
+                    example: openSUSE:Factory
+                  repository:
+                    type: string
+                    example: snapshot
+                  reponame:
+                    type: string
+                    example: openSUSE_Tumbleweed
+                  link:
+                    type: string
+                    example: http://www.opensuse.org/
+                  architecture:
+                    type: array
+                    example:
+                    - i586
+                    - x86_64
+                    items:
+                      type: string
+                  icon:
+                    type: array
+                    example:
+                    - width: 8
+                      height: 8
+                      url: https://static.opensuse.org/distributions/logos/opensuse.png
+                    - width: 16
+                      height: 16
+                      url: https://static.opensuse.org/distributions/logos/opensuse.png
+                    items:
+                      type: object
+                      properties:
+                        width:
+                          type: integer
+                          xml:
+                            attribute: true
+                        height:
+                          type: integer
+                          xml:
+                            attribute: true
+                        url:
+                          type: string
+                          xml:
+                            attribute: true
+                xml:
+                  name: distribution
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: Not found.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: not_found
+                summary: Couldn't find Distribution with 'id'=0
+      tags:
+      - Distributions
+    put:
+      summary: Update a distribution.
+      description: Update the data of a distribution.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: distribution_id
+        schema:
+          type: integer
+        required: true
+        description: The id of the distribution
+        example: 16626
+      requestBody:
+        description: Distribution definition
+        content:
+          application/xml; charset=utf-8:
+            schema:
+              type: object
+              properties:
+                id:
+                  type: integer
+                  example: 16626
+                  xml:
+                    attribute: true
+                vendor:
+                  type: string
+                  example: opensuse
+                  xml:
+                    attribute: true
+                version:
+                  type: string
+                  example: Tumbleweed
+                  xml:
+                    attribute: true
+                name:
+                  type: string
+                  example: openSUSE Tumbleweed
+                project:
+                  type: string
+                  example: openSUSE:Factory
+                repository:
+                  type: string
+                  example: snapshot
+                reponame:
+                  type: string
+                  example: openSUSE_Tumbleweed
+                link:
+                  type: string
+                  example: http://www.opensuse.org/
+                architecture:
+                  type: array
+                  example:
+                  - i586
+                  - x86_64
+                  items:
+                    type: string
+                icon:
+                  type: array
+                  example:
+                  - width: 8
+                    height: 8
+                    url: https://static.opensuse.org/distributions/logos/opensuse.png
+                  - width: 16
+                    height: 16
+                    url: https://static.opensuse.org/distributions/logos/opensuse.png
+                  items:
+                    type: object
+                    properties:
+                      width:
+                        type: integer
+                        xml:
+                          attribute: true
+                      height:
+                        type: integer
+                        xml:
+                          attribute: true
+                      url:
+                        type: string
+                        xml:
+                          attribute: true
+              xml:
+                name: distribution
+      responses:
+        '200':
+          description: |
+            OK. The Request has succeeded.
+
+            XML Schema used for body validation: [distribution.rng](../schema/distribution.rng)
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: Not found.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: not_found
+                summary: Couldn't find Distribution with 'id'=0
+      tags:
+      - Distributions
+    delete:
+      summary: Delete a distribution.
+      description: |
+        Delete a distribution.
+
+        This is only for admins.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: distribution_id
+        schema:
+          type: integer
+        required: true
+        description: The id of the distribution
+        example: 16626
+      responses:
+        '200':
+          description: OK. The request has succeded.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: Not found.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: not_found
+                summary: Couldn't find Distribution with 'id'=0
+      tags:
+      - Distributions
+  "/distributions/bulk_replace":
+    put:
+      summary: Bulk replace all distributions.
+      description: |
+        Bulk replace all distributions.
+
+        This is only for admins.
+      security:
+      - basic_authentication: []
+      requestBody:
+        description: Distributions definition
+        content:
+          application/xml; charset=utf-8:
+            schema:
+              type: object
+              properties:
+                distribution:
+                  type: array
+                  items:
+                    type: object
+                    properties:
+                      id:
+                        type: integer
+                        example: 16626
+                        xml:
+                          attribute: true
+                      vendor:
+                        type: string
+                        example: opensuse
+                        xml:
+                          attribute: true
+                      version:
+                        type: string
+                        example: Tumbleweed
+                        xml:
+                          attribute: true
+                      name:
+                        type: string
+                        example: openSUSE Tumbleweed
+                      project:
+                        type: string
+                        example: openSUSE:Factory
+                      repository:
+                        type: string
+                        example: snapshot
+                      reponame:
+                        type: string
+                        example: openSUSE_Tumbleweed
+                      link:
+                        type: string
+                        example: http://www.opensuse.org/
+                      architecture:
+                        type: array
+                        example:
+                        - i586
+                        - x86_64
+                        items:
+                          type: string
+                      icon:
+                        type: array
+                        example:
+                        - width: 8
+                          height: 8
+                          url: https://static.opensuse.org/distributions/logos/opensuse.png
+                        - width: 16
+                          height: 16
+                          url: https://static.opensuse.org/distributions/logos/opensuse.png
+                        items:
+                          type: object
+                          properties:
+                            width:
+                              type: integer
+                              xml:
+                                attribute: true
+                            height:
+                              type: integer
+                              xml:
+                                attribute: true
+                            url:
+                              type: string
+                              xml:
+                                attribute: true
+              xml:
+                name: distributions
+      responses:
+        '200':
+          description: |
+            OK. The Request has succeeded.
+
+            XML Schema used for body validation: [distributions.rng](../schema/distributions.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '400':
+          description: Bad Request.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: validation_failed
+                summary: 'distributions validation error: 40:0: ERROR: Expecting an
+                  element name, got nothing'
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+      tags:
+      - Distributions
+  "/group":
+    get:
+      summary: List available groups.
+      description: List available groups.
+      security:
+      - basic_authentication: []
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [directory.xsd](../schema/directory.xsd)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  count:
+                    type: integer
+                    xml:
+                      attribute: true
+                  name:
+                    type: string
+                    xml:
+                      attribute: true
+                  rev:
+                    type: string
+                    xml:
+                      attribute: true
+                  vrev:
+                    type: string
+                    xml:
+                      attribute: true
+                  srcmd5:
+                    type: string
+                    xml:
+                      attribute: true
+                  entry:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        name:
+                          type: string
+                          xml:
+                            attribute: true
+                        md5:
+                          type: string
+                          xml:
+                            attribute: true
+                        size:
+                          type: string
+                          xml:
+                            attribute: true
+                        mtime:
+                          type: string
+                          xml:
+                            attribute: true
+                xml:
+                  name: directory
+              example:
+                count: '2'
+                entry:
+                - name: group-admin
+                - name: group-test
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+      tags:
+      - Groups
+  "/group/{group_title}":
+    get:
+      summary: Read group data.
+      description: Read group data.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: group_title
+        schema:
+          type: string
+        required: true
+        description: Group title
+        example: group-test
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [group.rng](../schema/group.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  title:
+                    type: string
+                    example: group-test
+                  maintainer:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        userid:
+                          type: string
+                          example: user-test
+                          xml:
+                            attribute: true
+                  person:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        userid:
+                          type: string
+                          example: user-test
+                          xml:
+                            attribute: true
+                    xml:
+                      wrapped: true
+                xml:
+                  name: group
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: Not Found.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: not_found
+                summary: Couldn't find Group 'group-testd'
+      tags:
+      - Groups
+    post:
+      summary: Modify group data.
+      description: Modify group data.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: group_title
+        schema:
+          type: string
+        required: true
+        description: Group title
+        example: group-test
+      - in: query
+        name: cmd
+        schema:
+          type: string
+          enum:
+          - add_user
+          - remove_user
+          - set_email
+        description: |
+          Command to be executed. It takes one of these available values:
+          * `add_user`: add a user to a group. `userid` query parameter must be also used.
+          * `remove_user`: remove a user from a group. `userid` query parameter must be also used.
+          * `set_email`: set email adress of group. `email` query parameter must be also used.
+      - in: query
+        name: userid
+        schema:
+          type: string
+        description: User login. Used with `cmd=add_user` or `cmd=remove_user`.
+      - in: query
+        name: email
+        schema:
+          type: string
+        description: Group email. Used with `cmd=set_email`.
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '400':
+          description: Bad Request.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: bad_request
+                summary: cmd must be set to add_user or remove_user
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: Not Found.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                user_not_found:
+                  value:
+                    code: not_found
+                    summary: Couldn't find User with login = user_test
+                  summary: User Not Found
+                group_not_found:
+                  value:
+                    code: not_found
+                    summary: Couldn't find Group 'group-testd'
+                  summary: Group Not Found
+      tags:
+      - Groups
+    put:
+      summary: Write group data.
+      description: Write group data.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: group_title
+        schema:
+          type: string
+        required: true
+        description: Group title
+        example: group-test
+      requestBody:
+        description: |
+          Group definition.
+
+          XML Schema used for body validation: [group.rng](../schema/group.rng)
+        required: true
+        content:
+          application/xml; charset=utf-8:
+            schema:
+              type: object
+              properties:
+                title:
+                  type: string
+                  example: group-test
+                maintainer:
+                  type: array
+                  items:
+                    type: object
+                    properties:
+                      userid:
+                        type: string
+                        example: user-test
+                        xml:
+                          attribute: true
+                person:
+                  type: array
+                  items:
+                    type: object
+                    properties:
+                      userid:
+                        type: string
+                        example: user-test
+                        xml:
+                          attribute: true
+                  xml:
+                    wrapped: true
+              xml:
+                name: group
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: Not Found.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: not_found
+                summary: Couldn't find Group 'group-testd'
+      tags:
+      - Groups
+    delete:
+      summary: Delete a group.
+      description: Delete a group.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: group_title
+        schema:
+          type: string
+        required: true
+        description: Group title
+        example: group-test
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: Not Found.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: not_found
+                summary: Couldn't find Group 'group-testd'
+      tags:
+      - Groups
+  "/image_templates":
+    get:
+      summary: Get the list of image templates.
+      description: Get the list of image templates.
+      security:
+      - basic_authentication: []
+      responses:
+        '200':
+          description: List of image templates.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: array
+                items:
+                  type: object
+                  properties:
+                    name:
+                      type: string
+                      xml:
+                        attribute: true
+                    image_template_package:
+                      type: array
+                      items:
+                        type: object
+                        properties:
+                          name:
+                            type: string
+                          title:
+                            type: string
+                          description:
+                            type: string
+                  xml:
+                    name: image_template_project
+                    wrapped: true
+                xml:
+                  name: image_template_projects
+                  wrapped: true
+              example:
+              - name: openSUSE:Templates:Images:Tumbleweed
+                image_template_package:
+                - name: kiwi-templates-Minimal
+                  title: openSUSE Tumbleweed Minimal Images
+                  description: Images based on Tumbleweed for several platforms.
+                - name: minimal-container-image
+                  title: Application Container using KIWI
+                  description: |
+                    Starting ground to build a container image for openSUSE:Factory.
+
+                    It follows the requirements outlined on https://en.opensuse.org/Building_derived_containers.
+              - name: OBS:Flatpak:Templates
+                image_template_package:
+                - name: FlatpakTemplate
+                  title: Flatpak manifest template
+                  description: This is an example template how to build a Flatpak
+                    app in Open Build Service (OBS)
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+      tags:
+      - General Information
+  "/issue_trackers":
+    get:
+      summary: Get the list of issue trackers.
+      description: Get the list of issue trackers.
+      security:
+      - basic_authentication: []
+      responses:
+        '200':
+          description: |
+            List of issue trackers.
+
+            XML Schema used for body validation: [issue_trackers.rng](../schema/issue_trackers.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: array
+                items:
+                  type: object
+                  properties:
+                    name:
+                      type: string
+                      example: fate
+                    kind:
+                      type: string
+                      example: fate
+                    description:
+                      type: string
+                      example: openSUSE Feature Database
+                    url:
+                      type: string
+                      example: https://features.opensuse.org/
+                    show-url:
+                      type: string
+                      example: https://features.opensuse.org/@@@
+                    regex:
+                      type: string
+                      example: "(?:fate|Fate|FATE)\\s*#\\s*(\\d+)"
+                    label:
+                      type: string
+                      example: fate#@@@
+                    enable-fetch:
+                      type: string
+                      example: 'false'
+                  xml:
+                    name: issue-tracker
+                xml:
+                  name: issue-trackers
+                  wrapped: true
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+      tags:
+      - Issue Trackers
+    post:
+      summary: Create an issue tracker.
+      description: Create an issue tracker.
+      security:
+      - basic_authentication: []
+      requestBody:
+        description: |
+          Issue tracker definition.
+
+          XML Schema used for body validation: [issue_tracker.rng](../schema/issue_tracker.rng)
+        required: true
+        content:
+          application/xml; charset=utf-8:
+            schema:
+              type: object
+              properties:
+                name:
+                  type: string
+                  example: fate
+                kind:
+                  type: string
+                  example: fate
+                description:
+                  type: string
+                  example: openSUSE Feature Database
+                url:
+                  type: string
+                  example: https://features.opensuse.org/
+                show-url:
+                  type: string
+                  example: https://features.opensuse.org/@@@
+                regex:
+                  type: string
+                  example: "(?:fate|Fate|FATE)\\s*#\\s*(\\d+)"
+                label:
+                  type: string
+                  example: fate#@@@
+                enable-fetch:
+                  type: string
+                  example: 'false'
+              xml:
+                name: issue-tracker
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '400':
+          description: |
+            Validation failed.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                empty_body:
+                  value:
+                    code: validation_failed
+                    summary: Document is empty, not allowed for issue_tracker
+                  summary: Empty Body
+                wrong_xml_element:
+                  value:
+                    code: validation_failed
+                    summary: 'issue_tracker validation error: 1:0: ERROR: Expecting
+                      element issue-tracker, got foo'
+                  summary: Wrong XML Element
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+      tags:
+      - Issue Trackers
+  "/issue_trackers/{issue_tracker_name}":
+    get:
+      summary: Show an issue tracker.
+      description: Show an issue tracker.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: issue_tracker_name
+        schema:
+          type: string
+        required: true
+        description: Issue tracker name
+        example: fate
+      responses:
+        '200':
+          description: |
+            Issue tracker definition.
+
+            XML Schema used for body validation: [issue_tracker.rng](../schema/issue_tracker.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  name:
+                    type: string
+                    example: fate
+                  kind:
+                    type: string
+                    example: fate
+                  description:
+                    type: string
+                    example: openSUSE Feature Database
+                  url:
+                    type: string
+                    example: https://features.opensuse.org/
+                  show-url:
+                    type: string
+                    example: https://features.opensuse.org/@@@
+                  regex:
+                    type: string
+                    example: "(?:fate|Fate|FATE)\\s*#\\s*(\\d+)"
+                  label:
+                    type: string
+                    example: fate#@@@
+                  enable-fetch:
+                    type: string
+                    example: 'false'
+                xml:
+                  name: issue-tracker
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: |
+            Not Found.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: not_found
+                summary: Unable to find issue tracker 'foo'
+      tags:
+      - Issue Trackers
+    put:
+      summary: Update or create an issue tracker.
+      description: Update the issue tracker given as path parameter. If it is not
+        found, create it.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: issue_tracker_name
+        schema:
+          type: string
+        required: true
+        description: Issue tracker name
+        example: fate
+      requestBody:
+        description: |
+          Issue tracker definition.
+
+          XML Schema used for body validation: [issue_tracker.rng](../schema/issue_tracker.rng)
+        required: true
+        content:
+          application/xml; charset=utf-8:
+            schema:
+              type: object
+              properties:
+                name:
+                  type: string
+                  example: fate
+                kind:
+                  type: string
+                  example: fate
+                description:
+                  type: string
+                  example: openSUSE Feature Database
+                url:
+                  type: string
+                  example: https://features.opensuse.org/
+                show-url:
+                  type: string
+                  example: https://features.opensuse.org/@@@
+                regex:
+                  type: string
+                  example: "(?:fate|Fate|FATE)\\s*#\\s*(\\d+)"
+                label:
+                  type: string
+                  example: fate#@@@
+                enable-fetch:
+                  type: string
+                  example: 'false'
+              xml:
+                name: issue-tracker
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '400':
+          description: |
+            Validation failed.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                empty_body:
+                  value:
+                    code: validation_failed
+                    summary: Document is empty, not allowed for issue_tracker
+                  summary: Empty Body
+                wrong_xml_element:
+                  value:
+                    code: validation_failed
+                    summary: 'issue_tracker validation error: 1:0: ERROR: Expecting
+                      element issue-tracker, got foo'
+                  summary: Wrong XML Element
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+      tags:
+      - Issue Trackers
+    delete:
+      summary: Delete an issue tracker.
+      description: Delete an issue tracker.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: issue_tracker_name
+        schema:
+          type: string
+        required: true
+        description: Issue tracker name
+        example: fate
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: |
+            Not Found.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: not_found
+                summary: Unable to find issue tracker 'foo'
+      tags:
+      - Issue Trackers
+  "/issue_trackers/{issue_tracker_name}/issues/{issue_name}":
+    get:
+      summary: Show an issue of an issue tracker.
+      description: Show an issue of an issue tracker.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: issue_tracker_name
+        schema:
+          type: string
+        required: true
+        description: Issue tracker name
+        example: fate
+      - in: path
+        name: issue_name
+        schema:
+          type: string
+        required: true
+        description: Issue name.
+        example: 12345
+      responses:
+        '200':
+          description: |
+            Issue definition.
+
+            XML Schema used for body validation: [issue.rng](../schema/issue.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  created_at:
+                    type: string
+                    example: 2021-01-18 19:17:51 UTC
+                  updated_at:
+                    type: string
+                    example: 2021-01-18 19:17:51 UTC
+                  name:
+                    type: string
+                    example: 12345
+                  tracker:
+                    type: string
+                    example: fate
+                  label:
+                    type: string
+                    example: fate#12345
+                  url:
+                    type: string
+                    example: https://features.opensuse.org/12345
+                  state:
+                    type: string
+                  summary:
+                    type: string
+                  owner:
+                    type: object
+                    properties:
+                      login:
+                        type: string
+                      email:
+                        type: string
+                      realname:
+                        type: string
+                xml:
+                  name: issue
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: |
+            Not Found.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: issue_tracker_not_found
+                summary: 'Error: Issue Tracker ''foo'' not found.'
+      tags:
+      - Issue Trackers
+  "/my/notifications":
+    get:
+      summary: List the notifications of the authenticated user.
+      description: |
+        **(Unstable)** List user's notifications.
+
+        **NOTE:** Available only in OBS Unstable.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: query
+        name: project
+        schema:
+          type: string
+      - in: query
+        name: page
+        schema:
+          type: integer
+      - in: query
+        name: show_maximum
+        schema:
+          type: string
+        example: 1
+      - in: query
+        name: notifications_type
+        schema:
+          type: string
+          enum:
+          - read
+          - comments
+          - requests
+          - unread
+          - incoming_requests
+          - outgoing_requests
+          - relationships_created
+          - relationships_deleted
+          - build_failures
+          - reports
+          - workflow_runs
+          - appealed_decisions
+      responses:
+        '200':
+          description: OK. The request has succeeded.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  count:
+                    type: string
+                    xml:
+                      attribute: true
+                  total_pages:
+                    type: string
+                  current_page:
+                    type: string
+                  notification:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        id:
+                          type: string
+                          xml:
+                            attribute: true
+                        when:
+                          type: string
+                        description:
+                          type: string
+                        title:
+                          type: string
+                        who:
+                          type: string
+                        event_type:
+                          type: string
+                xml:
+                  name: notifications
+              example:
+                count: 2
+                total_pages: 1
+                current_page: 0
+                notification:
+                - id: 3
+                  title: test 1
+                  who: Administrator
+                  state: new
+                  when: 2021-09-30 07:12:02.000000000 +00:00
+                  event_type: review_wanted
+                - id: 25
+                  title: test 2
+                  who: User 2
+                  event_type: comment_for_package
+                  when: 2021-09-27 07:16:19.000000000 +00:00
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+      tags:
+      - Notifications
+  "/my/notifications/{id}":
+    put:
+      summary: Mark a notification as read/unread.
+      description: |
+        **(Unstable)** If a notification is unread, it will be marked as read. If a notification is read, it will be marked as unread.
+
+        **NOTE:** Available only in OBS Unstable.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: id
+        required: true
+        schema:
+          type: integer
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '403':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: Not Found
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Not Found:
+                  value:
+                    code: not_found
+                    summary: Couldn't find Notification with 'id'=213453
+      tags:
+      - Notifications
+  "/person":
+    get:
+      summary: List all people.
+      description: List all people.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: query
+        name: prefix
+        schema:
+          type: string
+        required: false
+        description: A prefix to filter the people to look for
+        example: Adm
+      - in: query
+        name: confirmed
+        schema:
+          type: string
+        required: false
+        description: List only active users. This parameter is interpreted as `true`
+          if present, `false` otherwise.
+        example: 1
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [directory.xsd](../schema/directory.xsd)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  count:
+                    type: integer
+                    xml:
+                      attribute: true
+                  name:
+                    type: string
+                    xml:
+                      attribute: true
+                  rev:
+                    type: string
+                    xml:
+                      attribute: true
+                  vrev:
+                    type: string
+                    xml:
+                      attribute: true
+                  srcmd5:
+                    type: string
+                    xml:
+                      attribute: true
+                  entry:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        name:
+                          type: string
+                          xml:
+                            attribute: true
+                        md5:
+                          type: string
+                          xml:
+                            attribute: true
+                        size:
+                          type: string
+                          xml:
+                            attribute: true
+                        mtime:
+                          type: string
+                          xml:
+                            attribute: true
+                xml:
+                  name: directory
+              example:
+                count: '9'
+                entry:
+                - name: Admin
+                - name: _nobody_
+                - name: Iggy
+                - name: user_1
+                - name: repo-checker
+                - name: reviewhero
+                - name: user_2
+                - name: user_3
+                - name: Requestor
+      tags:
+      - Person
+    post:
+      summary: Executes a command on the person endpoint.
+      description: |
+        Allows executing command on the person endpoint.
+
+        As of now, the only command allowed is 'register'.
+      parameters:
+      - in: query
+        name: cmd
+        schema:
+          type: string
+          enum:
+          - register
+        required: true
+        description: The command to execute
+        example: register
+      requestBody:
+        description: The data for the person to register.
+        required: true
+        content:
+          application/xml:
+            schema:
+              type: object
+              properties:
+                login:
+                  type: string
+                  example: jane
+                realname:
+                  type: string
+                  example: Jane Doe
+                email:
+                  type: string
+                  example: janedoe@example.com
+                password:
+                  type: string
+                  example: superpassword123
+                note:
+                  type: string
+                  example: Jane works in the Engineering team
+                state:
+                  type: string
+                  example: confirmed
+              xml:
+                name: unregisteredperson
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '400':
+          description: |
+            Bad request.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown Command:
+                  value:
+                    code: unknown_command
+                    summary: Allowed command is 'register'.
+                Bad Request:
+                  value:
+                    code: err_register_save
+                    summary: 'Could not save the registration, details: Login is the
+                      name of an already existing user and Password can''t be blank.'
+      tags:
+      - Person
+  "/person/register":
+    post:
+      summary: Registers a new person
+      deprecated: true
+      description: This endpoint is exactly the same as `POST /person?cmd=register`,
+        please use that one.
+      requestBody:
+        description: Data for the person to register.
+        required: true
+        content:
+          application/xml:
+            schema:
+              type: object
+              properties:
+                login:
+                  type: string
+                  example: jane
+                realname:
+                  type: string
+                  example: Jane Doe
+                email:
+                  type: string
+                  example: janedoe@example.com
+                password:
+                  type: string
+                  example: superpassword123
+                note:
+                  type: string
+                  example: Jane works in the Engineering team
+                state:
+                  type: string
+                  example: confirmed
+              xml:
+                name: unregisteredperson
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '403':
+          description: Forbidden
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: permission_denied
+                summary: |
+                  User accounts can not be registered via OBS when in LDAP mode. Please refer
+                  to your LDAP server to create new users.
+      tags:
+      - Person
+  "/person/{login}":
+    get:
+      summary: Get details about a person
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: login
+        schema:
+          type: string
+        required: true
+        description: Person login.
+        example: Admin
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [user.rng](../schema/user.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  login:
+                    type: string
+                    example: user_1
+                  email:
+                    type: string
+                    example: unconfigured@openbuildservice.org
+                  realname:
+                    type: string
+                    example: User1
+                  state:
+                    type: string
+                    example: confirmed
+                  globalrole:
+                    type: string
+                  ignore_auth_services:
+                    type: boolean
+                  watchlist:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        project:
+                          type: object
+                          properties:
+                            name:
+                              type: string
+                              xml:
+                                attribute: true
+                        package:
+                          type: object
+                          properties:
+                            name:
+                              type: string
+                              xml:
+                                attribute: true
+                            project:
+                              type: string
+                              xml:
+                                attribute: true
+                        request:
+                          type: object
+                          properties:
+                            number:
+                              type: string
+                              xml:
+                                attribute: true
+                    xml:
+                      name: watchlist
+                xml:
+                  name: person
+              example:
+                login: Admin
+                email: root@localhost
+                realname: OBS Instance Superuser
+                state: confirmed
+                globalrole: Admin
+                ignore_auth_services: false
+                watchlist:
+                - project:
+                    name: home:Admin
+                  package:
+                    name: ad
+                    project: home:Admin
+                  request:
+                    number: '7'
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: |
+            Not found.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: not_found
+                summary: Couldn't find User with login = <login>
+      tags:
+      - Person
+    post:
+      summary: Perform changes on a registered person
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: login
+        schema:
+          type: string
+        required: true
+        description: Person login.
+        example: Admin
+      - in: query
+        name: cmd
+        schema:
+          type: string
+          enum:
+          - change_password
+          - lock
+          - delete
+        required: true
+        description: The command to execute against the provided person.
+        example: change_password
+      requestBody:
+        description: The password in plain text when the cmd param is 'change_password'.
+        required: false
+        content:
+          text/plain:
+            schema:
+              type: string
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [api_response.xsd](../schema/api_response.xsd)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '400':
+          description: |
+            Bad request.
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown Command:
+                  value:
+                    code: unknown_command
+                    summary: Allowed commands are '<some command>'.
+                Bad Request:
+                  value:
+                    code: err_register_save
+                    summary: 'Could not save the registration, details: Login is the
+                      name of an already existing user and Password can''t be blank.'
+        '403':
+          description: |
+            Forbidden.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                update_user_not_authorized:
+                  value:
+                    code: update_user_not_authorized
+                    summary: You are not authorized to update this User.
+        '404':
+          description: |
+            Not found.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: not_found
+                summary: Couldn't find User with login = <login>
+      tags:
+      - Person
+    put:
+      summary: Update person
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: login
+        schema:
+          type: string
+        required: true
+        description: Person login.
+        example: Admin
+      requestBody:
+        description: The new data for the person referred in the login parameter.
+        required: true
+        content:
+          application/xml:
+            schema:
+              type: object
+              properties:
+                login:
+                  type: string
+                  example: jane
+                realname:
+                  type: string
+                  example: Jane Doe
+                email:
+                  type: string
+                  example: janedoe@example.com
+                password:
+                  type: string
+                  example: superpassword123
+                note:
+                  type: string
+                  example: Jane works in the Engineering team
+                state:
+                  type: string
+                  example: confirmed
+              xml:
+                name: unregisteredperson
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '400':
+          description: |
+            Bad request.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Subaccount chaining:
+                  value:
+                    code: subaccount_chaining
+                    summary: A subaccount can not be assigned to subaccount <login>
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '403':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Change user info not permitted:
+                  value:
+                    code: change_userinfo_no_permission
+                    summary: no permission to change userinfo for user <login>
+        '404':
+          description: |
+            Not found.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: password_empty
+                summary: Requested non-existing user
+      tags:
+      - Person
+  "/person/{login}/group":
+    get:
+      summary: List the groups of a person
+      description: List the groups the person belongs to.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: login
+        schema:
+          type: string
+        required: true
+        description: Person login.
+        example: Admin
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [directory.xsd](../schema/directory.xsd)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  count:
+                    type: integer
+                    xml:
+                      attribute: true
+                  name:
+                    type: string
+                    xml:
+                      attribute: true
+                  rev:
+                    type: string
+                    xml:
+                      attribute: true
+                  vrev:
+                    type: string
+                    xml:
+                      attribute: true
+                  srcmd5:
+                    type: string
+                    xml:
+                      attribute: true
+                  entry:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        name:
+                          type: string
+                          xml:
+                            attribute: true
+                        md5:
+                          type: string
+                          xml:
+                            attribute: true
+                        size:
+                          type: string
+                          xml:
+                            attribute: true
+                        mtime:
+                          type: string
+                          xml:
+                            attribute: true
+                xml:
+                  name: directory
+              example:
+                count: '2'
+                entry:
+                - name: factory-maintainers
+                - name: obs-developers
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: |
+            Not Found.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: not_found
+                summary: Couldn't find User with login = fake
+      tags:
+      - Person
+  "/person/{login}/token":
+    get:
+      summary: List the authentication tokens of a person.
+      description: List the authentication tokens of a person.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: login
+        schema:
+          type: string
+        required: true
+        description: Person login.
+        example: Admin
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [tokenlist.rng](../schema/tokenlist.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  count:
+                    type: integer
+                    xml:
+                      attribute: true
+                  entry:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        id:
+                          type: string
+                          xml:
+                            attribute: true
+                        description:
+                          type: string
+                          xml:
+                            attribute: true
+                        string:
+                          type: string
+                          xml:
+                            attribute: true
+                        kind:
+                          type: string
+                          xml:
+                            attribute: true
+                        triggered_at:
+                          type: string
+                          format: date-time
+                          xml:
+                            attribute: true
+                        project:
+                          type: string
+                          xml:
+                            attribute: true
+                        package:
+                          type: string
+                          xml:
+                            attribute: true
+                xml:
+                  name: directory
+              example:
+                count: 2
+                entry:
+                - id: 3
+                  string: FK49K39DKK
+                  kind: rss
+                  triggered_at: 2021-10-28 12:32:18 UTC
+                - id: 25
+                  description: Release ghcz
+                  string: 4T04JGI691
+                  kind: release
+                  triggered_at: 2021-09-21 11:12:18 UTC
+                  project: devel:languages:haskell
+                  package: ghcz
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '403':
+          description: |
+            Forbidden.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: view_user_not_authorized
+                summary: You are not authorized to view this User.
+      tags:
+      - Person
+    post:
+      summary: Create a new authentication token for a person.
+      description: |
+        Create a new authentication token for a person.
+
+        The token may be limited to a specific package. In this case the query parameters
+        `project` and `package` should be provided.
+
+        With an empty request body, a token of the default kind 'runservice' is created.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: login
+        schema:
+          type: string
+        required: true
+        description: Person login.
+        example: Admin
+      - in: query
+        name: description
+        schema:
+          type: string
+        description: 'Token description. It helps to identify a token from the rest
+          of the tokens of a user.
+
+'
+        example: Rebuild gchz
+      - in: query
+        name: project
+        schema:
+          type: string
+        description: |
+          Project name. Should be provided, together with the package query parameter,
+          to limit the token to a specific package.
+        example: home:hans
+      - in: query
+        name: package
+        schema:
+          type: string
+        description: |
+          Package name. Should be provided, together with the project query parameter,
+          to limit the token to a specific package.
+        example: gchz
+      - in: query
+        name: operation
+        schema:
+          type: string
+          enum:
+          - runservice
+          - rebuild
+          - release
+        description: |
+          Operation indicates the kind of token that is going to be created.
+
+          When operation is not specified, 'runservice' is the default value.
+        example: runservice
+      - in: query
+        name: scm_token
+        schema:
+          type: string
+        description: |
+          **(Beta/Unstable)**
+
+          SCM token used in OBS workflows to report back the workflow status, when the operation is workflow.
+
+          It's normally possible to generate SCM tokens directly on the SCM's website like GitHub or GitLab.
+        example: ghp_fake_token_123
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+
+            **NOTE:** This is an example of a valid response. It should include the attribute 'name'
+            in every 'data' tag, which is missing in the example using the schema.
+            ```
+              <status code="ok">
+                <summary>Ok</summary>
+                <data name="token">i6iF4M5cn</data>
+                <data name="id">5</data>
+              </status>
+            ```
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+                data:
+                - i6iF4M5cn
+                - 5
+        '400':
+          description: |
+            Bad Request.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: invalid_token
+                summary: 'Failed to create token: Name is too long (maximum is 64
+                  characters).'
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '403':
+          description: |
+            Forbidden.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: update_user_not_authorized
+                summary: You are not authorized to update this User.
+      tags:
+      - Person
+  "/person/{login}/token/{id}":
+    delete:
+      summary: Delete a token of a person.
+      description: Delete a token of the specified person.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: login
+        schema:
+          type: string
+        required: true
+        description: Person login.
+        example: Admin
+      - in: path
+        name: id
+        schema:
+          type: string
+        required: true
+        description: Id of the token to be removed.
+        example: 3
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '403':
+          description: |
+            Forbidden.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: update_user_not_authorized
+                summary: You are not authorized to update this User.
+        '404':
+          description: |
+            Not Found.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: not_found
+                summary: Couldn't find Token with 'id'=33
+      tags:
+      - Person
+  "/person/{login}/watchlist":
+    get:
+      summary: Get details about watchlist
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: login
+        schema:
+          type: string
+        required: true
+        description: Person login.
+        example: Admin
+      responses:
+        '200':
+          description: OK. The request has succeeded.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: array
+                items:
+                  type: object
+                  properties:
+                    project:
+                      type: object
+                      properties:
+                        name:
+                          type: string
+                          xml:
+                            attribute: true
+                    package:
+                      type: object
+                      properties:
+                        name:
+                          type: string
+                          xml:
+                            attribute: true
+                        project:
+                          type: string
+                          xml:
+                            attribute: true
+                    request:
+                      type: object
+                      properties:
+                        number:
+                          type: string
+                          xml:
+                            attribute: true
+                xml:
+                  name: watchlist
+              example:
+              - project:
+                  name: home:Admin
+                package:
+                  name: ad
+                  project: home:Admin
+                request:
+                  number: '7'
+        '404':
+          description: |
+            Not found.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: password_empty
+                summary: Requested non-existing user
+      tags:
+      - Person
+    put:
+      summary: Update watchlist
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: login
+        schema:
+          type: string
+        required: true
+        description: Person login.
+        example: Admin
+      requestBody:
+        description: The new data for the person referred in the login parameter.
+        required: true
+        content:
+          application/xml:
+            schema:
+              type: array
+              items:
+                type: object
+                properties:
+                  project:
+                    type: object
+                    properties:
+                      name:
+                        type: string
+                        xml:
+                          attribute: true
+                  package:
+                    type: object
+                    properties:
+                      name:
+                        type: string
+                        xml:
+                          attribute: true
+                      project:
+                        type: string
+                        xml:
+                          attribute: true
+                  request:
+                    type: object
+                    properties:
+                      number:
+                        type: string
+                        xml:
+                          attribute: true
+              xml:
+                name: watchlist
+            example:
+            - project:
+                name: home:Admin
+              package:
+                name: ad
+                project: home:Admin
+              request:
+                number: '7'
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '404':
+          description: |
+            Not found.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: password_empty
+                summary: Requested non-existing user
+      tags:
+      - Person
+  "/published":
+    get:
+      summary: List all the published projects.
+      description: Get a list of all the projects, all of them are considered published.
+      security:
+      - basic_authentication: []
+      responses:
+        '200':
+          description: OK. The request has succeeded.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  count:
+                    type: integer
+                    xml:
+                      attribute: true
+                  name:
+                    type: string
+                    xml:
+                      attribute: true
+                  rev:
+                    type: string
+                    xml:
+                      attribute: true
+                  vrev:
+                    type: string
+                    xml:
+                      attribute: true
+                  srcmd5:
+                    type: string
+                    xml:
+                      attribute: true
+                  entry:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        name:
+                          type: string
+                          xml:
+                            attribute: true
+                        md5:
+                          type: string
+                          xml:
+                            attribute: true
+                        size:
+                          type: string
+                          xml:
+                            attribute: true
+                        mtime:
+                          type: string
+                          xml:
+                            attribute: true
+                xml:
+                  name: directory
+              example:
+                entry:
+                - name: OBS:Server:Unstable
+                - name: devel:languages:ruby
+                - name: openSUSE:Maintenance:9810
+                - name: zypp:plugins
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+      tags:
+      - Published Binaries
+  "/published/{project_name}":
+    get:
+      summary: List the repositories of a project with published binaries
+      description: Get a list of the repositories of the project that already have
+        published binaries.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      responses:
+        '200':
+          description: OK. The request has succeeded.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  count:
+                    type: integer
+                    xml:
+                      attribute: true
+                  name:
+                    type: string
+                    xml:
+                      attribute: true
+                  rev:
+                    type: string
+                    xml:
+                      attribute: true
+                  vrev:
+                    type: string
+                    xml:
+                      attribute: true
+                  srcmd5:
+                    type: string
+                    xml:
+                      attribute: true
+                  entry:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        name:
+                          type: string
+                          xml:
+                            attribute: true
+                        md5:
+                          type: string
+                          xml:
+                            attribute: true
+                        size:
+                          type: string
+                          xml:
+                            attribute: true
+                        mtime:
+                          type: string
+                          xml:
+                            attribute: true
+                xml:
+                  name: directory
+              example:
+                entry:
+                - name: SLE_15_SP3
+                - name: containers
+                - name: images
+                - name: openSUSE_15.2
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '403':
+          description: |
+            Forbidden.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: download_binary_no_permission
+                summary: No permission for binaries from project home:Admin
+        '404':
+          description: Not Found.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: not_found
+                summary: Couldn't find Project
+      tags:
+      - Published Binaries
+  "/published/{project_name}/{repository_name}":
+    get:
+      summary: List the content of the directory tree where the binaries are published
+        at the level project/repository.
+      description: |
+        Get a list of architectures' directories and other files (.repo, .ymp, etc.) present at the level
+        project/repository of the directory tree where the published binaries are stored.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: repository_name
+        schema:
+          type: string
+        required: true
+        description: Repository name
+        example: openSUSE_Tumbleweed
+      responses:
+        '200':
+          description: OK. The request has succeeded.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  count:
+                    type: integer
+                    xml:
+                      attribute: true
+                  name:
+                    type: string
+                    xml:
+                      attribute: true
+                  rev:
+                    type: string
+                    xml:
+                      attribute: true
+                  vrev:
+                    type: string
+                    xml:
+                      attribute: true
+                  srcmd5:
+                    type: string
+                    xml:
+                      attribute: true
+                  entry:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        name:
+                          type: string
+                          xml:
+                            attribute: true
+                        md5:
+                          type: string
+                          xml:
+                            attribute: true
+                        size:
+                          type: string
+                          xml:
+                            attribute: true
+                        mtime:
+                          type: string
+                          xml:
+                            attribute: true
+                xml:
+                  name: directory
+              example:
+                entry:
+                - name: OBS:Server:Unstable.repo
+                - name: OBS_Server.ymp
+                - name: aarch64
+                - name: x86_64
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '403':
+          description: |
+            Forbidden.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: download_binary_no_permission
+                summary: No permission for binaries from project home:Admin
+        '404':
+          description: Not Found.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: not_found
+                summary: Couldn't find Project
+      tags:
+      - Published Binaries
+  "/published/{project_name}/{repository_name}?view=status":
+    get:
+      summary: Present information about the last publication of the pair project
+        and repository.
+      description: Get information about the build process (build id, start time,
+        etc.) for the pair project and repository.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: repository_name
+        schema:
+          type: string
+        required: true
+        description: Repository name
+        example: openSUSE_Tumbleweed
+      - in: query
+        name: view
+        schema:
+          type: string
+          enum:
+          - status
+        description: Set this parameter to status in order to get details about the
+          last publication.
+        example: status
+      responses:
+        '200':
+          description: OK. The request has succeeded.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    example: succeeded
+                    xml:
+                      attribute: true
+                  starttime:
+                    type: integer
+                    example: 1617574611
+                  endtime:
+                    type: integer
+                    example: 1617574611
+                  buildid:
+                    type: integer
+                    example: 1569496563
+                xml:
+                  name: status
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '403':
+          description: |
+            Forbidden.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: download_binary_no_permission
+                summary: No permission for binaries from project home:Admin
+        '404':
+          description: Not Found.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                project:
+                  code: not_found
+                  summary: Couldn't find Project
+                unknown:
+                  value:
+                    code: unknown
+      tags:
+      - Published Binaries
+  "/published/{project_name}/{repository_name}/{architecture_name}":
+    get:
+      summary: List the content of the directory tree where the binaries are published
+        at the level project/repository/architecture.
+      description: |
+        Get a list of binaries and other files present at the level project/repository/architecture of the directory
+        tree as a result of successful building and publishing processes.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: repository_name
+        schema:
+          type: string
+        required: true
+        description: Repository name
+        example: openSUSE_Tumbleweed
+      - in: path
+        name: architecture_name
+        schema:
+          type: string
+        required: true
+        description: Architecture name
+        example: x86_64
+      responses:
+        '200':
+          description: OK. The request has succeeded.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  count:
+                    type: integer
+                    xml:
+                      attribute: true
+                  name:
+                    type: string
+                    xml:
+                      attribute: true
+                  rev:
+                    type: string
+                    xml:
+                      attribute: true
+                  vrev:
+                    type: string
+                    xml:
+                      attribute: true
+                  srcmd5:
+                    type: string
+                    xml:
+                      attribute: true
+                  entry:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        name:
+                          type: string
+                          xml:
+                            attribute: true
+                        md5:
+                          type: string
+                          xml:
+                            attribute: true
+                        size:
+                          type: string
+                          xml:
+                            attribute: true
+                        mtime:
+                          type: string
+                          xml:
+                            attribute: true
+                xml:
+                  name: directory
+              example:
+                entry:
+                - name: apache2-mod_auth_memcookie-1.1.1-lp152.2.1.x86_64.rpm
+                - name: obs-api-testsuite-rspec-2.11~alpha.20200618T200341.d42d8310aa-lp152.10515.1.x86_64.rpm
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '403':
+          description: |
+            Forbidden.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: download_binary_no_permission
+                summary: No permission for binaries from project home:Admin
+        '404':
+          description: Not Found.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: not_found
+                summary: Couldn't find Project
+      tags:
+      - Published Binaries
+  "/published/{project_name}/{repository_name}/{architecture_name}/{binary_filename}":
+    get:
+      summary: Return the binary file itself.
+      description: |
+        Allow to download the binary file that was published and stored under the directory
+        given by project/repository/architecture/.
+
+        Can response with Media Types like application/x-rpm, text/xml, etc.
+
+        NOTE: Use this only if you absolutely have to, as it doesn't use the redirector.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: repository_name
+        schema:
+          type: string
+        required: true
+        description: Repository name
+        example: openSUSE_Tumbleweed
+      - in: path
+        name: architecture_name
+        schema:
+          type: string
+        required: true
+        description: Architecture name
+        example: x86_64
+      - in: path
+        name: binary_filename
+        schema:
+          type: string
+        required: true
+        description: Binary filename
+        example: ctris-0.42.1-8.1.x86_64.rpm
+      responses:
+        '200':
+          description: OK
+          content:
+            application/*:
+              schema:
+                type: string
+                format: binary
+            text/xml:
+              schema:
+                type: string
+                format: binary
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '403':
+          description: |
+            Forbidden.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: download_binary_no_permission
+                summary: No permission for binaries from project home:Admin
+        '404':
+          description: Not Found.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                NotFound:
+                  value:
+                    code: not_found
+                    summary: Couldn't find Project
+                NoSuchFile:
+                  value:
+                    code: 404
+                    summary: no such file
+                    details: 404 no such file
+      tags:
+      - Published Binaries
+  "/published/{project_name}/{repository_name}/{architecture_name}/{binary_filename}?view=ymp":
+    get:
+      summary: Generate a ymp pattern that includes the needed repositories to install
+        the given binary.
+      description: |
+        Generate a ymp pattern, which contains the list of packages needed for intalling certain software without having to
+        create dependencies between them.
+
+        Read more about patterns [in this tutorial](https://en.opensuse.org/openSUSE:Build_Service_Tutorial#Create_Patterns).
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: repository_name
+        schema:
+          type: string
+        required: true
+        description: Repository name
+        example: openSUSE_Tumbleweed
+      - in: path
+        name: architecture_name
+        schema:
+          type: string
+        description: Architecture name
+        example: x86_64
+      - in: path
+        name: binary_filename
+        schema:
+          type: string
+        required: true
+        description: Binary filename
+        example: ctris-0.42.1-8.1.x86_64.rpm
+      responses:
+        '200':
+          description: OK.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  group:
+                    type: object
+                    properties:
+                      repositories:
+                        type: object
+                        properties:
+                          repository:
+                            type: array
+                            items:
+                              type: object
+                              properties:
+                                recommended:
+                                  type: string
+                                  xml:
+                                    attribute: true
+                                name:
+                                  type: string
+                                summary:
+                                  type: string
+                                description:
+                                  type: string
+                                url:
+                                  type: string
+                      software:
+                        type: object
+                        properties:
+                          item:
+                            type: object
+                            properties:
+                              name:
+                                type: string
+                              summary:
+                                type: string
+                              description:
+                                type: string
+                      distversion:
+                        type: string
+                        xml:
+                          attribute: true
+                  xmlns:os:
+                    type: string
+                    xml:
+                      attribute: true
+                      example: http://opensuse.org/Standards/One_Click_Install
+                  xmlns:
+                    type: string
+                    xml:
+                      attribute: true
+                      example: http://opensuse.org/Standards/One_Click_Install
+                xml:
+                  name: metapackage
+              example:
+                group:
+                  repositories:
+                    repository:
+                    - recommended: true
+                      name: OBS:Server:Unstable
+                      summary: Developer versions of the Open Build Service Server
+                      description: These are the developer versions of the tools for
+                        the Open Build Service project
+                      url: https://download.opensuse.org/repositories/OBS:/Server:/Unstable/openSUSE_15.2
+                    - recommended: false
+                      name: openSUSE:Leap:15.2
+                      summary: openSUSE Leap 15.2
+                      description: openSUSE Leap borrows packages from SLE for the
+                        base system
+                      url: http://download.opensuse.org/distribution/leap/15.2/repo/oss
+                  software:
+                    item:
+                      name: virt-v2v-debuginfo
+                      summary: Debug information for package virt-v2v
+                      description: This package provides debug information for package
+                        virt-v2v
+                  distversion: openSUSEsLeap 15.2
+                xmlns:os: http://opensuse.org/Standards/One_Click_Install
+                xmlns: http://opensuse.org/Standards/One_Click_Install
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '403':
+          description: |
+            Forbidden.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: download_binary_no_permission
+                summary: No permission for binaries from project home:Admin
+        '404':
+          description: Not Found.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: not_found
+                summary: Couldn't find Project
+      tags:
+      - Published Binaries
+  "/request":
+    get:
+      summary: Get a simple directory listing of all requests
+      description: Get a simple directory listing of all requests
+      security:
+      - basic_authentication: []
+      responses:
+        '200':
+          description: |
+            OK
+
+            XML Schema used for body validation: [directory.xsd](../schema/directory.xsd)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  count:
+                    type: integer
+                    xml:
+                      attribute: true
+                  name:
+                    type: string
+                    xml:
+                      attribute: true
+                  rev:
+                    type: string
+                    xml:
+                      attribute: true
+                  vrev:
+                    type: string
+                    xml:
+                      attribute: true
+                  srcmd5:
+                    type: string
+                    xml:
+                      attribute: true
+                  entry:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        name:
+                          type: string
+                          xml:
+                            attribute: true
+                        md5:
+                          type: string
+                          xml:
+                            attribute: true
+                        size:
+                          type: string
+                          xml:
+                            attribute: true
+                        mtime:
+                          type: string
+                          xml:
+                            attribute: true
+                xml:
+                  name: directory
+              example:
+                entry:
+                - name: 122
+                - name: 123
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+      tags:
+      - Requests
+    post:
+      summary: Create a request
+      description: Create a request
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: query
+        name: cmd
+        required: true
+        schema:
+          type: string
+          enum:
+          - create
+        description: This endpoint will refuse the creation of a new request if this
+          parameter is not set.
+      - in: query
+        name: addrevision
+        schema:
+          type: string
+          enum:
+          - 1
+        description: Ask the server to add revisions of the current sources to the
+          request.
+      - in: query
+        name: ignore_delegate
+        schema:
+          type: string
+          enum:
+          - 1
+        description: Enforce a new package instance in a project which has OBS:DelegateRequestTarget
+          set
+      - in: query
+        name: ignore_build_state
+        schema:
+          type: string
+          enum:
+          - 1
+        description: Skip the build state check
+      requestBody:
+        description: |
+          Request XML
+
+          **NOTE:** You cannot pass the request id in the xml. You can pass the history in the xml, but it will be simply ignored.
+        required: true
+        content:
+          application/xml; charset=utf-8:
+            schema:
+              type: object
+              properties:
+                id:
+                  type: integer
+                  example: 42
+                  xml:
+                    attribute: true
+                creator:
+                  type: string
+                  example: foo-user
+                  xml:
+                    attribute: true
+                action:
+                  type: object
+                  properties:
+                    type:
+                      type: string
+                      example: submit
+                      xml:
+                        attribute: true
+                    source:
+                      type: object
+                      properties:
+                        project:
+                          type: string
+                          example: home:foo-user
+                          xml:
+                            attribute: true
+                        package:
+                          type: string
+                          example: obs-server
+                          xml:
+                            attribute: true
+                        rev:
+                          type: integer
+                          example: 521
+                          xml:
+                            attribute: true
+                    target:
+                      type: object
+                      properties:
+                        project:
+                          type: string
+                          example: OBS:Unstable
+                          xml:
+                            attribute: true
+                        package:
+                          type: string
+                          example: obs-server
+                          xml:
+                            attribute: true
+                    options:
+                      type: object
+                      properties:
+                        sourceupdate:
+                          type: string
+                          example: cleanup
+                state:
+                  type: object
+                  properties:
+                    name:
+                      type: string
+                      example: accepted
+                      xml:
+                        attribute: true
+                    who:
+                      type: string
+                      example: bar-user
+                      xml:
+                        attribute: true
+                    when:
+                      type: string
+                      example: '2021-01-15T13:39:43'
+                      xml:
+                        attribute: true
+                    comment:
+                      type: string
+                      example: allright
+                review:
+                  type: array
+                  items:
+                    type: object
+                    properties:
+                      state:
+                        type: string
+                        xml:
+                          attribute: true
+                      when:
+                        type: string
+                        xml:
+                          attribute: true
+                      who:
+                        type: string
+                        xml:
+                          attribute: true
+                      by_user:
+                        type: string
+                        xml:
+                          attribute: true
+                      by_group:
+                        type: string
+                        xml:
+                          attribute: true
+                      by_project:
+                        type: string
+                        xml:
+                          attribute: true
+                      by_package:
+                        type: string
+                        xml:
+                          attribute: true
+                      comment:
+                        type: string
+                      history:
+                        type: object
+                        properties:
+                          when:
+                            type: string
+                            xml:
+                              attribute: true
+                          who:
+                            type: string
+                            xml:
+                              attribute: true
+                          description:
+                            type: string
+                  example:
+                  - state: accepted
+                    when: '2021-01-15T15:49:32'
+                    who: obs-maintainer
+                    by_user: obs-maintainer
+                  - state: accepted
+                    when: '2021-01-15T15:49:32'
+                    who: obs-maintainer
+                    by_group: obs-group
+                  - state: accepted
+                    when: '2021-01-15T15:49:32'
+                    who: obs-maintainer
+                    by_project: OBS:Unstable
+                  - state: accepted
+                    when: '2021-01-15T15:49:32'
+                    who: obs-maintainer
+                    by_package: obs-server
+                history:
+                  type: array
+                  items:
+                    type: object
+                    properties:
+                      who:
+                        type: string
+                        example: foo
+                        xml:
+                          attribute: true
+                      when:
+                        type: string
+                        example: '2021-01-15T13:39:43'
+                        xml:
+                          attribute: true
+                      description:
+                        type: string
+                        example: Request created
+                      comment:
+                        type: string
+                        example: Please review sources
+                description:
+                  type: string
+                  example: A little version update
+              xml:
+                name: request
+      responses:
+        '200':
+          description: |
+            OK.
+
+            XML Schema used for body validation: [request.rng](../schema/request.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  id:
+                    type: integer
+                    example: 42
+                    xml:
+                      attribute: true
+                  creator:
+                    type: string
+                    example: foo-user
+                    xml:
+                      attribute: true
+                  action:
+                    type: object
+                    properties:
+                      type:
+                        type: string
+                        example: submit
+                        xml:
+                          attribute: true
+                      source:
+                        type: object
+                        properties:
+                          project:
+                            type: string
+                            example: home:foo-user
+                            xml:
+                              attribute: true
+                          package:
+                            type: string
+                            example: obs-server
+                            xml:
+                              attribute: true
+                          rev:
+                            type: integer
+                            example: 521
+                            xml:
+                              attribute: true
+                      target:
+                        type: object
+                        properties:
+                          project:
+                            type: string
+                            example: OBS:Unstable
+                            xml:
+                              attribute: true
+                          package:
+                            type: string
+                            example: obs-server
+                            xml:
+                              attribute: true
+                      options:
+                        type: object
+                        properties:
+                          sourceupdate:
+                            type: string
+                            example: cleanup
+                  state:
+                    type: object
+                    properties:
+                      name:
+                        type: string
+                        example: accepted
+                        xml:
+                          attribute: true
+                      who:
+                        type: string
+                        example: bar-user
+                        xml:
+                          attribute: true
+                      when:
+                        type: string
+                        example: '2021-01-15T13:39:43'
+                        xml:
+                          attribute: true
+                      comment:
+                        type: string
+                        example: allright
+                  review:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        state:
+                          type: string
+                          xml:
+                            attribute: true
+                        when:
+                          type: string
+                          xml:
+                            attribute: true
+                        who:
+                          type: string
+                          xml:
+                            attribute: true
+                        by_user:
+                          type: string
+                          xml:
+                            attribute: true
+                        by_group:
+                          type: string
+                          xml:
+                            attribute: true
+                        by_project:
+                          type: string
+                          xml:
+                            attribute: true
+                        by_package:
+                          type: string
+                          xml:
+                            attribute: true
+                        comment:
+                          type: string
+                        history:
+                          type: object
+                          properties:
+                            when:
+                              type: string
+                              xml:
+                                attribute: true
+                            who:
+                              type: string
+                              xml:
+                                attribute: true
+                            description:
+                              type: string
+                    example:
+                    - state: accepted
+                      when: '2021-01-15T15:49:32'
+                      who: obs-maintainer
+                      by_user: obs-maintainer
+                    - state: accepted
+                      when: '2021-01-15T15:49:32'
+                      who: obs-maintainer
+                      by_group: obs-group
+                    - state: accepted
+                      when: '2021-01-15T15:49:32'
+                      who: obs-maintainer
+                      by_project: OBS:Unstable
+                    - state: accepted
+                      when: '2021-01-15T15:49:32'
+                      who: obs-maintainer
+                      by_package: obs-server
+                  history:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        who:
+                          type: string
+                          example: foo
+                          xml:
+                            attribute: true
+                        when:
+                          type: string
+                          example: '2021-01-15T13:39:43'
+                          xml:
+                            attribute: true
+                        description:
+                          type: string
+                          example: Request created
+                        comment:
+                          type: string
+                          example: Please review sources
+                  description:
+                    type: string
+                    example: A little version update
+                xml:
+                  name: request
+        '400':
+          description: Bad Request
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: expand_error
+                summary: The source of package test-project/test-package for revision
+                  2 is broken
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '403':
+          description: Forbidden
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: create_bs_request_not_authorized
+                summary: You are not authorized to create this Bs request.
+      tags:
+      - Requests
+  "/request?view=collection":
+    get:
+      summary: Get a collection of requests for a specified target.
+      description: |
+        Get a collection of requests for a specified target.
+
+        **NOTE:** You need to set at least one of the following parameters in order to use this endpoint:
+
+        * `user`
+        * `group`
+        * `project`
+        * `package`
+        * `states`
+        * `reviewstates`
+        * `types`
+        * `ids`
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: query
+        name: user
+        schema:
+          type: string
+        description: |
+          Filter the results of requests and open reviews for a certain user. If no other parameters are
+          applied, it will include requests where the user is maintainer of the target or the creator of
+          the request.
+        example: hans
+      - in: query
+        name: group
+        schema:
+          type: string
+        description: Filter the results of requests and open reviews for a certain
+          group.
+        example: obs-group
+      - in: query
+        name: project
+        schema:
+          type: string
+        description: |
+          Limit the results to requests with this project as source or target,
+          or requests which were assigned to be reviewed by the maintainers of this project.
+        example: home:hans
+      - in: query
+        name: package
+        schema:
+          type: string
+        description: |
+          Limit the results to requests with this package as source or target,
+          or requests which were assigned to be reviewed by the maintainers of this package.
+        example: ruby
+      - in: query
+        name: states
+        schema:
+          type: string
+        description: Limit results to a given request state. Multiple states can be
+          provided as a comma separated list.
+        example: new,review
+      - in: query
+        name: reviewstates
+        schema:
+          type: string
+        description: Limit results to a given review state. Multiple states can be
+          provided as a comma separated list.
+        example: new,declined,accepted,superseded,obsoleted
+      - in: query
+        name: types
+        schema:
+          type: string
+        description: Limit the results to certain action types. Multiple types can
+          be provided as a comma separated list.
+        example: add_role,submit
+      - in: query
+        name: roles
+        schema:
+          type: string
+        description: Limit the results to a given role. Multiple roles can be provided
+          as a comma separated list.
+        example: creator,maintainer,reviewer,source,target
+      - in: query
+        name: withhistory
+        schema:
+          type: string
+        description: Include the request history in the results.
+        example: 1
+      - in: query
+        name: withfullhistory
+        schema:
+          type: string
+        description: Includes both, request and review history in the results.
+        example: 1
+      - in: query
+        name: limit
+        schema:
+          type: integer
+        description: Limit the results by the specified amount of requests.
+        example: 7
+      - in: query
+        name: offset
+        schema:
+          type: integer
+        description: Offset the results by the specified amount of requests.
+        example: 7
+      - in: query
+        name: ids
+        schema:
+          type: string
+        description: Limit the result to specified request id's. Multiple id's can
+          be provided as a comma separated list.
+        example: 151923
+      responses:
+        '200':
+          description: OK
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  matches:
+                    type: string
+                    example: 7
+                    xml:
+                      attribute: true
+                  request:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        id:
+                          type: integer
+                          example: 42
+                          xml:
+                            attribute: true
+                        creator:
+                          type: string
+                          example: foo-user
+                          xml:
+                            attribute: true
+                        action:
+                          type: object
+                          properties:
+                            type:
+                              type: string
+                              example: submit
+                              xml:
+                                attribute: true
+                            source:
+                              type: object
+                              properties:
+                                project:
+                                  type: string
+                                  example: home:foo-user
+                                  xml:
+                                    attribute: true
+                                package:
+                                  type: string
+                                  example: obs-server
+                                  xml:
+                                    attribute: true
+                                rev:
+                                  type: integer
+                                  example: 521
+                                  xml:
+                                    attribute: true
+                            target:
+                              type: object
+                              properties:
+                                project:
+                                  type: string
+                                  example: OBS:Unstable
+                                  xml:
+                                    attribute: true
+                                package:
+                                  type: string
+                                  example: obs-server
+                                  xml:
+                                    attribute: true
+                            options:
+                              type: object
+                              properties:
+                                sourceupdate:
+                                  type: string
+                                  example: cleanup
+                        state:
+                          type: object
+                          properties:
+                            name:
+                              type: string
+                              example: accepted
+                              xml:
+                                attribute: true
+                            who:
+                              type: string
+                              example: bar-user
+                              xml:
+                                attribute: true
+                            when:
+                              type: string
+                              example: '2021-01-15T13:39:43'
+                              xml:
+                                attribute: true
+                            comment:
+                              type: string
+                              example: allright
+                        review:
+                          type: array
+                          items:
+                            type: object
+                            properties:
+                              state:
+                                type: string
+                                xml:
+                                  attribute: true
+                              when:
+                                type: string
+                                xml:
+                                  attribute: true
+                              who:
+                                type: string
+                                xml:
+                                  attribute: true
+                              by_user:
+                                type: string
+                                xml:
+                                  attribute: true
+                              by_group:
+                                type: string
+                                xml:
+                                  attribute: true
+                              by_project:
+                                type: string
+                                xml:
+                                  attribute: true
+                              by_package:
+                                type: string
+                                xml:
+                                  attribute: true
+                              comment:
+                                type: string
+                              history:
+                                type: object
+                                properties:
+                                  when:
+                                    type: string
+                                    xml:
+                                      attribute: true
+                                  who:
+                                    type: string
+                                    xml:
+                                      attribute: true
+                                  description:
+                                    type: string
+                          example:
+                          - state: accepted
+                            when: '2021-01-15T15:49:32'
+                            who: obs-maintainer
+                            by_user: obs-maintainer
+                          - state: accepted
+                            when: '2021-01-15T15:49:32'
+                            who: obs-maintainer
+                            by_group: obs-group
+                          - state: accepted
+                            when: '2021-01-15T15:49:32'
+                            who: obs-maintainer
+                            by_project: OBS:Unstable
+                          - state: accepted
+                            when: '2021-01-15T15:49:32'
+                            who: obs-maintainer
+                            by_package: obs-server
+                        history:
+                          type: array
+                          items:
+                            type: object
+                            properties:
+                              who:
+                                type: string
+                                example: foo
+                                xml:
+                                  attribute: true
+                              when:
+                                type: string
+                                example: '2021-01-15T13:39:43'
+                                xml:
+                                  attribute: true
+                              description:
+                                type: string
+                                example: Request created
+                              comment:
+                                type: string
+                                example: Please review sources
+                        description:
+                          type: string
+                          example: A little version update
+                      xml:
+                        name: request
+                xml:
+                  name: collection
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: Not Found
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Require Filter:
+                  value:
+                    code: require_filter
+                    summary: This call requires at least one filter, either by user,
+                      project or package or states or types or reviewstates
+                Not Found:
+                  value:
+                    code: not_found
+                    summary: Couldn't find User with login = foo
+      tags:
+      - Requests
+  "/request/{id}":
+    get:
+      summary: Show details about a specified request.
+      description: Show details about a specified request.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: id
+        schema:
+          type: integer
+        required: true
+        description: Id of the choosen request.
+        example: 743
+      - in: query
+        name: withhistory
+        schema:
+          type: string
+        description: Include the request history in the results.
+        example: 1
+      - in: query
+        name: withfullhistory
+        schema:
+          type: string
+        description: Includes both, request and review history in the results.
+        example: 1
+      responses:
+        '200':
+          description: |
+            OK.
+
+            XML Schema used for body validation: [request.rng](../schema/request.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  id:
+                    type: integer
+                    example: 42
+                    xml:
+                      attribute: true
+                  creator:
+                    type: string
+                    example: foo-user
+                    xml:
+                      attribute: true
+                  action:
+                    type: object
+                    properties:
+                      type:
+                        type: string
+                        example: submit
+                        xml:
+                          attribute: true
+                      source:
+                        type: object
+                        properties:
+                          project:
+                            type: string
+                            example: home:foo-user
+                            xml:
+                              attribute: true
+                          package:
+                            type: string
+                            example: obs-server
+                            xml:
+                              attribute: true
+                          rev:
+                            type: integer
+                            example: 521
+                            xml:
+                              attribute: true
+                      target:
+                        type: object
+                        properties:
+                          project:
+                            type: string
+                            example: OBS:Unstable
+                            xml:
+                              attribute: true
+                          package:
+                            type: string
+                            example: obs-server
+                            xml:
+                              attribute: true
+                      options:
+                        type: object
+                        properties:
+                          sourceupdate:
+                            type: string
+                            example: cleanup
+                  state:
+                    type: object
+                    properties:
+                      name:
+                        type: string
+                        example: accepted
+                        xml:
+                          attribute: true
+                      who:
+                        type: string
+                        example: bar-user
+                        xml:
+                          attribute: true
+                      when:
+                        type: string
+                        example: '2021-01-15T13:39:43'
+                        xml:
+                          attribute: true
+                      comment:
+                        type: string
+                        example: allright
+                  review:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        state:
+                          type: string
+                          xml:
+                            attribute: true
+                        when:
+                          type: string
+                          xml:
+                            attribute: true
+                        who:
+                          type: string
+                          xml:
+                            attribute: true
+                        by_user:
+                          type: string
+                          xml:
+                            attribute: true
+                        by_group:
+                          type: string
+                          xml:
+                            attribute: true
+                        by_project:
+                          type: string
+                          xml:
+                            attribute: true
+                        by_package:
+                          type: string
+                          xml:
+                            attribute: true
+                        comment:
+                          type: string
+                        history:
+                          type: object
+                          properties:
+                            when:
+                              type: string
+                              xml:
+                                attribute: true
+                            who:
+                              type: string
+                              xml:
+                                attribute: true
+                            description:
+                              type: string
+                    example:
+                    - state: accepted
+                      when: '2021-01-15T15:49:32'
+                      who: obs-maintainer
+                      by_user: obs-maintainer
+                    - state: accepted
+                      when: '2021-01-15T15:49:32'
+                      who: obs-maintainer
+                      by_group: obs-group
+                    - state: accepted
+                      when: '2021-01-15T15:49:32'
+                      who: obs-maintainer
+                      by_project: OBS:Unstable
+                    - state: accepted
+                      when: '2021-01-15T15:49:32'
+                      who: obs-maintainer
+                      by_package: obs-server
+                  history:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        who:
+                          type: string
+                          example: foo
+                          xml:
+                            attribute: true
+                        when:
+                          type: string
+                          example: '2021-01-15T13:39:43'
+                          xml:
+                            attribute: true
+                        description:
+                          type: string
+                          example: Request created
+                        comment:
+                          type: string
+                          example: Please review sources
+                  description:
+                    type: string
+                    example: A little version update
+                xml:
+                  name: request
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: Not Found
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: not_found
+                summary: Couldn't find request with id '5'
+      tags:
+      - Requests
+    post:
+      summary: Apply certain actions on a specified request.
+      description: Apply certain actions on a specified request.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: id
+        schema:
+          type: integer
+        required: true
+        description: Id of the choosen request.
+        example: 743
+      - in: query
+        name: cmd
+        description: |
+          - `addreview`:
+            Add a review to a request. **NOTE:** You need to specify who has to address
+            the review by providing an additional paramter. Possible options are:
+            * by_user
+            * by_group
+            * by_project
+
+          - `assignreview`:
+            Accept a review for a given group and assign a new review to a specific user.
+            **NOTE:** You need to pass the group name in the `by_group` parameter
+            and the new reviewer in the `reviewer` parameter.
+
+          - `changestate`: Modify the state of a given request.
+            **NOTE:** You need to pass the new state through the `newstate` parameter. Changing
+            from one state to another is in certain cases not allowed. You can still force
+            the operation by using the `force` parameter.
+
+            To supersede the given request with another request, pass the ID of the other request
+            in the `superseded_by` parameter, in addition to `newstate=superseded`.
+
+          - `changereviewstate`:
+            Change the state of a review inside a given request.
+
+          - `setpriority`:
+            Change the priority of a given request. You have to pass the choosen priority through
+            the `priority` parameter. Possible values are:
+            * low
+            * moderate
+            * important
+            * critical
+
+          - `setincident`: Change the target incident for maintenance_incident actions
+            **NOTE:** You need to provide the incident number through the `incident`
+            parameter.
+
+          - `setacceptat`: Set or modify the accept_at time. Either specified by the `time`
+            parameter or by default set to now.
+
+          - `approve`: Pre-approve a request in the review state. It will turn into state `accepted`
+            after the last review.
+
+          - `cancelapproval`: Reset the approval of a request
+        schema:
+          type: string
+        style: form
+        explode: false
+        examples:
+          addreview:
+            value: cmd=addreview&by_group=heroes
+          assignreview:
+            value: cmd=assignreview&by_group=heroes&reviewer=foo
+          assignreview with revert:
+            value: cmd=assignreview&by_group=heroes&reviewer=foo&revert=1
+          changestate:
+            value: cmd=changestate&newstate=accepted
+          changestate (superseded):
+            value: cmd=changestate&newstate=superseded&superseded_by=173
+          changereviewstate:
+            value: cmd=changereviewstate&by_group=heroes&newstate=new&comment=reopened
+          setpriority:
+            value: cmd=setpriority&priority=low&comment=notsoimportant
+          setincident:
+            value: cmd=setincident&incident=12
+          setacceptat:
+            value: cmd=setacceptat&time='2020-12-01%2000:00:00%20UTC'
+          approve:
+            value: cmd=approve
+          cancelapproval:
+            value: cmd=cancelapproval
+      - in: query
+        name: newstate
+        schema:
+          type: string
+        description: Define the new state
+      - in: query
+        name: superseded_by
+        schema:
+          type: string
+        description: Required and used only with the combination of the `changestate`
+          command and the `newstate=superseded` parameter - Supersede the given request
+          with another request by passing its ID in this parameter
+      - in: query
+        name: priority
+        schema:
+          type: string
+        description: Define the new priority
+      - in: query
+        name: by_user
+        schema:
+          type: string
+        description: Specify the user of a new review
+      - in: query
+        name: by_group
+        schema:
+          type: string
+        description: Specify the group of the new review
+      - in: query
+        name: by_project
+        schema:
+          type: string
+        description: Specify the project of the new review
+      - in: query
+        name: by_package
+        schema:
+          type: string
+        description: Specify the package of the new review
+      - in: query
+        name: force
+        schema:
+          type: string
+        allowEmptyValue: true
+        description: Pass this parameter with an empty value to force the `changestate`
+          command.
+      - in: query
+        name: incident
+        schema:
+          type: string
+        description: Specify the incident number for `setincident`
+      - in: query
+        name: revert
+        schema:
+          type: string
+        description: Revert an assignreview command to assign review back to group
+      - in: query
+        name: time
+        schema:
+          type: string
+        description: Specify the time for `setacceptat`
+      - in: query
+        name: comment
+        schema:
+          type: string
+        description: Add a comment to one of the actions
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '400':
+          description: Bad Request
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: no_maintenance_release_target
+                summary: |
+                  Maintenance incident request contains release target project test_maintenance_project with
+                  invalid project kind "standard" (should be "maintenance_release") for package package01
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: Not Found
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Request Not Modifiable:
+                  value:
+                    code: request_not_modifiable
+                    summary: request is not in review state
+                Not Found:
+                  value:
+                    code: not_found
+                    summary: Couldn't find request with id '120'
+      tags:
+      - Requests
+    put:
+      summary: Modify a given request.
+      description: |
+        Modify a given request.
+
+        **NOTE:** Certain parts of a request can only be changed by admins.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: id
+        schema:
+          type: integer
+        required: true
+        description: Id of the choosen request.
+        example: 743
+      requestBody:
+        description: |
+          Request XML
+
+          **NOTE:** You cannot pass the request id in the xml. You can pass the history in the xml, but it will be simply ignored.
+
+          XML Schema used for body validation: [request.rng](../schema/request.rng)
+        required: true
+        content:
+          application/xml; charset=utf-8:
+            schema:
+              type: object
+              properties:
+                id:
+                  type: integer
+                  example: 42
+                  xml:
+                    attribute: true
+                creator:
+                  type: string
+                  example: foo-user
+                  xml:
+                    attribute: true
+                action:
+                  type: object
+                  properties:
+                    type:
+                      type: string
+                      example: submit
+                      xml:
+                        attribute: true
+                    source:
+                      type: object
+                      properties:
+                        project:
+                          type: string
+                          example: home:foo-user
+                          xml:
+                            attribute: true
+                        package:
+                          type: string
+                          example: obs-server
+                          xml:
+                            attribute: true
+                        rev:
+                          type: integer
+                          example: 521
+                          xml:
+                            attribute: true
+                    target:
+                      type: object
+                      properties:
+                        project:
+                          type: string
+                          example: OBS:Unstable
+                          xml:
+                            attribute: true
+                        package:
+                          type: string
+                          example: obs-server
+                          xml:
+                            attribute: true
+                    options:
+                      type: object
+                      properties:
+                        sourceupdate:
+                          type: string
+                          example: cleanup
+                state:
+                  type: object
+                  properties:
+                    name:
+                      type: string
+                      example: accepted
+                      xml:
+                        attribute: true
+                    who:
+                      type: string
+                      example: bar-user
+                      xml:
+                        attribute: true
+                    when:
+                      type: string
+                      example: '2021-01-15T13:39:43'
+                      xml:
+                        attribute: true
+                    comment:
+                      type: string
+                      example: allright
+                review:
+                  type: array
+                  items:
+                    type: object
+                    properties:
+                      state:
+                        type: string
+                        xml:
+                          attribute: true
+                      when:
+                        type: string
+                        xml:
+                          attribute: true
+                      who:
+                        type: string
+                        xml:
+                          attribute: true
+                      by_user:
+                        type: string
+                        xml:
+                          attribute: true
+                      by_group:
+                        type: string
+                        xml:
+                          attribute: true
+                      by_project:
+                        type: string
+                        xml:
+                          attribute: true
+                      by_package:
+                        type: string
+                        xml:
+                          attribute: true
+                      comment:
+                        type: string
+                      history:
+                        type: object
+                        properties:
+                          when:
+                            type: string
+                            xml:
+                              attribute: true
+                          who:
+                            type: string
+                            xml:
+                              attribute: true
+                          description:
+                            type: string
+                  example:
+                  - state: accepted
+                    when: '2021-01-15T15:49:32'
+                    who: obs-maintainer
+                    by_user: obs-maintainer
+                  - state: accepted
+                    when: '2021-01-15T15:49:32'
+                    who: obs-maintainer
+                    by_group: obs-group
+                  - state: accepted
+                    when: '2021-01-15T15:49:32'
+                    who: obs-maintainer
+                    by_project: OBS:Unstable
+                  - state: accepted
+                    when: '2021-01-15T15:49:32'
+                    who: obs-maintainer
+                    by_package: obs-server
+                history:
+                  type: array
+                  items:
+                    type: object
+                    properties:
+                      who:
+                        type: string
+                        example: foo
+                        xml:
+                          attribute: true
+                      when:
+                        type: string
+                        example: '2021-01-15T13:39:43'
+                        xml:
+                          attribute: true
+                      description:
+                        type: string
+                        example: Request created
+                      comment:
+                        type: string
+                        example: Please review sources
+                description:
+                  type: string
+                  example: A little version update
+              xml:
+                name: request
+      responses:
+        '200':
+          description: |
+            OK.
+
+            XML Schema used for body validation: [request.rng](../schema/request.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  id:
+                    type: integer
+                    example: 42
+                    xml:
+                      attribute: true
+                  creator:
+                    type: string
+                    example: foo-user
+                    xml:
+                      attribute: true
+                  action:
+                    type: object
+                    properties:
+                      type:
+                        type: string
+                        example: submit
+                        xml:
+                          attribute: true
+                      source:
+                        type: object
+                        properties:
+                          project:
+                            type: string
+                            example: home:foo-user
+                            xml:
+                              attribute: true
+                          package:
+                            type: string
+                            example: obs-server
+                            xml:
+                              attribute: true
+                          rev:
+                            type: integer
+                            example: 521
+                            xml:
+                              attribute: true
+                      target:
+                        type: object
+                        properties:
+                          project:
+                            type: string
+                            example: OBS:Unstable
+                            xml:
+                              attribute: true
+                          package:
+                            type: string
+                            example: obs-server
+                            xml:
+                              attribute: true
+                      options:
+                        type: object
+                        properties:
+                          sourceupdate:
+                            type: string
+                            example: cleanup
+                  state:
+                    type: object
+                    properties:
+                      name:
+                        type: string
+                        example: accepted
+                        xml:
+                          attribute: true
+                      who:
+                        type: string
+                        example: bar-user
+                        xml:
+                          attribute: true
+                      when:
+                        type: string
+                        example: '2021-01-15T13:39:43'
+                        xml:
+                          attribute: true
+                      comment:
+                        type: string
+                        example: allright
+                  review:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        state:
+                          type: string
+                          xml:
+                            attribute: true
+                        when:
+                          type: string
+                          xml:
+                            attribute: true
+                        who:
+                          type: string
+                          xml:
+                            attribute: true
+                        by_user:
+                          type: string
+                          xml:
+                            attribute: true
+                        by_group:
+                          type: string
+                          xml:
+                            attribute: true
+                        by_project:
+                          type: string
+                          xml:
+                            attribute: true
+                        by_package:
+                          type: string
+                          xml:
+                            attribute: true
+                        comment:
+                          type: string
+                        history:
+                          type: object
+                          properties:
+                            when:
+                              type: string
+                              xml:
+                                attribute: true
+                            who:
+                              type: string
+                              xml:
+                                attribute: true
+                            description:
+                              type: string
+                    example:
+                    - state: accepted
+                      when: '2021-01-15T15:49:32'
+                      who: obs-maintainer
+                      by_user: obs-maintainer
+                    - state: accepted
+                      when: '2021-01-15T15:49:32'
+                      who: obs-maintainer
+                      by_group: obs-group
+                    - state: accepted
+                      when: '2021-01-15T15:49:32'
+                      who: obs-maintainer
+                      by_project: OBS:Unstable
+                    - state: accepted
+                      when: '2021-01-15T15:49:32'
+                      who: obs-maintainer
+                      by_package: obs-server
+                  history:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        who:
+                          type: string
+                          example: foo
+                          xml:
+                            attribute: true
+                        when:
+                          type: string
+                          example: '2021-01-15T13:39:43'
+                          xml:
+                            attribute: true
+                        description:
+                          type: string
+                          example: Request created
+                        comment:
+                          type: string
+                          example: Please review sources
+                  description:
+                    type: string
+                    example: A little version update
+                xml:
+                  name: request
+        '400':
+          description: Bad Request
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: request_save_error
+                summary: Auto accept time is in the past
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: Not Found
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: not_found
+                summary: Couldn't find request with id '10'
+      tags:
+      - Requests
+    delete:
+      summary: Delete a given request.
+      description: Delete a given request.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: id
+        schema:
+          type: integer
+        required: true
+        description: Id of the choosen request.
+        example: 743
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: Not Found
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: not_found
+                summary: Couldn't find request with id '10'
+      tags:
+      - Requests
+  "/request/{id}?cmd=diff":
+    post:
+      summary: Get the diff for all packages affected by the request.
+      description: Get the diff for all packages affected by the request.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: id
+        schema:
+          type: integer
+        required: true
+        description: Id of the choosen request.
+        example: 743
+      - in: query
+        name: diff_to_superseded
+        schema:
+          type: integer
+        description: 'Diff relative to a given superseded request. State the id of
+          the corresponding superseded request.
+
+'
+        example: 10401
+      - in: query
+        name: view
+        schema:
+          type: string
+          enum:
+          - xml
+        description: Set this parameter to xml in order to receive a structured diff
+          instead of plain text.
+      - in: query
+        name: withissues
+        schema:
+          type: string
+          enum:
+          - true
+          - 1
+        description: Include parsed issues from referenced sources
+      - in: query
+        name: withdescriptionissues
+        description: Include parsed issues from request description
+      responses:
+        '200':
+          description: OK
+          content:
+            text/plain; charset=utf-8:
+              schema:
+                type: string
+              example: |
+                spec files:
+                -----------
+                --- test.spec
+                +++ test.spec
+                @@ -0,0 +1 @@
+                +# NEW COMMENT
+                \ No newline at end of file
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  id:
+                    type: string
+                    example: 12
+                    xml:
+                      attribute: true
+                  actions:
+                    type: string
+                    example: 0
+                    xml:
+                      attribute: true
+                  action:
+                    type: object
+                    properties:
+                      type:
+                        type: string
+                        example: submit
+                        xml:
+                          attribute: true
+                      source:
+                        type: object
+                        properties:
+                          project:
+                            type: string
+                            example: home:Iggy:branches:home:Admin
+                            xml:
+                              attribute: true
+                          package:
+                            type: string
+                            example: ruby
+                            xml:
+                              attribute: true
+                          rev:
+                            type: string
+                            example: 3
+                            xml:
+                              attribute: true
+                      target:
+                        type: object
+                        properties:
+                          project:
+                            type: string
+                            example: home:Admin
+                            xml:
+                              attribute: true
+                          package:
+                            type: string
+                            example: ruby
+                            xml:
+                              attribute: true
+                      options:
+                        type: object
+                        properties:
+                          sourceupdate:
+                            example: cleanup
+                            type: string
+                      sourcediff:
+                        type: object
+                        properties:
+                          key:
+                            type: string
+                            example: 9dbe9eb1767c5e12c69839af893dc239
+                            xml:
+                              attribute: true
+                          old: &1
+                            type: object
+                            properties:
+                              project:
+                                type: string
+                                example: home:Iggy:branches:home:Admin
+                                xml:
+                                  attribute: true
+                              package:
+                                type: string
+                                example: ruby
+                                xml:
+                                  attribute: true
+                              rev:
+                                type: string
+                                example: 3
+                                xml:
+                                  attribute: true
+                              srcmd5:
+                                type: string
+                                example: 59300f4ba65f53334b2e2a39f87ba3a0
+                                xml:
+                                  attribute: true
+                          new: *1
+                          files:
+                            type: array
+                            items:
+                              type: object
+                              properties:
+                                file:
+                                  type: object
+                                  properties:
+                                    state:
+                                      type: string
+                                      example: changed
+                                      xml:
+                                        attribute: true
+                                    old: &2
+                                      type: object
+                                      properties:
+                                        name:
+                                          type: string
+                                          example: ruby.spec
+                                          xml:
+                                            attribute: true
+                                        md5:
+                                          type: string
+                                          example: d4f573d2bf9a0e306f87dad7eee0cf56
+                                          xml:
+                                            attribute: true
+                                        size:
+                                          type: string
+                                          example: 70
+                                          xml:
+                                            attribute: true
+                                    new: *2
+                                    diff:
+                                      type: string
+                                      example: |
+                                        spec files:
+                                        -----------
+                                        --- test.spec
+                                        +++ test.spec
+                                        @@ -0,0 +1 @@
+                                        +# NEW COMMENT
+                                        \ No newline at end of file
+                          issues:
+                            type: array
+                            items:
+                              type: object
+                              properties:
+                                issue:
+                                  type: object
+                                  properties:
+                                    state:
+                                      type: string
+                                      example: added
+                                      xml:
+                                        attribute: true
+                                    tracker:
+                                      type: string
+                                      example: bnc
+                                      xml:
+                                        attribute: true
+                                    name:
+                                      type: string
+                                      example: 922894
+                                      xml:
+                                        attribute: true
+                                    label:
+                                      type: string
+                                      example: boo#944302
+                                      xml:
+                                        attribute: true
+                                    url:
+                                      type: string
+                                      example: https://bugzilla.opensuse.org/show_bug.cgi?id=944302
+                                      xml:
+                                        attribute: true
+                components:
+                  schemas:
+                    NewOldDestination: *1
+                    OldNewFile: *2
+                xml:
+                  name: diff
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: Not Found
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: not_found
+                summary: Couldn't find request with id '355'
+      tags:
+      - Requests
+  "/search":
+    get:
+      summary: Search in projects or in packages.
+      description: Get a list of projects or a list of packages that match a XPath
+        expression, passed in the query parameter `match`.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: query
+        name: in
+        required: true
+        schema:
+          type: string
+          enum:
+          - projects
+          - packages
+          example: projects
+        description: |
+          Where to search and apply a XPath expression: either the list of projects or the list of packages.
+
+          Example of a result when `projects` is selected:
+          ```
+          <collection>
+            <project name="home:Admin">
+              <title></title>
+              <description></description>
+              <person userid="Admin" role="maintainer"/>
+              <repository name="openSUSE_Tumbleweed">
+                <path project="openSUSE.org:openSUSE:Factory" repository="snapshot"/>
+                <arch>x86_64</arch>
+              </repository>
+              <repository name="15.3">
+                <path project="openSUSE.org:openSUSE:Leap:15.3" repository="standard"/>
+                <arch>x86_64</arch>
+              </repository>
+            </project>
+            <project name="openSUSE.org">
+              <title>Standard OBS instance at build.opensuse.org</title>
+              <description>This instance delivers the default build targets for OBS.</description>
+              <remoteurl>https://api.opensuse.org/public</remoteurl>
+            </project>
+          </collection>
+          ```
+
+          Example of a result when `packages` is selected:
+          ```
+          <collection>
+            <package name="ctris" project="home:Admin">
+              <title></title>
+              <description></description>
+            </package>
+          </collection>
+          ```
+      - in: query
+        name: match
+        required: true
+        schema:
+          type: string
+        description: XPath expression used to filter the results.
+        examples:
+          non_empty_element:
+            summary: Non empty element
+            value: repository/arch
+          non_empty_attribute:
+            summary: Non empty attribute
+            value: repository/name
+          element_content:
+            summary: Element content
+            value: repository/arch='x86_64'
+          attribute_content:
+            summary: Attribute content
+            value: repository/name='openSUSE_Tumbleweed'
+          compound_condition:
+            summary: Compound condition
+            value: name='OBS:Server:Unstable'+and+repository/arch='x86_64'
+      - in: query
+        name: return
+        schema:
+          type: string
+          example: repository/name
+        description: |
+          XPath expression that defines which values will be returned.
+
+          Instead of returning a collection of projects or packages, the result will be a collection of:
+            - contents of elements, when that XPath expression match elements, or,
+            - values of atttributes, when that XPath expression match atttributes.
+
+          Example of result, for a query string like `?in=projects&match=repository/arch='x86_64'&return=repository/name`:
+          ```
+          <collection>
+            <value>openSUSE_Tumbleweed</value>
+            <value>15.3</value>
+          </collection>
+          ```
+      - in: query
+        name: values
+        schema:
+          type: string
+          example: 1
+        description: |
+          When set to `1`, return a list of values, instead of returning a list of projects or packages.
+
+          The result will be a collection of:
+            - contents of elements, when the expression defined in the `match` query parameter match elements.
+              For example: `match=repository/arch`.
+            - values of atttributes, when the expression defined in the `match` query parameter match atttributes.
+              For example: `match=repository/name`.
+
+          Example of result, for a query string like `?in=projects&match=repository/path/project&values=1`:
+          ```
+          <collection>
+            <value>openSUSE.org:openSUSE:Factory</value>
+            <value>openSUSE.org:openSUSE:Leap:15.3</value>
+          </collection>
+          ```
+      responses:
+        '200':
+          description: OK. The request has succeeded.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                oneOf:
+                - type: object
+                  properties:
+                    matches:
+                      type: integer
+                      xml:
+                        attribute: true
+                    project:
+                      type: array
+                      items:
+                        type: object
+                        properties:
+                          name:
+                            type: string
+                            xml:
+                              attribute: true
+                          title:
+                            type: string
+                          description:
+                            type: string
+                          person:
+                            type: object
+                            properties:
+                              userid:
+                                type: string
+                                xml:
+                                  attribute: true
+                              role:
+                                type: string
+                                xml:
+                                  attribute: true
+                  xml:
+                    name: collection
+                - type: object
+                  properties:
+                    matches:
+                      type: integer
+                      xml:
+                        attribute: true
+                    package:
+                      type: array
+                      items:
+                        type: object
+                        properties:
+                          name:
+                            type: string
+                            xml:
+                              attribute: true
+                          project:
+                            type: string
+                            xml:
+                              attribute: true
+                          title:
+                            type: string
+                          description:
+                            type: string
+                  xml:
+                    name: collection
+        '400':
+          description: Bad Request
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                invalid_in_parameter:
+                  summary: Invalid in parameter
+                  value:
+                    code: 400
+                    origin: backend
+                    summary: "'in' parameter needs to be either 'projects' or 'packages'"
+                missing_match_parameter:
+                  summary: Missing match parameter
+                  value:
+                    code: 400
+                    origin: backend
+                    summary: parameter 'match' is missing
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+      tags:
+      - Search
+    post:
+      deprecated: true
+      summary: Search in projects or in packages.
+      description: This endpoint is exactly the same as `GET /search`, please use
+        that one.
+      tags:
+      - Search
+  "/search/channel":
+    get:
+      summary: List channel objects that match a XPath condition.
+      description: Return a collection of channel objects with release informations
+        that match a XPath condition.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: query
+        name: match
+        schema:
+          type: string
+        required: true
+        description: |
+          Expression based in XPath.
+
+          Providing a value of `*` will return all channels.
+
+          Available predicates are:
+            - General fields: `@package` and `@project`
+            - Binary fields: `binary/@name`, `binary/@binaryarch`, `binary/@package` and `binary/@supportstatus`
+            - Target fields: `target/disabled`, `target/updatefor/@project` and `target/updatefor/@product`
+        examples:
+          all:
+            summary: All
+            value: "*"
+          package:
+            summary: Name of the package that contains the `_channel` xml
+            value: "@package=openSUSE_Channels"
+          function_contains:
+            summary: Function contains
+            value: starts_with(@project,'open')
+      responses:
+        '200':
+          description: OK. The request has succeeded.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  matches:
+                    type: string
+                    example: 1
+                    xml:
+                      attribute: true
+                  channel:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        project:
+                          type: string
+                          xml:
+                            attribute: true
+                        package:
+                          type: string
+                          xml:
+                            attribute: true
+                        binary:
+                          type: object
+                          properties:
+                            name:
+                              type: string
+                              xml:
+                                attribute: true
+                            project:
+                              type: string
+                              xml:
+                                attribute: true
+                            package:
+                              type: string
+                              xml:
+                                attribute: true
+                            supportstatus:
+                              type: string
+                              xml:
+                                attribute: true
+                        target:
+                          type: object
+                          properties:
+                            project:
+                              type: string
+                              xml:
+                                attribute: true
+                            repository:
+                              type: string
+                              xml:
+                                attribute: true
+                            updatefor:
+                              type: object
+                              properties:
+                                project:
+                                  type: string
+                                  xml:
+                                    attribute: true
+                                product:
+                                  type: string
+                                  xml:
+                                    attribute: true
+                                baseversion:
+                                  type: string
+                                  xml:
+                                    attribute: true
+                                version:
+                                  type: string
+                                  xml:
+                                    attribute: true
+                                patchlevel:
+                                  type: string
+                                  xml:
+                                    attribute: true
+                      xml:
+                        name: channel
+                xml:
+                  name: collection
+              examples:
+                no_results:
+                  summary: No matching results
+                  value:
+                    matches: 0
+                one_result:
+                  summary: One matching result
+                  value:
+                    matches: 1
+                    channel:
+                    - project: openSUSE:Channels
+                      package: openSUSE:Leap_15_2_x86
+                      binary:
+                        name: Mesa
+                        project: openSUSE:Leap:15.2:Update
+                        package: Mesa
+                        supportstatus: l3
+                      target:
+                        project: openSUSE:Updates:Leap:15.2:x86
+                        repository: update
+                        updatefor:
+                          project: openSUSE:Leap:15.2:Update
+                          product: Leap
+                          baseversion: 15
+                          version: 2
+                          patchlevel: 2
+        '400':
+          description: Bad Request
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: illegal_xpath_error
+                summary: unable to evaluate 'foo' for 'channels'
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+      tags:
+      - Search
+    post:
+      deprecated: true
+      summary: List channel objects that match a XPath condition.
+      description: This endpoint is exactly the same as `GET /search/channel`, please
+        use that one.
+      tags:
+      - Search
+  "/search/channel/binary":
+    get:
+      summary: List channel objects that match a XPath condition.
+      description: |
+        Return a collection of channel objects with release informations that match a XPath condition.
+
+        This operation is the same as the one defined with `GET /search/channel/binary/id` with the exception of the results returned.
+        While the former operation only returns a list of channel objects with the channel definition related to the binary, this one returns a list of channel
+        objects with release information.
+        See example values of a succeeded request below.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: query
+        name: match
+        schema:
+          type: string
+        required: true
+        description: |
+          Expression based in XPath.
+
+          Providing a value of `*` will return all channels.
+
+          Available predicates are:
+            - General fields: `@name`, `@binaryarch`, `@package`, `@project` and `@supportstatus`
+            - Target fields: `target/disabled`
+            - Updatefor fields: `updatefor/@product` and `updatefor/@product`
+        examples:
+          all:
+            summary: All
+            value: "*"
+          package:
+            summary: Name of the package that contains the `_channel` xml
+            value: "@name=Mesa-debuginfo"
+          function_contains:
+            summary: Function contains
+            value: starts_with(@project,'open')
+      responses:
+        '200':
+          description: OK. The request has succeeded.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  matches:
+                    type: string
+                    example: 1
+                    xml:
+                      attribute: true
+                  channel:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        project:
+                          type: string
+                          xml:
+                            attribute: true
+                        package:
+                          type: string
+                          xml:
+                            attribute: true
+                        binary:
+                          type: object
+                          properties:
+                            name:
+                              type: string
+                              xml:
+                                attribute: true
+                            project:
+                              type: string
+                              xml:
+                                attribute: true
+                            package:
+                              type: string
+                              xml:
+                                attribute: true
+                            supportstatus:
+                              type: string
+                              xml:
+                                attribute: true
+                        target:
+                          type: object
+                          properties:
+                            project:
+                              type: string
+                              xml:
+                                attribute: true
+                            repository:
+                              type: string
+                              xml:
+                                attribute: true
+                            updatefor:
+                              type: object
+                              properties:
+                                project:
+                                  type: string
+                                  xml:
+                                    attribute: true
+                                product:
+                                  type: string
+                                  xml:
+                                    attribute: true
+                                baseversion:
+                                  type: string
+                                  xml:
+                                    attribute: true
+                                version:
+                                  type: string
+                                  xml:
+                                    attribute: true
+                                patchlevel:
+                                  type: string
+                                  xml:
+                                    attribute: true
+                      xml:
+                        name: channel
+                xml:
+                  name: collection
+              examples:
+                no_results:
+                  summary: No matching results
+                  value:
+                    matches: 0
+                one_result:
+                  summary: One matching result
+                  value:
+                    matches: 1
+                    channel:
+                    - project: openSUSE:Channels
+                      package: openSUSE:Leap_15_2_x86
+                      binary:
+                        name: Mesa
+                        project: openSUSE:Leap:15.2:Update
+                        package: Mesa
+                        supportstatus: l3
+                      target:
+                        project: openSUSE:Updates:Leap:15.2:x86
+                        repository: update
+                        updatefor:
+                          project: openSUSE:Leap:15.2:Update
+                          product: Leap
+                          baseversion: 15
+                          version: 2
+                          patchlevel: 2
+        '400':
+          description: Bad Request
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: illegal_xpath_error
+                summary: unable to evaluate 'foo' for 'channel_binaries'
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+      tags:
+      - Search
+    post:
+      deprecated: true
+      summary: List channel objects that match a XPath condition.
+      description: This endpoint is exactly the same as `GET /search/channel/binary`,
+        please use that one.
+      tags:
+      - Search
+  "/search/channel/binary/id":
+    get:
+      summary: List channel objects that match a XPath condition.
+      description: |
+        Return a collection of channel objects that match a XPath condition.
+
+        This operation is the same as the one defined with `GET /search/channel/binary` with the exception of the results returned.
+        While the former operation returns a list of channel objects with release information, this one only returns a list of channel
+        objects with the channel definition related to the binary.
+        See example values of a succeeded request below.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: query
+        name: match
+        schema:
+          type: string
+        description: |
+          Expression based in XPath.
+
+          Not providing a value or providing a value of `*` will return all released binaries.
+
+          Available predicates are:
+            - General fields: `@name`, `@binaryarch`, `@package`, `@project` and `@supportstatus`
+            - Target fields: `target/disabled`
+            - Updatefor fields: `updatefor/@product` and `updatefor/@product`
+        examples:
+          all:
+            summary: All
+            value: "*"
+          package:
+            summary: Name of the package that contains the `_channel` xml
+            value: "@name=Mesa-debuginfo"
+          function_contains:
+            summary: Function contains
+            value: starts_with(@project,'open')
+      responses:
+        '200':
+          description: OK. The request has succeeded.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  matches:
+                    type: string
+                    example: 1
+                    xml:
+                      attribute: true
+                  channel:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        project:
+                          type: string
+                          xml:
+                            attribute: true
+                        package:
+                          type: string
+                          xml:
+                            attribute: true
+                        binary:
+                          type: object
+                          properties:
+                            name:
+                              type: string
+                              xml:
+                                attribute: true
+                            project:
+                              type: string
+                              xml:
+                                attribute: true
+                            package:
+                              type: string
+                              xml:
+                                attribute: true
+                            supportstatus:
+                              type: string
+                              xml:
+                                attribute: true
+                        target:
+                          type: object
+                          properties:
+                            project:
+                              type: string
+                              xml:
+                                attribute: true
+                            repository:
+                              type: string
+                              xml:
+                                attribute: true
+                            updatefor:
+                              type: object
+                              properties:
+                                project:
+                                  type: string
+                                  xml:
+                                    attribute: true
+                                product:
+                                  type: string
+                                  xml:
+                                    attribute: true
+                                baseversion:
+                                  type: string
+                                  xml:
+                                    attribute: true
+                                version:
+                                  type: string
+                                  xml:
+                                    attribute: true
+                                patchlevel:
+                                  type: string
+                                  xml:
+                                    attribute: true
+                      xml:
+                        name: channel
+                xml:
+                  name: collection
+              examples:
+                no_results:
+                  summary: No matching results
+                  value:
+                    matches: 0
+                one_result:
+                  summary: One matching result
+                  value:
+                    matches: 1
+                    channel:
+                    - project: openSUSE:Channels
+                      package: openSUSE:Leap_15_2_x86
+                      binary:
+                        name: Mesa
+                        project: openSUSE:Leap:15.2:Update
+                        package: Mesa
+        '400':
+          description: Bad Request
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: illegal_xpath_error
+                summary: unable to evaluate 'foo' for 'channel_binaries'
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+      tags:
+      - Search
+    post:
+      deprecated: true
+      summary: List channel objects that match a XPath condition.
+      description: This endpoint is exactly the same as `GET /search/channel/binary/id`,
+        please use that one.
+      tags:
+      - Search
+  "/search/issue":
+    get:
+      summary: List issues that match a XPath condition.
+      description: Return a collection of issue objects that match a XPath condition.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: query
+        name: match
+        schema:
+          type: string
+        required: true
+        description: |
+          Expression based in XPath.
+
+          Providing a value of `*` will return all issues.
+
+          Available predicates are:
+            - Issue fields: `@name`, `@state`, and `@tracker`.
+            - Issue owner fields: `owner/@email`, and `owner/@login`.
+        examples:
+          all:
+            summary: All
+            value: "*"
+          name:
+            summary: Issue name
+            value: "@name='5021'"
+          function_contains:
+            summary: Funcion contains
+            value: contains(owner/@email,'my-domain.org')
+          combination:
+            summary: Tracker and state
+            value: "@tracker='bnc' and @state='CLOSED'"
+      - in: query
+        name: limit
+        schema:
+          type: integer
+        description: Limit the number of results.
+        example: 20
+      - in: query
+        name: offset
+        schema:
+          type: integer
+        description: Return results starting from the element specified by offset.
+        example: 10
+      responses:
+        '200':
+          description: OK. The request has succeeded.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  matches:
+                    type: integer
+                    xml:
+                      attribute: true
+                  issue:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        created_at:
+                          type: string
+                          example: 2021-01-18 19:17:51 UTC
+                        updated_at:
+                          type: string
+                          example: 2021-01-18 19:17:51 UTC
+                        name:
+                          type: string
+                          example: 12345
+                        tracker:
+                          type: string
+                          example: fate
+                        label:
+                          type: string
+                          example: fate#12345
+                        url:
+                          type: string
+                          example: https://features.opensuse.org/12345
+                        state:
+                          type: string
+                        summary:
+                          type: string
+                        owner:
+                          type: object
+                          properties:
+                            login:
+                              type: string
+                            email:
+                              type: string
+                            realname:
+                              type: string
+                      xml:
+                        name: issue
+                xml:
+                  name: collection
+              examples:
+                no_results:
+                  summary: No matching results
+                  value:
+                    matches: 0
+                two_results:
+                  summary: Two matching results
+                  value:
+                    matches: 2
+                    issue:
+                    - name: 941384
+                      created_at: 2015-08-12 06:11:00 UTC
+                      updated_at: 2020-01-09 10:58:33 UTC
+                      tracker: bnc
+                      label: boo#941384
+                      url: https://opensusebugzilla-next.opensuse.org/show_bug.cgi?id=941384
+                      state: CLOSED
+                      summary: vmware-guest-kmp is not built for SLE_11_SP3
+                      owner:
+                        login: user_1
+                        email: user_1@example.com
+                        realname: 
+                    - name: 4883
+                      created_at: 2018-12-11 03:22:54 UTC
+                      updated_at: 2018-12-11 03:22:54 UTC
+                      tracker: boost
+                      label: boost#4883
+                      url: https://svn.boost.demo/trac/boost/ticket/4883
+        '400':
+          description: Bad Request
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: illegal_xpath_error
+                summary: unable to evaluate 'foo' for 'issues'
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+      tags:
+      - Search
+    post:
+      deprecated: true
+      summary: List issues that match a XPath condition.
+      description: This endpoint is exactly the same as `GET /search/issue`, please
+        use that one.
+      tags:
+      - Search
+  "/search/missing_owner":
+    get:
+      summary: |
+        Search for packages that miss the definition for a by default
+        responsible person or group.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: query
+        name: project
+        schema:
+          type: string
+        description: Only return results for a given project.
+      - in: query
+        name: filter
+        schema:
+          type: string
+        description: |
+          A comma separated list of role names that should be
+          taken into account in the result.
+        example: bugowner,maintainer
+      - in: query
+        name: attribute
+        schema:
+          type: string
+        description: |
+          Choose the attribute name that marks the rootproject which defines the
+          owner's for all corresponding subprojects and limit the returned results
+          to those. The default value is `OBS:OwnerRootProject`.
+      responses:
+        '200':
+          description: OK. The request has succeeded.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  missing_owner:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        rootproject:
+                          type: string
+                          example: openSUSE
+                          xml:
+                            attribute: true
+                        project:
+                          type: string
+                          example: openSUSE:Factory
+                          xml:
+                            attribute: true
+                        package:
+                          type: string
+                          example: yast2-branding-openSUSE
+                          xml:
+                            attribute: true
+                xml:
+                  name: collection
+        '400':
+          description: Bad request
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: invalid_attribute
+                summary: 'Attribute ''foo'' must be in the $NAMESPACE:$NAME style
+
+'
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: Not Found
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Not Found:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: bla'
+      tags:
+      - Search
+    post:
+      deprecated: true
+      summary: |
+        Search for packages that miss the definition for a by default
+        responsible person or group.
+      description: This endpoint is exactly the same as `GET /search/missing_owner`,
+        please use that one.
+      tags:
+      - Search
+  "/search/owner":
+    get:
+      summary: Search for the users or groups who are the owners of a project or package.
+      description: |
+        The owners are users/groups with the maintainer or bugowner roles in the given project/package.
+
+        By default the owner search will get results from projects (and their sub-projects) that have the
+        OBS:OwnerRootProject attribute.
+
+        You can search for the package name, a user login, a group title or a binary package name.
+        If you don't want to search the default projects, you can provide another project to search in.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: query
+        name: package
+        schema:
+          type: string
+        description: The name of the package whose owners you want to search.
+      - in: query
+        name: binary
+        schema:
+          type: string
+        description: 'The name of a binary package whose owners you want to search.
+
+'
+      - in: query
+        name: user
+        schema:
+          type: string
+        description: 'Search what this user is owner of.
+
+'
+      - in: query
+        name: group
+        schema:
+          type: string
+        description: 'The title of a group. Search what this group is owner of.
+
+'
+      - in: query
+        name: limit
+        schema:
+          type: string
+        description: |
+          Limit the number of returned results. This is only available for
+          the search with the `binary` parameter. The default is set to `1`,
+          use `0` to receive all results or `-1` for the deepest match.
+      - in: query
+        name: devel
+        schema:
+          type: string
+          enum:
+          - true
+          - false
+          - 1
+          - 0
+        description: Include/exclude devel packages in the result.
+      - in: query
+        name: project
+        schema:
+          type: string
+        description: |
+          By default the owner search will get results from projects (and their sub-projects) that have the OBS:OwnerRootProject attribute.
+          Use this parameter to overwrite the default and search in this project (and it's sub-projects).
+      - in: query
+        name: filter
+        schema:
+          type: string
+        description: |
+          A comma separated list of role names that should be
+          taken into account in the result.
+        example: bugowner,maintainer
+      - in: query
+        name: attribute
+        schema:
+          type: string
+        description: |
+          Choose the attribute name that marks the rootproject which defines the
+          owner's for all corresponding subprojects and limit the returned results
+          to those. The default value is `OBS:OwnerRootProject`.
+      responses:
+        '200':
+          description: OK. The request has succeeded.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  owner:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        rootproject:
+                          type: string
+                          example: openSUSE
+                          xml:
+                            attribute: true
+                        project:
+                          type: string
+                          example: openSUSE:Factory
+                          xml:
+                            attribute: true
+                        package:
+                          type: string
+                          example: yast2-branding-openSUSE
+                          xml:
+                            attribute: true
+                        person:
+                          type: array
+                          items:
+                            type: object
+                            properties:
+                              name:
+                                type: string
+                                example: foo
+                                xml:
+                                  attribute: true
+                              role:
+                                type: string
+                                example: bugowner
+                                xml:
+                                  attribute: true
+                        group:
+                          type: array
+                          items:
+                            type: object
+                            properties:
+                              name:
+                                type: string
+                                example: bar
+                                xml:
+                                  attribute: true
+                              role:
+                                type: string
+                                example: maintainer
+                                xml:
+                                  attribute: true
+                xml:
+                  name: collection
+              examples:
+                only package:
+                  summary: Search by package name
+                  description: Search by package name 'aaa_base' only.
+                  value:
+                    owner:
+                    - rootproject: ''
+                      project: Base:System
+                      package: aaa_base
+                      person:
+                        name: user_1
+                        role: maintainer
+                    - rootproject: ''
+                      project: Base:System
+                      person:
+                        name: user_1
+                        role: maintainer
+                      group:
+                        name: factory-maintainers
+                        role: maintainer
+                    - rootproject: ''
+                      project: Base
+                      person:
+                        name: user_2
+                        role: maintainer
+                only project:
+                  summary: Search by project name
+                  description: Search by project name 'openSUSE:Factory' only.
+                  value:
+                    owner:
+                    - rootproject: ''
+                      project: openSUSE:Factory
+                      person:
+                        name: user_1
+                        role: maintainer
+                      group:
+                        name: factory-maintainers
+                        role: maintainer
+                    - rootproject: ''
+                      project: openSUSE
+                      group:
+                        name: factory-maintainers
+                        role: maintainer
+                only binary:
+                  summary: Search by binary name
+                  description: Search by binary name 'aaa_base' only.
+                  value:
+                    owner:
+                      rootproject: openSUSE
+                      project: Base:System
+                      package: aaa_base
+                      person:
+                      - name: user_1
+                        role: maintainer
+                      - name: user_2
+                        role: maintainer
+                group and project:
+                  summary: Search by group and project
+                  description: Search by group title 'factory-maintainers' and project
+                    name 'openSUSE:Leap:42.3'.
+                  value:
+                    owner:
+                      rootproject: openSUSE:Leap:42.3
+                      project: openSUSE:Leap:42.3
+        '400':
+          description: Bad request
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                without expected parameters:
+                  summary: Without the expected parameters
+                  description: One or a combination of the parameters package, user,
+                    group, binay and project is required.
+                  value:
+                    code: no_binary
+                    summary: 'The search needs at least a ''binary'', ''package''
+                      or ''user'' parameter
+
+'
+                search root not set:
+                  summary: Search root is not set
+                  description: At least one of the projects in your instance should
+                    contain the OBS:OwnerRootProject attribute.
+                  value:
+                    summary: 'The attribute OBS:OwnerRootProject is not set to define
+                      default projects.
+
+'
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: Not Found
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Not Found:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: bla'
+                Group Not Found:
+                  value:
+                    code: not_found
+                    summary: Couldn't find Group 'fake'
+      tags:
+      - Search
+    post:
+      deprecated: true
+      summary: Search for the users or groups who are the owners of a project or package.
+      description: This endpoint is exactly the same as `GET /search/owner`, please
+        use that one.
+      tags:
+      - Search
+  "/search/package":
+    get:
+      summary: List package objects that match a XPath condition.
+      description: |
+        Return a collection of package objects that match a XPath condition.
+
+        This operation is the same as the one defined with [GET /search/package/id](#/Search/get_search_package_id) with the exception of the results returned.
+        While the former operation returns a list of package names, this one return a list of package objects. See example values of a succeeded request below.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: query
+        name: match
+        schema:
+          type: string
+        required: true
+        description: |
+          Expression based in XPath.
+
+          Providing a value of `*` will return all packages.
+
+          Available predicates are:
+            - Package fields: `@name`, `title`, `description`, `scmsync`, and `kind`.
+            - `@project`: name of the project of the package.
+            - Devel package fields:
+              - `devel/@project`: name of the devel project of the package.
+              - `devel/@package`: name of the devel package of the package.
+            - Issue fields: `issue/@state`, `issue/@name`, `issue/@tracker`, and `issue/@change`.
+            - Issue owner fields: `issue/owner/@email`, and `issue/owner/@login`.
+            - Fields of attributes of an issue: `attribute_issue/@state`, `attribute_issue/@name`, and `attribute_issue/@tracker`.
+            - Fields of owners of an attribute of an issue: `attribute_issue/owner/@email` and `attribute_issue/owner/@login`.
+            - Users and groups:
+              - `person/@userid`: login of a user related to this package.
+              - `person/@role`: name of the role which a user could be related with this package.
+              - `group/@groupid`: name (title) of a group related to this package.
+              - `group/@role`: name of the role which a group could be related with this package.
+            - `attribute/@name`: name of an attribute of the package.
+            - `project/attribute/@name`: name of an attribute of the project of the package.
+        examples:
+          all:
+            summary: All
+            value: "*"
+          project_name_and_package_name:
+            summary: Project name and package name
+            value: "@project='my:project:name' and @name='my_package_name'"
+          function_contains:
+            summary: Function contains
+            value: contains(description,'editor')
+          combination:
+            summary: User and role
+            value: person/@userid='iggy' and person/@role='reviewer'
+      - in: query
+        name: limit
+        schema:
+          type: integer
+        description: Limit the number of results.
+        example: 20
+      - in: query
+        name: offset
+        schema:
+          type: integer
+        description: Return results starting from the element specified by offset.
+        example: 10
+      responses:
+        '200':
+          description: OK. The request has succeeded.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  matches:
+                    type: integer
+                    xml:
+                      attribute: true
+                  package:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        name:
+                          type: string
+                          xml:
+                            attribute: true
+                        project:
+                          type: string
+                          xml:
+                            attribute: true
+                        title:
+                          type: string
+                        description:
+                          type: string
+                xml:
+                  name: collection
+              examples:
+                no_results:
+                  summary: No matching results
+                  value:
+                    matches: 0
+                two_results:
+                  summary: Two matching results
+                  value:
+                    matches: 2
+                    package:
+                    - project: home:Admin
+                      name: ruby
+                      title: A Glass of Blessings
+                      description: Qui quod nostrum laudantium.
+                    - project: home:Admin:branch:home:Admin
+                      name: ruby
+                      title: To Your Scattered Bodies Go
+                      description: Quasi reiciendis qui ut.
+        '400':
+          description: Bad Request
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: illegal_xpath_error
+                summary: unable to evaluate 'foo' for 'packages'
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+      tags:
+      - Search
+    post:
+      deprecated: true
+      summary: List packages that match a XPath condition.
+      description: This endpoint is exactly the same as `GET /search/package`, please
+        use that one.
+      tags:
+      - Search
+  "/search/package/id":
+    get:
+      summary: List packages that match a XPath condition.
+      description: |
+        Return a collection of package names that match a XPath condition.
+
+        This operation is the same as the one defined with [GET /search/package](#/Search/get_search_package) with the exception of the results returned.
+        While the former operation returns a list of package objects, this one return a list of package names. See example values of a succeeded request below.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: query
+        name: match
+        schema:
+          type: string
+        description: |
+          Expression based in XPath.
+
+          Not providing a value or providing a value of `*` will return all packages.
+
+          Available predicates are:
+            - Package fields: `@name`, `title`, `description`, `scysync`, and `kind`.
+            - `@project`: name of the project of the package.
+            - Devel package fields:
+              - `devel/@project`: name of the devel project of the package.
+              - `devel/@package`: name of the devel package of the package.
+            - Issue fields: `issue/@state`, `issue/@name`, `issue/@tracker`, and `issue/@change`.
+            - Issue owner fields: `issue/owner/@email`, and `issue/owner/@login`.
+            - Fields of attributes of an issue: `attribute_issue/@state`, `attribute_issue/@name`, and `attribute_issue/@tracker`.
+            - Fields of owners of an attribute of an issue: `attribute_issue/owner/@email` and `attribute_issue/owner/@login`.
+            - Users and groups:
+              - `person/@userid`: login of a user related to this package.
+              - `person/@role`: name of the role which a user could be related with this package.
+              - `group/@groupid`: name (title) of a group related to this package.
+              - `group/@role`: name of the role which a group could be related with this package.
+            - `attribute/@name`: name of an attribute of the package.
+            - `project/attribute/@name`: name of an attribute of the project of the package.
+        examples:
+          all:
+            summary: All
+            value: "*"
+          project_name_and_package_name:
+            summary: Project name and package name
+            value: "@project='my:project:name' and @name='my_package_name'"
+          function_contains:
+            summary: Function contains
+            value: contains(description,'editor')
+          combination:
+            summary: User and role
+            value: person/@userid='iggy' and person/@role='reviewer'
+      - in: query
+        name: limit
+        schema:
+          type: integer
+        description: Limit the number of results.
+        example: 20
+      - in: query
+        name: offset
+        schema:
+          type: integer
+        description: Return results starting from the element specified by offset.
+        example: 10
+      responses:
+        '200':
+          description: OK. The request has succeeded.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  matches:
+                    type: integer
+                    xml:
+                      attribute: true
+                  package:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        name:
+                          type: string
+                          xml:
+                            attribute: true
+                        project:
+                          type: string
+                          xml:
+                            attribute: true
+                        title:
+                          type: string
+                        description:
+                          type: string
+                xml:
+                  name: collection
+              examples:
+                no_results:
+                  summary: No matching results
+                  value:
+                    matches: 0
+                two_results:
+                  summary: Two matching results
+                  value:
+                    matches: 2
+                    package:
+                    - project: home:Admin
+                      name: ruby
+                    - project: home:Admin:branch:home:Admin
+                      name: ruby
+        '400':
+          description: Bad Request
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: illegal_xpath_error
+                summary: unable to evaluate 'foo' for 'packages'
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+      tags:
+      - Search
+    post:
+      deprecated: true
+      summary: List packages that match a XPath condition.
+      description: This endpoint is exactly the same as `GET /search/package/id`,
+        please use that one.
+      tags:
+      - Search
+  "/search/package_id":
+    get:
+      deprecated: true
+      summary: List packages that match a XPath condition.
+      description: This endpoint is exactly the same as `GET /search/package/id`,
+        please use that one.
+      tags:
+      - Search
+    post:
+      deprecated: true
+      summary: List packages that match a XPath condition.
+      description: This endpoint is exactly the same as `GET /search/package/id`,
+        please use that one.
+      tags:
+      - Search
+  "/search/person":
+    get:
+      summary: List users that match a XPath condition.
+      description: Return a collection of users that match a XPath condition.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: query
+        name: match
+        schema:
+          type: string
+        required: true
+        description: |
+          Expression based in XPath.
+
+          Providing a value of `*` will return all users.
+
+          Available predicates are: `@login`, `@email`, `@realname`, and `@state`.
+        examples:
+          all:
+            summary: All
+            value: "*"
+          login:
+            summary: Login
+            value: "@login='user_1'"
+          function_contains:
+            summary: Function contains
+            value: contains(@realname,'lee')
+          combination:
+            summary: User email and state
+            value: "@email='iggy@example.com' and @state='confirmed'"
+      - in: query
+        name: limit
+        schema:
+          type: integer
+        description: Limit the number of results.
+        example: 20
+      - in: query
+        name: offset
+        schema:
+          type: integer
+        description: Return results starting from the element specified by offset.
+        example: 10
+      responses:
+        '200':
+          description: OK. The request has succeeded.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  matches:
+                    type: integer
+                    xml:
+                      attribute: true
+                  person:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        login:
+                          type: string
+                        email:
+                          type: string
+                        realname:
+                          type: string
+                        state:
+                          type: string
+                        globalrole:
+                          type: string
+                        ignore_auth_services:
+                          type: string
+                xml:
+                  name: collection
+              examples:
+                no_results:
+                  summary: No matching results
+                  value:
+                    matches: 0
+                two_results:
+                  summary: Two matching results
+                  value:
+                    matches: 2
+                    person:
+                    - login: Iggy
+                      email: iggy@example.com
+                      realname: Shanta
+                      state: confirmed
+                    - login: superkraig
+                      email: kraig@example.com
+                      realname: Kraig Doe
+                      state: confirmed
+                      globalrole: Admin
+                      ignore_auth_services: false
+        '400':
+          description: Bad Request
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: illegal_xpath_error
+                summary: unable to evaluate '@foo' for 'users'
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+      tags:
+      - Search
+    post:
+      deprecated: true
+      summary: List users that match a XPath condition.
+      description: This endpoint is exactly the same as `GET /search/person`, please
+        use that one.
+      tags:
+      - Search
+  "/search/project":
+    get:
+      summary: List project objects that match a XPath condition.
+      description: |
+        Return a collection of projects objects that match a XPath condition.
+
+        This operation is the same as the one defined with [GET /search/project/id](#/Search/get_search_project_id) with the exception of the results returned.
+        While the former operation returns a list of project names, this one return a list of project objects. See example values of a succeeded request below.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: query
+        name: match
+        schema:
+          type: string
+        required: true
+        description: |
+          Expression based in XPath.
+
+          Providing a value of `*` will return all projects.
+
+          Available predicates are:
+            - Project fields: `@name`, `@kind`, `title`, `description`, `scmsync`, `url`, and `remoteurl`.
+            - `package/@name`: name of the packages of the project.
+            - `attribute/@name`: name of the attributes of the project.
+            - Users and groups:
+              - `person/@userid`: login of a user related to this project.
+              - `person/@role`: name of the role which a user could be related with this project.
+              - `group/@groupid`: name (title) of a group related to this project.
+              - `group/@role`: name of the role which a group could be related with this project.
+            - More complex predicates are: `maintenance/maintains/@project`, `repository/@name`,
+              `repository/path/@project`, `repository/releasetarget/@trigger`.
+        examples:
+          all:
+            summary: All
+            value: "*"
+          name:
+            summary: Project name
+            value: "@name='my:project:name'"
+          function_contains:
+            summary: Funcion contains
+            value: contains(@name,'Test')
+          combination:
+            summary: User and role
+            value: person/@userid='iggy' and person/@role='reviewer'
+      - in: query
+        name: limit
+        schema:
+          type: integer
+        description: Limit the number of results.
+        example: 20
+      - in: query
+        name: offset
+        schema:
+          type: integer
+        description: Return results starting from the element specified by offset.
+        example: 10
+      responses:
+        '200':
+          description: OK. The request has succeeded.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  matches:
+                    type: integer
+                    xml:
+                      attribute: true
+                  project:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        name:
+                          type: string
+                          xml:
+                            attribute: true
+                        title:
+                          type: string
+                        description:
+                          type: string
+                        person:
+                          type: object
+                          properties:
+                            userid:
+                              type: string
+                              xml:
+                                attribute: true
+                            role:
+                              type: string
+                              xml:
+                                attribute: true
+                xml:
+                  name: collection
+              examples:
+                no_results:
+                  summary: No matching results
+                  value:
+                    matches: 0
+                two_results:
+                  summary: Two matching results
+                  value:
+                    matches: 2
+                    project:
+                    - name: home:Iggy
+                      title: 
+                      description: 
+                      person:
+                        userid: Iggy
+                        role: maintainer
+                    - name: home:Iggy:branches:home:Admin
+                      title: East of Eden
+                      description: 
+        '400':
+          description: Bad Request
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: illegal_xpath_error
+                summary: unable to evaluate 'foo' for 'projects'
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+      tags:
+      - Search
+    post:
+      deprecated: true
+      summary: List project objects that match a XPath condition.
+      description: This endpoint is exactly the same as `GET /search/project`, please
+        use that one.
+      tags:
+      - Search
+  "/search/project/id":
+    get:
+      summary: List projects that match a XPath condition.
+      description: |
+        Return a collection of project names that match a XPath condition.
+
+        This operation is the same as the one defined with [GET /search/project](#/Search/get_search_project) with the exception of the results returned.
+        While the former operation returns a list of project objects, this one return a list of project names. See example values of a succeeded request below.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: query
+        name: match
+        schema:
+          type: string
+        description: |
+          Expression based in XPath.
+
+          Not providing a value or providing a value of `*` will return all projects.
+
+          Available predicates are:
+            - Project fields: `@name`, `@kind`, `title`, `description`, `scmsync`, `url`, and `remoteurl`.
+            - `package/@name`: name of the packages of the project.
+            - `attribute/@name`: name of the attributes of the project.
+            - Users and groups:
+              - `person/@userid`: login of a user related to this project.
+              - `person/@role`: name of the role which a user could be related with this project.
+              - `group/@groupid`: name (title) of a group related to this project.
+              - `group/@role`: name of the role which a group could be related with this project.
+            - More complex predicates are: `maintenance/maintains/@project`, `repository/@name`,
+              `repository/path/@project`, `repository/releasetarget/@trigger`.
+        examples:
+          all:
+            summary: All
+            value: "*"
+          name:
+            summary: Project name
+            value: "@name='my:project:name'"
+          function_contains:
+            summary: Funcion contains
+            value: contains(@name,'Test')
+          combination:
+            summary: User and role
+            value: person/@userid='iggy' and person/@role='reviewer'
+      - in: query
+        name: limit
+        schema:
+          type: integer
+        description: Limit the number of results.
+        example: 20
+      - in: query
+        name: offset
+        schema:
+          type: integer
+        description: Return results starting from the element specified by offset.
+        example: 10
+      responses:
+        '200':
+          description: OK. The request has succeeded.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  matches:
+                    type: integer
+                    xml:
+                      attribute: true
+                  project:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        name:
+                          type: string
+                          xml:
+                            attribute: true
+                        title:
+                          type: string
+                        description:
+                          type: string
+                        person:
+                          type: object
+                          properties:
+                            userid:
+                              type: string
+                              xml:
+                                attribute: true
+                            role:
+                              type: string
+                              xml:
+                                attribute: true
+                xml:
+                  name: collection
+              examples:
+                no_results:
+                  summary: No matching results
+                  value:
+                    matches: 0
+                two_results:
+                  summary: Two matching results
+                  value:
+                    matches: 2
+                    project:
+                    - name: home:Admin
+                    - name: openSUSE.org
+        '400':
+          description: Bad Request
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: illegal_xpath_error
+                summary: unable to evaluate 'foo' for 'projects'
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+      tags:
+      - Search
+    post:
+      deprecated: true
+      summary: List projects that match a XPath condition.
+      description: This endpoint is exactly the same as `GET /search/project/id`,
+        please use that one.
+      tags:
+      - Search
+  "/search/project_id":
+    get:
+      deprecated: true
+      summary: List projects that match a XPath condition.
+      description: This endpoint is exactly the same as `GET /search/project/id`,
+        please use that one.
+      tags:
+      - Search
+    post:
+      deprecated: true
+      summary: List projects that match a XPath condition.
+      description: This endpoint is exactly the same as `GET /search/project/id`,
+        please use that one.
+      tags:
+      - Search
+  "/search/published/binary/id":
+    get:
+      summary: Search for currently available binaries in the publish area.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: query
+        name: match
+        schema:
+          type: string
+        required: true
+        description: XPath expression.
+        example: project='home:foo'+and+name='bar'
+      - in: query
+        name: limit
+        schema:
+          type: integer
+        description: Override default maximum value of 1000 entries to be returned.
+        example: 20
+      - in: query
+        name: withdownloadurl
+        schema:
+          type: integer
+          enum:
+          - 0
+          - 1
+        description: |
+          Add the download url in the results as attribute `downloadurl`.
+
+          A value `0` means without the download url. A value `1` means with the download url.
+        example: 1
+      responses:
+        '200':
+          description: OK. The request has succeeded.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  matches:
+                    type: integer
+                    xml:
+                      attribute: true
+                  limited:
+                    type: boolean
+                    xml:
+                      attribute: true
+                  binary:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        name:
+                          type: string
+                          xml:
+                            attribute: true
+                        project:
+                          type: string
+                          xml:
+                            attribute: true
+                        package:
+                          type: string
+                          xml:
+                            attribute: true
+                        repository:
+                          type: string
+                          xml:
+                            attribute: true
+                        version:
+                          type: string
+                          xml:
+                            attribute: true
+                        release:
+                          type: string
+                          xml:
+                            attribute: true
+                        arch:
+                          type: string
+                          xml:
+                            attribute: true
+                        filename:
+                          type: string
+                          xml:
+                            attribute: true
+                        filepath:
+                          type: string
+                          xml:
+                            attribute: true
+                        baseproject:
+                          type: string
+                          xml:
+                            attribute: true
+                        type:
+                          type: string
+                          xml:
+                            attribute: true
+                        downloadurl:
+                          type: string
+                          xml:
+                            attribute: true
+                xml:
+                  name: collection
+                  wrapped: true
+              examples:
+                including_download_urls:
+                  value:
+                    matches: 2
+                    binary:
+                    - name: package_name
+                      project: home:foo
+                      package: package_name
+                      repository: openSUSE_Tumbleweed
+                      version: 20201220
+                      release: 3.1
+                      arch: src
+                      filename: package_name-20201220-3.1.src.rpm
+                      filepath: home:/foo/openSUSE_Tumbleweed/src/package_name-20201220-3.1.src.rpm
+                      baseproject: home:bar
+                      type: rpm
+                      downloadurl: https://server1.myorg.org/repositories/home:/foo/openSUSE_Tumbleweed/src/package_name-20201220-3.1.src.rpm
+                    - name: package_name2
+                      project: home:foo
+                      package: package_name2
+                      repository: openSUSE_Tumbleweed
+                      version: 20201220
+                      release: 3.1
+                      arch: src
+                      filename: package_name2-20201220-3.1.src.rpm
+                      filepath: home:/foo/openSUSE_Tumbleweed/src/package_name2-20201220-3.1.src.rpm
+                      baseproject: home:bar
+                      type: rpm
+                      downloadurl: https://server1.myorg.org/repositories/home:/foo/openSUSE_Tumbleweed/src/package_name2-20201220-3.1.src.rpm
+                  summary: Including download urls
+                  description: Result after adding the `withdownloadurl=1` parameter/value
+                    pair to the request.
+                with_limit:
+                  value:
+                    matches: 2
+                    limited: true
+                    binary:
+                    - name: package_name
+                      project: home:foo
+                      repository: openSUSE_Tumbleweed
+                      package: package_name
+                      version: 20201220
+                      release: 3.1
+                      arch: src
+                      filename: package_name-20201220-3.1.src.rpm
+                      filepath: home:/foo/openSUSE_Tumbleweed/src/package_name-20201220-3.1.src.rpm
+                      baseproject: home:bar
+                      type: rpm
+                    - name: package_name2
+                      project: home:foo
+                      package: package_name2
+                      repository: openSUSE_Tumbleweed
+                      version: 20201220
+                      release: 3.1
+                      arch: src
+                      filename: package_name2-20201220-3.1.src.rpm
+                      filepath: home:/foo/openSUSE_Tumbleweed/src/package_name2-20201220-3.1.src.rpm
+                      baseproject: home:bar
+                      type: rpm
+                  summary: Limiting results
+                  description: Result after adding `limit=2` parameter/value pair
+                    to the request.
+        '400':
+          description: Bad Request
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: 400
+                summary: missing string terminator
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: Not Found.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                project_not_found:
+                  value:
+                    code: 404
+                    summary: project 'home:foo' does not exist
+                    description: 404 project 'home:foo' does not exist
+                  summary: Not Found
+      tags:
+      - Search
+    post:
+      deprecated: true
+      summary: Search for currently available binaries in the publish area.
+      description: This endpoint is exactly the same as `GET /search/published/binary/id`,
+        please use that one.
+      tags:
+      - Search
+  "/search/published/pattern/id":
+    get:
+      summary: Search for published patterns.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: query
+        name: match
+        schema:
+          type: string
+        required: true
+        description: XPath expression.
+        example: project='home:foo'+and+name='bar'
+      - in: query
+        name: limit
+        schema:
+          type: integer
+        description: Override default maximum value of 1000 entries to be returned.
+        example: 20
+      - in: query
+        name: withdownloadurl
+        schema:
+          type: integer
+          enum:
+          - 0
+          - 1
+        description: |
+          Add the download url in the results as attribute `downloadurl`.
+
+          A value `0` means without the download url. A value `1` means with the download url.
+        example: 1
+      responses:
+        '200':
+          description: OK. The request has succeeded.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  matches:
+                    type: integer
+                    xml:
+                      attribute: true
+                  limited:
+                    type: boolean
+                    xml:
+                      attribute: true
+                  pattern:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        name:
+                          type: string
+                          xml:
+                            attribute: true
+                        project:
+                          type: string
+                          xml:
+                            attribute: true
+                        repository:
+                          type: string
+                          xml:
+                            attribute: true
+                        filename:
+                          type: string
+                          xml:
+                            attribute: true
+                        filepath:
+                          type: string
+                          xml:
+                            attribute: true
+                        baseproject:
+                          type: string
+                          xml:
+                            attribute: true
+                        type:
+                          type: string
+                          xml:
+                            attribute: true
+                        downloadurl:
+                          type: string
+                          xml:
+                            attribute: true
+                xml:
+                  name: collection
+                  wrapped: true
+              examples:
+                including_download_urls:
+                  value:
+                    matches: 1
+                    pattern:
+                    - name: OBS_Server
+                      project: OBS:Server:Unstable
+                      repository: SLE_12_SP4
+                      filename: OBS_Server.ymp
+                      filepath: OBS:/Server:/Unstable/SLE_12_SP4/OBS_Server.ymp
+                      baseproject: SUSE:SLE-12:SLE-Module-Adv-Systems-Management
+                      type: ymp
+                      downloadurl: https://download.opensuse.org/repositories/OBS:/Server:/Unstable/SLE_12_SP4/SLE_12_SP4/OBS_Server.ymp
+                  summary: Including download urls
+                  description: Result after adding the `withdownloadurl=1` parameter/value
+                    pair to the request.
+                with_limit:
+                  value:
+                    matches: 9
+                    limited: true
+                    pattern:
+                    - name: OBS_Server
+                      project: OBS:Server:Unstable
+                      repository: 15.3
+                      filename: OBS_Server.ymp
+                      filepath: OBS:/Server:/Unstable/15.3/OBS_Server.ymp
+                      baseproject: SUSE:SLE-15:GA
+                      type: ymp
+                    - name: OBS_Server
+                      project: OBS:Server:Unstable
+                      repository: SLE_12_SP4
+                      filename: OBS_Server.ymp
+                      filepath: OBS:/Server:/Unstable/SLE_12_SP4/OBS_Server.ymp
+                      baseproject: SUSE:SLE-12:SLE-Module-Adv-Systems-Management
+                      type: ymp
+                  summary: Limiting results
+                  description: Result after adding `limit=2` parameter/value pair
+                    to the request.
+                without_matches:
+                  value:
+                    matches: 0
+                  summary: No matches
+                  description: 'Empty result, when there is no matches. For example:
+                    `?match=project=''home:bs-team:OBS''`.
+
+'
+        '400':
+          description: Bad Request
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: 400
+                summary: missing string terminator
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+      tags:
+      - Search
+    post:
+      deprecated: true
+      summary: Search for published patterns.
+      description: This endpoint is exactly the same as `GET /search/published/pattern/id`,
+        please use that one.
+      tags:
+      - Search
+  "/search/published/repoinfo/id":
+    get:
+      summary: Search for currently available repositories in the publish area.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: query
+        name: match
+        schema:
+          type: string
+        required: true
+        description: XPath expression.
+        example: project='home:foo'
+      - in: query
+        name: limit
+        schema:
+          type: integer
+        description: Override default maximum value of 1000 entries to be returned.
+        example: 20
+      - in: query
+        name: withdownloadurl
+        schema:
+          type: integer
+          enum:
+          - 0
+          - 1
+        description: |
+          Add the download url in the results as attribute `downloadurl`.
+
+          A value `0` means without the download url. A value `1` means with the download url.
+        example: 1
+      responses:
+        '200':
+          description: OK. The request has succeeded.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  matches:
+                    type: integer
+                    xml:
+                      attribute: true
+                  limited:
+                    type: boolean
+                    xml:
+                      attribute: true
+                  repoinfo:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        project:
+                          type: string
+                          xml:
+                            attribute: true
+                        repository:
+                          type: string
+                          xml:
+                            attribute: true
+                xml:
+                  name: collection
+                  wrapped: true
+              examples:
+                including_download_urls:
+                  value:
+                    matches: 1
+                    repoinfo:
+                    - project: OBS:Server:Unstable
+                      repository: SLE_12_SP4
+                      downloadurl: https://download.opensuse.org/repositories/OBS:/Server:/Unstable/SLE_12_SP4/SLE_12_SP4/OBS_Server.ymp
+                  summary: Including download urls
+                  description: Result after adding the `withdownloadurl=1` parameter/value
+                    pair to the request.
+                with_limit:
+                  value:
+                    matches: 2
+                    limited: true
+                    repoinfo:
+                    - project: OBS:Server:Unstable
+                      repository: SLE_12_SP4
+                    - project: OBS:Server:Unstable
+                      repository: SLE_12_SP5
+                  summary: Limiting results
+                  description: Result after adding `limit=2` parameter/value pair
+                    to the request.
+                without_matches:
+                  value:
+                    matches: 0
+                  summary: No matches
+                  description: 'Empty result, when there is no matches. For example:
+                    `?match=project=''home:bs-team:OBS''`.
+
+'
+        '400':
+          description: Bad Request
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: 400
+                summary: missing string terminator
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+      tags:
+      - Search
+    post:
+      deprecated: true
+      summary: Search for currently available repositories in the publish area.
+      description: This endpoint is exactly the same as `GET /search/published/repoinfo/id`,
+        please use that one.
+      tags:
+      - Search
+  "/search/released/binary":
+    get:
+      summary: List released binaries that match a XPath condition.
+      description: |
+        Return a collection of released binaries that match a XPath condition.
+
+        Released binaries are binaries published via the release mechanism. Binaries which got removed are also included.
+
+        This operation is the same as the one defined with [GET /search/released/binary/id](#/Search/get_search_released_binary_id) with the exception of the results returned.
+        While the former operation returns a list of released binaries without details, this one return a list of detailed released binaries. See example values of a succeeded request below.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: query
+        name: match
+        schema:
+          type: string
+        required: true
+        description: |
+          Expression based in XPath.
+
+          Providing a value of `*` will return all released binaries.
+
+          Available predicates are:
+            - Released binary fields: `@name`, `disturl`, `@version`, `@release`, `@arch`, `@medium`, `binaryid`, `cpeid`, `supportstatus`, and `operation`.
+            - Update info fields: `updateinfo/@id` and `updateinfo/@version`.
+            - Build fields: `build/@time` and `build/@binaryid`.
+            - Other fields: `modify/@time` and `obsolete/@time`.
+            - Repository fields: `repository/@project` and `repository/@name`.
+            - Publish fields: `publish/@time`, `publish/@package` and `publish/@flavor`.
+            - "Update for" fields: `updatefor/@project`, `updatefor/@arch`, `updatefor/@product`, `updatefor/@baseversion`, `updatefor/@patchlevel`, and `updatefor/@version`.
+            - Product fields: `product/@project`, `product/@version`, `product/@release`, `product/@baseversion`, `product/@patchlevel`, `product/@name`, `product/@arch`, and `product/@medium`.
+        examples:
+          all:
+            summary: All
+            value: "*"
+          example1:
+            summary: Latest version of given binary in all products
+            description: Find the latest version of a given `glibc-devel` binary in
+              all products, skipping old and revoked versions.
+            value: "@name='glibc-devel'+and+obsolete[not(@time)]"
+          example2:
+            summary: Specific version by given updateinfo id
+            description: Find a specific version by given updateinfo id. This ID is
+              visible in the update tools to the end user.
+            value: updateinfo/@id='OBS-2014-42'
+          example3:
+            summary: Specific version by given disturl
+            description: Find a specific version by given disturl. Used to find all
+              affected products by a certain build of a binary.
+            value: disturl='obs://...'
+          example4:
+            summary: First release of a specific package version
+            value: "@name='kernel-default'+and+@version='1.0'+and+@release='1'+and+@arch='i586'+and+supportstatus='l3'+and+operation='added'"
+          example5:
+            summary: All binaries of a given repository
+            value: repository/@project='BaseDistro3'+and+repository/@name='BaseDistro3_repo'
+          example6:
+            summary: All binaries part of a product release
+            value: product/@project='openSUSE'+and+product/@name='openSUSE'+and+(product/@arch='x86_64'+or+not(product/@arch))
+          example7:
+            summary: All binaries part of the update repositories of a product
+            value: updatefor/@project='openSUSE'+and+updatefor/@product='openSUSE'+and+(updatefor/@arch='x86_64'+or+not(updatefor/@arch))
+          example8:
+            summary: All binaries part of the update repositories of a versioned product
+            value: updatefor/@project='openSUSE'+and+updatefor/@product='openSUSE'+and+updatefor/@version='13.2'
+          example9:
+            summary: All binaries part of the update repositories of a versioned product
+              (enterprise style)
+            value: updatefor/@project='openSUSE'+and+updatefor/@product='openSUSE'+and+updatefor/@baseversion='12'+and+updatefor/@patchlevel='1'
+      - in: query
+        name: limit
+        schema:
+          type: integer
+        description: Limit the number of results.
+        example: 20
+      - in: query
+        name: offset
+        schema:
+          type: integer
+        description: Return results starting from the element specified by offset.
+        example: 10
+      responses:
+        '200':
+          description: OK. The request has succeeded.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  matches:
+                    type: integer
+                    xml:
+                      attribute: true
+                  binary:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        project:
+                          type: string
+                          xml:
+                            attribute: true
+                        repository:
+                          type: string
+                          xml:
+                            attribute: true
+                        name:
+                          type: string
+                          xml:
+                            attribute: true
+                        version:
+                          type: string
+                          xml:
+                            attribute: true
+                        release:
+                          type: string
+                          xml:
+                            attribute: true
+                        arch:
+                          type: string
+                          xml:
+                            attribute: true
+                        operation:
+                          type: string
+                        publish:
+                          type: object
+                          properties:
+                            package:
+                              type: string
+                              xml:
+                                attribute: true
+                            time:
+                              type: string
+                              xml:
+                                attribute: true
+                        build:
+                          type: object
+                          properties:
+                            time:
+                              type: string
+                              xml:
+                                attribute: true
+                        obsolete:
+                          type: object
+                          properties:
+                            time:
+                              type: string
+                              xml:
+                                attribute: true
+                        disturl:
+                          type: string
+                xml:
+                  name: collection
+              examples:
+                no_results:
+                  summary: No matching results
+                  value:
+                    matches: 0
+                two_results:
+                  summary: Two matching results
+                  value:
+                    matches: 2
+                    binary:
+                    - project: home:user_1
+                      repository: openSUSE_Tumbleweed
+                      name: cowsay
+                      version: 3.03
+                      release: 5.7
+                      arch: noarch
+                      operation: added
+                      publish:
+                        package: cowsay
+                        time: 2017-11-22 01:26:25 UTC
+                      build:
+                        time: 2014-11-22 01:26:25 UTC
+                      obsolete:
+                        time: 2018-11-22 01:26:25 UTC
+                      disturl: obs://openSUSE_TEST/home:user_1/openSUSE_Tumbleweed/60a1a1850b9fd0d3b30f3eefa195579b-cowsay
+                    - project: home:user_2:branches:openSUSE.org:Cloud:OpenStack:Pike:venv
+                      repository: SLE_12_SP3
+                      name: pyhon-Babel
+                      version: 2.3.4
+                      release: 3.1
+                      arch: src
+                      operation: added
+                      publish:
+                        package: python-Babel
+                        time: 2018-02-08 12:56:52 UTC
+                      build:
+                        time: 2018-01-08 12:56:52 UTC
+                      obsolete:
+                        time: 2018-02-28 12:56:52 UTC
+                      disturl: obs://openSUSE_TEST/home:user_2:branches:openSUSE.org:Cloud:OpenStack:Pike:venv/SLE_12_SP3/783d831d5cd44b08db0ca95ebe06c6cc-python-Babel
+        '400':
+          description: Bad Request
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: illegal_xpath_error
+                summary: unable to evaluate 'foo' for 'released_binaries'
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+      tags:
+      - Search
+    post:
+      deprecated: true
+      summary: List released binaries that match a XPath condition.
+      description: This endpoint is exactly the same as `GET /search/released/binary`,
+        please use that one.
+      tags:
+      - Search
+  "/search/released/binary/id":
+    get:
+      summary: List released binaries that match a XPath condition.
+      description: |
+        Return a collection of released binaries that match a XPath condition.
+
+        Released binaries are binaries published via the release mechanism. Binaries which got removed are also included.
+
+        This operation is the same as the one defined with [GET /search/released/binary](#/Search/get_search_released_binary) with the exception of the results returned.
+        While the former operation returns a list of detailed released binaries, this one return a list of released binaries without details. See example values of a succeeded request below.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: query
+        name: match
+        schema:
+          type: string
+        description: |
+          Expression based in XPath.
+
+          Not providing a value or providing a value of `*` will return all released binaries.
+
+          Available predicates are:
+            - Released binary fields: `@name`, `disturl`, `@version`, `@release`, `@arch`, `@medium`, `binaryid`, `cpeid`, `supportstatus`, and `operation`.
+            - Update info fields: `updateinfo/@id` and `updateinfo/@version`.
+            - Build fields: `build/@time` and `build/@binaryid`.
+            - Other fields: `modify/@time` and `obsolete/@time`.
+            - Repository fields: `repository/@project` and `repository/@name`.
+            - Publish fields: `publish/@time`, `publish/@package` and `publish/@flavor`.
+            - "Update for" fields: `updatefor/@project`, `updatefor/@arch`, `updatefor/@product`, `updatefor/@baseversion`, `updatefor/@patchlevel`, and `updatefor/@version`.
+            - Product fields: `product/@project`, `product/@version`, `product/@release`, `product/@baseversion`, `product/@patchlevel`, `product/@name`, `product/@arch`, and `product/@medium`.
+        examples:
+          all:
+            summary: All
+            value: "*"
+          example1:
+            summary: Latest version of given binary in all products
+            description: Find the latest version of a given `glibc-devel` binary in
+              all products, skipping old and revoked versions.
+            value: "@name='glibc-devel'+and+obsolete[not(@time)]"
+          example2:
+            summary: Specific version by given updateinfo id
+            description: Find a specific version by given updateinfo id. This ID is
+              visible in the update tools to the end user.
+            value: updateinfo/@id='OBS-2014-42'
+          example3:
+            summary: Specific version by given disturl
+            description: Find a specific version by given disturl. Used to find all
+              affected products by a certain build of a binary.
+            value: disturl='obs://...'
+          example4:
+            summary: First release of a specific package version
+            value: "@name='kernel-default'+and+@version='1.0'+and+@release='1'+and+@arch='i586'+and+supportstatus='l3'+and+operation='added'"
+          example5:
+            summary: All binaries of a given repository
+            value: repository/@project='BaseDistro3'+and+repository/@name='BaseDistro3_repo'
+          example6:
+            summary: All binaries part of a product release
+            value: product/@project='openSUSE'+and+product/@name='openSUSE'+and+(product/@arch='x86_64'+or+not(product/@arch))
+          example7:
+            summary: All binaries part of the update repositories of a product
+            value: updatefor/@project='openSUSE'+and+updatefor/@product='openSUSE'+and+(updatefor/@arch='x86_64'+or+not(updatefor/@arch))
+          example8:
+            summary: All binaries part of the update repositories of a versioned product
+            value: updatefor/@project='openSUSE'+and+updatefor/@product='openSUSE'+and+updatefor/@version='13.2'
+          example9:
+            summary: All binaries part of the update repositories of a versioned product
+              (enterprise style)
+            value: updatefor/@project='openSUSE'+and+updatefor/@product='openSUSE'+and+updatefor/@baseversion='12'+and+updatefor/@patchlevel='1'
+      - in: query
+        name: limit
+        schema:
+          type: integer
+        description: Limit the number of results.
+        example: 20
+      - in: query
+        name: offset
+        schema:
+          type: integer
+        description: Return results starting from the element specified by offset.
+        example: 10
+      responses:
+        '200':
+          description: OK. The request has succeeded.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  matches:
+                    type: integer
+                    xml:
+                      attribute: true
+                  binary:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        project:
+                          type: string
+                          xml:
+                            attribute: true
+                        repository:
+                          type: string
+                          xml:
+                            attribute: true
+                        name:
+                          type: string
+                          xml:
+                            attribute: true
+                        version:
+                          type: string
+                          xml:
+                            attribute: true
+                        release:
+                          type: string
+                          xml:
+                            attribute: true
+                        arch:
+                          type: string
+                          xml:
+                            attribute: true
+                        operation:
+                          type: string
+                        publish:
+                          type: object
+                          properties:
+                            package:
+                              type: string
+                              xml:
+                                attribute: true
+                            time:
+                              type: string
+                              xml:
+                                attribute: true
+                        build:
+                          type: object
+                          properties:
+                            time:
+                              type: string
+                              xml:
+                                attribute: true
+                        obsolete:
+                          type: object
+                          properties:
+                            time:
+                              type: string
+                              xml:
+                                attribute: true
+                        disturl:
+                          type: string
+                xml:
+                  name: collection
+              examples:
+                no_results:
+                  summary: No matching results
+                  value:
+                    matches: 0
+                two_results:
+                  summary: Two matching results
+                  value:
+                    matches: 2
+                    binary:
+                    - project: openSUSE:13.1:Update
+                      repository: standard
+                      name: ImageMagick-extra
+                      version: 6.8.6.9
+                      release: 2.12.1
+                      arch: i586
+                    - project: openSUSE:13.1:Update
+                      repository: standard
+                      name: Mesa
+                      version: 9.2.3
+                      release: 61.9.1
+                      arch: i586
+        '400':
+          description: Bad Request
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: illegal_xpath_error
+                summary: unable to evaluate 'foo' for 'released_binaries'
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+      tags:
+      - Search
+    post:
+      deprecated: true
+      summary: List released binaries that match a XPath condition.
+      description: This endpoint is exactly the same as `GET /search/released/binary/id`,
+        please use that one.
+      tags:
+      - Search
+  "/search/repository/id":
+    get:
+      summary: List repositories that match a XPath condition.
+      description: Return a collection of repository names that match a XPath condition.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: query
+        name: match
+        schema:
+          type: string
+        description: |
+          Expression based in XPath.
+
+          Not providing a value or providing a value of `*` will return all projects.
+
+          Available predicates are:
+            - `@name`: name of the repository.
+            - `@project`: name of the project of the repository.
+            - Path fields: `path/@project` and `path/@repository`.
+            - Target product fields: `targetproduct/@project`, `targetproduct/@arch`, `targetproduct/@name`,
+              `targetproduct/@baseversion`, `targetproduct/@patchlevel`, and `targetproduct/@version`.
+        examples:
+          all:
+            summary: All
+            value: "*"
+          name:
+            summary: Project name
+            value: "@project='home:Admin'"
+          function_contains:
+            summary: Funcion contains
+            value: contains(@name,'Tumb')
+      - in: query
+        name: limit
+        schema:
+          type: integer
+        description: Limit the number of results.
+        example: 20
+      - in: query
+        name: offset
+        schema:
+          type: integer
+        description: Return results starting from the element specified by offset.
+        example: 10
+      responses:
+        '200':
+          description: OK. The request has succeeded.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  matches:
+                    type: integer
+                    xml:
+                      attribute: true
+                  repository:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        name:
+                          type: string
+                          xml:
+                            attribute: true
+                        project:
+                          type: string
+                          xml:
+                            attribute: true
+                xml:
+                  name: collection
+              examples:
+                no_results:
+                  summary: No matching results
+                  value:
+                    matches: 0
+                two_results:
+                  summary: Two matching results
+                  value:
+                    matches: 2
+                    repository:
+                    - name: openSUSE_Tumbleweed
+                      project: home:Admin
+                    - name: snapshot
+                      project: openSUSE.org
+        '400':
+          description: Bad Request
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: illegal_xpath_error
+                summary: unable to evaluate 'foo' for 'repositories'
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+      tags:
+      - Search
+    post:
+      deprecated: true
+      summary: List repositories that match a XPath condition.
+      description: This endpoint is exactly the same as `GET /search/repository/id`,
+        please use that one.
+      tags:
+      - Search
+  "/search/request":
+    get:
+      summary: List request objects that match a XPath condition.
+      description: |
+        Return a collection of request objects that match a XPath condition.
+
+        This operation is the same as the one defined with [GET /search/request/id](#/Search/get_search_request_id) with the exception of the results returned.
+        While the former operation returns a list of request numbers, this one return a list of request objects. See example values of a succeeded request below.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: query
+        name: match
+        schema:
+          type: string
+        required: true
+        description: |
+          Expression based in XPath.
+
+          Providing a value of `*` will return all requests.
+
+          Available predicates are:
+            - Request fields: `@id` and `@creator`.
+            - State fields: `state/@name`, `state/@who`, and `state/@when`.
+            - Target fields: `target/@project` and `target/@package`.
+            - Source fields: `source/@project` and `source/@package`.
+            - Actions fields: `action/@type`, `action/grouped/@id`, `action/target/@project`, `action/target/@package`, `action/source/@project`, and `action/source/@package`.
+            - Reviews fields:
+              - General: `review/@when`, `review/@state`.
+              - Review by: `review/@by_user`, `review/@by_group`, `review/@by_project`, and `review/@by_package`.
+              - History: `review/history/@when`.
+            - History fields: `history/@when` and `history/@who`.
+        examples:
+          all:
+            summary: All
+            value: "*"
+          id:
+            summary: Request number
+            value: "@id=123456"
+          function_contains:
+            summary: Function contains
+            value: contains(@creator,'Igg')
+          combination:
+            summary: State name and date
+            value: state/@name='review' and starts_with(state/@when,'2022-08-22')
+      - in: query
+        name: limit
+        schema:
+          type: integer
+        description: Limit the number of results.
+        example: 20
+      - in: query
+        name: offset
+        schema:
+          type: integer
+        description: Return results starting from the element specified by offset.
+        example: 10
+      - in: query
+        name: withhistory
+        schema:
+          type: string
+        description: |
+          Include the request history.
+
+          Without a value or with the value `0` means without the request history. A value `1` means with the request history.
+        example: 1
+      - in: query
+        name: withfullhistory
+        schema:
+          type: string
+        description: |
+          Include the request and review history.
+
+          Without a value or with the value `0` means without the request and review history. A value `1` means with the request and review history.
+        example: 1
+      responses:
+        '200':
+          description: OK. The request has succeeded.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  matches:
+                    type: string
+                    example: 7
+                    xml:
+                      attribute: true
+                  request:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        id:
+                          type: integer
+                          example: 42
+                          xml:
+                            attribute: true
+                        creator:
+                          type: string
+                          example: foo-user
+                          xml:
+                            attribute: true
+                        action:
+                          type: object
+                          properties:
+                            type:
+                              type: string
+                              example: submit
+                              xml:
+                                attribute: true
+                            source:
+                              type: object
+                              properties:
+                                project:
+                                  type: string
+                                  example: home:foo-user
+                                  xml:
+                                    attribute: true
+                                package:
+                                  type: string
+                                  example: obs-server
+                                  xml:
+                                    attribute: true
+                                rev:
+                                  type: integer
+                                  example: 521
+                                  xml:
+                                    attribute: true
+                            target:
+                              type: object
+                              properties:
+                                project:
+                                  type: string
+                                  example: OBS:Unstable
+                                  xml:
+                                    attribute: true
+                                package:
+                                  type: string
+                                  example: obs-server
+                                  xml:
+                                    attribute: true
+                            options:
+                              type: object
+                              properties:
+                                sourceupdate:
+                                  type: string
+                                  example: cleanup
+                        state:
+                          type: object
+                          properties:
+                            name:
+                              type: string
+                              example: accepted
+                              xml:
+                                attribute: true
+                            who:
+                              type: string
+                              example: bar-user
+                              xml:
+                                attribute: true
+                            when:
+                              type: string
+                              example: '2021-01-15T13:39:43'
+                              xml:
+                                attribute: true
+                            comment:
+                              type: string
+                              example: allright
+                        review:
+                          type: array
+                          items:
+                            type: object
+                            properties:
+                              state:
+                                type: string
+                                xml:
+                                  attribute: true
+                              when:
+                                type: string
+                                xml:
+                                  attribute: true
+                              who:
+                                type: string
+                                xml:
+                                  attribute: true
+                              by_user:
+                                type: string
+                                xml:
+                                  attribute: true
+                              by_group:
+                                type: string
+                                xml:
+                                  attribute: true
+                              by_project:
+                                type: string
+                                xml:
+                                  attribute: true
+                              by_package:
+                                type: string
+                                xml:
+                                  attribute: true
+                              comment:
+                                type: string
+                              history:
+                                type: object
+                                properties:
+                                  when:
+                                    type: string
+                                    xml:
+                                      attribute: true
+                                  who:
+                                    type: string
+                                    xml:
+                                      attribute: true
+                                  description:
+                                    type: string
+                          example:
+                          - state: accepted
+                            when: '2021-01-15T15:49:32'
+                            who: obs-maintainer
+                            by_user: obs-maintainer
+                          - state: accepted
+                            when: '2021-01-15T15:49:32'
+                            who: obs-maintainer
+                            by_group: obs-group
+                          - state: accepted
+                            when: '2021-01-15T15:49:32'
+                            who: obs-maintainer
+                            by_project: OBS:Unstable
+                          - state: accepted
+                            when: '2021-01-15T15:49:32'
+                            who: obs-maintainer
+                            by_package: obs-server
+                        history:
+                          type: array
+                          items:
+                            type: object
+                            properties:
+                              who:
+                                type: string
+                                example: foo
+                                xml:
+                                  attribute: true
+                              when:
+                                type: string
+                                example: '2021-01-15T13:39:43'
+                                xml:
+                                  attribute: true
+                              description:
+                                type: string
+                                example: Request created
+                              comment:
+                                type: string
+                                example: Please review sources
+                        description:
+                          type: string
+                          example: A little version update
+                      xml:
+                        name: request
+                xml:
+                  name: collection
+              examples:
+                no_results:
+                  summary: No matching results
+                  value:
+                    matches: 0
+                two_results:
+                  summary: Two matching results
+                  value:
+                    matches: 2
+                    request:
+                    - id: 2
+                      creator: Iggy
+                      description: Praesentium in nobis.
+                      action:
+                        type: submit
+                        source:
+                          project: openSUSE:Leap:15.0
+                          package: apache2
+                        target:
+                          project: my_organization:Factory
+                          package: inreview
+                      state:
+                        name: review
+                        who: Iggy
+                        when: '2022-08-22T08:06:58'
+                      review:
+                      - state: new
+                        when: '2022-08-22T08:06:58'
+                        by_package: apache2
+                        by_project: openSUSE:Leap:15.0
+                      - state: new
+                        when: '2022-08-22T08:06:58'
+                        by_user: repo-checker
+                      - state: accepted
+                        when: '2022-08-22T08:06:58'
+                        who: Admin
+                        by_group: group_1
+                    - id: 4
+                      creator: Iggy2
+                      description: Ut voluptas quibusdam.
+                      action:
+                        type: submit
+                        source:
+                          project: requestor_project
+                          package: package_1661161028_1
+                        target:
+                          project: my_organization:Admin
+                          package: package_1661161028_1
+                      state:
+                        name: review
+                        who: Requestor
+                        when: '2022-08-22T09:37:09'
+                        comment: Dolores dolore animi.
+                      review:
+                      - state: new
+                        when: '2022-08-22T09:37:09'
+                        who: Requestor
+                        by_group: dolorum
+                        comment: Aut ipsum accusantium.
+                      - state: accepted
+                        when: '2022-08-22T09:37:09'
+                        who: Requestor
+                        by_group: group_1
+                        comment: 
+                        history:
+                          who: Admin
+                          when: '2022-08-22T09:37:09'
+                          description: Review got accepted
+                one_result_with_history:
+                  summary: One result with history
+                  value:
+                    matches: 1
+                    request:
+                    - id: 4
+                      creator: Iggy2
+                      description: Ut voluptas quibusdam.
+                      action:
+                        type: submit
+                        source:
+                          project: requestor_project
+                          package: package_1661161028_1
+                        target:
+                          project: my_organization:Admin
+                          package: package_1661161028_1
+                      state:
+                        name: review
+                        who: Requestor
+                        when: '2022-08-22T09:37:09'
+                        comment: Dolores dolore animi.
+                      review:
+                      - state: new
+                        when: '2022-08-22T09:37:09'
+                        who: Requestor
+                        by_group: dolorum
+                        comment: Aut ipsum accusantium.
+                      - state: accepted
+                        when: '2022-08-22T09:37:09'
+                        who: Admin
+                        by_group: group_1
+                        comment: 
+                        history:
+                          who: Admin
+                          when: '2022-08-22T09:37:09'
+                          description: Review got accepted
+                      history:
+                      - who: Iggy
+                        when: '2022-08-22T09:37:09'
+                        description: Request created
+                        comment: Praesentium in nobis. Tempore omnis error.
+                one_result_with_full_history:
+                  summary: One result with full history
+                  value:
+                    matches: 1
+                    request:
+                    - id: 4
+                      creator: Iggy2
+                      description: Ut voluptas quibusdam.
+                      action:
+                        type: submit
+                        source:
+                          project: requestor_project
+                          package: package_1661161028_1
+                        target:
+                          project: my_organization:Admin
+                          package: package_1661161028_1
+                      state:
+                        name: review
+                        who: Requestor
+                        when: '2022-08-22T09:37:09'
+                        comment: Dolores dolore animi.
+                      review:
+                      - state: new
+                        when: '2022-08-22T09:37:09'
+                        who: Requestor
+                        by_group: dolorum
+                        comment: Aut ipsum accusantium.
+                      - state: accepted
+                        when: '2022-08-22T09:37:09'
+                        who: Admin
+                        by_group: group_1
+                        comment: 
+                        history:
+                          who: Admin
+                          when: '2022-08-22T09:37:09'
+                          description: Review got accepted
+                      history:
+                      - who: Iggy
+                        when: '2022-08-22T09:37:09'
+                        description: Request created
+                        comment: Praesentium in nobis. Tempore omnis error.
+                      - who: Admin
+                        when: '2022-08-22T09:37:09'
+                        description: Request got accepted
+        '400':
+          description: Bad Request
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: illegal_xpath_error
+                summary: unable to evaluate 'foo' for 'requests'
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '403':
+          description: |
+            Forbidden.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng).
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: search_results_exceed_configured_limit
+                summary: |
+                  The number of results returned by the performed search exceeds the configured limit.
+
+                  You can:
+                  - retrieve only the ids by using an '/search/.../id' API endpoint, or
+                  - reduce the number of matches of your search:
+                    - paginating your results, through the 'limit' and 'offset' parameters, or
+                    - adjusting your `match` expression.
+      tags:
+      - Search
+    post:
+      deprecated: true
+      summary: List requests objects that match a XPath condition.
+      description: This endpoint is exactly the same as `GET /search/request`, please
+        use that one.
+      tags:
+      - Search
+  "/search/request/id":
+    get:
+      summary: List request numbers that match a XPath condition.
+      description: |
+        Return a collection of request numbers that match a XPath condition.
+
+        This operation is the same as the one defined with [GET /search/request](#/Search/get_search_request) with the exception of the results returned.
+        While the former operation returns a list of request objects, this one return a list of request numbers. See example values of a succeeded request below.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: query
+        name: match
+        schema:
+          type: string
+        description: |
+          Expression based in XPath.
+
+          Not providing a value or providing a value of `*` will return all requests.
+
+          Available predicates are:
+            - Request fields: `@id` and `@creator`.
+            - State fields: `state/@name`, `state/@who`, and `state/@when`.
+            - Target fields: `target/@project` and `target/@package`.
+            - Source fields: `source/@project` and `source/@package`.
+            - Actions fields: `action/@type`, `action/grouped/@id`, `action/target/@project`, `action/target/@package`, `action/source/@project`, and `action/source/@package`.
+            - Reviews fields:
+              - General: `review/@when`, `review/@state`.
+              - Review by: `review/@by_user`, `review/@by_group`, `review/@by_project`, and `review/@by_package`.
+              - History: `review/history/@when`.
+            - History fields: `history/@when` and `history/@who`.
+        examples:
+          all:
+            summary: All
+            value: "*"
+          id:
+            summary: Request number
+            value: "@id=123456"
+          function_contains:
+            summary: Function contains
+            value: contains(@creator,'Igg')
+          combination:
+            summary: State name and date
+            value: "/search/request?match=state/@name='review' and starts_with(state/@when,'2022-08-22')"
+      - in: query
+        name: limit
+        schema:
+          type: integer
+        description: Limit the number of results.
+        example: 20
+      - in: query
+        name: offset
+        schema:
+          type: integer
+        description: Return results starting from the element specified by offset.
+        example: 10
+      - in: query
+        name: withhistory
+        schema:
+          type: string
+        description: |
+          Include the request history.
+
+          Without a value or with the value `0` means without the request history. A value `1` means with the request history.
+        example: 1
+      - in: query
+        name: withfullhistory
+        schema:
+          type: string
+        description: |
+          Include the request and review history.
+
+          Without a value or with the value `0` means without the request and review history. A value `1` means with the request and review history.
+        example: 1
+      responses:
+        '200':
+          description: OK. The request has succeeded.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  matches:
+                    type: string
+                    example: 7
+                    xml:
+                      attribute: true
+                  request:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        id:
+                          type: integer
+                          example: 42
+                          xml:
+                            attribute: true
+                        creator:
+                          type: string
+                          example: foo-user
+                          xml:
+                            attribute: true
+                        action:
+                          type: object
+                          properties:
+                            type:
+                              type: string
+                              example: submit
+                              xml:
+                                attribute: true
+                            source:
+                              type: object
+                              properties:
+                                project:
+                                  type: string
+                                  example: home:foo-user
+                                  xml:
+                                    attribute: true
+                                package:
+                                  type: string
+                                  example: obs-server
+                                  xml:
+                                    attribute: true
+                                rev:
+                                  type: integer
+                                  example: 521
+                                  xml:
+                                    attribute: true
+                            target:
+                              type: object
+                              properties:
+                                project:
+                                  type: string
+                                  example: OBS:Unstable
+                                  xml:
+                                    attribute: true
+                                package:
+                                  type: string
+                                  example: obs-server
+                                  xml:
+                                    attribute: true
+                            options:
+                              type: object
+                              properties:
+                                sourceupdate:
+                                  type: string
+                                  example: cleanup
+                        state:
+                          type: object
+                          properties:
+                            name:
+                              type: string
+                              example: accepted
+                              xml:
+                                attribute: true
+                            who:
+                              type: string
+                              example: bar-user
+                              xml:
+                                attribute: true
+                            when:
+                              type: string
+                              example: '2021-01-15T13:39:43'
+                              xml:
+                                attribute: true
+                            comment:
+                              type: string
+                              example: allright
+                        review:
+                          type: array
+                          items:
+                            type: object
+                            properties:
+                              state:
+                                type: string
+                                xml:
+                                  attribute: true
+                              when:
+                                type: string
+                                xml:
+                                  attribute: true
+                              who:
+                                type: string
+                                xml:
+                                  attribute: true
+                              by_user:
+                                type: string
+                                xml:
+                                  attribute: true
+                              by_group:
+                                type: string
+                                xml:
+                                  attribute: true
+                              by_project:
+                                type: string
+                                xml:
+                                  attribute: true
+                              by_package:
+                                type: string
+                                xml:
+                                  attribute: true
+                              comment:
+                                type: string
+                              history:
+                                type: object
+                                properties:
+                                  when:
+                                    type: string
+                                    xml:
+                                      attribute: true
+                                  who:
+                                    type: string
+                                    xml:
+                                      attribute: true
+                                  description:
+                                    type: string
+                          example:
+                          - state: accepted
+                            when: '2021-01-15T15:49:32'
+                            who: obs-maintainer
+                            by_user: obs-maintainer
+                          - state: accepted
+                            when: '2021-01-15T15:49:32'
+                            who: obs-maintainer
+                            by_group: obs-group
+                          - state: accepted
+                            when: '2021-01-15T15:49:32'
+                            who: obs-maintainer
+                            by_project: OBS:Unstable
+                          - state: accepted
+                            when: '2021-01-15T15:49:32'
+                            who: obs-maintainer
+                            by_package: obs-server
+                        history:
+                          type: array
+                          items:
+                            type: object
+                            properties:
+                              who:
+                                type: string
+                                example: foo
+                                xml:
+                                  attribute: true
+                              when:
+                                type: string
+                                example: '2021-01-15T13:39:43'
+                                xml:
+                                  attribute: true
+                              description:
+                                type: string
+                                example: Request created
+                              comment:
+                                type: string
+                                example: Please review sources
+                        description:
+                          type: string
+                          example: A little version update
+                      xml:
+                        name: request
+                xml:
+                  name: collection
+              examples:
+                no_results:
+                  summary: No matching results
+                  value:
+                    matches: 0
+                two_results:
+                  summary: Two matching results
+                  value:
+                    matches: 2
+                    request:
+                    - id: 2
+                    - id: 4
+        '400':
+          description: Bad Request
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: illegal_xpath_error
+                summary: unable to evaluate 'foo' for 'requests'
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+      tags:
+      - Search
+    post:
+      deprecated: true
+      summary: List request numbers that match a XPath condition.
+      description: This endpoint is exactly the same as `GET /search/request/id`,
+        please use that one.
+      tags:
+      - Search
+  "/service":
+    get:
+      summary: List all services.
+      description: Get a list of all services known to OBS.
+      security:
+      - basic_authentication: []
+      responses:
+        '200':
+          description: OK. The request has succeeded.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: array
+                items:
+                  type: object
+                  properties:
+                    name:
+                      type: string
+                      xml:
+                        attribute: true
+                    summary:
+                      type: string
+                    description:
+                      type: string
+                    parameter:
+                      type: array
+                      items:
+                        type: object
+                        properties:
+                          name:
+                            type: string
+                            xml:
+                              attribute: true
+                          description:
+                            type: string
+                          allowedvalue:
+                            type: array
+                            items:
+                              type: string
+                          required:
+                            type: string
+                  xml:
+                    name: service
+                xml:
+                  wrapped: true
+                  name: servicelist
+              example:
+              - name: download_url
+                summary: Download a file
+                description: This services uses curl to download files from remote
+                  servers via supported protocols.
+                parameter:
+                - name: protocol
+                  description: Used Protocol
+                  allowedvalue:
+                  - ftp
+                  - http
+                  - https
+                - name: host
+                  description: Server Hostname
+                  required: ''
+              - name: source_validator
+                summary: Validate sources
+                description: The default SUSE source validator which catches common
+                  pitfalls before build.
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+      tags:
+      - General Information
+  "/source?cmd=branch":
+    post:
+      summary: Branch a set of packages based on attributes
+      description: |
+        Create a source link from a package of an existing project to a
+        new subproject of the requesters home project.
+      security:
+      - basic_authentication: []
+      parameters:
+      - name: project
+        description: The project that you want to branch
+        in: query
+        schema:
+          type: string
+      - name: package
+        description: The package that you want to branch
+        in: query
+        schema:
+          type: string
+      - name: target_project
+        description: Project which will be used or created
+        in: query
+        schema:
+          type: string
+      - name: target_package
+        description: Package name which will be used
+        in: query
+        schema:
+          type: string
+      - name: attribute
+        description: Attribute used for package search, default is OBS:MaintenanceProject
+        in: query
+        schema:
+          type: string
+      - name: add_repositories
+        description: Copy the repositories from branched project
+        in: query
+        schema:
+          type: boolean
+      - name: update_path_elements
+        description: Check if repository path elements do use each other and adapt
+          our own path elements
+        in: query
+        schema:
+          type: boolean
+      - name: update_project_attribute
+        description: Set a different Update Project attribute.
+        in: query
+        schema:
+          type: string
+        default: OBS:UpdateProject
+      - name: noaccess
+        description: Create hidden project. The new created project will be read protected
+        in: query
+        schema:
+          type: boolean
+      - name: extend_package_names
+        description: Extend repo and package names
+        in: query
+        schema:
+          type: boolean
+      - name: add_repositories_rebuild
+        description: Use defined rebuild policy for new repos or copy it from the
+          source project
+        in: query
+        schema:
+          type: string
+          enum:
+          - transitive direct local copy
+      - name: add_repositories_block
+        description: Use defined block policy for new repos
+        in: query
+        schema:
+          type: string
+          enum:
+          - all
+          - local
+          - never
+      - name: newinstance
+        description: The target package exists only via project links, but the link
+          should point to given project
+        in: query
+        schema:
+          type: boolean
+      - name: maintenance
+        describe: Explicitly asked for maintenance branch
+        in: query
+        schema:
+          type: boolean
+      responses:
+        '200':
+          description: ok
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+                data:
+                - home:Admin
+                - hello_world
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: Not Found
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                xml:
+                  name: status
+              example:
+                code: not_found
+                summary: no packages found by search criteria
+      tags:
+      - Sources
+  "/source?cmd=createmaintenanceincident":
+    post:
+      summary: Create maintenance incident projects
+      description: Create a mainatenance incident project based on attribute search.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: query
+        name: attribute
+        schema:
+          type: string
+        example: OBS:MaintenanceProject
+        description: attribute used for package search, default is OBS:MaintenanceProject
+      responses:
+        '200':
+          description: ok
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+                data:
+                - MaintenanceProject:1
+        '400':
+          description: Bad Request
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: incident_has_no_maintenance_project
+                summary: incident projects shall only create below maintenance projects
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '403':
+          description: Forbidden
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: modify_project_no_permission
+                summary: no permission to modify project 'MaintenanceProject'
+      tags:
+      - Sources
+  "/source?cmd=orderkiwirepos":
+    post:
+      summary: Sort the repositories inside of a kiwi file according to path relationships.
+      description: This API takes kiwi XML file in the request body and sort the repositories
+        based on priority.
+      security:
+      - basic_authentication: []
+      requestBody:
+        required: true
+        content:
+          application/xml; charset=utf-8:
+            schema:
+              type: object
+              properties:
+                name:
+                  type: string
+                  xml:
+                    attribute: true
+                schemaversion:
+                  type: string
+                  xml:
+                    attribute: true
+                repository:
+                  type: array
+                  items:
+                    type: object
+                    properties:
+                      source:
+                        type: object
+                        properties:
+                          path:
+                            type: string
+                            xml:
+                              attribute: true
+                  xml:
+                    name: repository
+              xml:
+                name: image
+            example: |
+              <image name="{exc_image_base_name}" schemaversion="7.4">
+                <repository type="rpm-md" priority="99" alias="kiwi">
+                  <source path="obs://Virtualization:Appliances:Builder/openSUSE_Leap_15.3"/>
+                </repository>
+                <repository type="rpm-md" priority="1" alias="OS" imageinclude="true">
+                  <source path="{exc_repo}"/>
+                </repository>
+              </image>
+      responses:
+        '200':
+          description: Sorted list of repositories
+          content:
+            text/xml:
+              schema:
+                type: object
+                properties:
+                  name:
+                    type: string
+                    xml:
+                      attribute: true
+                  schemaversion:
+                    type: string
+                    xml:
+                      attribute: true
+                  repository:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        source:
+                          type: object
+                          properties:
+                            path:
+                              type: string
+                              xml:
+                                attribute: true
+                    xml:
+                      name: repository
+                xml:
+                  name: image
+              example: |
+                <image name="{exc_image_base_name}" schemaversion="7.4">
+                  <repository type="rpm-md" priority="1" alias="OS" imageinclude="true">
+                    <source path="{exc_repo}"/>
+                  </repository>
+                  <repository type="rpm-md" priority="99" alias="kiwi">
+                    <source path="obs://Virtualization:Appliances:Builder/openSUSE_Leap_15.3"/>
+                  </repository>
+                </image>
+        '400':
+          description: Bad Request
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                xml:
+                  name: status
+              example:
+                code: 400
+                summary: "/srv/obs/sources/:upload/1344: not xml"
+      tags:
+      - Sources
+  "/source":
+    get:
+      summary: List all the projects.
+      description: Get the list of all projects.
+      security:
+      - basic_authentication: []
+      parameters:
+      - name: deleted
+        in: query
+        schema:
+          type: integer
+        description: Set to `1` to list the deleted projects. This is available for
+          Admins only.
+        example: 0
+      responses:
+        '200':
+          description: OK. The request has succeeded.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  count:
+                    type: integer
+                    xml:
+                      attribute: true
+                  name:
+                    type: string
+                    xml:
+                      attribute: true
+                  rev:
+                    type: string
+                    xml:
+                      attribute: true
+                  vrev:
+                    type: string
+                    xml:
+                      attribute: true
+                  srcmd5:
+                    type: string
+                    xml:
+                      attribute: true
+                  entry:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        name:
+                          type: string
+                          xml:
+                            attribute: true
+                        md5:
+                          type: string
+                          xml:
+                            attribute: true
+                        size:
+                          type: string
+                          xml:
+                            attribute: true
+                        mtime:
+                          type: string
+                          xml:
+                            attribute: true
+                xml:
+                  name: directory
+              examples:
+                List of projects:
+                  value:
+                    entry:
+                    - name: home:Admin
+                    - name: home:Iggy
+                Deleted projects:
+                  value:
+                    entry:
+                    - name: home:user_1
+        '400':
+          description: Wrong value for deleted parameter.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                not boolean:
+                  value:
+                    code: 400
+                    summary: not boolean
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '403':
+          description: No permission to access deleted projects.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: no_permission_for_deleted
+                summary: only admins can see deleted projects.
+      tags:
+      - Sources - Projects
+  "/source/{project_name}":
+    get:
+      summary: List packages of a project.
+      description: Get a list of packages belonging to a project.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - name: deleted
+        in: query
+        schema:
+          type: string
+        description: Set to `1` to list the packages of a deleted project.
+        example: 1
+      - in: query
+        name: expand
+        schema:
+          type: string
+          enum:
+          - 1
+          - 0
+        description: Set to `1` to include packages from linked projects.
+        example: 1
+      - in: query
+        name: view
+        schema:
+          type: string
+          enum:
+          - issues
+          - productlist
+          - verboseproductlist
+        description: |
+          Specify which sections should be included in the packages list.
+
+          * `issues`: Show all tracked issues for all the packages.
+          * `productlist`: Show all contained products.
+          * `verboseproductlist`: List all contained products with detailed information about the product.
+
+          Example of a result when `issues` is selected:
+          ```
+          <project name="Base:System">
+            <package project="Base:System" name="xz">
+              <issue change="kept">
+                <created_at>2009-05-21 10:50:00 UTC</created_at>
+                <updated_at>2020-02-24 13:01:11 UTC</updated_at>
+                <name>505969</name>
+                <tracker>bnc</tracker>
+                <label>boo#505969</label>
+                <url>https://bugzilla.opensuse.org/show_bug.cgi?id=505969</url>
+                <state>CLOSED</state>
+                <summary>lzma, xz: missing manpages</summary>
+                <owner>
+                  <login>coolo</login>
+                  <email>coolo@suse.com</email>
+                  <realname>Stephan Kulow</realname>
+                </owner>
+              </issue>
+              <issue change="kept">
+                <created_at>2009-06-04 14:35:00 UTC</created_at>
+                <updated_at>2020-02-24 13:01:11 UTC</updated_at>
+                <name>509945</name>
+                <tracker>bnc</tracker>
+                <label>boo#509945</label>
+                <url>https://bugzilla.opensuse.org/show_bug.cgi?id=509945</url>
+                <state>CLOSED</state>
+                <summary>Enforce packaging of static libraries by rpmlint check</summary>
+                <owner>
+                  <login>dirkmueller</login>
+                  <email>dmueller@suse.com</email>
+                  <realname>Dirk Mueller</realname>
+                </owner>
+              </issue>
+            </package>
+          </project>
+
+          ```
+
+          Example of a result when `productlist` is selected:
+          ```
+          <productlist count="3">
+            <product name="openSUSE-Addon-NonOss" cpe="cpe:/o:opensuse:opensuse-addon-nonoss:20230108" originproject="openSUSE:Factory" originpackage="000product" mtime="1673224560"/>
+            <product name="openSUSE" cpe="cpe:/o:opensuse:opensuse:20230108" originproject="openSUSE:Factory" originpackage="000product" mtime="1673224560"/>
+            <product name="MicroOS" cpe="cpe:/o:opensuse:microos:20230108" originproject="openSUSE:Factory" originpackage="000product" mtime="1673224560"/>
+          </productlist>
+          ```
+
+          Example of a result when `verboseproductlist` is selected:
+          ```
+          <productlist count="3">
+            <product name="openSUSE-Addon-NonOss" originproject="openSUSE:Factory" originpackage="000product">
+              <cpe>cpe:/o:opensuse:opensuse-addon-nonoss:20230108</cpe>
+              <version>20230108</version>
+            </product>
+            <product name="openSUSE" originproject="openSUSE:Factory" originpackage="000product">
+              <cpe>cpe:/o:opensuse:opensuse:20230108</cpe>
+              <version>20230108</version>
+            </product>
+            <product name="MicroOS" originproject="openSUSE:Factory" originpackage="000product">
+              <cpe>cpe:/o:opensuse:microos:20230108</cpe>
+              <version>20230108</version>
+            </product>
+          </productlist>
+          ```
+      responses:
+        '200':
+          description: OK. The request has succeeded.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                oneOf:
+                - type: object
+                  properties:
+                    count:
+                      type: string
+                      xml:
+                        attribute: true
+                    entry:
+                      type: array
+                      items:
+                        type: object
+                        properties:
+                          name:
+                            type: string
+                            xml:
+                              attribute: true
+                          originpackage:
+                            type: string
+                            xml:
+                              attribute: true
+                  xml:
+                    name: directory
+                - type: object
+                  properties:
+                    count:
+                      type: string
+                      xml:
+                        attribute: true
+                    entry:
+                      type: array
+                      items:
+                        type: object
+                        properties:
+                          name:
+                            type: string
+                            xml:
+                              attribute: true
+                          cpe:
+                            type: string
+                            xml:
+                              attribute: true
+                          originproject:
+                            type: string
+                            xml:
+                              attribute: true
+                          originpackage:
+                            type: string
+                            xml:
+                              attribute: true
+                          mtime:
+                            type: string
+                            xml:
+                              attribute: true
+                      xml:
+                        name: product
+                  xml:
+                    name: productlist
+                - type: object
+                  properties:
+                    count:
+                      type: string
+                      xml:
+                        attribute: true
+                    entry:
+                      type: array
+                      items:
+                        type: object
+                        properties:
+                          name:
+                            type: string
+                            xml:
+                              attribute: true
+                          originproject:
+                            type: string
+                            xml:
+                              attribute: true
+                          originpackage:
+                            type: string
+                            xml:
+                              attribute: true
+                          cpe:
+                            type: string
+                          version:
+                            type: string
+                      xml:
+                        name: product
+                  xml:
+                    name: productlist
+        '400':
+          description: |
+            Bad Request.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                not boolean:
+                  description: Passing a non boolean value to the `deleted` query
+                    parameter.
+                  value:
+                    code: 400
+                    summary: not boolean
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: Not Found.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: unknown_project
+                summary: 'Project not found: home:nonExistentUser'
+      tags:
+      - Sources - Packages
+    delete:
+      summary: Delete a specified project.
+      description: Deletes a specified project and all the packages of this project.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - name: force
+        in: query
+        schema:
+          type: integer
+        description: |
+          Set to `1` if you want to delete the project even if the repositories of other
+          projects include a path to this project. After deletion, the path
+          in the other repository will start pointing towards 'deleted/standard' to
+          prevent the build and publishing
+      - name: comment
+        in: query
+        schema:
+          type: string
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '403':
+          description: Unauthorized to delete project.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                delete_project_no_permission:
+                  value:
+                    code: delete_project_no_permission
+                    summary: Permission denied (delete project 'project_name')
+                  summary: No permission
+        '404':
+          description: |
+            Unknown project.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: <some project>.'
+      tags:
+      - Sources - Projects
+  "/source/{project_name}?view=info":
+    get:
+      summary: Show information of the packages of a project.
+      description: Show source version, md5sums and build description files of all
+        packages belonging to a project.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: query
+        name: view
+        schema:
+          type: string
+          enum:
+          - info
+          - issues
+          - productlist
+          - verboseproductlist
+        description: |
+          Specify which information about each package should be returned.
+
+          * `info`: Show source version, md5sums and build description files of all packages belonging to a project.
+          * `issues`, `productlist`, `verboseproductlist`:
+            See this [other endpoint](<#/Sources - Packages/get_source__project_name_>) for details.
+        example: info
+      - in: query
+        name: arch
+        schema:
+          type: string
+        description: Filter by architecture name.
+        example: x86_64
+      - in: query
+        name: noexpand
+        schema:
+          type: string
+          enum:
+          - 1
+          - 0
+        default: 0
+        description: Set to `1` to prevent from showing some elements about packages,
+          like `filename`, `error` or `linked` elements.
+        example: 1
+      - in: query
+        name: nofilename
+        schema:
+          type: string
+          enum:
+          - 1
+          - 0
+        default: 0
+        description: Set to `1` to prevent from showing filename elements. Shows only
+          the `sourceinfo` root element.
+        example: 1
+      - in: query
+        name: package
+        schema:
+          type: string
+        description: Filter by package name.
+        example: test
+      - in: query
+        name: parse
+        schema:
+          type: string
+          enum:
+          - 1
+          - 0
+        default: 0
+        description: Set to `1` to show more details, like `originproject`, `linked
+          package`, `name`, `version`, `release`, `subpacks`, `deps`, and `prereqs`
+          elements.
+        example: 1
+      - in: query
+        name: repository
+        schema:
+          type: string
+        description: Filter by repository name.
+        example: openSUSE_Tumbleweed
+      - in: query
+        name: withmetamd5
+        schema:
+          type: string
+          enum:
+          - 1
+          - 0
+        default: 0
+        description: Set to `1` to show the `metamd5` attribute.
+        example: 1
+      - in: query
+        name: withchangesmd5
+        schema:
+          type: string
+          enum:
+          - 1
+          - 0
+        default: 0
+        description: Set to `1` to show the `revtime` element.
+        example: 1
+      responses:
+        '200':
+          description: OK. The request has succeeded.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: array
+                items:
+                  type: object
+                  properties:
+                    package:
+                      type: string
+                      xml:
+                        attribute: true
+                    rev:
+                      type: string
+                      xml:
+                        attribute: true
+                    vrev:
+                      type: string
+                      xml:
+                        attribute: true
+                    srcmd5:
+                      type: string
+                      xml:
+                        attribute: true
+                    verifymd5:
+                      type: string
+                      xml:
+                        attribute: true
+                    metamd5:
+                      type: string
+                      xml:
+                        attribute: true
+                    filename:
+                      type: string
+                    originproject:
+                      type: string
+                    linked:
+                      type: array
+                      items:
+                        type: object
+                        properties:
+                          project:
+                            type: string
+                            xml:
+                              attribute: true
+                          package:
+                            type: string
+                            xml:
+                              attribute: true
+                    name:
+                      type: string
+                    version:
+                      type: string
+                    release:
+                      type: string
+                    revtime:
+                      type: string
+                    error:
+                      type: string
+                    subpacks:
+                      type: array
+                      items:
+                        type: string
+                    deps:
+                      type: array
+                      items:
+                        type: string
+                    prereqs:
+                      type: array
+                      items:
+                        type: string
+                  xml:
+                    name: sourceinfo
+                xml:
+                  name: sourceinfolist
+                  wrapped: true
+              examples:
+                A project contains three packages:
+                  value:
+                  - package: texlive-specs
+                    rev: 9f5336fcf6e4521b6a9587b02087eef9
+                    vrev: 25
+                    srcmd5: 9f5336fcf6e4521b6a9587b02087eef9
+                    verifymd5: 9b49b7314f5d0dfd8002cd329e048f73
+                    filename: texlive-specs.spec
+                  - package: texlive-specs-w
+                    rev: 9f5336fcf6e4521b6a9587b02087eef9
+                    vrev: 55
+                    srcmd5: 9f5336fcf6e4521b6a9587b02087eef9
+                    verifymd5: 9b49b7314f5d0dfd8002cd329e048f73
+                    filename: texlive-specs-w.spec
+                  - package: test
+                    rev: 5
+                    vrev: 5
+                    srcmd5: e3a71081cb7245e3c09c3655dffa7384
+                    verifymd5: e3a71081cb7245e3c09c3655dffa7384
+                    error: bad build configuration, no build type defined or detected
+                Applying a filter doesn't return any result:
+                  value:
+                  - package: hello
+                    error: 404 package 'hello' does not exist
+        '400':
+          description: |
+            Bad Request.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Not Boolean:
+                  description: Passing a value different than `0` or `1` to `parse`,
+                    for example.
+                  value:
+                    code: 400
+                    summary: not boolean
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: Not Found.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: home:some_project'
+      tags:
+      - Sources - Projects
+  "/source/{project_name}/_config":
+    get:
+      summary: Get project's configuration
+      description: Read configuration for the specified project
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - name: rev
+        in: query
+        schema:
+          type: string
+      responses:
+        '200':
+          description: OK. The request has succeeded.
+          content:
+            text/plain:
+              schema:
+                type: string
+              example: |
+                # temporary should be fixed in SUSE:SLE-15-SP4:GA
+                Prefer: -libudev-devel
+                Prefer: -libudev-devel-32bit
+                ...
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: |
+            Unknown project.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: <some project>.'
+      tags:
+      - Sources - Projects
+    put:
+      summary: Update project's configuration
+      description: Update configuration for the specified project
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - name: comment
+        in: query
+        schema:
+          type: string
+      requestBody:
+        description: configuration you want to update
+        content:
+          text/plain:
+            schema:
+              type: string
+            example: |
+              # temporary should be fixed in SUSE:SLE-15-SP4:GA
+              Prefer: -libudev-devel
+              Prefer: -libudev-devel-32bit
+              ...
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: |
+            Unknown project.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: <some project>.'
+      tags:
+      - Sources - Projects
+  "/source/{project_name}/_meta":
+    get:
+      summary: Get project meta file
+      description: Get project meta file
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - name: view
+        in: query
+        schema:
+          type: string
+      responses:
+        '200':
+          description: OK. The request has succeeded.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  name:
+                    type: string
+                    xml:
+                      attribute: true
+                  title:
+                    type: string
+                  description:
+                    type: string
+                  person:
+                    type: object
+                    properties:
+                      userid:
+                        type: string
+                        xml:
+                          attribute: true
+                      role:
+                        type: string
+                        xml:
+                          attribute: true
+                  repository:
+                    type: object
+                    properties:
+                      name:
+                        type: string
+                        xml:
+                          attribute: true
+                      path:
+                        type: object
+                        properties:
+                          project:
+                            type: string
+                            xml:
+                              attribute: true
+                          repository:
+                            type: string
+                            xml:
+                              attribute: true
+                      arch:
+                        type: array
+                        items:
+                          type: string
+                xml:
+                  name: project
+              example:
+                name: home:Admin
+                title: Endless Night
+                description: Test project
+                person:
+                  userid: Admin
+                  role: maintainer
+                repository:
+                  name: openSUSE_Tumbleweed
+                  path:
+                    project: openSUSE.org:openSUSE:Factory
+                    repository: snapshot
+                  arch:
+                  - x86_64
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: Unknown project.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: <some project>.'
+                Invalid Project Parameters:
+                  value:
+                    code: invalid_project_parameters
+                    summary: Not found
+      tags:
+      - Sources - Projects
+    put:
+      summary: Write project meta file
+      description: Write project's meta file. Create the project if it doesn't exist.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: query
+        name: comment
+        schema:
+          type: string
+        description: Comment that explains the changes you made in meta file.
+      requestBody:
+        description: Project meta definition.
+        content:
+          application/xml; charset=utf-8:
+            schema:
+              type: object
+              properties:
+                name:
+                  type: string
+                  xml:
+                    attribute: true
+                title:
+                  type: string
+                description:
+                  type: string
+                person:
+                  type: object
+                  properties:
+                    userid:
+                      type: string
+                      xml:
+                        attribute: true
+                    role:
+                      type: string
+                      xml:
+                        attribute: true
+                repository:
+                  type: object
+                  properties:
+                    name:
+                      type: string
+                      xml:
+                        attribute: true
+                    path:
+                      type: object
+                      properties:
+                        project:
+                          type: string
+                          xml:
+                            attribute: true
+                        repository:
+                          type: string
+                          xml:
+                            attribute: true
+                    arch:
+                      type: array
+                      items:
+                        type: string
+              xml:
+                name: project
+            example:
+              name: home:Admin
+              title: Endless Night
+              description: Test project
+              person:
+                userid: Admin
+                role: maintainer
+              repository:
+                name: openSUSE_Tumbleweed
+                path:
+                  project: openSUSE.org:openSUSE:Factory
+                  repository: snapshot
+                arch:
+                - x86_64
+                - aarch64
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '400':
+          description: |
+            Bad request.
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown Command:
+                  value:
+                    code: unknown_command
+                    summary: Allowed commands are '<some command>'.
+                Bad Request:
+                  value:
+                    code: err_register_save
+                    summary: 'Could not save the registration, details: Login is the
+                      name of an already existing user and Password can''t be blank.'
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '403':
+          description: The user does not have permission to change the project.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Change project no permission:
+                  value:
+                    code: change_project_no_permission
+                    summary: The project <some project> is locked
+      tags:
+      - Sources - Projects
+  "/source/{project_name}/_pattern":
+    get:
+      summary: Get list of patterns
+      description: Get a list of all patterns for the project
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      responses:
+        '200':
+          description: OK. The request has succeeded.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  name:
+                    type: string
+                    xml:
+                      attribute: true
+                  rev:
+                    type: string
+                    xml:
+                      attribute: true
+                  vrev:
+                    type: string
+                    xml:
+                      attribute: true
+                  srcmd5:
+                    type: string
+                    xml:
+                      attribute: true
+                  entry:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        name:
+                          type: string
+                          xml:
+                            attribute: true
+                        md5:
+                          type: string
+                          xml:
+                            attribute: true
+                        size:
+                          type: string
+                          xml:
+                            attribute: true
+                        ntime:
+                          type: string
+                          xml:
+                            attribute: true
+                xml:
+                  name: directory
+              example:
+                name: _pattern
+                rev: '3'
+                vrev: '555'
+                srcmd5: db8d976cd59b1a933ab82a539247aeac
+                entry:
+                - name: OBS_Server
+                  md5: d4ba5bf938ed8d26e68a7c6d1237854e
+                  size: '947'
+                  ntime: '1463555386'
+                - name: OBS_Server:unstable
+                  md5: d4ba5bf938ed8d26e6xvv8a7c6d12ddd
+                  size: '737'
+                  ntime: 146355ddd6
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: |
+            Unknown project.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: <some project>.'
+      tags:
+      - Sources - Projects
+  "/source/{project_name}/_pattern/{file_name}":
+    get:
+      deprecated: true
+      summary: Read a specified pattern file
+      description: Read a specified pattern file and return the content
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: file_name
+        schema:
+          type: string
+        required: true
+        description: The file name
+        example: ctris-0.42.1-4.1.x86_64.rpm
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: |
+            Not Found.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: home:some_project'
+                Unknown File:
+                  value:
+                    code: unknown_file
+                    summary: 'File not found: home:some_project/_pattern/some_file'
+      tags:
+      - Sources - Projects
+    delete:
+      deprecated: true
+      summary: Deletes a specified pattern file.
+      description: Deletes a specified pattern file of a project.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: file_name
+        schema:
+          type: string
+        required: true
+        description: The file name
+        example: ctris-0.42.1-4.1.x86_64.rpm
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: |
+            Not Found.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: home:some_project'
+                Unknown File:
+                  value:
+                    code: unknown_file
+                    summary: 'File not found: home:some_project/_pattern/some_file'
+      tags:
+      - Sources - Projects
+    put:
+      deprecated: true
+      summary: Write a specified pattern file.
+      description: Write a specified pattern file of a project.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: file_name
+        schema:
+          type: string
+        required: true
+        description: The file name
+        example: ctris-0.42.1-4.1.x86_64.rpm
+      requestBody:
+        content:
+          plain/text:
+            schema:
+              type: string
+              properties:
+                file:
+                  type: string
+                  format: binary
+      responses:
+        '200':
+          description: Updates the artifact's file contents
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  rev:
+                    type: string
+                    xml:
+                      attribute: true
+                  vrev:
+                    type: string
+                    xml:
+                      attribute: true
+                  srcmd5:
+                    type: string
+                  version:
+                    type: string
+                  time:
+                    type: string
+                  user:
+                    type: string
+                  comment:
+                    type: string
+                  requestid:
+                    type: string
+                xml:
+                  name: revision
+              example:
+                rev: 28
+                srcmd5: 6c73fc9ef8d43369f0778564617b4a93
+                time: 1682497725
+                user: Admin
+                comment: 
+                requestid: 
+        '400':
+          description: 'Error: Bad request.'
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Bad Request:
+                  value:
+                    code: validation_failed
+                    summary: 'pattern validation error: 1:1: FATAL: Start tag expected,
+                      < not found
+
+'
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: |
+            Not Found.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: home:some_project'
+                Unknown File:
+                  value:
+                    code: unknown_file
+                    summary: 'File not found: home:some_project/_pattern/some_file'
+      tags:
+      - Sources - Projects
+  "/source/{project_name}/_project":
+    get:
+      summary: List project files
+      description: List all the files in project
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: query
+        name: meta
+        required: false
+        schema:
+          type: integer
+        description: Set to 1 to include _meta files
+        example: 1
+      - in: query
+        name: rev
+        required: false
+        schema:
+          type: integer
+        description: Revision number
+      responses:
+        '200':
+          description: OK. The request has succeeded.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  name:
+                    type: string
+                    xml:
+                      attribute: true
+                  rev:
+                    type: string
+                    xml:
+                      attribute: true
+                  vrev:
+                    type: string
+                    xml:
+                      attribute: true
+                  srcmd5:
+                    type: string
+                    xml:
+                      attribute: true
+                  entry:
+                    type: object
+                    properties:
+                      name:
+                        type: string
+                        xml:
+                          attribute: true
+                      md5:
+                        type: string
+                        xml:
+                          attribute: true
+                      size:
+                        type: string
+                        xml:
+                          attribute: true
+                      mtime:
+                        type: string
+                        xml:
+                          attribute: true
+                xml:
+                  name: directory
+              example:
+                name: _project
+                rev: '7'
+                vrev: '445'
+                srcmd5: 9a18405476229262648b4c3e548a90a9
+                entry:
+                  name: _pubkey
+                  md5: 1536ab133eb76be69aaba65d934d827a
+                  size: '1369'
+                  mtime: '1650378374'
+        '400':
+          description: Wrong value for meta parameter.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                not boolean:
+                  value:
+                    code: 400
+                    summary: not boolean
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: |
+            Unknown project.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: <some project>.'
+      tags:
+      - Sources - Projects
+  "/source/{project_name}/_pubkey":
+    get:
+      summary: Get GPG key
+      description: |
+        Get the project's GPG key. If the project doesn't have a default GPG key, it looks for the first one
+        available in the namespace hierarchy, ending at the global buildservice key.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      responses:
+        '200':
+          description: OK. The request has succeeded.
+          content:
+            text/plain:
+              schema:
+                type: string
+                example: |
+                  -----BEGIN PGP PUBLIC KEY BLOCK-----
+                  Version: GnuPG v1.4.5 (GNU/Linux)
+                  mQENBFfX+W4BCAC89VZEUt8O/o2rXnFoNrW0nsZoaHZX5Kjtzwuns5/UwzBffY/h
+                  [...]
+                  -----END PGP PUBLIC KEY BLOCK-----
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: |
+            Not Found.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Not Found:
+                  value:
+                    code: not_found
+                    summary: 'Project not found: <some project>.'
+                No pubkey:
+                  value:
+                    code: no_pubkey
+                    summary: no pubkey available
+      tags:
+      - Sources - Projects
+    delete:
+      summary: Removes the current gpg key
+      description: Removes the current gpg key if it exists
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: |
+            Unknown project.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: <some project>.'
+      tags:
+      - Sources - Projects
+  "/source/{project_name}/_keyinfo":
+    get:
+      summary: Get a projects signing keys
+      description: Read information about the signing keys for the specified project
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      responses:
+        '200':
+          description: OK. The request has succeeded.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  project:
+                    type: string
+                    xml:
+                      attribute: true
+                  pubkey:
+                    type: object
+                    properties:
+                      keyid:
+                        type: string
+                        xml:
+                          attribute: true
+                      userid:
+                        type: string
+                        xml:
+                          attribute: true
+                      algo:
+                        type: string
+                        xml:
+                          attribute: true
+                      keysize:
+                        type: string
+                        xml:
+                          attribute: true
+                      expires:
+                        type: string
+                        xml:
+                          attribute: true
+                      fingerprint:
+                        type: string
+                        xml:
+                          attribute: true
+                  sslcert:
+                    type: object
+                    properties:
+                      keyid:
+                        type: string
+                        xml:
+                          attribute: true
+                      serial:
+                        type: string
+                        xml:
+                          attribute: true
+                      issuer:
+                        type: string
+                        xml:
+                          attribute: true
+                      subject:
+                        type: string
+                        xml:
+                          attribute: true
+                      algo:
+                        type: string
+                        xml:
+                          attribute: true
+                      keysize:
+                        type: string
+                        xml:
+                          attribute: true
+                      begins:
+                        type: string
+                        xml:
+                          attribute: true
+                      expires:
+                        type: string
+                        xml:
+                          attribute: true
+                      fingerprint:
+                        type: string
+                        xml:
+                          attribute: true
+                xml:
+                  name: keyinfo
+              example:
+                project: openSUSE:Leap
+                pubkey:
+                  keyid: b88b2fd43dbdc284
+                  userid: openSUSE Project Signing Key &lt;opensuse@opensuse.org&gt;
+                  algo: rsa
+                  keysize: 2048
+                  expires: 1887851113
+                  fingerprint: 22c0 7ba5 3417 8cd0 2efe 22aa b88b 2fd4 3dbd c284
+                sslcert:
+                  serial: 18991220325
+                  issuer: CN=openSUSE Secure Boot CA, C=DE, L=Nuremberg, O=openSUSE
+                    Project, emailAddress=build@opensuse.org
+                  subject: CN=openSUSE Secure Boot Signkey, C=DE, L=Nuremberg, O=openSUSE
+                    Project, emailAddress=build@opensuse.org
+                  algo: rsa
+                  keysize: 2048
+                  begins: 1655126536
+                  expires: 1966166536
+                  fingerprint: 1f67 3297 da56 8ae0 dedf db7c 8cc6 8f9e cb85 7275
+                  keyid: fd9f 2c12 e599 d67c c7f9 0675 41ad f426 b712 469e
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: |
+            Unknown project.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: <some project>.'
+      tags:
+      - Sources - Projects
+  "/source/{project_name}/_attribute":
+    get:
+      summary: Get all the project's attributes
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - name: view
+        in: query
+        schema:
+          type: string
+          enum:
+          - blame
+        description: With view=blame, information about who changed each XML tag and
+          when is displayed.
+        example: blame
+      - name: with_default
+        in: query
+        schema:
+          type: string
+        description: |
+          If the attribute doesn't contain any value and `with_default` is present,
+          the default values will be displayed, if any.
+        example: 1
+      responses:
+        '200':
+          description: OK. The request has succeeded.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: array
+                items:
+                  type: object
+                  properties:
+                    name:
+                      type: string
+                      xml:
+                        attribute: true
+                    namespace:
+                      type: string
+                      xml:
+                        attribute: true
+                    binary:
+                      type: string
+                      xml:
+                        attribute: true
+                  xml:
+                    name: attribute
+                xml:
+                  name: attributes
+                  wrapped: true
+              examples:
+                listOfAttributes:
+                  value:
+                  - name: MaintenanceProject
+                    namespace: OBS
+                  - name: ScreenShots
+                    namespace: OBS
+                viewBlame:
+                  description: Passing view=blame.
+                  value: |
+                    10 (Admin        2023-03-09 11:46:01     1) <attributes>
+                    12 (Iggy         2023-03-13 14:46:01     5)   <attribute namespace="OBS" name="MakeOriginOlder"/>
+                    14 (Admin        2023-03-13 15:14:21     6)   <attribute namespace="OBS" name="QualityCategory">
+                    14 (Admin        2023-03-13 15:14:21     7)     <value>Development</value>
+                    14 (Admin        2023-03-13 15:14:21     8)   </attribute>
+                    10 (Admin        2023-03-09 11:46:01     9) </attributes>
+        '400':
+          description: Bad Request.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: remote_project
+                summary: Attribute access to remote project is not yet supported
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: |
+            Unknown project.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: <some project>.'
+      tags:
+      - Sources - Projects
+  "/source/{project_name}/_attribute/{attribute_name}":
+    get:
+      summary: Get project's attribute
+      description: Get a specified attribute of the project
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: attribute_name
+        schema:
+          type: string
+        required: true
+        description: The name of the attribute
+        example: OBS:OwnerRootProjectTest
+      - name: view
+        in: query
+        schema:
+          type: string
+          enum:
+          - blame
+        description: With view=blame, information about who changed each XML tag and
+          when is displayed.
+        example: blame
+      - name: with_default
+        in: query
+        schema:
+          type: string
+        description: |
+          If the attribute doesn't contain any value and `with_default` is present,
+          the default values will be displayed, if any.
+        example: 1
+      responses:
+        '200':
+          description: OK. The request has succeeded.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: array
+                items:
+                  type: object
+                  properties:
+                    name:
+                      type: string
+                      xml:
+                        attribute: true
+                    namespace:
+                      type: string
+                      xml:
+                        attribute: true
+                    binary:
+                      type: string
+                      xml:
+                        attribute: true
+                  xml:
+                    name: attribute
+                xml:
+                  name: attributes
+                  wrapped: true
+              examples:
+                oneAttribute:
+                  value:
+                  - name: MaintenanceProject
+                    namespace: OBS
+                viewBlame:
+                  description: Passing view=blame.
+                  value: |
+                    6  (Admin        2023-03-09 11:46:01     1) <attributes>
+                    12 (Iggy         2023-03-13 14:46:01     5)   <attribute namespace="OBS" name="MakeOriginOlder"/>
+                    14 (Admin        2023-03-13 15:14:21     6)   <attribute namespace="OBS" name="QualityCategory">
+                    14 (Admin        2023-03-13 15:14:21     7)     <value>Development</value>
+                    14 (Admin        2023-03-13 15:14:21     8)   </attribute>
+                    6  (Admin        2023-03-09 11:46:01     9) </attributes>
+        '400':
+          description: Wrong value for deleted parameter.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                invalid_attribute:
+                  value:
+                    code: 400
+                    summary: Attribute 'OwnerRootProjectTest' must be in the $NAMESPACE:$NAME
+                      style
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: |
+            Unknown project.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: <some project>.'
+      tags:
+      - Sources - Projects
+    post:
+      summary: Modifies the specified attribute
+      description: Modifies the specified attribute
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: attribute_name
+        schema:
+          type: string
+        required: true
+        description: The name of the attribute
+        example: OBS:OwnerRootProjectTest
+      - name: comment
+        in: query
+        schema:
+          type: string
+      requestBody:
+        description: Attributes you want to update
+        content:
+          application/xml; charset=utf-8:
+            schema:
+              type: array
+              items:
+                type: object
+                properties:
+                  name:
+                    type: string
+                    xml:
+                      attribute: true
+                  namespace:
+                    type: string
+                    xml:
+                      attribute: true
+                  binary:
+                    type: string
+                    xml:
+                      attribute: true
+                xml:
+                  name: attribute
+              xml:
+                name: attributes
+                wrapped: true
+            example:
+            - name: MaintenanceProject
+              namespace: OBS
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '400':
+          description: Wrong value for deleted parameter.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                invalid_attribute:
+                  value:
+                    code: 400
+                    summary: Attribute 'OwnerRootProjectTest' must be in the $NAMESPACE:$NAME
+                      style
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: |
+            Unknown project.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: <some project>.'
+      tags:
+      - Sources - Projects
+    delete:
+      summary: Removes a specified attribute
+      description: Removes a specified attribute
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: attribute_name
+        schema:
+          type: string
+        required: true
+        description: The name of the attribute
+        example: OBS:OwnerRootProjectTest
+      - name: comment
+        in: query
+        schema:
+          type: string
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '400':
+          description: Wrong value for deleted parameter.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                invalid_attribute:
+                  value:
+                    code: 400
+                    summary: Attribute 'OwnerRootProjectTest' must be in the $NAMESPACE:$NAME
+                      style
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: |
+            Unknown project.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: <some project>.'
+      tags:
+      - Sources - Projects
+  "/source/{project_name}/_project/_history":
+    get:
+      summary: Get project commit history.
+      description: Get project commit history.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: query
+        name: deleted
+        schema:
+          type: string
+        description: Set to `1` to allow to retrieve the revision history of a deleted
+          project.
+        example: 1
+      - in: query
+        name: limit
+        schema:
+          type: integer
+        description: Limit the number of retrieved revision history elements to the
+          specified number.
+        example: 20
+      - in: query
+        name: meta
+        schema:
+          type: string
+        description: Set to `1` to retrieve the revision history of the meta file
+          (`_meta`) of the project.
+        example: 1
+      - in: query
+        name: startbefore
+        schema:
+          type: integer
+        description: Start the list of revision history elements before the given
+          revision number.
+        example: 124
+      - in: query
+        name: rev
+        schema:
+          type: string
+        description: Return the revision entry for a specific revision number.
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [revisionlist.rng](../schema/revisionlist.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: array
+                items:
+                  type: object
+                  properties:
+                    rev:
+                      type: string
+                      xml:
+                        attribute: true
+                    vrev:
+                      type: string
+                      xml:
+                        attribute: true
+                    srcmd5:
+                      type: string
+                    version:
+                      type: string
+                    time:
+                      type: string
+                    user:
+                      type: string
+                    comment:
+                      type: string
+                    requestid:
+                      type: string
+                  xml:
+                    name: revision
+                xml:
+                  name: revisionlist
+                  wrapped: true
+              examples:
+                Two Revisions:
+                  value:
+                  - rev: 1
+                    vrev: ''
+                    srcmd5: d41d8cd98f00b204e9800998ecf8427e
+                    version: ''
+                    time: 1678364228
+                    user: Admin
+                    comment: project was deleted
+                  - rev: 2
+                    vrev: ''
+                    srcmd5: d41d8cd98f00b204e9800998ecf8427e
+                    version: ''
+                    time: 1678364246
+                    user: Admin
+                    comment: project was undeleted
+                rev Parameter Specified (rev = 1):
+                  value:
+                  - rev: 1
+                    vrev: ''
+                    srcmd5: d41d8cd98f00b204e9800998ecf8427e
+                    version: ''
+                    time: 1678364228
+                    user: Admin
+                    comment: project was deleted
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: Not Found.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: home:some_project'
+      tags:
+      - Sources - Projects
+  "/source/{project_name}/_project/{file_name}":
+    get:
+      summary: Read a project file
+      description: Read a project file
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: file_name
+        schema:
+          type: string
+        required: true
+        description: The file name
+        example: ctris-0.42.1-4.1.x86_64.rpm
+      - name: deleted
+        in: query
+        schema:
+          type: string
+        description: Set to `1` to read a file of a deleted project.
+        example: 1
+      - in: query
+        name: meta
+        required: false
+        schema:
+          type: integer
+        description: Set to `1` to include _meta files
+        example: 1
+      - in: query
+        name: rev
+        required: false
+        schema:
+          type: integer
+        description: Revision number
+      responses:
+        '200':
+          description: OK. The request has succeeded.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  name:
+                    type: string
+                    xml:
+                      attribute: true
+                  title:
+                    type: string
+                  description:
+                    type: string
+                  person:
+                    type: object
+                    properties:
+                      userid:
+                        type: string
+                        xml:
+                          attribute: true
+                      role:
+                        type: string
+                        xml:
+                          attribute: true
+                  repository:
+                    type: object
+                    properties:
+                      name:
+                        type: string
+                        xml:
+                          attribute: true
+                      path:
+                        type: object
+                        properties:
+                          project:
+                            type: string
+                            xml:
+                              attribute: true
+                          repository:
+                            type: string
+                            xml:
+                              attribute: true
+                      arch:
+                        type: array
+                        items:
+                          type: string
+                xml:
+                  name: project
+              example:
+                name: home:Admin
+                title: Endless Night
+                description: Test project
+                person:
+                  userid: Admin
+                  role: maintainer
+                repository:
+                  name: openSUSE_Tumbleweed
+                  path:
+                    project: openSUSE.org:openSUSE:Factory
+                    repository: snapshot
+                  arch:
+                  - x86_64
+        '400':
+          description: Wrong value for meta parameter.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                not boolean:
+                  value:
+                    code: 400
+                    summary: not boolean
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '403':
+          description: The user does not have permission to access the source.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Source access no permission:
+                  value:
+                    code: source_access_no_permission
+                    summary: Source Access not allowed
+        '404':
+          description: |
+            Unknown project.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: <some project>.'
+      tags:
+      - Sources - Projects
+  "/source/{project_name}?cmd=addchannels":
+    post:
+      summary: Add channels and extend repository list.
+      description: |
+        Add channels for each one of the provided project packages.
+        If the mode parameter is provided, that mode is added to the package channel.
+        The mode parameter can be:
+          - 'skip_disabled'
+          - 'enable_all'
+          - 'add_disabled' being the default.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: mode
+        schema:
+          type: string
+          enum:
+          - skip_disabled
+          - enable_all
+          - add_disabled
+        required: false
+        description: The channel will be added to the package using this mode.
+        example: add_disabled
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: |
+            Unknown project.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: <some project>.'
+      tags:
+      - Sources - Projects
+  "/source/{project_name}?cmd=copy":
+    post:
+      summary: Copy an entire project.
+      description: Copy the source project provided by the required parameter `oproject`
+        to the target project provided by the path parameter `project_name`.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: |
+          Target project name
+
+          The target project must exist. Otherwise, the copy is not performed and a not found error (404) is returned.
+        example: home:Iggy:target
+      - in: query
+        name: oproject
+        schema:
+          type: string
+        required: true
+        description: Origin project name
+        example: home:Iggy:source
+      - in: query
+        name: comment
+        schema:
+          type: string
+        description: Comment to be added in the revision history.
+        example: Copy project for testing.
+      - in: query
+        name: makeolder
+        schema:
+          type: string
+          enum:
+          - 1
+          - 0
+        default: 0
+        description: Make target older. Set to `1` to bump the source vrev by two
+          numbers and the target by one.
+        example: 1
+      - in: query
+        name: makeoriginolder
+        schema:
+          type: string
+          enum:
+          - 1
+          - 0
+        default: 0
+        description: Make origin older. Set to `1` to extend the source vrev.
+        example: 1
+      - in: query
+        name: nodelay
+        schema:
+          type: string
+          enum:
+          - 1
+          - 0
+        default: 0
+        description: By default the copying is done as a deferred job. Set to `1`
+          to perform the copy right away.
+        example: 1
+      - in: query
+        name: noservice
+        schema:
+          type: string
+          enum:
+          - 1
+          - 0
+        default: 0
+        description: Set to `1` not to run source services.
+        example: 1
+      - in: query
+        name: resign
+        schema:
+          type: string
+          enum:
+          - 1
+          - 0
+        default: 0
+        description: Set to `1` to resign all binaries with the target project key.
+        example: 1
+      - in: query
+        name: withbinaries
+        schema:
+          type: string
+          enum:
+          - 1
+          - 0
+        default: 0
+        description: Set to `1` to also copy binaries.
+        example: 1
+      - in: query
+        name: withhistory
+        schema:
+          type: string
+          enum:
+          - 1
+          - 0
+        default: 0
+        description: Set to `1` to also copy the revision history.
+        example: 1
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [about.xsd](../schema/about.xsd)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                job_invoked:
+                  summary: Job Invoked
+                  value:
+                    code: invoked
+                    summary: Job invoked
+                ok:
+                  summary: Ok
+                  description: Response given when `nodelay` is set to `1`.
+                  value:
+                    code: ok
+                    summary: Ok
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '403':
+          description: Forbidden.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                cmd_execution_no_permission:
+                  summary: No Permission to Execute Command
+                  value:
+                    code: cmd_execution_no_permission
+                    summary: no permission to execute command 'copy'
+        '404':
+          description: |
+            Unknown project.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: <some project>.'
+      tags:
+      - Sources - Projects
+  "/source/{project_name}?cmd=createkey":
+    post:
+      summary: Generate a new GPG key for a project.
+      description: Generate a new GPG key. If the project already has a GPG key, the
+        old key is discarded.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      responses:
+        '200':
+          description: ok
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                xml:
+                  name: status
+              example:
+                code: ok
+        '400':
+          description: Bad Request
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: invalid_project_name
+                summary: invalid project name '{project_name}'
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '403':
+          description: Forbidden
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: cmd_execution_no_permission
+                summary: no permission to execute command 'createkey'
+      tags:
+      - Sources - Projects
+  "/source/{project_name}?cmd=createmaintenanceincident":
+    post:
+      summary: Create a single maintenance incident project.
+      description: Create a single maintenance incident project as a sub project.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      responses:
+        '200':
+          description: ok
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+                data:
+                - MaintenanceProject:17
+        '400':
+          description: Bad Request
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: incident_has_no_maintenance_project
+                summary: incident projects shall only create below maintenance projects
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '403':
+          description: Forbidden
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: cmd_execution_no_permission
+                summary: no permission to execute command 'createmaintenanceincident'
+        '404':
+          description: Not Found
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: unknown_project
+                summary: 'Project not found: home:Admin'
+      tags:
+      - Sources - Projects
+  "/source/{project_name}?cmd=createpatchinfo":
+    post:
+      summary: Creates a patchinfo inside the given project
+      description: |
+        Creates a new patchinfo package, in the given project, containing a '_patchinfo' file.
+        The file will include all the issues in other project's sources, if any.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: query
+        name: name
+        schema:
+          type: string
+        description: Name of the patchinfo package. If not passed, 'patchinfo' is
+          the default value.
+        example: BaseDistro_patchinfo
+      - in: query
+        name: comment
+        schema:
+          type: string
+        description: Comment to be included in the 'summary' XML tag of the patchinfo.
+        example: Security update for the Linux Kernel
+      - in: query
+        name: force
+        schema:
+          type: string
+        description: |
+          If the patchinfo with the given name already existed and the force parameter is passed,
+          then the patchinfo will be overwritten.
+          If the force parameter is not passed, an error will be raised giving you some suggestions.
+        example: 1
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example: |
+                <status code="ok">
+                  <summary>Ok</summary>
+                  <data name="targetproject">home:Admin</data>
+                  <data name="targetpackage">BaseDistro_patchinfo</data>
+                </status>
+        '400':
+          description: |
+            Bad Request.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                invalid_project_name:
+                  value:
+                    code: invalid_project_name
+                    summary: invalid project name '0'
+                  summary: Invalid Project Name
+                invalid_package_name:
+                  value:
+                    code: invalid_package_name
+                    summary: invalid package name 'base:distro'
+                  summary: Invalid Package Name
+                patchinfo_file_exists:
+                  value:
+                    code: patchinfo_file_exists
+                    summary: 'createpatchinfo command: the patchinfo BaseDistro exists
+                      already. Either use force=1 re-create the _patchinfo or use
+                      updatepatchinfo for updating.'
+                  summary: Patchinfo File Exists
+                package_already_exists:
+                  value:
+                    code: package_already_exists
+                    summary: 'createpatchinfo command: the package BaseDistro exists
+                      already, but is  no patchinfo. Please create a new package instead.'
+                  summary: Package Already Exists
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+      tags:
+      - Sources - Projects
+  "/source/{project_name}?cmd=extendkey":
+    post:
+      summary: Extend the expiration date of GPG keys.
+      description: Extend the expiration date of GPG key for the given project.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: query
+        name: days
+        schema:
+          type: integer
+        description: Define the number of days until key expiry
+        example: 712
+      responses:
+        '200':
+          description: ok
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '403':
+          description: Forbidden
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: cmd_execution_no_permission
+                summary: no permission to execute command 'extendkey'
+        '404':
+          description: Not Found
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: unknown_project
+                summary: 'Project not found: home:Admin'
+      tags:
+      - Sources - Projects
+  "/source/{project_name}?cmd=freezelink":
+    post:
+      summary: Freeze a project link.
+      description: Freeze a project link, either creating the freeze or updating it.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: query
+        name: comment
+        schema:
+          type: string
+        description: A comment that will appear in the project's comment section explaining
+          the reason behind the freezing.
+        example: Project link frozen due to some important reason.
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: |
+            Unknown project.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: <some project>.'
+      tags:
+      - Sources - Projects
+  "/source/{project_name}?cmd=lock":
+    post:
+      summary: Locks the project.
+      description: Locks the project given as parameter. You can pass a comment with
+        the reason of the lock.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: query
+        name: comment
+        schema:
+          type: string
+        description: Comment that can be added to describe the reasoning behind the
+          lock.
+        example: Locked project beacause A, B and C.
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '403':
+          description: |
+            No permission to execute command 'lock' because the project is already locked or
+            because the user do not have permission to modify the project.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: cmd_execution_no_permission
+                summary: no permission to execute command 'lock'.
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: |
+            Unknown project.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: <some project>.'
+      tags:
+      - Sources - Projects
+  "/source/{project_name}?cmd=modifychannels":
+    post:
+      summary: Modify existing channels.
+      description: Add repositories or enable them for existing channels.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: query
+        name: mode
+        schema:
+          type: string
+          enum:
+          - add_disabled
+          - enable_all
+        example: add_disabled
+        description: The channel will be added to the package using this mode.
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '400':
+          description: Bad Request
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: invalid_parameter
+                summary: Internal Server Error
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '403':
+          description: Forbidden
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: cmd_execution_no_permission
+                summary: no permission to execute command 'modifychannels'
+        '404':
+          description: Not Found
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: unknown_project
+                summary: 'Project not found: home:Admin'
+      tags:
+      - Sources - Projects
+  "/source/{project_name}?cmd=move":
+    post:
+      summary: Move all sources and binaries.
+      description: |
+        Admin permissions required and schedulers need to be stopped.
+        This api moves all sources and binaries from a source project (oproject) to a new project (project_name).
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: query
+        name: oproject
+        required: true
+        schema:
+          type: string
+        description: The project you want to move. Source project.
+        example: home:Admin
+      - in: query
+        name: comment
+        schema:
+          type: string
+      responses:
+        '200':
+          description: ok
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '400':
+          description: Bad Request
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Project Exists:
+                  value:
+                    code: project_exists
+                    summary: Target project exists already.
+                Move Failed:
+                  value:
+                    code: move_failed
+                    summary: Move operation failed
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '403':
+          description: Forbidden
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: cmd_execution_no_permission
+                summary: Admin permissions required. STOP SCHEDULER BEFORE.
+      tags:
+      - Sources - Projects
+  "/source/{project_name}?cmd=release":
+    post:
+      summary: Release the project.
+      description: Release source and binaries for a repository of the project, if
+        you have the permissions to do so.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: query
+        name: nodelay
+        schema:
+          type: string
+        description: If this parameter is present, do not delay the relase. If this
+          parameter is not present, the release will be delayed to be done later.
+        example: 1
+      - in: query
+        name: target_project
+        schema:
+          type: string
+        description: Project containing the repository targeted by the release.
+        example: openSUSE:Factory
+      - in: query
+        name: target_repository
+        schema:
+          type: string
+        description: Repository targeted by the release.
+        example: standard
+      - in: query
+        name: repository
+        schema:
+          type: string
+        description: Repository for which source and binaries will be released.
+        example: openSUSE_Tumbleweed
+      - in: query
+        name: setrelease
+        schema:
+          type: string
+        description: If this parameter is present, the release will be tagged with
+          this parameter's value.
+        example: Beta1
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: |
+            Unknown project.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: <some project>.'
+      tags:
+      - Sources - Projects
+  "/source/{project_name}?cmd=remove_flag":
+    post:
+      summary: Delete a flag for the project.
+      description: |
+        For the project, you can delete a flag with the provided flag name, repository and architecture.
+        You can only delete the flag if you have the permissions to do so.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: query
+        name: flag
+        required: true
+        schema:
+          type: string
+        description: Name of the flag to be deleted
+        example: access
+      - in: query
+        name: repository
+        schema:
+          type: string
+        description: Repository for which the flag is set
+        example: openSUSE_Tumbleweed
+      - in: query
+        name: arch
+        schema:
+          type: string
+        description: Architecture for which the flag is set
+        example: x86_64
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '400':
+          description: |
+            Bad Request.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                missing_parameter:
+                  value:
+                    code: missing_parameter
+                    summary: Required Parameter flag missing.
+                  summary: Missing Parameter
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '403':
+          description: Forbidden
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: cmd_execution_no_permission
+                summary: no permission to execute command 'remove_flag'.
+        '404':
+          description: |
+            Unknown project.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: <some project>.'
+      tags:
+      - Sources - Projects
+  "/source/{project_name}?cmd=set_flag":
+    post:
+      summary: Set a flag for the project.
+      description: |
+        For the project, you can set a flag with the provided flag name, status, repository and architecture.
+        You can only set the flag if you have the permissions to do so.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: query
+        name: flag
+        required: true
+        schema:
+          type: string
+        description: Name of the flag to be set
+        example: access
+      - in: query
+        name: status
+        required: true
+        schema:
+          type: string
+        description: Status of the flag to be set
+        example: disable
+      - in: query
+        name: repository
+        schema:
+          type: string
+        description: Repository for which the flag is to be set
+        example: openSUSE_Tumbleweed
+      - in: query
+        name: arch
+        schema:
+          type: string
+        description: Architecture for which the flag is to be set
+        example: x86_64
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '400':
+          description: |
+            Bad Request.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                missing_parameter_flag:
+                  value:
+                    code: missing_parameter
+                    summary: Required Parameter flag missing.
+                  summary: Missing Parameter flag
+                missing_parameter_status:
+                  value:
+                    code: missing_parameter
+                    summary: Required Parameter status missing.
+                  summary: Missing Parameter status
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '403':
+          description: Forbidden
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: cmd_execution_no_permission
+                summary: no permission to execute command 'set_flag'.
+        '404':
+          description: |
+            Unknown project.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: <some project>.'
+      tags:
+      - Sources - Projects
+  "/source/{project_name}?cmd=showlinked":
+    post:
+      summary: List projects linking to the provided project.
+      description: Return a list of projects linking to the provided project. This
+        command doesn't perform any action.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      responses:
+        '200':
+          description: OK. The request has succeeded.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: array
+                items:
+                  type: object
+                  properties:
+                    name:
+                      type: string
+                      xml:
+                        attribute: true
+                  xml:
+                    name: project
+                xml:
+                  name: collection
+                  wrapped: true
+              examples:
+                no_results:
+                  summary: No results
+                  value: |
+                    <?xml version="1.0" encoding="UTF-8"?>
+                    <collection/>
+                one_result:
+                  summary: One result
+                  value:
+                  - name: OBS:Server:Unstable:Containers:ruby2.7
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: |
+            Unknown project.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: <some project>.'
+      tags:
+      - Sources - Projects
+  "/source/{project_name}?cmd=undelete":
+    post:
+      summary: Restore a deleted project.
+      description: |
+        If the given project was previously deleted, you can restore it.
+        You can only restore it if you have the permissions to do so.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '403':
+          description: Forbidden
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: cmd_execution_no_permission
+                summary: no permission to execute command 'undelete'.
+        '404':
+          description: Not Found.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Not deleted project:
+                  value:
+                    code: 404
+                    summary: project 'Sandbox' already exists
+                  description: Response when trying to "undelete" a project that was
+                    not deleted previously.
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+      tags:
+      - Sources - Projects
+  "/source/{project_name}?cmd=unlock":
+    post:
+      summary: Unlocks the project.
+      description: Unlocks the previously locked project, given as parameter. You
+        can pass a comment with the reason of the lock.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: query
+        name: comment
+        required: true
+        schema:
+          type: string
+        description: Comment that should be added to describe the reasoning behind
+          the unlock.
+        example: Unlocked project beacause A, B and C.
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '400':
+          description: |
+            Bad Request.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                missing_parameter:
+                  value:
+                    code: missing_parameter
+                    summary: Required Parameter comment missing.
+                  summary: Missing Parameter
+                not_locked:
+                  value:
+                    code: not_locked
+                    summary: project 'Sandbox' is not locked.
+                  summary: Not Locked
+        '403':
+          description: No permission to execute command 'unlock' because the user
+            do not have permission to modify the project.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: cmd_execution_no_permission
+                summary: no permission to execute command 'unlock'.
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: |
+            Unknown project.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: <some project>.'
+      tags:
+      - Sources - Projects
+  "/source/{project_name}/{package_name}":
+    get:
+      summary: List source files of a package.
+      description: Get a list of source files belonging to a package.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: package_name
+        schema:
+          type: string
+        required: true
+        description: Package name
+        example: ctris
+      - in: query
+        name: deleted
+        schema:
+          type: string
+        description: |
+          Set to `1` to list source files of deleted packages.
+
+          Return a "Bad Request" error (400) if it is set to `1` and the package exists.
+        example: 1
+      - in: query
+        name: expand
+        schema:
+          type: string
+          enum:
+          - 1
+          - 0
+        default: 0
+        description: Expand links.
+        example: 1
+      - in: query
+        name: extension
+        schema:
+          type: string
+        description: List source files with the given extension.
+        example: txt
+      - in: query
+        name: lastworking
+        schema:
+          type: string
+          enum:
+          - 1
+          - 0
+        default: 0
+        description: Show sources of the last mergeable sources in case of conflicting
+          changes.
+        example: 1
+      - in: query
+        name: linkrev
+        schema:
+          type: string
+        description: Show sources of the specified linked revision in the base package.
+      - in: query
+        name: meta
+        schema:
+          type: string
+          enum:
+          - 1
+          - 0
+        default: 0
+        description: Set to `1` to show only the metadata file (`_meta`) in the list
+          of files.
+        example: 1
+      - in: query
+        name: product
+        schema:
+          type: string
+        description: Use with `view=products`. Limit the product view to a given product.
+      - in: query
+        name: rev
+        schema:
+          type: string
+        description: Show sources of the specified revision.
+        example: 42
+      - in: query
+        name: view
+        schema:
+          type: string
+          enum:
+          - cpio
+          - getmultibuild
+          - info
+          - issues
+          - products
+          - productrepositories
+        description: |
+          Specify which information about a package should be returned.
+
+          * `cpio`: Stream all package files as cpio.
+          * `getmultibuild`: List multibuild packages.
+          * `info`: Show source version, md5sums and build description files, among other information.
+             See this [other endpoint](<#/Sources - Packages/get_source__project_name___package_name__view_info>) for details.
+          * `issues`: Show all tracked issues for this package.
+          * `products`: Show all products of a package (works only on `_product` or `000product` packages).
+          * `productrepositories`: Show all repositories used in product definitions (or a given product).
+        example: issues
+      - in: query
+        name: withlinked
+        schema:
+          type: string
+          enum:
+          - 1
+          - 0
+        default: 0
+        description: Set to `1` to show all used packages (in case of multiple link
+          indirections) in linkinfo information.
+        example: 1
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [directory.xsd](../schema/directory.xsd). This schema is not used in the following cases:
+            * view=cpio
+            * view=issues
+            * view=products
+            * view=productrepositories
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  count:
+                    type: integer
+                    xml:
+                      attribute: true
+                  name:
+                    type: string
+                    xml:
+                      attribute: true
+                  rev:
+                    type: string
+                    xml:
+                      attribute: true
+                  vrev:
+                    type: string
+                    xml:
+                      attribute: true
+                  srcmd5:
+                    type: string
+                    xml:
+                      attribute: true
+                  entry:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        name:
+                          type: string
+                          xml:
+                            attribute: true
+                        md5:
+                          type: string
+                          xml:
+                            attribute: true
+                        size:
+                          type: string
+                          xml:
+                            attribute: true
+                        mtime:
+                          type: string
+                          xml:
+                            attribute: true
+                xml:
+                  name: directory
+              examples:
+                Without Any Parameters:
+                  value:
+                    name: package_1
+                    rev: 4
+                    vrev: 4
+                    srcmd5: 2e276a9a18eb1f4e6d1187d456c9335d
+                    entry:
+                    - name: _config
+                      md5: 38a56fe6747ddc35214cb2ace161496f
+                      size: 59
+                      mtime: 1677507657
+                    - name: somefile.txt
+                      md5: 8680db994e398a1542c6fd05ee7f9fef
+                      size: 55
+                      mtime: 1677507647
+                With Parameter meta=1:
+                  value:
+                    name: package_1
+                    rev: 4
+                    vrev: 4
+                    srcmd5: 2e276a9a18eb1f4e6d1187d456c9335d
+                    entry:
+                    - name: _meta
+                      md5: 6742b7fc375300ce04e56819a1a52f64
+                      size: 181
+                      mtime: 1678724165
+                With Parameter view=getmultibuild:
+                  value:
+                    entry:
+                    - name: obs-bundled-gems
+                    - name: obs-api-testsuite-rspec
+                With Parameter view=issues:
+                  value: |
+                    <?xml version="1.0" encoding="UTF-8"?>
+                    <package project="project_1" name="package_1">
+                      <issue change="kept">
+                        <created_at>2008-11-18 16:47:00 UTC</created_at>
+                        <updated_at>2020-02-24 13:01:11 UTC</updated_at>
+                        <name>446164</name>
+                        <tracker>bnc</tracker>
+                        <label>boo#246064</label>
+                        <url>https://bugzilla.test.com/show_bug.cgi?id=246064</url>
+                        <state>CLOSED</state>
+                        <summary>AUDIT-0: obs-server: /usr/bin/sign</summary>
+                        <owner>
+                          <login>user_1</login>
+                          <email>user_1@test.com</email>
+                          <realname>John Doe</realname>
+                        </owner>
+                      </issue>
+                    </package>
+                With Parameter view=products:
+                  value: |
+                    <productlist>
+                      <productdefinition xmlns:xi="http://www.w3.org/2001/XInclude">
+                        <products>
+                          <product>
+                            <vendor>openSUSE</vendor>
+                            <name>openSUSE</name>
+                            <version>20230315</version>
+                            <release>0</release>
+                            <productline>openSUSE</productline>
+                            <register>
+                              <updates>
+                                <distrotarget arch="x86_64">openSUSE-Tumbleweed-x86_64</distrotarget>
+                                <distrotarget arch="s390x">openSUSE-Tumbleweed-s390x</distrotarget>
+                                <distrotarget arch="ppc64le">openSUSE-Tumbleweed-ppc64le</distrotarget>
+                                <distrotarget arch="aarch64">openSUSE-Tumbleweed-aarch64</distrotarget>
+                              </updates>
+                            </register>
+                            <updaterepokey>000000000</updaterepokey>
+                            <summary>openSUSE Tumbleweed</summary>
+                            <shortsummary>openSUSE</shortsummary>
+                            <description>openSUSE Tumbleweed is the rolling distribution by the openSUSE.org project.</description>
+                            <linguas>
+                              <language>cs</language>
+                              <language>da</language>
+                            </linguas>
+                            <urls>
+                              <url name="releasenotes">http://doc.opensuse.org/release-notes/x86_64/openSUSE/Tumbleweed/release-notes-openSUSE.rpm</url>
+                              <url name="repository">http://download.opensuse.org/tumbleweed/repo/oss/</url>
+                            </urls>
+                            <buildconfig>
+                              <producttheme>openSUSE</producttheme>
+                              <create_flavors>true</create_flavors>
+                            </buildconfig>
+                            <installconfig>
+                              <defaultlang>en_US</defaultlang>
+                              <default_obs_repository_name>openSUSE_Tumbleweed</default_obs_repository_name>
+                              <releasepackage name="openSUSE-release" flag="EQ" version="%{version}"/>
+                              <distribution>openSUSE</distribution>
+                            </installconfig>
+                            <runtimeconfig/>
+                          </product>
+                        </products>
+                        <conditionals>
+                          <conditional name="baselibs_only_x86_64">
+                            <platform onlyarch="x86_64"/>
+                          </conditional>
+                          <conditional name="baselibs_hammer_from_i686">
+                            <platform arch="x86_64" baselibs_arch="i686"/>
+                          </conditional>
+                        </conditionals>
+                        <repositories>
+                          <repository path="obsrepositories:/"/>
+                        </repositories>
+                        <archsets>
+                          <archset name="i586" productarch="i586">
+                            <arch>i586</arch>
+                            <arch>i686</arch>
+                            <arch>noarch</arch>
+                          </archset>
+                          <archset name="i686" productarch="i686">
+                            <arch>i686</arch>
+                            <arch>i586</arch>
+                            <arch>i486</arch>
+                            <arch>i386</arch>
+                            <arch>noarch</arch>
+                          </archset>
+                        </archsets>
+                      </productdefinition>
+                    </productlist>
+                With Parameter view=productrepositories:
+                  value: |
+                    <productrepositories>
+                      <product name="MicroOS">
+                      </product>
+                      <product name="openSUSE-Addon-NonOss">
+                      </product>
+                      <product name="openSUSE">
+                        <distrotarget arch="x86_64">openSUSE-Tumbleweed-x86_64</distrotarget>
+                        <distrotarget arch="s390x">openSUSE-Tumbleweed-s390x</distrotarget>
+                        <distrotarget arch="ppc64le">openSUSE-Tumbleweed-ppc64le</distrotarget>
+                        <distrotarget arch="aarch64">openSUSE-Tumbleweed-aarch64</distrotarget>
+                      </product>
+                    </productrepositories>
+            application/x-cpio:
+              schema:
+                type: string
+              examples:
+                With Parameter view=cpio:
+                  value: |
+                    07070100000000000081a40000000000000000000000015331456900000135000000000000000000000000000000000000000d00000000_constraints<constraints>
+                      <overwrite>
+                        <conditions>
+                          <package>obs-server</package>
+                        </conditions>
+
+                        <hardware>
+                          <memory>
+                            <size unit="M">2000</size>
+                          </memory>
+                          <physicalmemory>
+                            <size unit="M">1500</size>
+                          </physicalmemory>
+                        </hardware>
+                      </overwrite>
+                    </constraints>
+                    07070100000000000081a40000000000000000000000015b595e440000006a000000000000000000000000000000000000000c00000000_multibuild<multibuild>
+                      <flavor>obs-bundled-gems</flavor>
+                      <flavor>obs-api-testsuite-rspec</flavor>
+                    </multibuild>
+                    07070100000000000081a40000000000000000000000016229cffc000002ec000000000000000000000000000000000000000900000000_service<?xml version="1.0"?>
+                    <services>
+                      <service name="obs_scm">
+                        <param name="versionformat">2.11~alpha.%ci.%h</param>
+                        <param name="url">https://github.com/openSUSE/open-build-service.git</param>
+                        <param name="scm">git</param>
+                        <param name="revision">master</param>
+                        <param name="extract">dist/obs-api-testsuite-rspec.spec</param>
+                        <param name="extract">dist/obs-bundled-gems.spec</param>
+                        <param name="extract">dist/obs-server.spec</param>
+                        <param name="extract">dist/obs-rpmlintrc</param>
+                      </service>
+                      <service name="set_version"/>
+                      <service name="tar" mode="buildtime"/>
+                      <service name="recompress" mode="buildtime">
+                        <param name="compression">xz</param>
+                        <param name="file">*.tar</param>
+                      </service>
+                    </services>
+                    07070100000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000b00000000TRAILER!!!
+        '400':
+          description: |
+            Bad Request.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Not Boolean:
+                  description: Passing a value different than `0` or `1` to `meta`,
+                    for example.
+                  value:
+                    code: 400
+                    summary: not boolean
+                With deleted=1 and Package exists:
+                  description: Passing a value of `1` to `deleted`, and the package
+                    exists.
+                  value:
+                    code: package_exists
+                    summary: the package is not deleted
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: Not Found.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: home:some_project'
+                Unknown Package:
+                  value:
+                    code: unknown_package
+                    summary: 'Package not found: home:some_project/some_package'
+      tags:
+      - Sources - Files
+    delete:
+      summary: Deletes a specified package including all its source files.
+      description: Deletes a specified package including all its source files. By
+        default only if no other packages use this package as a devel package.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: package_name
+        schema:
+          type: string
+        required: true
+        description: Package name
+        example: ctris
+      - in: query
+        name: comment
+        schema:
+          type: string
+        description: Comment to be included in the revision history of the package.
+        example: This package was no longer needed.
+      - in: query
+        name: force
+        schema:
+          type: string
+          enum:
+          - 1
+          - 0
+        default: 0
+        description: Set to `1` to delete this package, even if other packages use
+          this one as devel package.
+        example: 1
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '400':
+          description: Bad Request.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Delete Error:
+                  value:
+                    code: delete_error
+                    summary: 'Package is used by following packages as devel package:
+                      project_devel/ctris'
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: |
+            Not Found.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: home:some_project'
+                Unknown Package:
+                  value:
+                    code: unknown_package
+                    summary: 'Package not found: home:some_project/some_package'
+      tags:
+      - Sources - Packages
+  "/source/{project_name}/{package_name}/_attribute":
+    get:
+      summary: List the attibutes of a package
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: package_name
+        schema:
+          type: string
+        required: true
+        description: Package name
+        example: ctris
+      - name: rev
+        in: query
+        schema:
+          type: string
+        description: 'Passing the number of the revision, this endpoint displays the
+          attributes'' XML as it was at that point.
+
+'
+        example: 3
+      - name: view
+        in: query
+        schema:
+          type: string
+          enum:
+          - blame
+        description: With `view=blame`, information about who changed each XML tag
+          and when is displayed.
+        example: blame
+      - name: with_default
+        in: query
+        schema:
+          type: string
+        description: |
+          If the attribute doesn't contain any value and `with_default` is present,
+          the default values will be displayed, if any.
+        example: 1
+      - name: with_project
+        in: query
+        schema:
+          type: string
+        description: 'Passing `with_project`, the response displays the attributes
+          of the package''s project in addition to the package ones.
+
+'
+        example: 1
+      responses:
+        '200':
+          description: OK. The request has succeeded.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: array
+                items:
+                  type: object
+                  properties:
+                    name:
+                      type: string
+                      xml:
+                        attribute: true
+                    namespace:
+                      type: string
+                      xml:
+                        attribute: true
+                    binary:
+                      type: string
+                      xml:
+                        attribute: true
+                  xml:
+                    name: attribute
+                xml:
+                  name: attributes
+                  wrapped: true
+              examples:
+                manyAttributes:
+                  value:
+                  - name: MaintenanceProject
+                    namespace: OBS
+                  - name: ScreenShots
+                    namespace: OBS
+                viewBlame:
+                  description: Passing `view=blame`.
+                  value: |
+                    10 (Admin        2023-03-09 11:46:01     1) <attributes>
+                    12 (Iggy         2023-03-13 14:46:01     5)   <attribute namespace="OBS" name="MakeOriginOlder"/>
+                    14 (Admin        2023-03-13 15:14:21     6)   <attribute namespace="OBS" name="QualityCategory">
+                    14 (Admin        2023-03-13 15:14:21     7)     <value>Development</value>
+                    14 (Admin        2023-03-13 15:14:21     8)   </attribute>
+                    10 (Admin        2023-03-09 11:46:01     9) </attributes>
+        '400':
+          description: Bad Request.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                remoteProject:
+                  value:
+                    code: remote_project
+                    summary: Attribute access to remote project is not yet supported
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: |
+            Not Found.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: home:some_project'
+                Unknown Package:
+                  value:
+                    code: unknown_package
+                    summary: 'Package not found: home:some_project/some_package'
+      tags:
+      - Sources - Packages
+    post:
+      summary: Create or update the package's attribute given in the request body
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: package_name
+        schema:
+          type: string
+        required: true
+        description: Package name
+        example: ctris
+      security:
+      - basic_authentication: []
+      requestBody:
+        description: Attribute you want to create or update
+        content:
+          application/xml; charset=utf-8:
+            schema:
+              type: array
+              items:
+                type: object
+                properties:
+                  name:
+                    type: string
+                    xml:
+                      attribute: true
+                  namespace:
+                    type: string
+                    xml:
+                      attribute: true
+                  binary:
+                    type: string
+                    xml:
+                      attribute: true
+                xml:
+                  name: attribute
+              xml:
+                name: attributes
+                wrapped: true
+            example:
+            - name: MaintenanceProject
+              namespace: OBS
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '400':
+          description: |
+            Bad Request.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng).
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                invalid_attribute:
+                  description: Wrong attribute name.
+                  value:
+                    code: invalid_attribute
+                    summary: Attribute 'OwnerRootProjectTest' must be in the $NAMESPACE:$NAME
+                      style
+                invalid_xml:
+                  description: When not passing an XML body to the requset.
+                  value:
+                    code: invalid_xml
+                    summary: Invalid XML
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: |
+            Not Found.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: home:some_project'
+                Unknown Package:
+                  value:
+                    code: unknown_package
+                    summary: 'Package not found: home:some_project/some_package'
+      tags:
+      - Sources - Packages
+  "/source/{project_name}/{package_name}/_attribute/{attribute_name}":
+    get:
+      summary: Get package's attribute
+      description: Get the specified attribute of the package
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: package_name
+        schema:
+          type: string
+        required: true
+        description: Package name
+        example: ctris
+      - in: path
+        name: attribute_name
+        schema:
+          type: string
+        required: true
+        description: The name of the attribute
+        example: OBS:OwnerRootProjectTest
+      - name: rev
+        in: query
+        schema:
+          type: string
+        description: 'Passing the number of the revision, this endpoint displays the
+          attributes'' XML as it was at that point.
+
+'
+        example: 3
+      - name: view
+        in: query
+        schema:
+          type: string
+          enum:
+          - blame
+        description: With `view=blame`, information about who changed each XML tag
+          and when is displayed.
+        example: blame
+      - name: with_default
+        in: query
+        schema:
+          type: string
+        description: |
+          If the attribute doesn't contain any value and `with_default` is present,
+          the default values will be displayed, if any.
+        example: 1
+      - name: with_project
+        in: query
+        schema:
+          type: string
+        description: 'Passing `with_project`, the response displays the specified
+          attribute of the package''s project, if any, in addition to the package
+          one.
+
+'
+        example: 1
+      responses:
+        '200':
+          description: OK. The request has succeeded.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: array
+                items:
+                  type: object
+                  properties:
+                    name:
+                      type: string
+                      xml:
+                        attribute: true
+                    namespace:
+                      type: string
+                      xml:
+                        attribute: true
+                    binary:
+                      type: string
+                      xml:
+                        attribute: true
+                  xml:
+                    name: attribute
+                xml:
+                  name: attributes
+                  wrapped: true
+              examples:
+                oneAttribute:
+                  value:
+                  - name: MaintenanceProject
+                    namespace: OBS
+                viewBlame:
+                  description: Passing `view=blame`.
+                  value: |
+                    10 (Admin        2023-03-09 11:46:01     1) <attributes>
+                    12 (Iggy         2023-03-13 14:46:01     5)   <attribute namespace="OBS" name="MakeOriginOlder"/>
+                    14 (Admin        2023-03-13 15:14:21     6)   <attribute namespace="OBS" name="QualityCategory">
+                    14 (Admin        2023-03-13 15:14:21     7)     <value>Development</value>
+                    14 (Admin        2023-03-13 15:14:21     8)   </attribute>
+                    10 (Admin        2023-03-09 11:46:01     9) </attributes>
+        '400':
+          description: |
+            Bad Request.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng).
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                invalid_attribute:
+                  description: Wrong attribute name.
+                  value:
+                    code: invalid_attribute
+                    summary: Attribute 'OwnerRootProjectTest' must be in the $NAMESPACE:$NAME
+                      style
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: |
+            Unknown project.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: <some project>.'
+      tags:
+      - Sources - Packages
+    post:
+      summary: Create or update an attribute of a package
+      description: Create or update the specified attribute of the package
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: package_name
+        schema:
+          type: string
+        required: true
+        description: Package name
+        example: ctris
+      - in: path
+        name: attribute_name
+        schema:
+          type: string
+        required: true
+        description: The name of the attribute
+        example: OBS:OwnerRootProjectTest
+      requestBody:
+        description: Attribute you want to create or update
+        content:
+          application/xml; charset=utf-8:
+            schema:
+              type: array
+              items:
+                type: object
+                properties:
+                  name:
+                    type: string
+                    xml:
+                      attribute: true
+                  namespace:
+                    type: string
+                    xml:
+                      attribute: true
+                  binary:
+                    type: string
+                    xml:
+                      attribute: true
+                xml:
+                  name: attribute
+              xml:
+                name: attributes
+                wrapped: true
+            example:
+            - name: MaintenanceProject
+              namespace: OBS
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '400':
+          description: |
+            Bad Request.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng).
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                invalid_attribute:
+                  description: Wrong attribute name.
+                  value:
+                    code: invalid_attribute
+                    summary: Attribute 'OwnerRootProjectTest' must be in the $NAMESPACE:$NAME
+                      style
+                invalid_xml:
+                  description: When not passing an XML body to the requset.
+                  value:
+                    code: invalid_xml
+                    summary: Invalid XML
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: |
+            Not Found.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: home:some_project'
+                Unknown Package:
+                  value:
+                    code: unknown_package
+                    summary: 'Package not found: home:some_project/some_package'
+      tags:
+      - Sources - Packages
+    delete:
+      summary: Delete the specified attribute of a package
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: package_name
+        schema:
+          type: string
+        required: true
+        description: Package name
+        example: ctris
+      - in: path
+        name: attribute_name
+        schema:
+          type: string
+        required: true
+        description: The name of the attribute
+        example: OBS:OwnerRootProjectTest
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '400':
+          description: |
+            Bad Request.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng).
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                invalid_attribute:
+                  description: Wrong attribute name.
+                  value:
+                    code: invalid_attribute
+                    summary: Attribute 'OwnerRootProjectTest' must be in the $NAMESPACE:$NAME
+                      style
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '403':
+          description: The user don't have permission to delete the specified attribute
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                change_attribute_no_permission:
+                  value:
+                    code: change_attribute_no_permission
+                    summary: User Iggy has no permission to change attribute
+        '404':
+          description: Unknown attribute
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                unknown_attribute_type:
+                  value:
+                    code: unknown_attribute_type
+                    summary: Attribute Type OBS:Fake does not exist
+      tags:
+      - Sources - Packages
+  "/source/{project_name}/{package_name}/_history":
+    get:
+      summary: Get package commit history.
+      description: Get package commit history.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: package_name
+        schema:
+          type: string
+        required: true
+        description: Package name
+        example: ctris
+      - in: query
+        name: deleted
+        schema:
+          type: string
+        description: Set to `1` to allow to retrieve the revision history of a deleted
+          package.
+        example: 1
+      - in: query
+        name: limit
+        schema:
+          type: integer
+        description: Limit the number of retrieved revision history elements to the
+          specified number.
+        example: 20
+      - in: query
+        name: meta
+        schema:
+          type: string
+        description: Set to `1` to retrieve the revision history of the meta file
+          (`_meta`) of the package.
+        example: 1
+      - in: query
+        name: startbefore
+        schema:
+          type: integer
+        description: Start the list of revision history elements before the given
+          revision number.
+        example: 124
+      - in: query
+        name: rev
+        schema:
+          type: string
+        description: Return the revision entry for a specific revision number.
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [revisionlist.rng](../schema/revisionlist.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: array
+                items:
+                  type: object
+                  properties:
+                    rev:
+                      type: string
+                      xml:
+                        attribute: true
+                    vrev:
+                      type: string
+                      xml:
+                        attribute: true
+                    srcmd5:
+                      type: string
+                    version:
+                      type: string
+                    time:
+                      type: string
+                    user:
+                      type: string
+                    comment:
+                      type: string
+                    requestid:
+                      type: string
+                  xml:
+                    name: revision
+                xml:
+                  name: revisionlist
+                  wrapped: true
+              examples:
+                Two Revisions:
+                  value:
+                  - rev: 1
+                    vrev: ''
+                    srcmd5: d41d8cd98f00b204e9800998ecf8427e
+                    version: ''
+                    time: 1678364228
+                    user: Admin
+                    comment: package was deleted
+                  - rev: 2
+                    vrev: ''
+                    srcmd5: d41d8cd98f00b204e9800998ecf8427e
+                    version: ''
+                    time: 1678364246
+                    user: Admin
+                    comment: package was undeleted
+                rev Parameter Specified (rev = 1):
+                  value:
+                  - rev: 1
+                    vrev: ''
+                    srcmd5: d41d8cd98f00b204e9800998ecf8427e
+                    version: ''
+                    time: 1678364228
+                    user: Admin
+                    comment: package was deleted
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: Not Found.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: home:some_project'
+                Unknown Package:
+                  value:
+                    code: unknown_package
+                    summary: 'Package not found: home:some_project/some_package'
+      tags:
+      - Sources - Packages
+  "/source/{project_name}/{package_name}/_meta":
+    get:
+      summary: Get package meta file.
+      description: Get package meta file.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: package_name
+        schema:
+          type: string
+        required: true
+        description: Package name
+        example: ctris
+      - in: query
+        name: meta
+        schema:
+          type: string
+        description: Set to `1` to force to retrieve the package metadata from the
+          backend.
+        example: 1
+      - in: query
+        name: rev
+        schema:
+          type: string
+        description: Return the package metadata for a specific revision number.
+        example: 42
+      - in: query
+        name: view
+        schema:
+          type: string
+          enum:
+          - blame
+        description: With `view=blame` show information about who and when each line
+          of the package metadata was changed.
+        example: blame
+      responses:
+        '200':
+          description: OK. The request has succeeded.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  name:
+                    type: string
+                    xml:
+                      attribute: true
+                  project:
+                    type: string
+                    xml:
+                      attribute: true
+                  title:
+                    type: string
+                  description:
+                    type: string
+                  devel:
+                    type: object
+                    properties:
+                      project:
+                        type: string
+                        xml:
+                          attribute: true
+                      package:
+                        type: string
+                        xml:
+                          attribute: true
+                xml:
+                  name: package
+              examples:
+                Simple Request:
+                  value:
+                    name: package_1
+                    title: ''
+                    description: Test package
+                    devel:
+                      project: home:Admin
+                      package: package_2
+                Request with view=blame:
+                  value: |
+                    11 (Admin        2023-03-09 12:14:58     1) <package name="package_1" project="home:Admin">
+                    12 (Admin        2023-03-09 12:23:11     2)   <title></title>
+                    63 (Admin        2023-03-13 16:16:05     3)   <description>Description 2 added...</description>
+                    44 (Admin        2023-03-09 17:39:39     4)   <devel project="home:Admin" package="package_2"/>
+                    11 (Admin        2023-03-09 12:14:58     5) </package>
+        '400':
+          description: |
+            Bad Request.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng).
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Bad Revision:
+                  description: Passing `rev=invalid_revision`.
+                  value:
+                    code: 400
+                    summary: bad revision 'invalid_revision'
+                Not Boolean:
+                  description: Passing `meta=not_boolean`.
+                  value:
+                    code: 400
+                    summary: not boolean
+                Unknown View:
+                  description: Passing `view=invalid_view`.
+                  value:
+                    code: 400
+                    summary: unknown view 'invalid_view'
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: |
+            Not Found.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng).
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: home:some_project'
+                Unknown Package:
+                  value:
+                    code: unknown_package
+                    summary: 'Package not found: home:some_project/some_package'
+                Unknown Revision:
+                  value:
+                    code: 404
+                    summary: revision '66' does not exist
+                    details: 404 revision '66' does not exist
+      tags:
+      - Sources - Packages
+    put:
+      summary: Write package meta file.
+      description: Write package's meta file. Create the package if it doesn't exist.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: package_name
+        schema:
+          type: string
+        required: true
+        description: Package name
+        example: ctris
+      - in: query
+        name: comment
+        schema:
+          type: string
+        description: Comment that explains the changes you made in the meta file.
+        example: Fix the title of the package.
+      requestBody:
+        description: Package meta definition.
+        content:
+          application/xml; charset=utf-8:
+            schema:
+              type: object
+              properties:
+                name:
+                  type: string
+                  xml:
+                    attribute: true
+                project:
+                  type: string
+                  xml:
+                    attribute: true
+                title:
+                  type: string
+                description:
+                  type: string
+                devel:
+                  type: object
+                  properties:
+                    project:
+                      type: string
+                      xml:
+                        attribute: true
+                    package:
+                      type: string
+                      xml:
+                        attribute: true
+              xml:
+                name: package
+            example:
+              name: package_1
+              title: ''
+              description: Test package
+              devel:
+                project: home:Admin
+                package: package_2
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '400':
+          description: |
+            Bad Request.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                XML Not Valid:
+                  value:
+                    code: validation_failed
+                    summary: 'package validation error: 1:11: FATAL: Extra content
+                      at the end of the document'
+                Project Name Mismatch:
+                  value:
+                    code: project_name_mismatch
+                    summary: project name in xml data does not match resource path
+                      component
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '403':
+          description: |
+            Forbidden.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng).
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Not Authorized to Update the Project:
+                  value:
+                    code: update_project_not_authorized
+                    summary: You are not authorized to update this project
+        '404':
+          description: Not Found.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: home:some_project'
+      tags:
+      - Sources - Packages
+  "/source/{project_name}/{package_name}?cmd=addcontainers":
+    post:
+      summary: Add docker container packages and repositories
+      description: Add docker container packages and repositories using the maintained
+        version of this package
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: package_name
+        schema:
+          type: string
+        required: true
+        description: Package name
+        example: ctris
+      - in: query
+        name: cmd
+        required: true
+        schema:
+          type: string
+          enum:
+          - addcontainers
+      - in: query
+        name: extend_package_names
+        schema:
+          type: string
+          enum:
+          - 1
+          example: 1
+        description: |
+          Set to consider the container name as a parsed combination of container project and container name.
+          With format `[container name].[container project name]` where `:` was replaced by `_`,
+          i.e. "kiwi-templates-Minimal.SUSE_Templates_Images_SLE-15-SP4".
+      security:
+      - basic_authentication: []
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: |
+            Not Found.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: home:some_project'
+                Unknown Package:
+                  value:
+                    code: unknown_package
+                    summary: 'Package not found: home:some_project/some_package'
+      tags:
+      - Sources - Packages
+  "/source/{project_name}/{package_name}?cmd=branch":
+    post:
+      summary: Branch a package.
+      description: |
+        Create a source link from a package of an existing project to a
+        new subproject of the requester's home project.
+        The default target is `home:<user>:branches:<project>/<package>`.
+        A possible defined devel project in the package meta data gets ignored.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: package_name
+        schema:
+          type: string
+        required: true
+        description: Package name
+        example: ctris
+      - in: query
+        name: target_project
+        schema:
+          type: string
+        description: Target project name.
+        example: home:Admin:subproject
+      - in: query
+        name: target_package
+        schema:
+          type: string
+        description: Target package name.
+        example: test
+      - in: query
+        name: add_repositories
+        schema:
+          type: string
+          enum:
+          - 1
+        description: Set to add repositories based on source project (default for
+          new projects).
+      - in: query
+        name: add_repositories_rebuild
+        schema:
+          type: string
+          enum:
+          - transitive
+          - direct
+          - local
+          - copy
+        description: Set one of the defined rebuild policies for new repositories
+          (`transitive`, `direct` or `local`) or copy it from the source project (`copy`)
+      - in: query
+        name: add_repositories_block
+        schema:
+          type: string
+          enum:
+          - all
+          - local
+          - never
+        description: Set to use defined block policy for new repositories.
+      - in: query
+        name: autocleanup
+        schema:
+          type: string
+          enum:
+          - 1
+        description: Set to enable autocleanup on the branched project.
+      - in: query
+        name: dryrun
+        schema:
+          type: string
+          enum:
+          - 1
+        description: Set to run without making action, just report results.
+      - in: query
+        name: extend_package_names
+        schema:
+          type: string
+          enum:
+          - 1
+        description: Set to extend package and repository names to allow multiple
+          instances of the same package.
+      - in: query
+        name: ignoredevel
+        schema:
+          type: string
+          enum:
+          - 1
+        description: Set to ignore validation and resolving of devel package or devel
+          project definition.
+      - in: query
+        name: force
+        schema:
+          type: string
+        description: 'Set to 1 to allow overwriting of a pre-existing package.
+
+'
+        example: 1
+      - in: query
+        name: rev
+        schema:
+          type: string
+        description: Set to branch against a specific revision.
+      - in: query
+        name: maintenance
+        schema:
+          type: string
+          enum:
+          - 1
+        description: Set to explicitly ask for a maintenance branch.
+      - in: query
+        name: missingok
+        schema:
+          type: string
+          enum:
+          - 1
+        description: Set to create the target package if it does not exist.
+      - in: query
+        name: newinstance
+        schema:
+          type: string
+          enum:
+          - 1
+        description: Set to have the target package exist only via project links,
+          but the link should point to the given project.
+      - in: query
+        name: noaccess
+        schema:
+          type: string
+          enum:
+          - 1
+        description: Set to make the newly created project be read protected. This
+          won't work if the project already exists.
+      - in: query
+        name: noservice
+        schema:
+          type: string
+          enum:
+          - 1
+        description: Set to not run source services on branching.
+      - in: query
+        name: request
+        schema:
+          type: string
+        description: Creates a branch project based on the provided request number.
+      - in: query
+        name: update_path_elements
+        schema:
+          type: string
+          enum:
+          - 1
+        description: Set to update all the path elements if needed (used repositories
+          depend on each other).
+      - in: query
+        name: update_project_attribute
+        schema:
+          type: string
+        default: OBS:UpdateProject
+        description: Set a different Update Project attribute.
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example: |
+                <status code="ok">
+                  <summary>Ok</summary>
+                  <data name="targetproject">home:Admin:subproject</data>
+                  <data name="targetpackage">test</data>
+                  <data name="sourceproject">home:Admin</data>
+                  <data name="sourcepackage">ctris</data>
+                </status>
+        '400':
+          description: |
+            Bad Request.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Double Branch:
+                  value:
+                    code: double_branch_package
+                    summary: 'branch target package already exists: home:Admin:subproject/test'
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '403':
+          description: Forbidden.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: cmd_execution_no_permission
+                summary: no permission to modify package test in project home:Admin
+        '404':
+          description: |
+            Not Found.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: home:some_project'
+                Unknown Package:
+                  value:
+                    code: unknown_package
+                    summary: 'Package not found: home:some_project/some_package'
+      tags:
+      - Sources - Packages
+  "/source/{project_name}/{package_name}?cmd=collectbuildenv":
+    post:
+      summary: Collect build environment information.
+      description: |
+        Creates _buildenv files based on origin package builds. This can be used
+        to re-use exact older build enviroment even when further new binary packages
+        got added. For example to re-build an old maintenance update in the same way.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: package_name
+        schema:
+          type: string
+        required: true
+        description: Package name
+        example: ctris
+      - in: query
+        name: oproject
+        required: true
+        schema:
+          type: string
+        description: Origin project. The project that the Origin Package will have
+          the build information copied from.
+      - in: query
+        name: opackage
+        schema:
+          type: string
+        description: Origin package. Build environment information of the package
+          that will be copied.
+      - in: query
+        name: orev
+        schema:
+          type: string
+        description: Origin package revision. Revision of the Origin Package on which
+          to base the build environment collection.
+      - in: query
+        name: comment
+        description: Comment for the new revision.
+      responses:
+        '200':
+          description: OK
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  rev:
+                    type: string
+                    xml:
+                      attribute: true
+                  vrev:
+                    type: string
+                    xml:
+                      attribute: true
+                  srcmd5:
+                    type: string
+                  version:
+                    type: string
+                  time:
+                    type: string
+                  user:
+                    type: string
+                  comment:
+                    type: string
+                  requestid:
+                    type: string
+                xml:
+                  name: revision
+              examples:
+                Copy:
+                  value:
+                    rev: 3
+                    vrev: 3
+                    srcmd5: d41d8cd98f00b204e9800998ecf8427e
+                    version: 20220902.37b45c2
+                    time: 1678785078
+                    user: Admin
+                    comment: Copying the build environment from origin
+                    requestid: 
+        '400':
+          description: |
+            Bad Request.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Missing Parameter:
+                  value:
+                    code: missing_parameter
+                    summary: Required Parameter opackage missing
+                Bad Revision:
+                  value:
+                    code: 400
+                    origin: backend
+                    summary: bad revision '-3'
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '403':
+          description: Forbidden.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: cmd_execution_no_permission
+                summary: no permission to modify package test in project home:Admin
+        '404':
+          description: |
+            Not Found.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: home:some_project'
+                Unknown Package:
+                  value:
+                    code: unknown_package
+                    summary: 'Package not found: home:some_project/some_package'
+      tags:
+      - Sources - Packages
+  "/source/{project_name}/{package_name}?cmd=commit":
+    post:
+      summary: Commit package changes.
+      description: Create a new revision of the package, committing package changes.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: package_name
+        schema:
+          type: string
+        required: true
+        description: Package name
+        example: ctris
+      - in: query
+        name: comment
+        schema:
+          type: string
+        description: Provide a comment to the revision in history.
+        example: This was changed to improve foobar.
+      - in: query
+        name: linkrev
+        schema:
+          type: string
+        description: |
+          Link revision in base package. Set to `base` to use the commit revision.
+
+          Used together with the `keeplink` parameter.
+        example: base
+      - in: query
+        name: rev
+        schema:
+          type: string
+        description: Revision of the package.
+      - in: query
+        name: keeplink
+        schema:
+          type: string
+          enum:
+          - 1
+          - 0
+        default: 0
+        description: Set to `1` to preserve the link (`_link` file) on the source.
+        example: 1
+      - in: query
+        name: repairlink
+        schema:
+          type: string
+          enum:
+          - 1
+          - 0
+        default: 0
+        description: |
+          Set to `1` to solve conflicts.
+
+          Used together with `keeplink` parameter.
+        example: 1
+      responses:
+        '200':
+          description: OK. Revision created with this commit.
+          content:
+            text/xml:
+              schema:
+                type: object
+                properties:
+                  rev:
+                    type: string
+                    xml:
+                      attribute: true
+                  vrev:
+                    type: string
+                    xml:
+                      attribute: true
+                  srcmd5:
+                    type: string
+                  version:
+                    type: string
+                  time:
+                    type: string
+                  user:
+                    type: string
+                  comment:
+                    type: string
+                  requestid:
+                    type: string
+                xml:
+                  name: revision
+              example:
+                rev: 86
+                vrev: 86
+                srcmd5: 55452f7326fe90cb67ca96bf9e9ffabc
+                version: 2.10~pre
+                time: 1665060711
+                user: Admin
+                comment: 
+                requestid: 
+        '400':
+          description: Bad Request.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Not Boolean:
+                  description: Passing a value different than `0` or `1` to `keeplink`,
+                    for example.
+                  value: |
+                    <xml version="1.0" encoding="UTF-8"?>
+                    <status code="400" origin="backend">
+                      <summary>not boolean</summary>
+                    </status>
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '403':
+          description: Forbidden.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: cmd_execution_no_permission
+                summary: no permission to modify package test in project home:Admin
+        '404':
+          description: |
+            Not Found.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: home:some_project'
+                Unknown Package:
+                  value:
+                    code: unknown_package
+                    summary: 'Package not found: home:some_project/some_package'
+      tags:
+      - Sources - Packages
+  "/source/{project_name}/{package_name}?cmd=commitfilelist":
+    post:
+      summary: Commit package changes from a filelist.
+      description: |
+        Create a new commit using defined files already uploaded to the repository.
+
+        This requires a directory xml providing file name and md5 as body.
+        It is recommended to use the `withvalidate` parameter and add the
+        sha256 sum including "sha256:" prefix in "hash" attribute for security reasons.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: package_name
+        schema:
+          type: string
+        required: true
+        description: Package name
+        example: ctris
+      - in: query
+        name: comment
+        schema:
+          type: string
+        description: Provide a comment to the revision
+        example: This was changed to improve foobar.
+      - in: query
+        name: linkrev
+        schema:
+          type: string
+        description: |
+          Link revision in base package. Set to `base` to use the commit revision.
+
+          Used together with the `keeplink` parameter.
+        example: base
+      - in: query
+        name: rev
+        schema:
+          type: string
+        description: Revision of the package.
+      - in: query
+        name: keeplink
+        schema:
+          type: string
+          enum:
+          - 1
+          - 0
+        default: 0
+        description: Set to `1` to preserve the link (`_link` file) on the source.
+        example: 1
+      - in: query
+        name: repairlink
+        schema:
+          type: string
+          enum:
+          - 1
+          - 0
+        default: 0
+        description: |
+          Set to `1` to solve conflicts.
+
+          Used together with `keeplink` parameter.
+        example: 1
+      - in: query
+        name: withvalidate
+        schema:
+          type: string
+          enum:
+          - 1
+          - 0
+        default: 0
+        description: Set to `1` to activate sha validation code (optional, but recommended)
+        example: 1
+      responses:
+        '200':
+          description: OK. Revision created with this commit.
+          content:
+            text/xml:
+              schema:
+                type: object
+                properties:
+                  rev:
+                    type: string
+                    xml:
+                      attribute: true
+                  vrev:
+                    type: string
+                    xml:
+                      attribute: true
+                  srcmd5:
+                    type: string
+                  version:
+                    type: string
+                  time:
+                    type: string
+                  user:
+                    type: string
+                  comment:
+                    type: string
+                  requestid:
+                    type: string
+                xml:
+                  name: revision
+              example:
+                rev: 86
+                vrev: 86
+                srcmd5: 55452f7326fe90cb67ca96bf9e9ffabc
+                version: 2.10~pre
+                time: 1665060711
+                user: Admin
+                comment: 
+                requestid: 
+        '400':
+          description: Bad Request.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Not Boolean:
+                  description: Passing a value different than `0` or `1` to `keeplink`,
+                    for example.
+                  value: |
+                    <xml version="1.0" encoding="UTF-8"?>
+                    <status code="400" origin="backend">
+                      <summary>not boolean</summary>
+                    </status>
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '403':
+          description: Forbidden.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: cmd_execution_no_permission
+                summary: no permission to modify package test in project home:Admin
+        '404':
+          description: |
+            Not Found.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: home:some_project'
+                Unknown Package:
+                  value:
+                    code: unknown_package
+                    summary: 'Package not found: home:some_project/some_package'
+      tags:
+      - Sources - Packages
+  "/source/{project_name}/{package_name}?cmd=copy":
+    post:
+      summary: Copy packages.
+      description: "Copy packages. \nAdditionally you can copy the binaries and/or
+        the commit history.\nThe copy can be done synchronously or asynchronously.\nYou
+        can leave a comment in the package revision.\n"
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: package_name
+        schema:
+          type: string
+        required: true
+        description: Package name
+        example: ctris
+      - in: query
+        name: rev
+        schema:
+          type: string
+          enum:
+          - upload
+          - repository
+        example: repository
+      - in: query
+        name: opackage
+        schema:
+          type: string
+        description: Origin package. The package that will be copied.
+      - in: query
+        name: oproject
+        schema:
+          type: string
+        description: Origin project. The project that the Origin Package will be copied
+          from.
+      - in: query
+        name: withbinaries
+        schema:
+          type: string
+          enum:
+          - 1
+          - 0
+        description: Set to '1' to copy binaries that have been build by the origin
+          package too.
+      - in: query
+        name: makeolder
+        schema:
+          type: string
+          enum:
+          - 1
+          - 0
+        description: Set to '1' to make the target older, the source vrev is bumped
+          by two numbers and target by one. Setting both makeolder and makeoriginolder
+          will return an error back.
+      - in: query
+        name: makeoriginolder
+        schema:
+          type: string
+          enum:
+          - 1
+          - 0
+        description: Set to '1' to make the origin older, the source vrev is extended
+          and target is guaranteed to be newer. Setting both makeoriginolder and makeolder
+          will return an error back.
+      - in: query
+        name: nodelay
+        schema:
+          type: string
+          enum:
+          - 1
+          - 0
+        description: Set to '1' to do the copying synchronously. By default the copying
+          is done asynchronously.
+      - in: query
+        name: withhistory
+        schema:
+          type: string
+          enum:
+          - 1
+          - 0
+        description: Set to '1' to copy the package commit history.
+      - in: query
+        name: noservice
+        schema:
+          type: string
+          enum:
+          - 1
+          - 0
+        description: Set to '1' to avoid running the services after the copy.
+      - in: query
+        name: comment
+        description: Comment for the new revision.
+      responses:
+        '200':
+          description: OK
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  rev:
+                    type: string
+                    xml:
+                      attribute: true
+                  srcmd5:
+                    type: string
+                xml:
+                  name: revision
+                  wrapped: true
+              examples:
+                Repository:
+                  value:
+                    srcmd5: d41d8cd98f00b204e9800998ecf8427e
+                Upload:
+                  value:
+                    srcmd5: d41d8cd98f00b204e9800998ecf8427e
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: |
+            Not Found.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: home:some_project'
+                Unknown Package:
+                  value:
+                    code: unknown_package
+                    summary: 'Package not found: home:some_project/some_package'
+      tags:
+      - Sources - Packages
+  "/source/{project_name}/{package_name}?cmd=createSpecFileTemplate":
+    post:
+      deprecated: true
+      summary: Create a RPM Spec File Template for a specified package.
+      description: |
+        Create a RPM Spec File Template for a specified package. This endpoint
+        is broken and will be removed.
+        See [https://github.com/openSUSE/open-build-service/issues/9707](https://github.com/openSUSE/open-build-service/issues/9707)
+      tags:
+      - Sources - Packages
+  "/source/{project_name}/{package_name}?cmd=deleteuploadrev":
+    post:
+      summary: Delete all uploaded sources which are not committed yet.
+      description: Removes all changes made to the upload revision and reverts to
+        last committed revision
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: package_name
+        schema:
+          type: string
+        required: true
+        description: Package name
+        example: ctris
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '403':
+          description: Forbidden.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: cmd_execution_no_permission
+                summary: no permission to modify package ctris in project home:Admin
+        '404':
+          description: |
+            Not Found.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: home:some_project'
+                Unknown Package:
+                  value:
+                    code: unknown_package
+                    summary: 'Package not found: home:some_project/some_package'
+      tags:
+      - Sources - Packages
+  "/source/{project_name}/{package_name}?cmd=diff":
+    post:
+      summary: Returns the source diff of a package.
+      description: |
+        Without parameters, return the diff of the last change made to the package.
+        Despite using the method `POST`, this endpoint doesn't alter any data.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: package_name
+        schema:
+          type: string
+        required: true
+        description: Package name
+        example: ctris
+      - in: query
+        name: cacheonly
+        schema:
+          type: string
+          enum:
+          - 1
+          - 0
+        description: |
+          Set to `1` to retrieve a diff only if the diff is already cached.
+
+          If the diff is not cached return a 412 "Precondition failed" error.
+        example: 1
+      - in: query
+        name: expand
+        schema:
+          type: string
+          enum:
+          - 1
+          - 0
+        description: Set to `1` to expand any link before diffing.
+        example: 1
+      - in: query
+        name: file
+        schema:
+          type: string
+        description: Limit diff to the given file name.
+        example: hello_world.spec
+        deprecated: true
+      - in: query
+        name: file[]
+        schema:
+          type: array
+          elements:
+            type: string
+        description: Limit diff to the given file names.
+        example:
+        - hello_world.spec
+        - my_program.c
+      - in: query
+        name: filelimit
+        schema:
+          type: string
+        description: |
+          Limit the size of the diff to this amount of lines.
+
+          By default it takes a built-in value of 200.
+
+          Set to `0` to disable the limit.
+        example: 20
+      - in: query
+        name: linkrev
+        schema:
+          type: string
+        description: Link revision in base package. Set to `base` to use the commit
+          revision.
+        example: base
+      - in: query
+        name: meta
+        schema:
+          type: string
+          enum:
+          - 1
+          - 0
+        description: Set to `1` to diff meta data instead of sources.
+        example: 1
+      - in: query
+        name: missingok
+        schema:
+          type: string
+          enum:
+          - 1
+          - 0
+        description: Set to `1` to diff against an inexistent origin.
+        example: 1
+      - in: query
+        name: nodiff
+        schema:
+          type: string
+          enum:
+          - 1
+          - 0
+        description: Set to `1` to only show changed files, and not details inside
+          files.
+        example: 
+      - in: query
+        name: olinkrev
+        schema:
+          type: string
+        description: Link revision of the origin package.
+      - in: query
+        name: onlyissues
+        schema:
+          type: string
+          enum:
+          - 1
+          - 0
+        description: Set to `1` to show no source diff, only the tracker issues and
+          their change state.
+        example: 1
+      - in: query
+        name: orev
+        schema:
+          type: string
+        description: Old revision.
+      - in: query
+        name: opackage
+        schema:
+          type: string
+        description: Old package.
+      - in: query
+        name: oproject
+        schema:
+          type: string
+        description: Old project.
+      - in: query
+        name: rev
+        schema:
+          type: string
+        description: Revision of the package.
+      - in: query
+        name: tarlimit
+        schema:
+          type: string
+        description: Limit the size of the diff of tar files to this amount of lines.
+        example: 100
+      - in: query
+        name: unified
+        schema:
+          type: string
+          enum:
+          - 1
+          - 0
+        description: |
+          Set to `1` to use unified diff format. Same as setting `view=unified`.
+
+          Setting `unified` to `1` takes precedence on the setting of the `view` parameter.
+
+          See `view` parameter for details on the unified format.
+        example: 1
+      - in: query
+        name: view
+        schema:
+          type: string
+          enum:
+          - unified
+          - xml
+        description: |
+          Set the format of the diff being returned.
+
+          Don't pass the parameter for custom diff format.
+
+          Set to `unified` for unified content.
+
+          Set to `xml` for structured content in a `sourcediff` xml element.
+        example: unified
+      - in: query
+        name: withissues
+        schema:
+          type: string
+          enum:
+          - 1
+          - 0
+        description: Set to `1` to include parsed issue tracker issues and their change
+          state.
+        example: 1
+      responses:
+        '200':
+          description: OK
+          content:
+            text/plain:
+              schema:
+                type: string
+              examples:
+                Without parameters. One character change:
+                  description: Diff of adding an exclamation mark.
+                  value: |2
+
+                    spec files:
+                    -----------
+                    --- hello_world.spec
+                    +++ hello_world.spec
+                    @@ -13,7 +13,7 @@
+                     %build
+                     cat > hello_world.sh <<EOF
+                     #!/usr/bin/bash
+                    -echo Hello world
+                    +echo Hello world!
+                     EOF
+
+                     %install
+                With view=unified:
+                  value: |
+                    Index: hello_world.spec
+                    ===================================================================
+                    --- hello_world.spec (revision 2)
+                    +++ hello_world.spec (revision 3)
+                    @@ -13,7 +13,7 @@
+                     %build
+                     cat > hello_world.sh <<EOF
+                     #!/usr/bin/bash
+                    -echo Hello world
+                    +echo Hello world!
+                     EOF
+
+                     %install
+                With view=xml:
+                  value: |
+                    <?xml version="1.0" encoding="UTF-8"?>
+                    <sourcediff key="e27d928c027cca122f604ad5240e4fbc">
+                      <old project="home:Admin" package="hello_world" rev="2" srcmd5="3793527d5cd7aaac8e52a8b94e3c1ffc"/>
+                      <new project="home:Admin" package="hello_world" rev="3" srcmd5="672795214454d08abd9143893d673e38"/>
+                      <files>
+                        <file state="changed">
+                          <old name="hello_world.spec" md5="dcd026ba76f1723ea8292ad13579aa84" size="463"/>
+                          <new name="hello_world.spec" md5="40f5f87134e806a20123821a3442f176" size="464"/>
+                          <diff lines="9">@@ -13,7 +13,7 @@
+                     %build
+                     cat &gt; hello_world.sh &lt;&lt;EOF
+                     #!/usr/bin/bash
+                    -echo Hello world
+                    +echo Hello world!
+                     EOF
+
+                     %install
+                    </diff>
+                        </file>
+                      </files>
+                    </sourcediff>
+                With nodiff=1:
+                  description: Passing `nodiff=1` only shows changed files.
+                  value: |2
+
+                    spec files:
+                    -----------
+                    --- hello_world.spec
+                    +++ hello_world.spec
+        '400':
+          description: Bad Request.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Not Boolean:
+                  description: Passing a value different than `0` or `1` to `nodiff`,
+                    for example.
+                  value:
+                    code: 400
+                    origin: backend
+                    summary: not boolean
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: |
+            Not Found.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: home:some_project'
+                Unknown Package:
+                  value:
+                    code: unknown_package
+                    summary: 'Package not found: home:some_project/some_package'
+        '412':
+          description: |
+            Precondition Failed
+
+            With `cacheonly=1`, and the diff is still not cached.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: 412
+                origin: backend
+                summary: diff not yet in cache
+                details: 412 diff not yet in cache
+      tags:
+      - Sources - Packages
+  "/source/{project_name}/{package_name}?cmd=fork":
+    post:
+      summary: Create a fork of a package taking the source from the scmsync parameter
+      description: |
+        Create a fork of a package taking the source from the scmsync parameter.
+        The target project is by default below home:<user>:branches namespace.
+        The target project will be setup to include the source project repository setup.
+        The source project must exists, the source package may not exist.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: package_name
+        schema:
+          type: string
+        required: true
+        description: Package name
+        example: ctris
+      - name: scmsync
+        description: Checkout url for the source
+        in: query
+        required: true
+        schema:
+          type: string
+      - name: target_project
+        description: target project name, optional (default home:<user>:branches:<project>)
+        in: query
+        schema:
+          type: string
+      - name: target_package
+        description: target package name
+        in: query
+        schema:
+          type: string
+      - in: query
+        name: force
+        schema:
+          type: string
+        description: 'Set to 1 to allow overwriting of a pre-existing package.
+
+'
+        example: 1
+      - name: add_repositories_rebuild
+        in: query
+        schema:
+          type: string
+          enum:
+          - transitive
+          - direct
+          - local
+          - copy
+        description: Set one of the defined rebuild policies for new repositories
+          (`transitive`, `direct` or `local`) or copy it from the source project (`copy`)
+      - in: query
+        name: add_repositories_block
+        schema:
+          type: string
+          enum:
+          - all
+          - local
+          - never
+        description: Set to use defined block policy for new repositories.
+      responses:
+        '200':
+          description: ok
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+                data:
+                - home:Admin
+                - hello_world
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: Not Found
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                xml:
+                  name: status
+              example:
+                code: not_found
+                summary: project not found
+      tags:
+      - Sources - Packages
+  "/source/{project_name}/{package_name}?cmd=getprojectservices":
+    post:
+      summary: List all services related to a package.
+      description: |
+        List all services defined in the project for this package.
+
+        Despite using the method `POST`, this endpoint doesn't alter any data.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: package_name
+        schema:
+          type: string
+        required: true
+        description: Package name
+        example: ctris
+      - in: query
+        name: cmd
+        required: true
+        schema:
+          type: string
+          enum:
+          - getprojectservices
+      responses:
+        '200':
+          description: 
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: array
+                items:
+                  type: object
+                  properties:
+                    name:
+                      type: string
+                      xml:
+                        attribute: true
+                    mode:
+                      type: string
+                      xml:
+                        attribute: true
+                  xml:
+                    name: service
+                xml:
+                  wrapped: true
+                  name: services
+              example:
+              - name: format_spec_file
+                mode: localonly
+              - name: download_files
+                mode: disabled
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: |
+            Not Found.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: home:some_project'
+                Unknown Package:
+                  value:
+                    code: unknown_package
+                    summary: 'Package not found: home:some_project/some_package'
+      tags:
+      - Sources - Packages
+  "/source/{project_name}/{package_name}?cmd=instantiate":
+    post:
+      summary: Instantiate a new package through a project link.
+      description: |
+        Instantiate a new package in the specified project based on the packages inherited
+        through a linked project (local). The new package will be a branch of the package
+        that lives in the linked project unless the `makeoriginolder` parameter is provided.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: package_name
+        schema:
+          type: string
+        required: true
+        description: Package name
+        example: ctris
+      - in: query
+        name: makeoriginolder
+        schema:
+          type: string
+        description: |
+          Instead of creating a branch of the package, it will instantiate a copy
+          of the package and extend the `vrev` to ensure the copy represents a
+          newer version of the package.
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '403':
+          description: Forbidden
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: 403
+                summary: package is already intialized here
+        '404':
+          description: Not Found
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Not Found:
+                  value:
+                    code: unknown_package
+                    summary: 'Package not found: openSUSE:Leap:15.0:Update/foo'
+      tags:
+      - Sources - Packages
+  "/source/{project_name}/{package_name}?cmd=linkdiff":
+    post:
+      summary: Return the diff of the linked package.
+      description: |
+        For a package with a link to another package, return the diff of the linked package.
+
+        Despite using the method `POST`, this endpoint doesn't alter any data.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: package_name
+        schema:
+          type: string
+        required: true
+        description: Package name
+        example: ctris
+      - in: query
+        name: file
+        schema:
+          type: string
+        description: Limit diff to the given file name.
+        example: hello_world.spec
+        deprecated: true
+      - in: query
+        name: file[]
+        schema:
+          type: array
+          elements:
+            type: string
+        description: Limit diff to the given file names.
+        example:
+        - hello_world.spec
+        - my_program.c
+      - in: query
+        name: filelimit
+        schema:
+          type: string
+        description: |
+          Limit the size of the diff to this amount of lines.
+
+          By default it takes a built-in value of 200.
+
+          Set to `0` to disable the limit.
+        example: 20
+      - in: query
+        name: linkrev
+        schema:
+          type: string
+        description: Link revision in base package. Set to `base` to use the commit
+          revision.
+        example: base
+      - in: query
+        name: onlyissues
+        schema:
+          type: string
+          enum:
+          - 1
+          - 0
+        description: Set to `1` to show no source diff, only the tracker issues and
+          their change state.
+        example: 1
+      - in: query
+        name: rev
+        schema:
+          type: string
+        description: Revision of the package.
+      - in: query
+        name: tarlimit
+        schema:
+          type: string
+        description: Limit the size of the diff of tar files to this amount of lines.
+        example: 100
+      - in: query
+        name: unified
+        schema:
+          type: string
+          enum:
+          - 1
+          - 0
+        description: |
+          Set to `1` to use unified diff format. Same as setting `view=unified`.
+
+          Setting `unified` to `1` takes precedence on the setting of the `view` parameter.
+
+          See `view` parameter for details on the unified format.
+        example: 1
+      - in: query
+        name: view
+        schema:
+          type: string
+          enum:
+          - unified
+          - xml
+        description: |
+          Set the format of the diff being returned.
+
+          Don't pass the parameter for custom diff format.
+
+          Set to `unified` for unified content.
+
+          Set to `xml` for structured content in a `sourcediff` xml element.
+        example: unified
+      - in: query
+        name: withissues
+        schema:
+          type: string
+          enum:
+          - 1
+          - 0
+        description: Set to `1` to include parsed issue tracker issues and their change
+          state.
+        example: 1
+      responses:
+        '200':
+          description: OK
+          content:
+            text/plain:
+              schema:
+                type: string
+              examples:
+                Without parameters. One word change:
+                  value: |2
+
+                    spec files:
+                    -----------
+                    --- hello_world.spec
+                    +++ hello_world.spec
+                    @@ -1,7 +1,7 @@
+                     Name:       hello_world
+                     Version:    1
+                     Release:    1
+                    -Summary:    Most simple RPM package
+                    +Summary:    Most simple RPM package branched
+                     License:    CC0-1.0
+
+                     %description
+                With view=unified:
+                  value: |
+                    Index: hello_world.spec
+                    ===================================================================
+                    --- hello_world.spec (revision d1f45c7c7b5bf91353a4ec2042cbc53c)
+                    +++ hello_world.spec (revision f03477e1b083c6499ee2c195e3340cdf)
+                    @@ -1,7 +1,7 @@
+                     Name:       hello_world
+                     Version:    1
+                     Release:    1
+                    -Summary:    Most simple RPM package
+                    +Summary:    Most simple RPM package branched
+                     License:    CC0-1.0
+
+                     %description
+                With view=xml:
+                  value: |
+                    <?xml version="1.0" encoding="UTF-8"?>
+                    <sourcediff key="6eac2a5a0ac0e75ba854a2569b3b24f8">
+                      <old project="home:Admin" package="hello_world" rev="d1f45c7c7b5bf91353a4ec2042cbc53c" srcmd5="d1f45c7c7b5bf91353a4ec2042cbc53c"/>
+                      <new project="home:Admin:branches:home:Admin" package="hello_world" rev="f03477e1b083c6499ee2c195e3340cdf" srcmd5="f03477e1b083c6499ee2c195e3340cdf"/>
+                      <files>
+                        <file state="changed">
+                          <old name="hello_world.spec" md5="40f5f87134e806a20123821a3442f176" size="464"/>
+                          <new name="hello_world.spec" md5="5729ac8ecab5452b777b4a596332a6f4" size="473"/>
+                          <diff lines="9">@@ -1,7 +1,7 @@
+                     Name:       hello_world
+                     Version:    1
+                     Release:    1
+                    -Summary:    Most simple RPM package
+                    +Summary:    Most simple RPM package branched
+                     License:    CC0-1.0
+
+                     %description
+                    </diff>
+                        </file>
+                      </files>
+                    </sourcediff>
+        '400':
+          description: Bad Request.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Not Boolean:
+                  description: Passing a value different than `0` or `1` to `unified`,
+                    for example.
+                  value: |
+                    <xml version="1.0" encoding="UTF-8"?>
+                    <status code="400" origin="backend">
+                      <summary>not boolean</summary>
+                    </status>
+                Not a Link:
+                  description: The package doesn't cotain a `_link` file.
+                  value: |
+                    <xml version="1.0" encoding="UTF-8"?>
+                    <status code="400" origin="backend">
+                      <summary>not a link</summary>
+                    </status>
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: |
+            Not Found.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: home:some_project'
+                Unknown Package:
+                  value:
+                    code: unknown_package
+                    summary: 'Package not found: home:some_project/some_package'
+      tags:
+      - Sources - Packages
+  "/source/{project_name}/{package_name}?cmd=linktobranch":
+    post:
+      summary: Turn link into a branch.
+      description: Convert a plain source link into a full branch.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: package_name
+        schema:
+          type: string
+        required: true
+        description: Package name
+        example: ctris
+      - in: query
+        name: linkrev
+        schema:
+          type: string
+        description: 'Link revision in base package. Set to `base` to use the commit
+          revision.
+
+'
+        example: base
+      - in: query
+        name: rev
+        schema:
+          type: string
+        description: Revision of the package.
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '400':
+          description: |
+            Bad Request.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Not A Link:
+                  value:
+                    code: 400
+                    origin: backend
+                    summary: package is not a link
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '403':
+          description: Forbidden.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: cmd_execution_no_permission
+                summary: no permission to modify package test in project home:Admin
+        '404':
+          description: |
+            Not Found.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: home:some_project'
+                Unknown Package:
+                  value:
+                    code: unknown_package
+                    summary: 'Package not found: home:some_project/some_package'
+      tags:
+      - Sources - Packages
+  "/source/{project_name}/{package_name}?cmd=mergeservice":
+    post:
+      summary: Expand all server side generated files and adapt the _service file.
+      description: |
+        This command executes the following steps:
+        - Expand all server side generated files. Those are the files created by the services, starting with `_service:`.
+        - Modify The `_service` file:
+          - Preserve all those services which have the `mode` attribute set to `buildtime`.
+          - Remove the `_service` file only if there aren't any services with the `mode` attribute set to `buildtime`.
+
+        An example of a `_service` file, before:
+          ```
+          <services>
+            <service name="obs_scm">
+              <param name="versionformat">2.11~alpha.%ci.%h</param>
+              <param name="url">https://github.com/openSUSE/open-build-service.git</param>
+              <param name="scm">git</param>
+              <param name="revision">master</param>
+              <param name="extract">dist/obs-server.spec</param>
+            </service>
+            <service name="tar" mode="buildtime"/>
+            <service name="recompress" mode="buildtime">
+              <param name="compression">xz</param>
+              <param name="file">*.tar</param>
+            </service>
+          </services>
+          ```
+
+        An example of a `_service` file, after this command is run:
+          ```
+          <services>
+            <service name="tar" mode="buildtime"/>
+            <service name="recompress" mode="buildtime">
+              <param name="compression">xz</param>
+              <param name="file">*.tar</param>
+            </service>
+          </services>
+          ```
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: package_name
+        schema:
+          type: string
+        required: true
+        description: Package name
+        example: ctris
+      - in: query
+        name: comment
+        schema:
+          type: string
+        description: Set a comment.
+        example: Merge services.
+      responses:
+        '200':
+          description: Revision of the merge of the service file.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  rev:
+                    type: string
+                    xml:
+                      attribute: true
+                  vrev:
+                    type: string
+                    xml:
+                      attribute: true
+                  srcmd5:
+                    type: string
+                  version:
+                    type: string
+                  time:
+                    type: string
+                  user:
+                    type: string
+                  comment:
+                    type: string
+                  requestid:
+                    type: string
+                xml:
+                  name: revision
+              example:
+                rev: 8
+                vrev: 8
+                srcmd5: beb268dc9f786efaa585ac07e17fea47
+                version: 2.10~pre
+                time: 1665060711
+                user: Admin
+                comment: 
+                requestid: 
+        '400':
+          description: |
+            Bad Request.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Package Without _service file:
+                  value:
+                    code: 400
+                    origin: backend
+                    summary: package has no service
+                Services Running:
+                  value:
+                    code: 400
+                    origin: backend
+                    summary: service in progress
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '403':
+          description: Forbidden.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: cmd_execution_no_permission
+                summary: no permission to modify package test in project home:Admin
+        '404':
+          description: |
+            Not Found.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: home:some_project'
+                Unknown Package:
+                  value:
+                    code: unknown_package
+                    summary: 'Package not found: home:some_project/some_package'
+      tags:
+      - Sources - Packages
+  "/source/{project_name}/{package_name}?cmd=rebuild":
+    post:
+      deprecated: true
+      summary: Trigger a package rebuild.
+      description: |
+        Triggers a rebuild of the package. This endpoint
+        is broken and will be removed.
+        See [`POST /build/{project_name}?cmd=rebuild`](#/Build/post_build__project_name__cmd_rebuild).
+      tags:
+      - Sources - Packages
+  "/source/{project_name}/{package_name}?cmd=release":
+    post:
+      summary: Release sources and binaries of a specified package.
+      description: |
+        Release sources and binaries of the specified package. If no release target is specified through
+        the optional parameters, it will trigger the release for all manual release targets
+        set on the specified project repository definitions for the specified package.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: package_name
+        schema:
+          type: string
+        required: true
+        description: Package name
+        example: ctris
+      - in: query
+        name: target_project
+        schema:
+          type: string
+        description: |
+          The name of the release target project. Specify in which project the sources and
+          binaries are going to be released. You need to provide the `target_repository`
+          parameter as well.
+        example: OBS:Server:2.10
+      - in: query
+        name: target_repository
+        schema:
+          type: string
+        description: |
+          The name of the release target repository. Specify in which repository the sources and
+          binaries are going to be released. You need to provide the `target_project`
+          parameter as well.
+        example: openSUSE_Tumbleweed
+      - in: query
+        name: repository
+        schema:
+          type: string
+        description: 'Limit the release to a certain repository, set on the project
+          repository definitions.
+
+'
+        example: openSUSE_Tumbleweed
+      - in: query
+        name: setrelease
+        schema:
+          type: string
+        description: 'If this parameter is present, the release will be tagged with
+          this parameter''s value.
+
+'
+        example: Build8.18
+      - in: query
+        name: arch
+        schema:
+          type: string
+        description: The name of the architecture. Limit the release to a certain
+          architecture.
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '400':
+          description: |
+            Bad Request.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Missing Parameter:
+                  value:
+                    code: missing_parameter
+                    summary: release action with specified target project needs also
+                      "repository" and "target_repository" parameter
+        '403':
+          description: Forbidden
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: cmd_execution_no_permission
+                summary: no permission to execute command 'release' for package hello_world
+                  in project home:foo
+        '404':
+          description: Not Found.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown Package:
+                  value:
+                    code: unknown_package
+                    summary: 'Package not found: home:some_project/some_package'
+      tags:
+      - Sources - Packages
+  "/source/{project_name}/{package_name}?cmd=remove_flag":
+    post:
+      summary: Remove a specific flag.
+      description: Remove a specific flag for a package.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: package_name
+        schema:
+          type: string
+        required: true
+        description: Package name
+        example: ctris
+      - in: query
+        name: flag
+        required: true
+        schema:
+          type: string
+          enum:
+          - access
+          - binarydownload
+          - build
+          - debuginfo
+          - lock
+          - publish
+          - sourceaccess
+          - useforbuild
+        description: Name of the flag to be removed.
+        example: build
+      - in: query
+        name: repository
+        schema:
+          type: string
+        description: Repository for which the flag is to be removed.
+        example: openSUSE_Tumbleweed
+      - in: query
+        name: arch
+        schema:
+          type: string
+        description: Architecture for which the flag is to be removed.
+        example: x86_64
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '400':
+          description: |
+            Bad Request.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Missing Parameter flag:
+                  value:
+                    code: missing_parameter
+                    summary: Required Parameter flag missing
+                Invalid flag:
+                  value:
+                    code: invalid_flag
+                    summary: 'Error: unknown flag type ''RANDOM_STRING'' not found.'
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '403':
+          description: Forbidden
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: cmd_execution_no_permission
+                summary: no permission to modify package test in project home:Admin
+        '404':
+          description: |
+            Not Found.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: home:some_project'
+                Unknown Package:
+                  value:
+                    code: unknown_package
+                    summary: 'Package not found: home:some_project/some_package'
+      tags:
+      - Sources - Packages
+  "/source/{project_name}/{package_name}?cmd=runservice":
+    post:
+      summary: Trigger run of defined services.
+      description: Trigger run of defined services in the `_service` file.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: package_name
+        schema:
+          type: string
+        required: true
+        description: Package name
+        example: ctris
+      - in: query
+        name: comment
+        schema:
+          type: string
+        description: Set a comment.
+        default: trigger service run
+        example: Trigger services once more.
+      - in: query
+        name: user
+        schema:
+          type: string
+        description: Set the user who triggers the services.
+        example: Iggy
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '400':
+          description: |
+            Bad Request.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Package is _project:
+                  value:
+                    code: 400
+                    origin: backend
+                    summary: triggerservicerun does not work with _project
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '403':
+          description: Forbidden.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                No Permission to Run Services:
+                  value:
+                    code: cmd_execution_no_permission
+                    summary: no permission to modify package test in project home:Admin
+        '404':
+          description: |
+            Not Found.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: home:some_project'
+                Unknown Package:
+                  value:
+                    code: unknown_package
+                    summary: 'Package not found: home:some_project/some_package'
+                No Source Service Defined:
+                  value:
+                    code: not_found
+                    summary: |
+                      <status code="404">
+                        <summary>no source service defined!</summary>
+                        <details>404 no source service defined!</details>
+                      </status>
+      tags:
+      - Sources - Packages
+  "/source/{project_name}/{package_name}?cmd=servicediff":
+    post:
+      summary: Return the diff of changes made by a service run.
+      description: |
+        Return the diff of changes made by a service run.
+
+        Despite using the method `POST`, this endpoint doesn't alter any data.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: package_name
+        schema:
+          type: string
+        required: true
+        description: Package name
+        example: ctris
+      - in: query
+        name: file
+        schema:
+          type: string
+        description: Limit diff to the given file name.
+        example: hello_world.spec
+        deprecated: true
+      - in: query
+        name: file[]
+        schema:
+          type: array
+          elements:
+            type: string
+        description: Limit diff to the given file names.
+        example:
+        - hello_world.spec
+        - my_program.c
+      - in: query
+        name: filelimit
+        schema:
+          type: string
+        description: |
+          Limit the size of the diff to this amount of lines.
+
+          By default it takes a built-in value of 200.
+
+          Set to `0` to disable the limit.
+        example: 20
+      - in: query
+        name: onlyissues
+        schema:
+          type: string
+          enum:
+          - 1
+          - 0
+        description: Set to `1` to show no source diff, only the tracker issues and
+          their change state.
+        example: 1
+      - in: query
+        name: rev
+        schema:
+          type: string
+        description: Revision of the package.
+      - in: query
+        name: tarlimit
+        schema:
+          type: string
+        description: Limit the size of the diff of tar files to this amount of lines.
+        example: 100
+      - in: query
+        name: unified
+        schema:
+          type: string
+          enum:
+          - 1
+          - 0
+        description: |
+          Set to `1` to use unified diff format. Same as setting `view=unified`.
+
+          Setting `unified` to `1` takes precedence on the setting of the `view` parameter.
+
+          See `view` parameter for details on the unified format.
+        example: 1
+      - in: query
+        name: view
+        schema:
+          type: string
+          enum:
+          - unified
+          - xml
+        description: |
+          Set the format of the diff being returned.
+
+          Don't pass the parameter for custom diff format.
+
+          Set to `unified` for unified content.
+
+          Set to `xml` for structured content in a `sourcediff` xml element.
+        example: unified
+      - in: query
+        name: withissues
+        schema:
+          type: string
+          enum:
+          - 1
+          - 0
+        description: Set to `1` to include parsed issue tracker issues and their change
+          state.
+        example: 1
+      responses:
+        '200':
+          description: OK
+          content:
+            text/plain:
+              schema:
+                type: string
+              examples:
+                No Changes:
+                  description: If the last run of services didn't change the sources,
+                    return empty.
+                  value: ''
+                Without any value for view parameter:
+                  value: |
+                    new:
+                    ----
+                      _service:obs_scm:obs-api-testsuite-rspec.spec
+
+                    spec files:
+                    -----------
+
+                    ++++++ new spec file:
+                    --- _service:obs_scm:obs-api-testsuite-rspec.spec
+                    +++ _service:obs_scm:obs-api-testsuite-rspec.spec
+                    @@ -0,0 +1,73 @@
+                    +#
+                    +# spec file for package obs-api-testsuite-rspec
+                    +#
+                    +
+                    +
+                    +Name:           obs-api-testsuite-rspec
+                    +Version:        2.10~pre
+                    +Release:        0
+                    +Summary:        The Open Build Service -- RSpec test suite
+                    +License:        GPL-2.0-only OR GPL-3.0-only
+                    +Group:          Productivity/Networking/Web/Utilities
+                    +Url:            http://www.openbuildservice.org
+                    +Source0:        open-build-service-%version.tar.xz
+                    +BuildRequires:  obs-api-testsuite-deps
+                    +# rspec specific dependencies
+                    +BuildRequires:  chromedriver
+                    +BuildRequires:  xorg-x11-fonts
+                    +BuildRoot:      %{_tmppath}/%{name}-%{version}-build
+                    +%if 0%{?disable_obs_frontend_test_suite} || 0%{?disable_obs_test_suite}
+                    +ExclusiveArch:  nothere
+                    +%else
+                    +ExclusiveArch:  x86_64
+                    +%endif
+                    +
+                    +
+                    +%description
+                    +Running the RSpec test suite of the OBS frontend independently
+                    +of packaging the application
+                    +
+                    +%prep
+                    +%setup -q -n open-build-service-%{version}
+                    +
+                    +%build
+                    +# run in build environment
+                    +pushd src/backend/
+                    +rm -rf build
+                    +ln -sf /usr/lib/build build
+                    +popd
+                    +
+                    +pushd src/api
+                    +# configure to the bundled gems
+                    +bundle --local --path %_libdir/obs-api/
+                    +
+                    +./script/prepare_spec_tests.sh
+                    +
+                    +export RAILS_ENV=test
+                    +bin/rake db:setup
+                    +bin/rails assets:precompile
+                    +
+                    +bin/rspec -f d --exclude-pattern 'spec/db/**/*_spec.rb'
+                    +
+                    +# now migration tests (if they fail they create tons of follow up errors, so run them last)
+                    +bin/rspec -f d -P 'spec/db/**/*_spec.rb'
+                    +
+                    +%install
+                    +
+                    +# no result
+                    +%files
+                    +
+                    +%changelog
+                With view=unified:
+                  value: |
+                    Index: _service:obs_scm:obs-api-testsuite-rspec.spec
+                    ===================================================================
+                    --- _service:obs_scm:obs-api-testsuite-rspec.spec (added)
+                    +++ _service:obs_scm:obs-api-testsuite-rspec.spec (revision c63d8550ea46703ce56000277de12d1c)
+                    @@ -0,0 +1,73 @@
+                    +#
+                    +# spec file for package obs-api-testsuite-rspec
+                    +#
+                    [...]
+                    +%changelog
+                    Index: _service:obs_scm:obs-server.spec
+                    ===================================================================
+                    --- _service:obs_scm:obs-server.spec (added)
+                    +++ _service:obs_scm:obs-server.spec (revision c63d8550ea46703ce56000277de12d1c)
+                    @@ -0,0 +1,1120 @@
+                    +#
+                    +# spec file for package obs-server
+                    [...]
+                    +Recommends:     yum yum-metadata-parser repoview dpkg
+                    +Recommends:     deb >= 1.5
+                    (921 more lines skipped)
+                    Index: _service:obs_scm:open-build-service-2.11~alpha.20221007T165328.9f99a31a.obscpio
+                    ===================================================================
+                    Binary file _service:obs_scm:open-build-service-2.11~alpha.20221007T165328.9f99a31a.obscpio (revision c63d8550ea46703ce56000277de12d1c) added
+                    Index: _service:obs_scm:open-build-service.obsinfo
+                    ===================================================================
+                    --- _service:obs_scm:open-build-service.obsinfo (added)
+                    +++ _service:obs_scm:open-build-service.obsinfo (revision c63d8550ea46703ce56000277de12d1c)
+                    @@ -0,0 +1,4 @@
+                    +name: open-build-service
+                    +version: 2.11~alpha.20221007T165328.9f99a31a
+                    +mtime: 1665154408
+                    +commit: 9f99a31afe0ab435c1dd1d02be5f52fe4425b00f
+            text/xml:
+              schema:
+                type: object
+                properties:
+                  name:
+                    key: string
+                    xml:
+                      attribute: true
+                xml:
+                  name: sourcediff
+              examples:
+                With view=xml:
+                  value: |
+                    <?xml version="1.0" encoding="UTF-8"?>
+                    <sourcediff key="1634c0e9b7625f79874458d437a4f225">
+                      <old project="home:Admin" package="test" rev="62be45f382bfef30d5028b3f3161d4fc" srcmd5="62be45f382bfef30d5028b3f3161d4fc"/>
+                      <new project="home:Admin" package="test" rev="c63d8550ea46703ce56000277de12d1c" srcmd5="c63d8550ea46703ce56000277de12d1c"/>
+                      <files>
+                        <file state="added">
+                          <new name="_service:obs_scm:obs-api-testsuite-rspec.spec" md5="4fab7cf67a4293a22778d2062239864c" size="2069"/>
+                          <diff lines="74">@@ -0,0 +1,73 @@
+                    +#
+                    +# spec file for package obs-api-testsuite-rspec
+                    [...]
+                    +
+                    +%changelog
+                    </diff>
+                        </file>
+                        <file state="added">
+                          <new name="_service:obs_scm:obs-server.spec" md5="49bbbfd13505e676cd02296094095933" size="36575"/>
+                          <diff lines="1121" shown="200">@@ -0,0 +1,1120 @@
+                    +#
+                    +# spec file for package obs-server
+                    [...]
+                    +Recommends:     yum yum-metadata-parser repoview dpkg
+                    +Recommends:     deb &gt;= 1.5
+                    </diff>
+                        </file>
+                        <file state="added">
+                          <new name="_service:obs_scm:open-build-service-2.11~alpha.20221007T165328.9f99a31a.obscpio" md5="9f6cb81b792f4afc208d285086f3e9ec" size="96545294"/>
+                          <diff binary="1" lines="0"></diff>
+                        </file>
+                        <file state="added">
+                          <new name="_service:obs_scm:open-build-service.obsinfo" md5="7220e2c761f90c579e01ba0d3c2af25a" size="137"/>
+                          <diff lines="5">@@ -0,0 +1,4 @@
+                    +name: open-build-service
+                    +version: 2.11~alpha.20221007T165328.9f99a31a
+                    +mtime: 1665154408
+                    +commit: 9f99a31afe0ab435c1dd1d02be5f52fe4425b00f
+                    </diff>
+                        </file>
+                      </files>
+                    </sourcediff>
+        '400':
+          description: Bad Request.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Not Boolean:
+                  description: Passing a value different than `0` or `1` to `unified`,
+                    for example.
+                  value: |
+                    <xml version="1.0" encoding="UTF-8"?>
+                    <status code="400" origin="backend">
+                      <summary>not boolean</summary>
+                    </status>
+                No Service Run:
+                  value: |
+                    <xml version="1.0" encoding="UTF-8"?>
+                    <status code="400" origin="backend">
+                      <summary>no service was run for this revision</summary>
+                    </status>
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: |
+            Not Found.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: home:some_project'
+                Unknown Package:
+                  value:
+                    code: unknown_package
+                    summary: 'Package not found: home:some_project/some_package'
+      tags:
+      - Sources - Packages
+  "/source/{project_name}/{package_name}?cmd=set_flag":
+    post:
+      summary: Enable or disable a specific flag.
+      description: Enable or disable a specific flag for a package.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: package_name
+        schema:
+          type: string
+        required: true
+        description: Package name
+        example: ctris
+      - in: query
+        name: flag
+        required: true
+        schema:
+          type: string
+          enum:
+          - access
+          - binarydownload
+          - build
+          - debuginfo
+          - lock
+          - publish
+          - sourceaccess
+          - useforbuild
+        description: Name of the flag to be set.
+        example: build
+      - in: query
+        name: status
+        required: true
+        schema:
+          type: string
+          enum:
+          - enable
+          - disable
+        description: Status of the flag to be set.
+        example: enable
+      - in: query
+        name: repository
+        schema:
+          type: string
+        description: Repository for which the flag is to be set.
+        example: openSUSE_Tumbleweed
+      - in: query
+        name: arch
+        schema:
+          type: string
+        description: Architecture for which the flag is to be set.
+        example: x86_64
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '400':
+          description: |
+            Bad Request.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Missing Parameter flag:
+                  value:
+                    code: missing_parameter
+                    summary: Required Parameter flag missing
+                Missing Parameter status:
+                  value:
+                    code: missing_parameter
+                    summary: Required Parameter status missing
+                Invalid flag:
+                  value:
+                    code: invalid_flag
+                    summary: 'Error: unknown flag type ''RANDOM_STRING'' not found.'
+                Invalid status:
+                  value:
+                    code: invalid_flag
+                    summary: 'Error: unknown status flag ''RANDOM_STRING'''
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '403':
+          description: Forbidden
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: cmd_execution_no_permission
+                summary: no permission to modify package test in project home:Admin
+        '404':
+          description: |
+            Not Found.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: home:some_project'
+                Unknown Package:
+                  value:
+                    code: unknown_package
+                    summary: 'Package not found: home:some_project/some_package'
+      tags:
+      - Sources - Packages
+  "/source/{project_name}/{package_name}?cmd=showlinked":
+    post:
+      summary: List all packages linking to this one.
+      description: List all packages linking to this one. Despite using the method
+        `POST`, this endpoint doesn't alter any data.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: package_name
+        schema:
+          type: string
+        required: true
+        description: Package name
+        example: ctris
+      responses:
+        '200':
+          description: OK
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: array
+                items:
+                  type: object
+                  properties:
+                    name:
+                      type: string
+                      xml:
+                        attribute: true
+                    project:
+                      type: string
+                      xml:
+                        attribute: true
+                  xml:
+                    name: package
+                xml:
+                  name: collection
+                  wrapped: true
+              examples:
+                No results:
+                  value: |
+                    <?xml version="1.0" encoding="UTF-8"?>
+                    <collection/>
+                Two linked packages:
+                  value:
+                  - name: hello_world
+                    project: home:Admin:branches:home:Admin
+                  - name: hello_world2
+                    project: home:Admin:branches:home:Admin
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: |
+            Not Found.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: home:some_project'
+                Unknown Package:
+                  value:
+                    code: unknown_package
+                    summary: 'Package not found: home:some_project/some_package'
+      tags:
+      - Sources - Packages
+  "/source/{project_name}/{package_name}?cmd=undelete":
+    post:
+      summary: Undelete the package.
+      description: Undelete the package.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: package_name
+        schema:
+          type: string
+        required: true
+        description: Package name
+        example: ctris
+      - in: query
+        name: comment
+        schema:
+          type: string
+        description: Set a comment.
+        default: package was undeleted
+        example: The package was removed by mistake. Undeleting.
+      - in: query
+        name: time
+        schema:
+          type: integer
+        description: |
+          Set the time of the undelete operation, expressed in seconds since the epoch.
+
+          Set to `1` to set the time of the undelete operation to the same time the package was deleted.
+        examples:
+          Seconds Since Epoch:
+            value: 1664912989
+          Same as Delete Time:
+            value: 1
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '400':
+          description: Bad Request.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Package Exists:
+                  value:
+                    code: package_exists
+                    summary: the package exists already home:Admin hello_world
+                Time is Not a Number:
+                  value:
+                    code: 400
+                    origin: backend
+                    summary: 'not a number: ''RANDOM_STRING'''
+                Time is Less than Time in Last Commit:
+                  value:
+                    code: 400
+                    origin: backend
+                    summary: specified time is less than time in last commit
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '403':
+          description: Forbidden.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Package Was Not Deleted:
+                  value:
+                    code: 403
+                    summary: package 'hello_world' was not deleted
+                    details: 403 package 'hello_world' was not deleted
+                No Permission to Create Package:
+                  value:
+                    code: cmd_execution_no_permission
+                    summary: no permission to create package in project home:Admin
+                No Permission to Set the Time:
+                  value:
+                    code: cmd_execution_no_permission
+                    summary: Only administrators are allowed to set the time
+        '404':
+          description: |
+            Unknown project.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: <some project>.'
+      tags:
+      - Sources - Packages
+  "/source/{project_name}/{package_name}?cmd=unlock":
+    post:
+      summary: Unlock a locked package.
+      description: Unlock a locked package (`<lock><enable/></lock>` flag present
+        in the package `_meta` file).
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: package_name
+        schema:
+          type: string
+        required: true
+        description: Package name
+        example: ctris
+      - in: query
+        name: comment
+        required: true
+        schema:
+          type: string
+        description: Comment to be included in the revision history of the `_meta`
+          file
+        example: Locking the package is no longer needed
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '400':
+          description: |
+            Bad Request.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Missing Parameter:
+                  value:
+                    code: missing_parameter
+                    summary: Required Parameter comment missing
+                Not locked:
+                  value:
+                    code: not_locked
+                    summary: package 'home:Foo/hello_world' is not locked
+        '403':
+          description: Forbidden
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: cmd_execution_no_permission
+                summary: no permission to modify package ruby in project home:Foo
+        '404':
+          description: Not Found
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Not Found:
+                  value:
+                    code: unknown_package
+                    summary: 'Package not found: openSUSE:Leap:15.0:Update/foo'
+      tags:
+      - Sources - Packages
+  "/source/{project_name}/{package_name}?cmd=updatepatchinfo":
+    post:
+      summary: Update the issues listed in the `_patchinfo` file of a specified package.
+      description: |
+        Update the issues listed in the `_patchinfo` file of a specified package, based on
+        infos available through the issue trackers.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: package_name
+        schema:
+          type: string
+        required: true
+        description: Package name
+        example: ctris
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '403':
+          description: Forbidden.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: cmd_execution_no_permission
+                summary: no permission to modify package patchinfo in project openSUSE:Maintenance:123
+        '404':
+          description: |
+            Not Found.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: home:some_project'
+                Unknown Package:
+                  value:
+                    code: unknown_package
+                    summary: 'Package not found: home:some_project/some_package'
+      tags:
+      - Sources - Packages
+  "/source/{project_name}/{package_name}?cmd=waitservice":
+    post:
+      summary: Return when the last run of defined services has finished.
+      description: |
+        Return an `Ok` code when the last run of defined services in the `_service` file has finished.
+
+        If a run of services is in progress, wait until all services finish.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: package_name
+        schema:
+          type: string
+        required: true
+        description: Package name
+        example: ctris
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '400':
+          description: Bad Request.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Service Not Installed:
+                  value:
+                    code: 400
+                    origin: backend
+                    summary: " 400 remote error: /usr/lib/obs/service//set_version.service
+                      \ No such file or directory (http://backend:5152/sourceupdate/home:Admin/obs-server?timeout=3600)"
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '403':
+          description: Forbidden.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                No Permission to Wait for Services:
+                  value:
+                    code: cmd_execution_no_permission
+                    summary: no permission to modify package test in project home:Admin
+        '404':
+          description: |
+            Not Found.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: home:some_project'
+                Unknown Package:
+                  value:
+                    code: unknown_package
+                    summary: 'Package not found: home:some_project/some_package'
+      tags:
+      - Sources - Packages
+  "/source/{project_name}/{package_name}?view=info":
+    get:
+      summary: Show source version, md5sums and build description files of a package.
+      description: Show source version, md5sums and build description files of a package,
+        among other information.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: package_name
+        schema:
+          type: string
+        required: true
+        description: Package name
+        example: ctris
+      - in: query
+        name: view
+        schema:
+          type: string
+          enum:
+          - cpio
+          - getmultibuild
+          - info
+          - issues
+          - products
+          - productrepositories
+        description: |
+          Specify which information about a package should be returned.
+
+          * `info`: Show source version, md5sums and build description files, among other information.
+          * `cpio`, `getmultibuild`, `issues`, `products`, `productrepositories`:
+            See this [other endpoint](<#/Sources - Files/get_source__project_name___package_name_>) for details.
+        example: info
+      - in: query
+        name: arch
+        schema:
+          type: string
+        description: Filter by architecture name.
+        example: x86_64
+      - in: query
+        name: nofilename
+        schema:
+          type: string
+          enum:
+          - 1
+          - 0
+        default: 0
+        description: Set to `1` to prevent from showing filename elements. Shows only
+          the `sourceinfo` root element.
+        example: 1
+      - in: query
+        name: repository
+        schema:
+          type: string
+        description: Filter by repository name.
+        example: openSUSE_Tumbleweed
+      - in: query
+        name: parse
+        schema:
+          type: string
+          enum:
+          - 1
+          - 0
+        default: 0
+        description: Set to `1` to show more details, like `originproject`, `linked
+          package`, `name`, `version`, `release`, `subpacks`, `deps`, and `prereqs`
+          elements.
+        example: 1
+      responses:
+        '200':
+          description: OK. The request has succeeded.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  package:
+                    type: string
+                    xml:
+                      attribute: true
+                  rev:
+                    type: string
+                    xml:
+                      attribute: true
+                  vrev:
+                    type: string
+                    xml:
+                      attribute: true
+                  srcmd5:
+                    type: string
+                    xml:
+                      attribute: true
+                  verifymd5:
+                    type: string
+                    xml:
+                      attribute: true
+                  metamd5:
+                    type: string
+                    xml:
+                      attribute: true
+                  filename:
+                    type: string
+                  originproject:
+                    type: string
+                  linked:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        project:
+                          type: string
+                          xml:
+                            attribute: true
+                        package:
+                          type: string
+                          xml:
+                            attribute: true
+                  name:
+                    type: string
+                  version:
+                    type: string
+                  release:
+                    type: string
+                  revtime:
+                    type: string
+                  error:
+                    type: string
+                  subpacks:
+                    type: array
+                    items:
+                      type: string
+                  deps:
+                    type: array
+                    items:
+                      type: string
+                  prereqs:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: sourceinfo
+              examples:
+                Without Any Other Parameters:
+                  value:
+                    package: texlive-specs-w
+                    rev: 9f5336fcf6e4521b6a9587b02087eef9
+                    vrev: 55
+                    srcmd5: 9f5336fcf6e4521b6a9587b02087eef9
+                    verifymd5: 9b49b7314f5d0dfd8002cd329e048f73
+                    filename: texlive-specs-w.spec
+                    originproject: openSUSE:Factory:Rings:1-MinimalX
+                    linked:
+                    - project: openSUSE:Factory:Rings:0-Bootstrap
+                      package: textlive-specs-w
+                    - project: openSUSE:Factory:Rings:1-MinimalX
+                      package: textlive-specs-w
+                With Parameter nofilename=1:
+                  value:
+                    package: texlive-specs-w
+                    rev: 9f5336fcf6e4521b6a9587b02087eef9
+                    vrev: 55
+                    srcmd5: 9f5336fcf6e4521b6a9587b02087eef9
+                    verifymd5: 9b49b7314f5d0dfd8002cd329e048f73
+                    originproject: openSUSE:Factory:Rings:1-MinimalX
+                    linked:
+                    - project: openSUSE:Factory:Rings:0-Bootstrap
+                      package: textlive-specs-w
+                    - project: openSUSE:Factory:Rings:1-MinimalX
+                      package: textlive-specs-w
+                With Parameter parse=1:
+                  value:
+                    package: texlive-specs-w
+                    rev: 9f5336fcf6e4521b6a9587b02087eef9
+                    vrev: 55
+                    srcmd5: 9f5336fcf6e4521b6a9587b02087eef9
+                    verifymd5: 9b49b7314f5d0dfd8002cd329e048f73
+                    filename: texlive-specs-w.spec
+                    originproject: openSUSE:Factory:Rings:1-MinimalX
+                    linked:
+                    - project: openSUSE:Factory:Rings:0-Bootstrap
+                      package: textlive-specs-w
+                    - project: openSUSE:Factory:Rings:1-MinimalX
+                      package: textlive-specs-w
+                    name: textlive-specs-w
+                    version: 2023
+                    release: 0
+                    subpacks:
+                    - texlive-specs-w
+                    - texlive-tablists
+                    deps:
+                    - texlive-kpathsea
+                    - texlive-tie-bin
+                    prereqs:
+                    - texlive-filesystem
+                    - coreutils
+        '400':
+          description: |
+            Bad Request.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Not Boolean:
+                  description: Passing a value different than `0` or `1` to `parse`,
+                    for example.
+                  value:
+                    code: 400
+                    summary: not boolean
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: Not Found.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: home:some_project'
+                Unknown Package:
+                  value:
+                    code: unknown_package
+                    summary: 'Package not found: home:some_project/some_package'
+      tags:
+      - Sources - Packages
+  "/source/{project_name}/{package_name}/{file_name}":
+    get:
+      summary: Read a specified source file
+      description: Read a specified source file and return the content
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: package_name
+        schema:
+          type: string
+        required: true
+        description: Package name
+        example: ctris
+      - in: path
+        name: file_name
+        schema:
+          type: string
+        required: true
+        description: The file name
+        example: ctris-0.42.1-4.1.x86_64.rpm
+      - in: query
+        name: rev
+        schema:
+          type: integer
+        description: Retrieve the file at a specific package revision.
+        example: 3
+      - in: query
+        name: meta
+        schema:
+          type: integer
+          enum:
+          - 1
+          - 0
+        description: Set to `1` to show meta data instead of sources.
+        example: 1
+      - in: query
+        name: deleted
+        schema:
+          type: integer
+          enum:
+          - 1
+          - 0
+        description: Set to 1 to retrieve a file from a deleted project or package.
+        example: 0
+      - in: query
+        name: expand
+        schema:
+          type: integer
+          enum:
+          - 1
+          - 0
+        description: Set to `1` to include files from linked packages.
+        example: 1
+      - name: view
+        in: query
+        schema:
+          type: string
+          enum:
+          - blame
+        description: With `view=blame`, information about who changed the file.
+        example: blame
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '400':
+          description: Unknown parameter
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown parameter:
+                  value:
+                    code: unknown_parameter
+                    summary: unknown parameter 'limit'
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: |
+            Not Found.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: home:some_project'
+                Unknown Package:
+                  value:
+                    code: unknown_package
+                    summary: 'Package not found: home:some_project/some_package'
+                Unknown File:
+                  value:
+                    code: unknown_file
+                    summary: 'File not found: home:some_project/some_package/some_file'
+      tags:
+      - Sources - Files
+    delete:
+      summary: Deletes a specified source file of a package.
+      description: Deletes a specified source file of a package of a project.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: package_name
+        schema:
+          type: string
+        required: true
+        description: Package name
+        example: ctris
+      - in: path
+        name: file_name
+        schema:
+          type: string
+        required: true
+        description: The file name
+        example: ctris-0.42.1-4.1.x86_64.rpm
+      - in: query
+        name: rev
+        schema:
+          type: string
+        description: |
+          If set to 'upload', multiple files can be deleted in just one commit.
+          Delete first the files with `rev=upload`, then close the single commit by another request call with `cmd=commit`
+        example: upload
+      - in: query
+        name: meta
+        schema:
+          type: integer
+          enum:
+          - 1
+          - 0
+        description: Set to `1` to delete meta data instead of sources.
+        example: 1
+      - in: query
+        name: comment
+        schema:
+          type: string
+        description: A comment that will appear in the package's comment section explaining
+          the reason behind the deletion of the file.
+        example: File deleted because it is useless.
+      - in: query
+        name: keeplink
+        schema:
+          type: string
+          enum:
+          - 1
+          - 0
+        default: 0
+        description: Set to `1` to preserve the link (`_link` file) on the source.
+        example: 1
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: |
+            Not Found.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: home:some_project'
+                Unknown Package:
+                  value:
+                    code: unknown_package
+                    summary: 'Package not found: home:some_project/some_package'
+                Unknown File:
+                  value:
+                    code: unknown_file
+                    summary: 'File not found: home:some_project/some_package/some_file'
+      tags:
+      - Sources - Files
+    put:
+      summary: Write a specified source file into a package.
+      description: Write a specified source file of a package of a project.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: package_name
+        schema:
+          type: string
+        required: true
+        description: Package name
+        example: ctris
+      - in: path
+        name: file_name
+        schema:
+          type: string
+        required: true
+        description: The file name
+        example: ctris-0.42.1-4.1.x86_64.rpm
+      - in: query
+        name: rev
+        schema:
+          type: string
+        description: |
+          If set to 'upload', multiple files can be uploaded in just one commit.
+          Upload first the files with `rev=upload`, then close the single commit by another request call with `cmd=commit`
+        example: upload
+      - in: query
+        name: meta
+        schema:
+          type: integer
+          enum:
+          - 1
+          - 0
+        description: Set to `1` to write meta data instead of sources.
+        example: 1
+      - in: query
+        name: comment
+        schema:
+          type: string
+        description: A comment that will appear in the package's comment section explaining
+          the reason behind the creation of the new file.
+        example: Added new configuration file.
+      - in: query
+        name: keeplink
+        schema:
+          type: string
+          enum:
+          - 1
+          - 0
+        default: 0
+        description: Set to `1` to preserve the link (`_link` file) on the source.
+        example: 1
+      requestBody:
+        content:
+          plain/text:
+            schema:
+              type: string
+              properties:
+                file:
+                  type: string
+                  format: binary
+      responses:
+        '200':
+          description: Updates the artifact's file contents
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  rev:
+                    type: string
+                    xml:
+                      attribute: true
+                  vrev:
+                    type: string
+                    xml:
+                      attribute: true
+                  srcmd5:
+                    type: string
+                  version:
+                    type: string
+                  time:
+                    type: string
+                  user:
+                    type: string
+                  comment:
+                    type: string
+                  requestid:
+                    type: string
+                xml:
+                  name: revision
+              example:
+                rev: 28
+                vrev: 28
+                srcmd5: 2e0bd85c089953743bd30eeacf70989b
+                version: 1
+                time: 1678787266
+                user: Admin
+                comment: 
+                requestid: 
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: |
+            Not Found.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: home:some_project'
+                Unknown Package:
+                  value:
+                    code: unknown_package
+                    summary: 'Package not found: home:some_project/some_package'
+                Unknown File:
+                  value:
+                    code: unknown_file
+                    summary: 'File not found: home:some_project/some_package/some_file'
+      tags:
+      - Sources - Files
+  "/source/{project_name}/{package_name}/{binary_filename}/_attribute/{attribute_name}":
+    get:
+      summary: Get values of an attribute
+      description: Get attribute and attribute values of a given attribute and binary
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: package_name
+        schema:
+          type: string
+        required: true
+        description: Package name
+        example: ctris
+      - in: path
+        name: binary_filename
+        schema:
+          type: string
+        required: true
+        description: Binary filename
+        example: ctris-0.42.1-8.1.x86_64.rpm
+      - in: path
+        name: attribute_name
+        schema:
+          type: string
+        required: true
+        description: The name of the attribute
+        example: OBS:OwnerRootProjectTest
+      responses:
+        '200':
+          description: OK. The request has succeeded.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: array
+                items:
+                  type: object
+                  properties:
+                    name:
+                      type: string
+                      xml:
+                        attribute: true
+                    namespace:
+                      type: string
+                      xml:
+                        attribute: true
+                    binary:
+                      type: string
+                      xml:
+                        attribute: true
+                  xml:
+                    name: attribute
+                xml:
+                  name: attributes
+                  wrapped: true
+              example:
+                name: AllowSubmitToMaintenanceRelease
+                namespace: OBS
+                binary: Ceph
+        '400':
+          description: Bad request
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                invalid_attribute:
+                  value:
+                    code: invalid_attribute
+                    summary: Attribute '{attribute_name}' must be in the $NAMESPACE:$NAME
+                      style
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: |
+            Not Found.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: home:some_project'
+                Unknown Package:
+                  value:
+                    code: unknown_package
+                    summary: 'Package not found: home:some_project/some_package'
+                Unknown Attribute:
+                  value:
+                    code: unknown_attribute
+                    summary: Attribute some_attribute does not exist
+      tags:
+      - Sources - Files
+    delete:
+      summary: Removes a specified attribute
+      description: Removes a specified attribute from a package
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: package_name
+        schema:
+          type: string
+        required: true
+        description: Package name
+        example: ctris
+      - in: path
+        name: binary_filename
+        schema:
+          type: string
+        required: true
+        description: Binary filename
+        example: ctris-0.42.1-8.1.x86_64.rpm
+      - in: path
+        name: attribute_name
+        schema:
+          type: string
+        required: true
+        description: The name of the attribute
+        example: OBS:OwnerRootProjectTest
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '400':
+          description: Wrong value for deleted parameter.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                invalid_attribute:
+                  value:
+                    code: invalid_attribute
+                    summary: Attribute 'OwnerRootProjectTest' must be in the $NAMESPACE:$NAME
+                      style
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: |
+            Not Found.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: home:some_project'
+                Unknown Package:
+                  value:
+                    code: unknown_package
+                    summary: 'Package not found: home:some_project/some_package'
+                Unknown Attribute:
+                  value:
+                    code: unknown_attribute
+                    summary: Attribute some_attribute does not exist
+      tags:
+      - Sources - Files
+  "/source/{project_name}/{package_name}/{binary_filename}/_attribute":
+    get:
+      summary: Get list of attributes and attribute values with binary parameter
+      description: Get a list of all attributes and their values for a given binary
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: package_name
+        schema:
+          type: string
+        required: true
+        description: Package name
+        example: ctris
+      - in: path
+        name: binary_filename
+        schema:
+          type: string
+        required: true
+        description: Binary filename
+        example: ctris-0.42.1-8.1.x86_64.rpm
+      responses:
+        '200':
+          description: OK. The request has succeeded.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: array
+                items:
+                  type: object
+                  properties:
+                    name:
+                      type: string
+                      xml:
+                        attribute: true
+                    namespace:
+                      type: string
+                      xml:
+                        attribute: true
+                    binary:
+                      type: string
+                      xml:
+                        attribute: true
+                  xml:
+                    name: attribute
+                xml:
+                  name: attributes
+                  wrapped: true
+              example:
+              - name: AllowSubmitToMaintenanceRelease
+                namespace: OBS
+                binary: SLES-cd-DVD-x86_64
+              - name: OwnerRootProjectTest
+                namespace: OBS
+                binary: Ceph
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: |
+            Not Found.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: home:some_project'
+                Unknown Package:
+                  value:
+                    code: unknown_package
+                    summary: 'Package not found: home:some_project/some_package'
+      tags:
+      - Sources - Files
+    post:
+      summary: Add an attribute
+      description: Add an attribute with binary to a package
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: package_name
+        schema:
+          type: string
+        required: true
+        description: Package name
+        example: ctris
+      - in: path
+        name: binary_filename
+        schema:
+          type: string
+        required: true
+        description: Binary filename
+        example: ctris-0.42.1-8.1.x86_64.rpm
+      requestBody:
+        description: Attributes you want to update
+        content:
+          application/xml; charset=utf-8:
+            schema:
+              type: array
+              items:
+                type: object
+                properties:
+                  name:
+                    type: string
+                    xml:
+                      attribute: true
+                  namespace:
+                    type: string
+                    xml:
+                      attribute: true
+                  binary:
+                    type: string
+                    xml:
+                      attribute: true
+                xml:
+                  name: attribute
+              xml:
+                name: attributes
+                wrapped: true
+            example:
+              name: MaintenanceProject
+              namespace: OBS
+              binary: Ceph
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: |
+            Not Found.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: home:some_project'
+                Unknown Package:
+                  value:
+                    code: unknown_package
+                    summary: 'Package not found: home:some_project/some_package'
+      tags:
+      - Sources - Files
+  "/staging/{project_name}/backlog":
+    get:
+      summary: List the requests in the staging backlog.
+      description: List the requests that can be assigned to the staging project (backlog).
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      responses:
+        '200':
+          description: List of request in the staging backlog.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  request:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        id:
+                          type: integer
+                          example: 42
+                          xml:
+                            attribute: true
+                        creator:
+                          type: string
+                          example: foo-user
+                          xml:
+                            attribute: true
+                        type:
+                          type: string
+                          example: submit
+                          xml:
+                            attribute: true
+                        state:
+                          type: string
+                          example: review
+                          xml:
+                            attribute: true
+                        package:
+                          type: string
+                          example: hello_world
+                          xml:
+                            attribute: true
+                        superseded_by:
+                          type: integer
+                          example: 43
+                          xml:
+                            attribute: true
+                        updated:
+                          type: string
+                          example: '2023-04-24T08:34:39Z'
+                          xml:
+                            attribute: true
+                xml:
+                  name: backlog
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: Not Found
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                project_without_staging_workflow:
+                  value:
+                    code: not_found
+                    sumary: Project project_name doesn't have an associated Staging
+                      Workflow
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: <some project>.'
+      tags:
+      - Staging Workflow
+  "/staging/{project_name}/excluded_requests":
+    get:
+      summary: List the requests excluded from a staging workflow.
+      description: List the requests excluded from the staging workflow associated
+        to the specified project.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      responses:
+        '200':
+          description: List of requests that are excluded from the staging workflow
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  request:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        id:
+                          type: integer
+                          example: 42
+                          xml:
+                            attribute: true
+                        description:
+                          type: string
+                          example: Missing dependencies
+                          xml:
+                            attribute: true
+                xml:
+                  name: excluded_requests
+        '404':
+          description: Not Found
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                project_without_staging_workflow:
+                  value:
+                    code: not_found
+                    sumary: Project project_name doesn't have an associated Staging
+                      Workflow
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: <some project>.'
+      tags:
+      - Staging Workflow
+    post:
+      summary: Exclude requests from the staging workflow.
+      description: Add requests to the list of excluded requests of the staging workflow
+        associated to the specified project.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      requestBody:
+        description: List of requests to be excluded from the staging workflow
+        content:
+          application/xml; charset=utf-8:
+            schema:
+              type: object
+              properties:
+                request:
+                  type: array
+                  items:
+                    type: object
+                    properties:
+                      id:
+                        type: integer
+                        example: 42
+                        xml:
+                          attribute: true
+                      description:
+                        type: string
+                        example: Missing dependencies
+                        xml:
+                          attribute: true
+              xml:
+                name: excluded_requests
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '400':
+          description: |
+            Bad Request.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng).
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Excluding Failed:
+                  value:
+                    code: invalid_request
+                    summary: 'Excluding requests for project_name failed:'
+                Invalid XML Format:
+                  value:
+                    code: invalid_xml_format
+                    summary: XML format is not valid
+                Empty Body:
+                  value:
+                    code: invalid_request
+                    summary: Empty body
+        '404':
+          description: Not Found
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                project_without_staging_workflow:
+                  value:
+                    code: not_found
+                    sumary: Project project_name doesn't have an associated Staging
+                      Workflow
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: <some project>.'
+      tags:
+      - Staging Workflow
+    delete:
+      summary: Delete the specified requests from the list of excluded requests.
+      description: Stop excluding the requests from the staging workflow.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      requestBody:
+        description: List of requests to stop excluding from the staging workflow
+        content:
+          application/xml; charset=utf-8:
+            schema:
+              type: object
+              properties:
+                request:
+                  type: array
+                  items:
+                    type: object
+                    properties:
+                      id:
+                        type: integer
+                        example: 42
+                        xml:
+                          attribute: true
+                      description:
+                        type: string
+                        example: Missing dependencies
+                        xml:
+                          attribute: true
+              xml:
+                name: excluded_requests
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '400':
+          description: |
+            Bad Request.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng).
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Invalid Request:
+                  value:
+                    code: invalid_request
+                    summary: 'Error while unexcluding requests: Requests with number
+                      ID are not excluded.'
+                Invalid XML Format:
+                  value:
+                    code: invalid_xml_format
+                    summary: XML format is not valid
+                Empty Body:
+                  value:
+                    code: invalid_request
+                    summary: Empty body
+        '404':
+          description: Not Found
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                project_without_staging_workflow:
+                  value:
+                    code: not_found
+                    sumary: Project project_name doesn't have an associated Staging
+                      Workflow
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: <some project>.'
+      tags:
+      - Staging Workflow
+  "/staging/{project_name}/staged_requests":
+    delete:
+      summary: Delete requests from any of the staging projects.
+      description: Delete the given requests from any of the staging projects they
+        were staged in.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      requestBody:
+        description: List of requests to be deleted.
+        content:
+          application/xml; charset=utf-8:
+            schema:
+              type: object
+              properties:
+                request:
+                  type: array
+                  items:
+                    type: object
+                    properties:
+                      id:
+                        type: integer
+                        example: 42
+                        xml:
+                          attribute: true
+              xml:
+                name: requests
+            examples:
+              Multiple Requests:
+                value:
+                  request:
+                  - id: 1
+                  - id: 2
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '400':
+          description: |
+            Bad Request.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng).
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Request Not Staged:
+                  value:
+                    code: invalid_request
+                    summary: 'Error while unassigning requests: Request ''ID'' is
+                      not staged'
+                Request Not In Staging:
+                  value:
+                    code: invalid_request
+                    summary: 'Error while unassigning requests: Requests with number:
+                      ID don''t belong to Staging: project_name'
+                Unknown Request:
+                  value:
+                    code: invalid_request
+                    summary: 'Error while unassigning requests: Requests with number:
+                      212 don''t exist'
+                Wrong Request Number:
+                  value:
+                    code: invalid_request
+                    summary: Error while parsing the numbers of the requests
+                Invalid XML Format:
+                  value:
+                    code: invalid_xml_format
+                    summary: XML format is not valid
+                Empty Body:
+                  value:
+                    code: invalid_request
+                    summary: Empty body
+        '404':
+          description: Not Found
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Without Staging Workflow:
+                  value:
+                    code: not_found
+                    sumary: Project project_name doesn't have an associated Staging
+                      Workflow
+                Unknown Project:
+                  value:
+                    code: not_found
+                    summary: Project 'project_name' not found.
+      tags:
+      - Staging Workflow
+  "/staging/{project_name}/staging_projects":
+    get:
+      summary: List all the staging projects of a staging workflow.
+      description: |
+        List the staging projects of the staging workflow associated to the specified project.
+        Extra information can be requested by adding any combination of these parameters in the URL: `requests`, `status` and `history`.
+        - If `requests` is present, the output includes the staged, untracked and obsolete requests as well as missing reviews.
+        - If `status` is present, the output includes the overall state and the status xml (broken packages, missing reviews, checks, etc.)
+        - If `history` is present, the output includes the history of the staging project.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - name: requests
+        in: query
+        schema:
+          type: string
+          example: 1
+        description: '"Set to `1` if you want to include the staged, untracked and
+          obsolete requests as well as missing reviews, otherwise don''t pass this
+          query parameter."
+
+'
+      - name: status
+        in: query
+        schema:
+          type: string
+          example: 1
+        description: '"Set to `1` if you want to include the overall state and the
+          status xml (broken packages, missing reviews, checks, etc.), otherwise don''t
+          pass this query parameter"
+
+'
+      - name: history
+        in: query
+        schema:
+          type: string
+          example: 1
+        description: Set to `1` if you want to include the history of the staging
+          project, otherwise don't pass this query parameter.
+      responses:
+        '200':
+          description: OK. The request has succeeded.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  staging_project:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        name:
+                          type: string
+                          example: openSUSE:Factory
+                          xml:
+                            attribute: true
+                        state:
+                          type: string
+                          example: empty
+                          xml:
+                            attribute: true
+                        staged_requests:
+                          type: object
+                          properties:
+                            count:
+                              type: integer
+                              example: 0
+                              xml:
+                                attribute: true
+                        untracked_requests:
+                          type: object
+                          properties:
+                            count:
+                              type: integer
+                              example: 0
+                              xml:
+                                attribute: true
+                        obsolete_requests:
+                          type: object
+                          properties:
+                            count:
+                              type: integer
+                              example: 0
+                              xml:
+                                attribute: true
+                        missing_reviews:
+                          type: object
+                          properties:
+                            count:
+                              type: integer
+                              example: 0
+                              xml:
+                                attribute: true
+                        building_repositories:
+                          type: object
+                          properties:
+                            count:
+                              type: integer
+                              example: 0
+                              xml:
+                                attribute: true
+                        broken_packages:
+                          type: object
+                          properties:
+                            count:
+                              type: integer
+                              example: 0
+                              xml:
+                                attribute: true
+                        checks:
+                          type: object
+                          properties:
+                            count:
+                              type: integer
+                              example: 0
+                              xml:
+                                attribute: true
+                        missing_checks:
+                          type: object
+                          properties:
+                            count:
+                              type: integer
+                              example: 0
+                              xml:
+                                attribute: true
+                        history:
+                          type: object
+                          properties:
+                            count:
+                              type: integer
+                              example: 0
+                              xml:
+                                attribute: true
+                      xml:
+                        name: staging_project
+                xml:
+                  name: staging_projects
+              examples:
+                Simple Result:
+                  value:
+                    staging_project:
+                    - name: openSUSE:Factory:Staging:A
+                    - name: openSUSE:Factory:Staging:B
+                Detailed Result:
+                  value:
+                    staging_project:
+                      name: openSUSE:Factory:Staging:A
+                      state: empty
+                      staged_requests:
+                        count: 0
+                      untracked_requests:
+                        count: 0
+                      obsolete_requests:
+                        count: 0
+                      missing_reviews:
+                        count: 0
+                      building_repositories:
+                        count: 0
+                      broken_packages:
+                        count: 0
+                      checks:
+                        count: 0
+                      missing_checks:
+                        count: 0
+                      history:
+                        count: 0
+        '404':
+          description: Not Found
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Project Without Staging Workflow:
+                  value:
+                    code: project_has_no_staging_workflow
+                    summary: No staging workflow for project 'project_name'
+                Unknown Project:
+                  value:
+                    code: not_found
+                    summary: Project 'project_name' not found.
+      tags:
+      - Staging Workflow
+    post:
+      summary: Create staging projects
+      description: Create staging projects on the staging workflow associated to the
+        specified project
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      requestBody:
+        description: List of the names of the staging projects you want to add to
+          the staging workflow
+        content:
+          application/xml; charset=utf-8:
+            schema:
+              type: object
+              properties:
+                staging_project:
+                  type: array
+                  items:
+                    type: string
+                    example: openSUSE:Factory:Staging:C
+              xml:
+                name: workflow
+            examples:
+              Multiple Staging Projects:
+                value:
+                  staging_project:
+                  - openSUSE:Factory:Staging:C
+                  - openSUSE:Factory:Staging:D
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '400':
+          description: |
+            Bad Request.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng).
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Invalid Project Name:
+                  value:
+                    code: invalid_request
+                    summary: 'Staging Projects for package_name failed: Project "0":
+                      Name is illegal.'
+                Already Assigned:
+                  value:
+                    code: invalid_request
+                    summary: 'Staging Projects for project_name failed: Project "project_name":
+                      is already assigned to a staging workflow.'
+        '404':
+          description: Not Found
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Project Without Staging Workflow:
+                  value:
+                    code: not_found
+                    summary: Project project_name doesn't have an associated Staging
+                      Workflow
+                Unknown Project:
+                  value:
+                    code: not_found
+                    summary: Project 'project_name' not found.
+      tags:
+      - Staging Workflow
+  "/staging/{project_name}/staging_projects/{staging_project_name}":
+    get:
+      summary: Gets the overall state of a staging project.
+      description: |
+        Extra information can be requested by adding any combination of these parameters in the URL: requests, status and history.
+        - If requests is present, the output includes the staged, untracked and obsolete requests as well as missing reviews.
+        - If status is present, the output includes the overall state and the status xml (broken packages, missing reviews, checks, etc.)
+        - If history is present, the output includes the history of the staging project.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: staging_project_name
+        schema:
+          type: string
+        required: true
+        description: Staging Project Name
+        example: openSUSE:Factory:Staging:A
+      - name: requests
+        in: query
+        schema:
+          type: string
+          enum:
+          - 1
+        description: 'Set to `1` if you want to include the staged, untracked and
+          obsolete requests as well as missing reviews, otherwise don''t pass this
+          query parameter.
+
+'
+      - name: status
+        in: query
+        schema:
+          type: string
+          enum:
+          - 1
+        description: 'Set to `1` if you want to include the overall state and the
+          status xml (broken packages, missing reviews, checks, etc.), otherwise don''t
+          pass this query parameter.
+
+'
+      - name: history
+        in: query
+        schema:
+          type: string
+          enum:
+          - 1
+        description: Set to `1` if you want to include the history of the staging
+          project, otherwise don't pass this query parameter.
+      responses:
+        '200':
+          description: Get the state of a staging project.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  name:
+                    type: string
+                    example: openSUSE:Factory
+                    xml:
+                      attribute: true
+                  state:
+                    type: string
+                    example: empty
+                    xml:
+                      attribute: true
+                  staged_requests:
+                    type: object
+                    properties:
+                      count:
+                        type: integer
+                        example: 0
+                        xml:
+                          attribute: true
+                  untracked_requests:
+                    type: object
+                    properties:
+                      count:
+                        type: integer
+                        example: 0
+                        xml:
+                          attribute: true
+                  obsolete_requests:
+                    type: object
+                    properties:
+                      count:
+                        type: integer
+                        example: 0
+                        xml:
+                          attribute: true
+                  missing_reviews:
+                    type: object
+                    properties:
+                      count:
+                        type: integer
+                        example: 0
+                        xml:
+                          attribute: true
+                  building_repositories:
+                    type: object
+                    properties:
+                      count:
+                        type: integer
+                        example: 0
+                        xml:
+                          attribute: true
+                  broken_packages:
+                    type: object
+                    properties:
+                      count:
+                        type: integer
+                        example: 0
+                        xml:
+                          attribute: true
+                  checks:
+                    type: object
+                    properties:
+                      count:
+                        type: integer
+                        example: 0
+                        xml:
+                          attribute: true
+                  missing_checks:
+                    type: object
+                    properties:
+                      count:
+                        type: integer
+                        example: 0
+                        xml:
+                          attribute: true
+                  history:
+                    type: object
+                    properties:
+                      count:
+                        type: integer
+                        example: 0
+                        xml:
+                          attribute: true
+                xml:
+                  name: staging_project
+              example:
+                name: home:Iggy:Staging:A
+                state: empty
+                staged_requests:
+                  count: 0
+                untracked_requests:
+                  count: 0
+                obsolete_requests:
+                  count: 0
+                missing_reviews:
+                  count: 0
+                building_repositories:
+                  count: 0
+                broken_packages:
+                  count: 0
+                checks:
+                  count: 0
+                missing_checks:
+                  count: 0
+                history:
+                  count: 0
+        '404':
+          description: Not Found.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                not_found:
+                  summary: Staging Workflow Project Not Found
+                  value:
+                    code: not_found
+                    summary: Project home:Adminn not found.
+                staging_project_not_found:
+                  summary: Staging Project Name Not Found
+                  value:
+                    code: staging_project_not_found
+                    details: Staging Project "home:Admin:Staging:AA" does not exist.
+      tags:
+      - Staging Workflow
+  "/staging/{project_name}/staging_projects/{staging_project_name}/accept":
+    post:
+      summary: Accept a staging project
+      description: |
+        This accepts all staged requests and sets the project state back to 'empty'.
+        Will return in an error if staging project is not acceptable, unless force is given. You can force
+        accept staging projects with building or failing packages, but not with missing reviews
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: staging_project_name
+        schema:
+          type: string
+        required: true
+        description: Staging Project Name
+        example: openSUSE:Factory:Staging:A
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '400':
+          description: Bad Request.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                staging_project_not_in_acceptable_state:
+                  summary: Staging Project is not in an acceptable state
+                  value:
+                    code: staging_project_not_in_acceptable_state
+                    summary: 'Staging Project is not acceptable: empty is not an acceptable
+                      state'
+        '404':
+          description: Not Found.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                not_found:
+                  summary: Staging Workflow Project Not Found
+                  value:
+                    code: not_found
+                    summary: Project home:Adminn not found.
+                staging_project_not_found:
+                  summary: Staging Project Name Not Found
+                  value:
+                    code: staging_project_not_found
+                    details: Staging Project "home:Admin:Staging:AA" does not exist.
+      tags:
+      - Staging Workflow
+  "/staging/{project_name}/staging_projects/{staging_project_name}/copy/{staging_project_copy_name}":
+    post:
+      summary: Copy a staging project
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: staging_project_name
+        schema:
+          type: string
+        required: true
+        description: Staging Project Name
+        example: openSUSE:Factory:Staging:A
+      - in: path
+        name: staging_project_copy_name
+        schema:
+          type: string
+        required: true
+        description: The name of the staging project's copy
+        example: openSUSE:Factory:Staging:B
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '404':
+          description: Not Found.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                not_found:
+                  summary: Staging Workflow Project Not Found
+                  value:
+                    code: not_found
+                    summary: Project home:Adminn not found.
+                staging_project_not_found:
+                  summary: Staging Project Name Not Found
+                  value:
+                    code: staging_project_not_found
+                    details: Staging Project "home:Admin:Staging:AA" does not exist.
+      tags:
+      - Staging Workflow
+  "/staging/{project_name}/staging_projects/{staging_project_name}/staged_requests":
+    get:
+      summary: List all the staged requests of a staging project.
+      description: List all the requests that are already associated to a staging
+        project (staged requests).
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: staging_project_name
+        schema:
+          type: string
+        required: true
+        description: Staging Project Name
+        example: openSUSE:Factory:Staging:A
+      responses:
+        '200':
+          description: List of staged requests.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  request:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        id:
+                          type: integer
+                          example: 42
+                          xml:
+                            attribute: true
+                        creator:
+                          type: string
+                          example: foo-user
+                          xml:
+                            attribute: true
+                        type:
+                          type: string
+                          example: submit
+                          xml:
+                            attribute: true
+                        state:
+                          type: string
+                          example: review
+                          xml:
+                            attribute: true
+                        package:
+                          type: string
+                          example: hello_world
+                          xml:
+                            attribute: true
+                        superseded_by:
+                          type: integer
+                          example: 43
+                          xml:
+                            attribute: true
+                        updated:
+                          type: string
+                          example: '2023-04-24T08:34:39Z'
+                          xml:
+                            attribute: true
+                xml:
+                  name: staged_requests
+              examples:
+                Multiple Requests:
+                  value:
+                    request:
+                    - id: 1
+                      creator: Iggy
+                      type: submit
+                      state: accepted
+                      package: package_a
+                      updated_at: '2023-04-24T08:34:39Z'
+                    - id: 2
+                      creator: Dan
+                      type: submit
+                      state: review
+                      package: package_b
+                      superseded_by: 3
+                      updated_at: '2022-02-22T02:22:22Z'
+        '404':
+          description: Not Found
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Project Without Staging Workflow:
+                  value:
+                    code: not_found
+                    summary: Project project_name doesn't have an associated Staging
+                      Workflow
+                Unknown Staging Project:
+                  value:
+                    code: not_found
+                    summary: 'Staging Project ''staging_project_name'' not found in
+                      Staging: ''project_name'''
+                Unknown Project:
+                  value:
+                    code: not_found
+                    summary: Project 'project_name' not found.
+      tags:
+      - Staging Workflow
+    post:
+      summary: Add requests to the staging project.
+      description: |
+        Add requests to the specified staging project except those that are excluded from the staging workflow.
+        Pass `remove_exclusion` to stop excluding the requests before adding them to the staging project.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: staging_project_name
+        schema:
+          type: string
+        required: true
+        description: Staging Project Name
+        example: openSUSE:Factory:Staging:A
+      - in: query
+        name: remove_exclusion
+        schema:
+          type: string
+        description: |
+          Set to `1` if you want to stop excluding the specified requests before you add them to the staging project.
+          Don't pass this parameter to only stage the requests that are not excluded.
+        example: 1
+      requestBody:
+        description: List of requests to be added to the staging project.
+        content:
+          application/xml; charset=utf-8:
+            schema:
+              type: object
+              properties:
+                request:
+                  type: array
+                  items:
+                    type: object
+                    properties:
+                      id:
+                        type: integer
+                        example: 42
+                        xml:
+                          attribute: true
+              xml:
+                name: requests
+            examples:
+              Multiple Requests:
+                value:
+                  request:
+                  - id: 1
+                  - id: 2
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '400':
+          description: |
+            Bad Request.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng).
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                With Excluded Requests:
+                  value:
+                    code: invalid_request
+                    summary: 'Request ID currently excluded from project project_name.
+                      Use --remove-exclusion if you want to force this action.
+
+'
+                Unknown Request:
+                  value:
+                    code: invalid_request
+                    summary: Request ID doesn't exist
+                Invalid XML Format:
+                  value:
+                    code: invalid_xml_format
+                    summary: XML format is not valid
+                Empty Body:
+                  value:
+                    code: invalid_request
+                    summary: Empty body
+        '404':
+          description: Not Found
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Without Staging Workflow:
+                  value:
+                    code: not_found
+                    sumary: Project project_name doesn't have an associated Staging
+                      Workflow
+                Unknown Staging Project:
+                  value:
+                    code: not_found
+                    summary: 'Staging Project ''project_name:Staging:G'' not found
+                      in Staging: ''project_name'''
+                Unknown Project:
+                  value:
+                    code: not_found
+                    summary: Project 'project_name' not found.
+        '424':
+          description: Unacceptable State
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unacceptable State:
+                  value:
+                    code: staging_project_not_in_acceptable_state
+                    sumary: 'Can''t change staged requests: Project ''project_name''
+                      is being accepted.'
+      tags:
+      - Staging Workflow
+    delete:
+      summary: Delete requests from the staging project.
+      description: Delete the given requests from the staging project they were staged
+        in.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: staging_project_name
+        schema:
+          type: string
+        required: true
+        description: Staging Project Name
+        example: openSUSE:Factory:Staging:A
+      requestBody:
+        description: List of requests to be removed from the staging project.
+        content:
+          application/xml; charset=utf-8:
+            schema:
+              type: object
+              properties:
+                request:
+                  type: array
+                  items:
+                    type: object
+                    properties:
+                      id:
+                        type: integer
+                        example: 42
+                        xml:
+                          attribute: true
+              xml:
+                name: requests
+            examples:
+              Multiple Requests:
+                value:
+                  request:
+                  - id: 1
+                  - id: 2
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '400':
+          description: |
+            Bad Request.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng).
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Request Not Staged:
+                  value:
+                    code: invalid_request
+                    summary: 'Error while unassigning requests: Request ''ID'' is
+                      not staged'
+                Request Not In Staging:
+                  value:
+                    code: invalid_request
+                    summary: 'Error while unassigning requests: Requests with number:
+                      ID don''t belong to Staging: project_name'
+                Wrong Request Number:
+                  value:
+                    code: invalid_request
+                    summary: Error while parsing the numbers of the requests
+                Invalid XML Format:
+                  value:
+                    code: invalid_xml_format
+                    summary: XML format is not valid
+                Empty Body:
+                  value:
+                    code: invalid_request
+                    summary: Empty body
+        '404':
+          description: Not Found
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Without Staging Workflow:
+                  value:
+                    code: not_found
+                    sumary: Project project_name doesn't have an associated Staging
+                      Workflow
+                Unknown Project:
+                  value:
+                    code: not_found
+                    summary: Project 'project_name' not found.
+      tags:
+      - Staging Workflow
+  "/staging/{project_name}/workflow":
+    post:
+      summary: Create a staging workflow for the specified project
+      description: Create a staging workflow associated to the project and the manager
+        group specified in the body of the request
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      requestBody:
+        description: Title of the staging workflow's managers group
+        content:
+          application/xml; charset=utf-8:
+            schema:
+              type: object
+              properties:
+                managers:
+                  type: string
+                  example: group-test
+                  xml:
+                    attribute: true
+              xml:
+                name: workflow
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '400':
+          description: |
+            Bad Request.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng).
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Staging Workflow Exists:
+                  description: The project is already associated to a staging workflow
+                  value:
+                    code: staging_workflow_exists
+                    summary: 'Project project_name already has an associated Staging
+                      Workflow with id: ID'
+                Invalid XML Format:
+                  value:
+                    code: invalid_xml_format
+                    summary: XML format is not valid
+                Empty Body:
+                  value:
+                    code: invalid_request
+                    summary: Empty body
+                Invalid Request:
+                  value:
+                    code: invalid_request
+                    summary: 'Staging for project_name couldn''t be created:'
+        '404':
+          description: |
+            Unknown project.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: <some project>.'
+      tags:
+      - Staging Workflow
+    put:
+      summary: Change the managers group of a staging workflow
+      description: Change the managers group of the staging workflow associated to
+        the specified project.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      requestBody:
+        description: Title of the staging workflow's managers group
+        content:
+          application/xml; charset=utf-8:
+            schema:
+              type: object
+              properties:
+                managers:
+                  type: string
+                  example: group-test
+                  xml:
+                    attribute: true
+              xml:
+                name: workflow
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '400':
+          description: |
+            Bad Request.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng).
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Invalid XML Format:
+                  value:
+                    code: invalid_xml_format
+                    summary: XML format is not valid
+                Empty Body:
+                  value:
+                    code: invalid_request
+                    summary: Empty body
+                Invalid Request:
+                  value:
+                    code: invalid_request
+                    summary: 'Staging for project_name couldn''t be updated:'
+        '404':
+          description: Not Found
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                project_without_staging_workflow:
+                  value:
+                    code: not_found
+                    sumary: Project project_name doesn't have an associated Staging
+                      Workflow
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: <some project>.'
+      tags:
+      - Staging Workflow
+    delete:
+      summary: Delete the staging workflow of the specified project
+      description: |
+        Delete the staging workflow associated to the given project (a.k.a staging workflow project).
+        The staging projects associated to that workflow are not removed unless the parameter `with_staging_projects` is given.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - name: with_staging_projects
+        in: query
+        schema:
+          type: integer
+        description: |
+          Set to `1` if you want to delete all the staging projects associated to the staging workflow when it is deleted.
+          Staging projects' names usually look like: project_name:Staging:A, project_name:Staging:B etc.
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: Not Found
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                project_without_staging_workflow:
+                  value:
+                    code: not_found
+                    sumary: Project project_name doesn't have an associated Staging
+                      Workflow
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: <some project>.'
+      tags:
+      - Staging Workflow
+  "/statistics":
+    get:
+      deprecated: true
+      summary: This endpoint is deprecated
+      description: This endpoint is no longer supported or might not work as expected.
+      tags:
+      - Statistics
+  "/statistics/active_request_creators/{project_name}":
+    get:
+      deprecated: true
+      summary: This endpoint is deprecated
+      description: This endpoint is no longer supported or might not work as expected.
+      tags:
+      - Statistics
+  "/statistics/activity/{project_name}/{package_name}":
+    get:
+      deprecated: true
+      summary: This endpoint is deprecated
+      description: This endpoint is no longer supported or might not work as expected.
+      tags:
+      - Statistics
+  "/statistics/added_timestamp/{project_name}/{package_name}":
+    get:
+      deprecated: true
+      summary: This endpoint is deprecated
+      description: This endpoint is no longer supported or might not work as expected.
+      tags:
+      - Statistics
+  "/statistics/global_counters":
+    get:
+      deprecated: true
+      summary: This endpoint is deprecated
+      description: This endpoint is no longer supported or might not work as expected.
+      tags:
+      - Statistics
+  "/statistics/latest_added":
+    get:
+      summary: Get a list of last added project and packages
+      description: Get a list of last added project and packages
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: query
+        name: limit
+        schema:
+          type: integer
+        description: Override default maximum value of 10 entries to be returned.
+        example: 20
+      responses:
+        '200':
+          description: OK. The request has succeeded.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  project:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        name:
+                          type: string
+                          xml:
+                            attribute: true
+                        packages:
+                          type: integer
+                          xml:
+                            attribute: true
+                        activity:
+                          type: number
+                          xml:
+                            attribute: true
+                        created:
+                          type: string
+                          xml:
+                            attribute: true
+                        updated:
+                          type: string
+                          xml:
+                            attribute: true
+                  package:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        project:
+                          type: string
+                          xml:
+                            attribute: true
+                        name:
+                          type: string
+                          xml:
+                            attribute: true
+                        activity:
+                          type: number
+                          xml:
+                            attribute: true
+                        created:
+                          type: string
+                          xml:
+                            attribute: true
+                        updated:
+                          type: string
+                          xml:
+                            attribute: true
+                      xml:
+                        name: package
+                xml:
+                  name: latest_added
+              example:
+                package:
+                - name: pgbackrest
+                  project: openSUSE:Factory:Staging:adi:24
+                  created: '2023-06-01T07:07:24Z'
+                project:
+                - name: openSUSE:Factory:Staging:adi:24
+                  created: '2023-06-01T07:07:22Z'
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+      tags:
+      - Statistics
+  "/statistics/latest_updated":
+    get:
+      summary: Get a list of last updated project and packages
+      description: Get a list of last updated project and packages
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: query
+        name: limit
+        schema:
+          type: integer
+        description: Override default maximum value of 10 entries to be returned.
+        example: 20
+      - in: query
+        name: timelimit
+        schema:
+          type: integer
+        description: Limit the maximum age to this number of days.
+        example: 1
+      - in: query
+        name: prjfilter
+        schema:
+          type: string
+        description: Filter by project name.
+        example: openSUSE:Factory
+      - in: query
+        name: pkgfilter
+        schema:
+          type: string
+        description: Filter by package name.
+        example: 0ad
+      responses:
+        '200':
+          description: OK. The request has succeeded.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  project:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        name:
+                          type: string
+                          xml:
+                            attribute: true
+                        packages:
+                          type: integer
+                          xml:
+                            attribute: true
+                        activity:
+                          type: number
+                          xml:
+                            attribute: true
+                        created:
+                          type: string
+                          xml:
+                            attribute: true
+                        updated:
+                          type: string
+                          xml:
+                            attribute: true
+                  package:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        project:
+                          type: string
+                          xml:
+                            attribute: true
+                        name:
+                          type: string
+                          xml:
+                            attribute: true
+                        activity:
+                          type: number
+                          xml:
+                            attribute: true
+                        created:
+                          type: string
+                          xml:
+                            attribute: true
+                        updated:
+                          type: string
+                          xml:
+                            attribute: true
+                      xml:
+                        name: package
+                xml:
+                  name: latest_updated
+              example:
+                package:
+                - name: calc
+                  project: openSUSE:Factory:Staging:adi:26
+                  created: '2023-06-01T07:07:36Z'
+                project:
+                - name: openSUSE:Factory:Staging:adi:26
+                  created: '2023-06-01T07:07:27Z'
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+      tags:
+      - Statistics
+  "/statistics/maintenance_statistics/{project_name}":
+    get:
+      deprecated: true
+      summary: This endpoint is deprecated
+      description: This endpoint is no longer supported or might not work as expected.
+      tags:
+      - Statistics
+  "/statistics/most_active_packages":
+    get:
+      summary: Get a list of the most active packages
+      description: Get a list of the most active packages
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: query
+        name: limit
+        schema:
+          type: integer
+        description: Override default maximum value of 10 entries to be returned.
+        example: 20
+      responses:
+        '200':
+          description: OK. The request has succeeded.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  project:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        name:
+                          type: string
+                          xml:
+                            attribute: true
+                        packages:
+                          type: integer
+                          xml:
+                            attribute: true
+                        activity:
+                          type: number
+                          xml:
+                            attribute: true
+                        created:
+                          type: string
+                          xml:
+                            attribute: true
+                        updated:
+                          type: string
+                          xml:
+                            attribute: true
+                  package:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        project:
+                          type: string
+                          xml:
+                            attribute: true
+                        name:
+                          type: string
+                          xml:
+                            attribute: true
+                        activity:
+                          type: number
+                          xml:
+                            attribute: true
+                        created:
+                          type: string
+                          xml:
+                            attribute: true
+                        updated:
+                          type: string
+                          xml:
+                            attribute: true
+                      xml:
+                        name: package
+                xml:
+                  name: most_active
+              example:
+                package:
+                - activity: 1371.487973151121
+                  project: openSUSE:Factory:Staging
+                  name: dashboard
+                - activity: 1369.5483848725057
+                  project: home:repo-checker
+                  name: reports
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+      tags:
+      - Statistics
+  "/statistics/most_active_projects":
+    get:
+      summary: Get a list of the most active projects
+      description: Get a list of the most active projects
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: query
+        name: limit
+        schema:
+          type: integer
+        description: Override default maximum value of 10 entries to be returned.
+        example: 20
+      responses:
+        '200':
+          description: OK. The request has succeeded.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  project:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        name:
+                          type: string
+                          xml:
+                            attribute: true
+                        packages:
+                          type: integer
+                          xml:
+                            attribute: true
+                        activity:
+                          type: number
+                          xml:
+                            attribute: true
+                        created:
+                          type: string
+                          xml:
+                            attribute: true
+                        updated:
+                          type: string
+                          xml:
+                            attribute: true
+                  package:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        project:
+                          type: string
+                          xml:
+                            attribute: true
+                        name:
+                          type: string
+                          xml:
+                            attribute: true
+                        activity:
+                          type: number
+                          xml:
+                            attribute: true
+                        created:
+                          type: string
+                          xml:
+                            attribute: true
+                        updated:
+                          type: string
+                          xml:
+                            attribute: true
+                      xml:
+                        name: package
+                xml:
+                  name: most_active
+              example:
+                project:
+                - activity: 1371.492028553694
+                  packages: 1
+                  name: openSUSE:Factory:Staging
+                - activity: 1369.5524345398396
+                  packages: 2
+                  name: home:repo-checker
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+      tags:
+      - Statistics
+  "/statistics/updated_timestamp/{project_name}/{package_name}":
+    get:
+      deprecated: true
+      summary: This endpoint is deprecated
+      description: This endpoint is no longer supported or might not work as expected.
+      tags:
+      - Statistics
+  "/status/messages":
+    get:
+      summary: Get list of status messages
+      description: Get a list of all status messages
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: query
+        name: limit
+        schema:
+          type: integer
+        description: Override default maximum value of 1000 entries to be returned.
+        example: 20
+      responses:
+        '200':
+          description: OK. The request has succeeded.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  status_message:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        id:
+                          type: integer
+                          xml:
+                            attribute: true
+                        message:
+                          type: string
+                        user:
+                          type: string
+                        severity:
+                          type: string
+                        scope:
+                          type: string
+                        created_at:
+                          type: string
+                      xml:
+                        name: status_message
+                  count:
+                    type: integer
+                    xml:
+                      attribute: true
+                xml:
+                  name: status_messages
+              example:
+                count: 2
+                status_message:
+                - id: 2
+                  message: OBS 3.0 is released!
+                  user: Iggy
+                  severity: announcement
+                  scope: all_users
+                  created_at: 2021-10-15 13:28:22 UTC
+                - id: 1
+                  message: Feature number 42 was implemented!
+                  user: Iggy
+                  severity: announcement
+                  scope: all_users
+                  created_at: 2021-10-12 11:18:12 UTC
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+      tags:
+      - Status Messages
+    post:
+      summary: Create a status message
+      description: |
+        Create a new status message (Only admins are allowed to add status messages).
+
+        Possible values for severity: (information, green, yellow, red, announcement).
+
+        Possible values for scope: (all_users, logged_in_users, admin_users, in_beta_users, in_rollout_users)
+      security:
+      - basic_authentication: []
+      requestBody:
+        description: Attributes for status message
+        required: true
+        content:
+          application/xml; charset=utf-8:
+            schema:
+              type: object
+              properties:
+                id:
+                  type: integer
+                  xml:
+                    attribute: true
+                message:
+                  type: string
+                user:
+                  type: string
+                severity:
+                  type: string
+                scope:
+                  type: string
+                created_at:
+                  type: string
+              xml:
+                name: status_message
+            example:
+              message: Feature number 42 was implemented!
+              severity: announcement
+              scope: all_users
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '400':
+          description: Bad request. Validation Error
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Validation Failed:
+                  value:
+                    code: validation_failed
+                    summary: 'status_message validation error: 2:0: ERROR: Element
+                      ''<some element>'': No matching global declaration available
+                      for the validation root.'
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '403':
+          description: |
+            Status message no permission.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                status message no permission:
+                  value:
+                    code: put_request_no_permission
+                    summary: Requires admin privileges
+      tags:
+      - Status Messages
+  "/status_message":
+    get:
+      summary: Get list of status messages
+      description: Get a list of all status messages
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: query
+        name: limit
+        schema:
+          type: integer
+        description: Override default maximum value of 1000 entries to be returned.
+        example: 20
+      responses:
+        '200':
+          description: OK. The request has succeeded.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  status_message:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        id:
+                          type: integer
+                          xml:
+                            attribute: true
+                        message:
+                          type: string
+                        user:
+                          type: string
+                        severity:
+                          type: string
+                        scope:
+                          type: string
+                        created_at:
+                          type: string
+                      xml:
+                        name: status_message
+                  count:
+                    type: integer
+                    xml:
+                      attribute: true
+                xml:
+                  name: status_messages
+              example:
+                count: 2
+                status_message:
+                - id: 2
+                  message: OBS 3.0 is released!
+                  user: Iggy
+                  severity: announcement
+                  scope: all_users
+                  created_at: 2021-10-15 13:28:22 UTC
+                - id: 1
+                  message: Feature number 42 was implemented!
+                  user: Iggy
+                  severity: announcement
+                  scope: all_users
+                  created_at: 2021-10-12 11:18:12 UTC
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+      tags:
+      - Status Messages
+  "/status/messages/{id}":
+    get:
+      summary: Get a status message
+      description: Find a status message with id
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: id
+        required: true
+        schema:
+          type: integer
+      responses:
+        '200':
+          description: OK. The request has succeeded.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  id:
+                    type: integer
+                    xml:
+                      attribute: true
+                  message:
+                    type: string
+                  user:
+                    type: string
+                  severity:
+                    type: string
+                  scope:
+                    type: string
+                  created_at:
+                    type: string
+                xml:
+                  name: status_message
+              example:
+                id: 2
+                message: OBS 3.0 is released!
+                user: Iggy
+                severity: announcement
+                scope: all_users
+                created_at: 2021-10-15 13:28:22 UTC
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: |
+            Not Found.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Not Found:
+                  value:
+                    code: not_found
+                    summary: Couldn't find StatusMessage with 'id'=300
+      tags:
+      - Status Messages
+    delete:
+      summary: Delete a status message
+      description: Delete a status message with id
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: id
+        required: true
+        schema:
+          type: integer
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '403':
+          description: |
+            Status message no permission.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                status message no permission:
+                  value:
+                    code: put_request_no_permission
+                    summary: Requires admin privileges
+        '404':
+          description: |
+            Not Found.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Not Found:
+                  value:
+                    code: not_found
+                    summary: Couldn't find StatusMessage with 'id'=300
+      tags:
+      - Status Messages
+  "/status/project/{project_name}":
+    get:
+      summary: Get list of packages inside a project
+      description: Get a full list of packages and their status
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      responses:
+        '200':
+          description: OK. The request has succeeded.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  package:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        project:
+                          type: string
+                          xml:
+                            attribute: true
+                        name:
+                          type: string
+                          xml:
+                            attribute: true
+                        version:
+                          type: string
+                          xml:
+                            attribute: true
+                        srcmd5:
+                          type: string
+                          xml:
+                            attribute: true
+                        changesmd5:
+                          type: string
+                          xml:
+                            attribute: true
+                        maxmtime:
+                          type: string
+                          xml:
+                            attribute: true
+                        release:
+                          type: string
+                          xml:
+                            attribute: true
+                        verifymd5:
+                          type: string
+                          xml:
+                            attribute: true
+                        link:
+                          type: object
+                          properties:
+                            project:
+                              type: string
+                              xml:
+                                attribute: true
+                            package:
+                              type: string
+                              xml:
+                                attribute: true
+                        error:
+                          type: string
+                      xml:
+                        name: package
+                xml:
+                  name: packages
+              example:
+                package:
+                - project: home:Admin
+                  name: ruby
+                  version: 1
+                  srcmd5: 7fbfafc07ebb87ef62119216619d0fa5
+                  changesmd5: d0fa5
+                - project: home:Admin
+                  name: linked_package
+                  version: 1.1
+                  verifymd5: 7fbfafc07ebb87ef62rrrvvv555
+                  srcmd5: 7fbfafc07ebb87ef62119216619d0fa5
+                  link:
+                    project: home:Admin
+                    package: ut
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: |
+            Unknown project.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: <some project>.'
+      tags:
+      - Status Project
+  "/status/workerstatus":
+    get:
+      deprecated: true
+      summary: Lists status of workers, jobs, backend services and general statistics.
+      description: |
+        Lists status of workers, running jobs, waiting jobs, status of the backend services and general statistics.
+
+        This endpoint is exactly the same as `GET /worker/_status`, please use that one.
+      security:
+      - basic_authentication: []
+      responses:
+        '200':
+          description: OK
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  clients:
+                    type: integer
+                    xml:
+                      attribute: true
+                  idle:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        workerid:
+                          type: string
+                          xml:
+                            attribute: true
+                        hostarch:
+                          type: string
+                          xml:
+                            attribute: true
+                  building:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        repository:
+                          type: string
+                          xml:
+                            attribute: true
+                        arch:
+                          type: string
+                          xml:
+                            attribute: true
+                        project:
+                          type: string
+                          xml:
+                            attribute: true
+                        package:
+                          type: string
+                          xml:
+                            attribute: true
+                        starttime:
+                          type: string
+                          xml:
+                            attribute: true
+                        workerid:
+                          type: string
+                          xml:
+                            attribute: true
+                        hostarch:
+                          type: string
+                          xml:
+                            attribute: true
+                  down:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        workerid:
+                          type: string
+                          xml:
+                            attribute: true
+                        hostarch:
+                          type: string
+                          xml:
+                            attribute: true
+                  waiting:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        arch:
+                          type: string
+                          xml:
+                            attribute: true
+                        jobs:
+                          type: string
+                          xml:
+                            attribute: true
+                  blocked:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        arch:
+                          type: string
+                          xml:
+                            attribute: true
+                        jobs:
+                          type: string
+                          xml:
+                            attribute: true
+                  buildavg:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        arch:
+                          type: string
+                          xml:
+                            attribute: true
+                        buildavg:
+                          type: string
+                          xml:
+                            attribute: true
+                  partition:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        name:
+                          type: string
+                          xml:
+                            attribute: true
+                        daemon:
+                          type: array
+                          items:
+                            type: object
+                            properties:
+                              type:
+                                type: string
+                                xml:
+                                  attribute: true
+                              state:
+                                type: string
+                                xml:
+                                  attribute: true
+                              starttime:
+                                type: string
+                                xml:
+                                  attribute: true
+                              arch:
+                                type: string
+                                xml:
+                                  attribute: true
+                              queue:
+                                type: object
+                                properties:
+                                  high:
+                                    type: string
+                                    xml:
+                                      attribute: true
+                                  med:
+                                    type: string
+                                    xml:
+                                      attribute: true
+                                  low:
+                                    type: string
+                                    xml:
+                                      attribute: true
+                                  next:
+                                    type: string
+                                    xml:
+                                      attribute: true
+                xml:
+                  name: workerstatus
+              example:
+                clients: '2'
+                idle:
+                - workerid: 1a1f67b948b6:1
+                  hostarch: x86_64
+                building:
+                - repository: openSUSE_11.3_Update
+                  arch: x86_64
+                  project: home:enzokiel
+                  package: android-sdk
+                  starttime: '1289838671'
+                  workerid: 1a1f67b948b6:2
+                  hostarch: x86_64
+                down:
+                - workerid: armbuild03:1
+                  hostarch: aarch64
+                waiting:
+                - arch: i586
+                  jobs: '0'
+                - arch: x86_64
+                  jobs: '0'
+                blocked:
+                - arch: i586
+                  jobs: '0'
+                - arch: x86_64
+                  jobs: '0'
+                buildavg:
+                - arch: i586
+                  buildavg: '1200'
+                - arch: x86_64
+                  buildavg: '1200'
+                partition:
+                - daemon:
+                  - type: srcserver
+                    state: running
+                    starttime: '1617711138'
+                  - type: servicedispatch
+                    state: running
+                    starttime: '1617711144'
+                  - type: service
+                    state: running
+                    starttime: '1617711144'
+                  - type: clouduploadserver
+                    state: running
+                    starttime: '1617711145'
+                  - type: clouduploadworker
+                    state: running
+                    starttime: '1617711144'
+                  - type: scheduler
+                    arch: i586
+                    state: running
+                    starttime: '1617711145'
+                    queue:
+                      high: '0'
+                      med: '0'
+                      low: '11'
+                      next: '0'
+                  - type: scheduler
+                    arch: x86_64
+                    state: running
+                    starttime: '1617711145'
+                    queue:
+                      high: '0'
+                      med: '0'
+                      low: '11'
+                      next: '0'
+                  - type: repserver
+                    state: running
+                    starttime: '1617711143'
+                  - type: dispatcher
+                    state: running
+                    starttime: '1617711144'
+                  - type: publisher
+                    state: running
+                    starttime: '1617711145'
+                  - type: signer
+                    state: running
+                    starttime: '1617711146'
+                - name: back-main
+                  daemon:
+                  - type: scheduler
+                    arch: aarch64
+                    state: running
+                    starttime: '1617148925'
+                    queue:
+                      high: '0'
+                      med: '1'
+                      low: '4'
+                      next: '22'
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+      tags:
+      - Status Project
+  "/status_reports/built/{project_name}/{repository_name}/{architecture_name}/reports/{build_id}":
+    get:
+      summary: Get list of checks in the built project repository
+      description: Get a full list of checks in the built project repository's status
+        reports
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: repository_name
+        schema:
+          type: string
+        required: true
+        description: Repository name
+        example: openSUSE_Tumbleweed
+      - in: path
+        name: architecture_name
+        schema:
+          type: string
+        required: true
+        description: Architecture name
+        example: x86_64
+      - in: path
+        name: build_id
+        schema:
+          type: integer
+        required: true
+        description: The id of the build.
+        example: 16
+      responses:
+        '200':
+          description: OK. The request has succeeded.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  check:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        name:
+                          type: string
+                          example: first_ci
+                          xml:
+                            attribute: true
+                        required:
+                          type: string
+                          enum:
+                          - true
+                          - false
+                          xml:
+                            attribute: true
+                        state:
+                          type: string
+                          enum:
+                          - pending
+                          - error
+                          - failure
+                          - success
+                        short_description:
+                          type: string
+                          example: A short description of the check
+                        url:
+                          type: string
+                          example: https://ci.opensuse.org/
+                      xml:
+                        name: check
+                  uuid:
+                    type: integer
+                    xml:
+                      attribute: true
+                xml:
+                  name: status_report
+              example:
+                check:
+                - name: First
+                  required: false
+                  state: pending
+                  short_description: This is the first of the checks
+                  url: https://ci.opensuse.org/
+                - name: Second
+                  required: true
+                  state: success
+                  short_description: This is the second of the checks
+                  url: https://check.opensuse.org/
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: |
+            Not Found.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Not Found:
+                  value:
+                    code: not_found
+                    summary: Couldn't find StatusMessage with 'id'=300
+      tags:
+      - Status Reports
+    post:
+      summary: Submit a check to a built project repository's status report
+      description: Create or update a check to the status report for the built project
+        repository
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: repository_name
+        schema:
+          type: string
+        required: true
+        description: Repository name
+        example: openSUSE_Tumbleweed
+      - in: path
+        name: architecture_name
+        schema:
+          type: string
+        required: true
+        description: Architecture name
+        example: x86_64
+      - in: path
+        name: build_id
+        schema:
+          type: integer
+        required: true
+        description: The id of the build.
+        example: 16
+      requestBody:
+        description: Check definition.
+        content:
+          application/xml; charset=utf-8:
+            schema:
+              type: object
+              properties:
+                name:
+                  type: string
+                  example: first_ci
+                  xml:
+                    attribute: true
+                required:
+                  type: string
+                  enum:
+                  - true
+                  - false
+                  xml:
+                    attribute: true
+                state:
+                  type: string
+                  enum:
+                  - pending
+                  - error
+                  - failure
+                  - success
+                short_description:
+                  type: string
+                  example: A short description of the check
+                url:
+                  type: string
+                  example: https://ci.opensuse.org/
+              xml:
+                name: check
+      responses:
+        '200':
+          description: OK. The request has succeeded.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  name:
+                    type: string
+                    example: first_ci
+                    xml:
+                      attribute: true
+                  required:
+                    type: string
+                    enum:
+                    - true
+                    - false
+                    xml:
+                      attribute: true
+                  state:
+                    type: string
+                    enum:
+                    - pending
+                    - error
+                    - failure
+                    - success
+                  short_description:
+                    type: string
+                    example: A short description of the check
+                  url:
+                    type: string
+                    example: https://ci.opensuse.org/
+                xml:
+                  name: check
+              example:
+                name: First
+                required: false
+                state: pending
+                short_description: This is the first of the checks
+                url: https://ci.opensuse.org/
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '403':
+          description: |
+            Forbidden.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: update_status/report_not_authorized
+                summary: Sorry, you are not authorized to update this status/report.
+        '404':
+          description: |
+            Not Found.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Not Found:
+                  value:
+                    code: not_found
+                    summary: Couldn't find StatusMessage with 'id'=300
+        '422':
+          description: |
+            Unprocessable Content.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Invalid State:
+                  value:
+                    code: invalid_check
+                    summary: "Could not save check: State State '\U0001F680' is not
+                      a valid. Valid states are: pending, error, failure, success"
+      tags:
+      - Status Reports
+  "/status_reports/published/{project_name}/{repository_name}/reports/{build_id}":
+    get:
+      summary: Get list of checks in the published project repository
+      description: Get a full list of checks in the published project repository's
+        status reports
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: repository_name
+        schema:
+          type: string
+        required: true
+        description: Repository name
+        example: openSUSE_Tumbleweed
+      - in: path
+        name: build_id
+        schema:
+          type: integer
+        required: true
+        description: The id of the build.
+        example: 16
+      responses:
+        '200':
+          description: OK. The request has succeeded.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  check:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        name:
+                          type: string
+                          example: first_ci
+                          xml:
+                            attribute: true
+                        required:
+                          type: string
+                          enum:
+                          - true
+                          - false
+                          xml:
+                            attribute: true
+                        state:
+                          type: string
+                          enum:
+                          - pending
+                          - error
+                          - failure
+                          - success
+                        short_description:
+                          type: string
+                          example: A short description of the check
+                        url:
+                          type: string
+                          example: https://ci.opensuse.org/
+                      xml:
+                        name: check
+                  uuid:
+                    type: integer
+                    xml:
+                      attribute: true
+                xml:
+                  name: status_report
+              example:
+                check:
+                - name: First
+                  required: false
+                  state: pending
+                  short_description: This is the first of the checks
+                  url: https://ci.opensuse.org/
+                - name: Second
+                  required: true
+                  state: success
+                  short_description: This is the second of the checks
+                  url: https://check.opensuse.org/
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: |
+            Not Found.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Not Found:
+                  value:
+                    code: not_found
+                    summary: Couldn't find StatusMessage with 'id'=300
+      tags:
+      - Status Reports
+    post:
+      summary: Submit a check to a published project repository's status report
+      description: Create or update a check to the status report for the published
+        project repository
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: repository_name
+        schema:
+          type: string
+        required: true
+        description: Repository name
+        example: openSUSE_Tumbleweed
+      - in: path
+        name: build_id
+        schema:
+          type: integer
+        required: true
+        description: The id of the build.
+        example: 16
+      requestBody:
+        description: Check definition.
+        content:
+          application/xml; charset=utf-8:
+            schema:
+              type: object
+              properties:
+                name:
+                  type: string
+                  example: first_ci
+                  xml:
+                    attribute: true
+                required:
+                  type: string
+                  enum:
+                  - true
+                  - false
+                  xml:
+                    attribute: true
+                state:
+                  type: string
+                  enum:
+                  - pending
+                  - error
+                  - failure
+                  - success
+                short_description:
+                  type: string
+                  example: A short description of the check
+                url:
+                  type: string
+                  example: https://ci.opensuse.org/
+              xml:
+                name: check
+      responses:
+        '200':
+          description: OK. The request has succeeded.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  name:
+                    type: string
+                    example: first_ci
+                    xml:
+                      attribute: true
+                  required:
+                    type: string
+                    enum:
+                    - true
+                    - false
+                    xml:
+                      attribute: true
+                  state:
+                    type: string
+                    enum:
+                    - pending
+                    - error
+                    - failure
+                    - success
+                  short_description:
+                    type: string
+                    example: A short description of the check
+                  url:
+                    type: string
+                    example: https://ci.opensuse.org/
+                xml:
+                  name: check
+              example:
+                name: First
+                required: false
+                state: pending
+                short_description: This is the first of the checks
+                url: https://ci.opensuse.org/
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '403':
+          description: |
+            Forbidden.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: update_status/report_not_authorized
+                summary: Sorry, you are not authorized to update this status/report.
+        '404':
+          description: |
+            Not Found.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Not Found:
+                  value:
+                    code: not_found
+                    summary: Couldn't find StatusMessage with 'id'=300
+        '422':
+          description: |
+            Unprocessable Content.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Invalid State:
+                  value:
+                    code: invalid_check
+                    summary: "Could not save check: State State '\U0001F680' is not
+                      a valid. Valid states are: pending, error, failure, success"
+      tags:
+      - Status Reports
+  "/status_reports/requests/{id}/reports":
+    get:
+      summary: Get list of checks in the request
+      description: Get a full list of checks in the request's status reports
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: id
+        schema:
+          type: integer
+        required: true
+        description: Id of the choosen request.
+        example: 743
+      responses:
+        '200':
+          description: OK. The request has succeeded.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  check:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        name:
+                          type: string
+                          example: first_ci
+                          xml:
+                            attribute: true
+                        required:
+                          type: string
+                          enum:
+                          - true
+                          - false
+                          xml:
+                            attribute: true
+                        state:
+                          type: string
+                          enum:
+                          - pending
+                          - error
+                          - failure
+                          - success
+                        short_description:
+                          type: string
+                          example: A short description of the check
+                        url:
+                          type: string
+                          example: https://ci.opensuse.org/
+                      xml:
+                        name: check
+                  uuid:
+                    type: integer
+                    xml:
+                      attribute: true
+                xml:
+                  name: status_report
+              example:
+                check:
+                - name: First
+                  required: false
+                  state: pending
+                  short_description: This is the first of the checks
+                  url: https://ci.opensuse.org/
+                - name: Second
+                  required: true
+                  state: success
+                  short_description: This is the second of the checks
+                  url: https://check.opensuse.org/
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: |
+            Not Found.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Not Found:
+                  value:
+                    code: not_found
+                    summary: Couldn't find StatusMessage with 'id'=300
+      tags:
+      - Status Reports
+    post:
+      summary: Submit a check to the request's status report
+      description: Create or update a check to the status report for the request
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: id
+        schema:
+          type: integer
+        required: true
+        description: Id of the choosen request.
+        example: 743
+      requestBody:
+        description: Check definition.
+        content:
+          application/xml; charset=utf-8:
+            schema:
+              type: object
+              properties:
+                name:
+                  type: string
+                  example: first_ci
+                  xml:
+                    attribute: true
+                required:
+                  type: string
+                  enum:
+                  - true
+                  - false
+                  xml:
+                    attribute: true
+                state:
+                  type: string
+                  enum:
+                  - pending
+                  - error
+                  - failure
+                  - success
+                short_description:
+                  type: string
+                  example: A short description of the check
+                url:
+                  type: string
+                  example: https://ci.opensuse.org/
+              xml:
+                name: check
+      responses:
+        '200':
+          description: OK. The request has succeeded.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  name:
+                    type: string
+                    example: first_ci
+                    xml:
+                      attribute: true
+                  required:
+                    type: string
+                    enum:
+                    - true
+                    - false
+                    xml:
+                      attribute: true
+                  state:
+                    type: string
+                    enum:
+                    - pending
+                    - error
+                    - failure
+                    - success
+                  short_description:
+                    type: string
+                    example: A short description of the check
+                  url:
+                    type: string
+                    example: https://ci.opensuse.org/
+                xml:
+                  name: check
+              example:
+                name: First
+                required: false
+                state: pending
+                short_description: This is the first of the checks
+                url: https://ci.opensuse.org/
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '403':
+          description: |
+            Forbidden.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: update_status/report_not_authorized
+                summary: Sorry, you are not authorized to update this status/report.
+        '404':
+          description: |
+            Not Found.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Not Found:
+                  value:
+                    code: not_found
+                    summary: Couldn't find StatusMessage with 'id'=300
+        '422':
+          description: |
+            Unprocessable Content.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Invalid State:
+                  value:
+                    code: invalid_check
+                    summary: "Could not save check: State State '\U0001F680' is not
+                      a valid. Valid states are: pending, error, failure, success"
+      tags:
+      - Status Reports
+  "/status_reports/built_repositories/{project_name}/{repository_name}/{architecture_name}/required_checks":
+    get:
+      summary: Get list of required checks in the built repository
+      description: Get a full list of required checks in the built repository
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: repository_name
+        schema:
+          type: string
+        required: true
+        description: Repository name
+        example: openSUSE_Tumbleweed
+      - in: path
+        name: architecture_name
+        schema:
+          type: string
+        required: true
+        description: Architecture name
+        example: x86_64
+      responses:
+        '200':
+          description: OK. The request has succeeded.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  name:
+                    type: array
+                    items:
+                      type: string
+                    example:
+                    - first
+                    - second
+                  project:
+                    type: string
+                    xml:
+                      attribute: true
+                    example: home:Admin
+                  repository:
+                    type: string
+                    xml:
+                      attribute: true
+                    example: openSUSE_Tumbleweed
+                  architecture:
+                    type: string
+                    xml:
+                      attribute: true
+                    example: x86_64
+                xml:
+                  name: required_checks
+              example:
+                project: home:Admin
+                repository: openSUSE_Tumbleweed
+                architecture: x86_64
+                name:
+                - first
+                - second
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: |
+            Not Found.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: home:some_project'
+                Unknown Repository:
+                  value:
+                    code: not_found
+                    summary: Couldn't find Repository
+                Unknown Architecture:
+                  value:
+                    code: not_found
+                    summary: Couldn't find Architecture
+      tags:
+      - Status Reports - Required Checks
+    post:
+      summary: Submit a required checks list to the built repository
+      description: Submit a new or modified required checks list to the built repository
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: repository_name
+        schema:
+          type: string
+        required: true
+        description: Repository name
+        example: openSUSE_Tumbleweed
+      - in: path
+        name: architecture_name
+        schema:
+          type: string
+        required: true
+        description: Architecture name
+        example: x86_64
+      requestBody:
+        description: Required checks list.
+        content:
+          application/xml; charset=utf-8:
+            schema:
+              type: object
+              properties:
+                name:
+                  type: array
+                  items:
+                    type: string
+                  example:
+                  - first
+                  - second
+                project:
+                  type: string
+                  xml:
+                    attribute: true
+                  example: home:Admin
+                repository:
+                  type: string
+                  xml:
+                    attribute: true
+                  example: openSUSE_Tumbleweed
+                architecture:
+                  type: string
+                  xml:
+                    attribute: true
+                  example: x86_64
+              xml:
+                name: required_checks
+            example:
+              project: home:Admin
+              repository: openSUSE_Tumbleweed
+              architecture: x86_64
+              name:
+              - first
+              - second
+      responses:
+        '200':
+          description: OK. The request has succeeded.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  name:
+                    type: array
+                    items:
+                      type: string
+                    example:
+                    - first
+                    - second
+                  project:
+                    type: string
+                    xml:
+                      attribute: true
+                    example: home:Admin
+                  repository:
+                    type: string
+                    xml:
+                      attribute: true
+                    example: openSUSE_Tumbleweed
+                  architecture:
+                    type: string
+                    xml:
+                      attribute: true
+                    example: x86_64
+                xml:
+                  name: required_checks
+              example:
+                project: home:Admin
+                repository: openSUSE_Tumbleweed
+                architecture: x86_64
+                name:
+                - first
+                - second
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '403':
+          description: |
+            Forbidden.
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: create_repository_architecture_not_authorized
+                summary: Sorry, you are not authorized to create this repository architecture.
+        '404':
+          description: |
+            Not Found.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: home:some_project'
+                Unknown Repository:
+                  value:
+                    code: not_found
+                    summary: Couldn't find Repository
+                Unknown Architecture:
+                  value:
+                    code: not_found
+                    summary: Couldn't find Architecture
+        '422':
+          description: |
+            Unprocessable Content.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Could not save:
+                  value:
+                    code: invalid_required_check
+                    summary: 'Could not save required check:'
+                Could not delete:
+                  value:
+                    code: invalid_required_check
+                    summary: 'Could not delete required check:'
+      tags:
+      - Status Reports - Required Checks
+  "/status_reports/built_repositories/{project_name}/{repository_name}/{architecture_name}/required_checks/{check_name}":
+    delete:
+      summary: Delete a required check from the built repository
+      description: Delete a required check from the built repository
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: repository_name
+        schema:
+          type: string
+        required: true
+        description: Repository name
+        example: openSUSE_Tumbleweed
+      - in: path
+        name: architecture_name
+        schema:
+          type: string
+        required: true
+        description: Architecture name
+        example: x86_64
+      - in: path
+        name: check_name
+        schema:
+          type: string
+        required: true
+        description: Check name.
+        example: first
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '403':
+          description: |
+            Forbidden.
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: delete_repository_architecture_not_authorized
+                summary: Sorry, you are not authorized to delete this repository architecture.
+        '404':
+          description: |
+            Not Found.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: home:some_project'
+                Unknown Repository:
+                  value:
+                    code: not_found
+                    summary: Couldn't find Repository
+                Unknown Architecture:
+                  value:
+                    code: not_found
+                    summary: Couldn't find Architecture
+        '422':
+          description: |
+            Unprocessable Content.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Could not save:
+                  value:
+                    code: invalid_required_check
+                    summary: 'Could not save required check:'
+                Could not delete:
+                  value:
+                    code: invalid_required_check
+                    summary: 'Could not delete required check:'
+      tags:
+      - Status Reports - Required Checks
+  "/status_reports/projects/{project_name}/required_checks":
+    get:
+      summary: Get list of required checks in the project
+      description: Get a full list of required checks in the project
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      responses:
+        '200':
+          description: OK. The request has succeeded.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  name:
+                    type: array
+                    items:
+                      type: string
+                    example:
+                    - first
+                    - second
+                  project:
+                    type: string
+                    xml:
+                      attribute: true
+                    example: home:Admin
+                  repository:
+                    type: string
+                    xml:
+                      attribute: true
+                    example: openSUSE_Tumbleweed
+                  architecture:
+                    type: string
+                    xml:
+                      attribute: true
+                    example: x86_64
+                xml:
+                  name: required_checks
+              example:
+                project: home:Admin
+                name:
+                - first
+                - second
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: |
+            Unknown project.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: <some project>.'
+      tags:
+      - Status Reports - Required Checks
+    post:
+      summary: Submit a required checks list to the project
+      description: Submit a new or modified required checks list to the project
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      requestBody:
+        description: Required checks list.
+        content:
+          application/xml; charset=utf-8:
+            schema:
+              type: object
+              properties:
+                name:
+                  type: array
+                  items:
+                    type: string
+                  example:
+                  - first
+                  - second
+                project:
+                  type: string
+                  xml:
+                    attribute: true
+                  example: home:Admin
+                repository:
+                  type: string
+                  xml:
+                    attribute: true
+                  example: openSUSE_Tumbleweed
+                architecture:
+                  type: string
+                  xml:
+                    attribute: true
+                  example: x86_64
+              xml:
+                name: required_checks
+            example:
+              project: home:Admin
+              name:
+              - first
+              - second
+      responses:
+        '200':
+          description: OK. The request has succeeded.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  name:
+                    type: array
+                    items:
+                      type: string
+                    example:
+                    - first
+                    - second
+                  project:
+                    type: string
+                    xml:
+                      attribute: true
+                    example: home:Admin
+                  repository:
+                    type: string
+                    xml:
+                      attribute: true
+                    example: openSUSE_Tumbleweed
+                  architecture:
+                    type: string
+                    xml:
+                      attribute: true
+                    example: x86_64
+                xml:
+                  name: required_checks
+              example:
+                project: home:Admin
+                name:
+                - first
+                - second
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '403':
+          description: |
+            Forbidden.
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: create_project_not_authorized
+                summary: Sorry, you are not authorized to create this project.
+        '404':
+          description: |
+            Unknown project.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: <some project>.'
+        '422':
+          description: |
+            Unprocessable Content.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Could not save:
+                  value:
+                    code: invalid_required_check
+                    summary: 'Could not save required check:'
+                Could not delete:
+                  value:
+                    code: invalid_required_check
+                    summary: 'Could not delete required check:'
+      tags:
+      - Status Reports - Required Checks
+  "/status_reports/projects/{project_name}/required_checks/{check_name}":
+    delete:
+      summary: Delete a required checks from the project
+      description: Delete a required check from the project
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: check_name
+        schema:
+          type: string
+        required: true
+        description: Check name.
+        example: first
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '403':
+          description: |
+            Forbidden.
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: delete_project_not_authorized
+                summary: Sorry, you are not authorized to delete this project.
+        '404':
+          description: |
+            Unknown project.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: <some project>.'
+        '422':
+          description: |
+            Unprocessable Content.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Could not save:
+                  value:
+                    code: invalid_required_check
+                    summary: 'Could not save required check:'
+                Could not delete:
+                  value:
+                    code: invalid_required_check
+                    summary: 'Could not delete required check:'
+      tags:
+      - Status Reports - Required Checks
+  "/status_reports/repositories/{project_name}/{repository_name}/required_checks":
+    get:
+      summary: Get list of required checks in the project repository
+      description: Get a full list of required checks in the project repository
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: repository_name
+        schema:
+          type: string
+        required: true
+        description: Repository name
+        example: openSUSE_Tumbleweed
+      responses:
+        '200':
+          description: OK. The request has succeeded.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  name:
+                    type: array
+                    items:
+                      type: string
+                    example:
+                    - first
+                    - second
+                  project:
+                    type: string
+                    xml:
+                      attribute: true
+                    example: home:Admin
+                  repository:
+                    type: string
+                    xml:
+                      attribute: true
+                    example: openSUSE_Tumbleweed
+                  architecture:
+                    type: string
+                    xml:
+                      attribute: true
+                    example: x86_64
+                xml:
+                  name: required_checks
+              example:
+                project: home:Admin
+                repository: openSUSE_Tumbleweed
+                name:
+                - first
+                - second
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: |
+            Not Found.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: home:some_project'
+                Unknown Repository:
+                  value:
+                    code: not_found
+                    summary: Couldn't find Repository
+      tags:
+      - Status Reports - Required Checks
+    post:
+      summary: Submit a required checks list to the project repository
+      description: Submit a new or modified required checks list to the project repository
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: repository_name
+        schema:
+          type: string
+        required: true
+        description: Repository name
+        example: openSUSE_Tumbleweed
+      requestBody:
+        description: Required checks list.
+        content:
+          application/xml; charset=utf-8:
+            schema:
+              type: object
+              properties:
+                name:
+                  type: array
+                  items:
+                    type: string
+                  example:
+                  - first
+                  - second
+                project:
+                  type: string
+                  xml:
+                    attribute: true
+                  example: home:Admin
+                repository:
+                  type: string
+                  xml:
+                    attribute: true
+                  example: openSUSE_Tumbleweed
+                architecture:
+                  type: string
+                  xml:
+                    attribute: true
+                  example: x86_64
+              xml:
+                name: required_checks
+            example:
+              project: home:Admin
+              repository: openSUSE_Tumbleweed
+              name:
+              - first
+              - second
+      responses:
+        '200':
+          description: OK. The request has succeeded.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  name:
+                    type: array
+                    items:
+                      type: string
+                    example:
+                    - first
+                    - second
+                  project:
+                    type: string
+                    xml:
+                      attribute: true
+                    example: home:Admin
+                  repository:
+                    type: string
+                    xml:
+                      attribute: true
+                    example: openSUSE_Tumbleweed
+                  architecture:
+                    type: string
+                    xml:
+                      attribute: true
+                    example: x86_64
+                xml:
+                  name: required_checks
+              example:
+                project: home:Admin
+                repository: openSUSE_Tumbleweed
+                name:
+                - first
+                - second
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '403':
+          description: |
+            Forbidden.
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: create_repository_not_authorized
+                summary: Sorry, you are not authorized to create this repository.
+        '404':
+          description: |
+            Not Found.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: home:some_project'
+                Unknown Repository:
+                  value:
+                    code: not_found
+                    summary: Couldn't find Repository
+        '422':
+          description: |
+            Unprocessable Content.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Could not save:
+                  value:
+                    code: invalid_required_check
+                    summary: 'Could not save required check:'
+                Could not delete:
+                  value:
+                    code: invalid_required_check
+                    summary: 'Could not delete required check:'
+      tags:
+      - Status Reports - Required Checks
+  "/status_reports/repositories/{project_name}/{repository_name}/required_checks/{check_name}":
+    delete:
+      summary: Delete a required check from the project repository
+      description: Delete a required checks from the project repository
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: project_name
+        schema:
+          type: string
+        required: true
+        description: Project name
+        example: home:Admin
+      - in: path
+        name: repository_name
+        schema:
+          type: string
+        required: true
+        description: Repository name
+        example: openSUSE_Tumbleweed
+      - in: path
+        name: check_name
+        schema:
+          type: string
+        required: true
+        description: Check name.
+        example: first
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '403':
+          description: |
+            Forbidden.
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: delete_repository_not_authorized
+                summary: Sorry, you are not authorized to delete this repository.
+        '404':
+          description: |
+            Not Found.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Unknown Project:
+                  value:
+                    code: unknown_project
+                    summary: 'Project not found: home:some_project'
+                Unknown Repository:
+                  value:
+                    code: not_found
+                    summary: Couldn't find Repository
+        '422':
+          description: |
+            Unprocessable Content.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                Could not save:
+                  value:
+                    code: invalid_required_check
+                    summary: 'Could not save required check:'
+                Could not delete:
+                  value:
+                    code: invalid_required_check
+                    summary: 'Could not delete required check:'
+      tags:
+      - Status Reports - Required Checks
+  "/trigger":
+    post:
+      summary: Trigger a rebuild, release or service run via an API token
+      description: |
+        This route allows to trigger
+
+        - a Project/Package rebuild
+        - a Project/Package release
+        - a Package service run
+
+        via an API token.
+
+        You are required to authenticate with the API token secret. The API token secret needs
+        to be provided either by HTTP headers or by a Hash-based Message Authentication Code (HMAC).
+
+        See the [/person/{login}/token](#/Person/post_person__login__token) endpoint for
+        information how to create an API token.
+      security:
+      - GitLab_key_authentication: []
+      parameters:
+      - in: header
+        name: X-OBS-SIGNATURE
+        description: |
+          A HMAC of the request body, signed with the API token secret.
+          Only useful in combination with the id parameter.
+        schema:
+          type: string
+        example: 123458568938927827827
+      - in: header
+        name: X-HUB-SIGNATURE-256
+        description: |
+          A HMAC of the request body, signed with the API token secret.
+          Only useful in combination with the id parameter.
+        schema:
+          type: string
+        example: 123458568938927827827
+      - in: header
+        name: X-Pagure-Signature-256
+        description: |
+          A HMAC of the request body, signed with the API token secret.
+          Only useful in combination with the id parameter.
+        schema:
+          type: string
+        example: 123458568938927827827
+      - in: header
+        name: X-GitLab-Token
+        description: The API token secret.
+        schema:
+          type: string
+        example: THE_TOKEN_SECRET
+      - in: header
+        name: Authorization
+        description: The API token secret in the Token realm.
+        schema:
+          type: string
+        example: Token THE_TOKEN_SECRET
+      - in: query
+        name: id
+        description: |
+          Numerical ID of the token to trigger.
+          This is required if you authenticate via a HMAC.
+        schema:
+          type: integer
+        example: 1
+      - in: query
+        name: project
+        description: |
+          If the API token does not have a package assigned you can set a project via this parameter.
+          The operation of the API token is then executed on this project.
+        schema:
+          type: string
+        example: home:user
+      - in: query
+        name: package
+        description: |
+          If the API token does not have a package assigned you can set a package via this parameter.
+          The operation of the API token is then executed on this package.
+
+          Setting this requires the project parameter to be set too.
+        schema:
+          type: string
+        example: vim
+      - in: query
+        name: repository
+        description: |
+          Restrict the API token operation to this repository.
+
+          Only has an effect if the API token operation is 'rebuild' or 'release'.
+        schema:
+          type: string
+        example: openSUSE_Factory
+      - in: query
+        name: arch
+        description: |
+          Restrict the API token operation to this architecture with this name.
+
+          Only has an effect when the API token operation is 'rebuild' or 'release'.
+        schema:
+          type: string
+        example: x86_64
+      - in: query
+        name: targetproject
+        description: |
+          Release binaries only to the provided project with this name.
+          Setting this requires the 'targetrepository' parameter to be set also.
+
+          Only has an effect if the API token operation is 'release'.
+        schema:
+          type: string
+        example: devel:languages:ruby
+      - in: query
+        name: targetrepository
+        description: |
+          Release binaries only to the target repository with this name.
+          Setting this requires the 'targetproject' parameter to be set also.
+
+          Only has an effect if the API token operation is 'release'.
+        schema:
+          type: string
+        example: openSUSE_Factory
+      - in: query
+        name: filter_source_repository
+        description: |
+          Release binaries only from the repository with this name.
+
+          Only has an effect if the API token operation is 'release'.
+        schema:
+          type: string
+        example: openSUSE_Factory
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '400':
+          description: Bad Request.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: invalid_token
+                summary: No valid token found
+        '403':
+          description: Forbidden.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: permission_denied
+                summary: No valid token found
+        '404':
+          description: Not Found.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                unknown_project:
+                  summary: Project not found
+                  value:
+                    code: unknown_project
+                    details: 'Project not found: home:Admin'
+                unknown_package:
+                  summary: Package not found
+                  value:
+                    code: unknown_package
+                    details: 'Package not found: home:Admin/foo'
+      tags:
+      - Trigger
+  "/trigger/rebuild":
+    post:
+      summary: Trigger a Project/Package rebuild
+      description: |
+        This endpoint behaves exactly as the [/trigger](#/Trigger/post_trigger) endpoint but
+        only allows API tokens with the operation 'rebuild' to be triggered.
+      security:
+      - GitLab_key_authentication: []
+      tags:
+      - Trigger
+  "/trigger/release":
+    post:
+      summary: Trigger a Project/Package release
+      description: |
+        This endpoint behaves exactly as the [/trigger](#/Trigger/post_trigger) endpoint but
+        only allows API tokens the the operation 'release' to be triggered.
+      security:
+      - GitLab_key_authentication: []
+      tags:
+      - Trigger
+  "/trigger/runservice":
+    post:
+      summary: Trigger a Package service run
+      description: |
+        This endpoint behaves exactly as the [/trigger](#/Trigger/post_trigger) endpoint but
+        only allows API tokens with the operation 'runservice' to be triggered.
+      security:
+      - GitLab_key_authentication: []
+      tags:
+      - Trigger
+  "/trigger/workflow":
+    post:
+      summary: Trigger a SCM/CI Workflow via an API token
+      description: |
+        This route allows to trigger an [OBS SCM/CI workflow](https://openbuildservice.org/help/manuals/obs-user-guide/cha.obs.scm_ci_workflow_integration)
+        via an API token.
+
+        You are required to authenticate with the API token secret. The API token secret needs
+        to be provided either by HTTP headers or by a Hash-based Message Authentication Code (HMAC).
+
+        See the [/person/{login}/token](#/Person/post_person__login__token) endpoint for
+        information how to create an API token.
+      security:
+      - GitLab_key_authentication: []
+      parameters:
+      - in: header
+        name: X-OBS-SIGNATURE
+        description: |
+          A HMAC of the request body, signed with the API token secret.
+          Only useful in combination with the id parameter.
+        schema:
+          type: string
+        example: 123458568938927827827
+      - in: header
+        name: X-HUB-SIGNATURE-256
+        description: |
+          A HMAC of the request body, signed with the API token secret.
+          Only useful in combination with the id parameter.
+        schema:
+          type: string
+        example: 123458568938927827827
+      - in: header
+        name: X-Pagure-Signature-256
+        description: |
+          A HMAC of the request body, signed with the API token secret.
+          Only useful in combination with the id parameter.
+        schema:
+          type: string
+        example: 123458568938927827827
+      - in: header
+        name: X-GitLab-Token
+        description: The API token secret.
+        schema:
+          type: string
+        example: THE_TOKEN_SECRET
+      - in: header
+        name: Authorization
+        description: The API token secret in the Token realm.
+        schema:
+          type: string
+        example: Token THE_TOKEN_SECRET
+      - in: query
+        name: id
+        description: |
+          Numerical ID of the token to trigger.
+          This is required if you authenticate via a HMAC.
+        schema:
+          type: integer
+        example: 1
+      responses:
+        '200':
+          description: |
+            OK. The request has succeeded.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: ok
+                summary: Ok
+        '400':
+          description: Bad Request.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: invalid_token
+                summary: No valid token found
+        '403':
+          description: Forbidden.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: permission_denied
+                summary: No valid token found
+        '404':
+          description: Not Found.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                unknown_project:
+                  summary: Project not found
+                  value:
+                    code: unknown_project
+                    details: 'Project not found: home:Admin'
+                unknown_package:
+                  summary: Package not found
+                  value:
+                    code: unknown_package
+                    details: 'Package not found: home:Admin/foo'
+      tags:
+      - Trigger
+  "/trigger/webhook":
+    post:
+      deprecated: true
+      summary: Trigger an operation
+      description: This endpoint behaves exactly as the [/trigger](#/Trigger) endpoint.
+      security:
+      - GitLab_key_authentication: []
+      tags:
+      - Trigger
+  "/worker/_status":
+    get:
+      summary: Lists status of workers, jobs, backend services and general statistics.
+      description: Lists status of workers, running jobs, waiting jobs, status of
+        the backend services and general statistics.
+      security:
+      - basic_authentication: []
+      responses:
+        '200':
+          description: OK
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  clients:
+                    type: integer
+                    xml:
+                      attribute: true
+                  idle:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        workerid:
+                          type: string
+                          xml:
+                            attribute: true
+                        hostarch:
+                          type: string
+                          xml:
+                            attribute: true
+                  building:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        repository:
+                          type: string
+                          xml:
+                            attribute: true
+                        arch:
+                          type: string
+                          xml:
+                            attribute: true
+                        project:
+                          type: string
+                          xml:
+                            attribute: true
+                        package:
+                          type: string
+                          xml:
+                            attribute: true
+                        starttime:
+                          type: string
+                          xml:
+                            attribute: true
+                        workerid:
+                          type: string
+                          xml:
+                            attribute: true
+                        hostarch:
+                          type: string
+                          xml:
+                            attribute: true
+                  down:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        workerid:
+                          type: string
+                          xml:
+                            attribute: true
+                        hostarch:
+                          type: string
+                          xml:
+                            attribute: true
+                  waiting:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        arch:
+                          type: string
+                          xml:
+                            attribute: true
+                        jobs:
+                          type: string
+                          xml:
+                            attribute: true
+                  blocked:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        arch:
+                          type: string
+                          xml:
+                            attribute: true
+                        jobs:
+                          type: string
+                          xml:
+                            attribute: true
+                  buildavg:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        arch:
+                          type: string
+                          xml:
+                            attribute: true
+                        buildavg:
+                          type: string
+                          xml:
+                            attribute: true
+                  partition:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        name:
+                          type: string
+                          xml:
+                            attribute: true
+                        daemon:
+                          type: array
+                          items:
+                            type: object
+                            properties:
+                              type:
+                                type: string
+                                xml:
+                                  attribute: true
+                              state:
+                                type: string
+                                xml:
+                                  attribute: true
+                              starttime:
+                                type: string
+                                xml:
+                                  attribute: true
+                              arch:
+                                type: string
+                                xml:
+                                  attribute: true
+                              queue:
+                                type: object
+                                properties:
+                                  high:
+                                    type: string
+                                    xml:
+                                      attribute: true
+                                  med:
+                                    type: string
+                                    xml:
+                                      attribute: true
+                                  low:
+                                    type: string
+                                    xml:
+                                      attribute: true
+                                  next:
+                                    type: string
+                                    xml:
+                                      attribute: true
+                xml:
+                  name: workerstatus
+              example:
+                clients: '2'
+                idle:
+                - workerid: 1a1f67b948b6:1
+                  hostarch: x86_64
+                building:
+                - repository: openSUSE_11.3_Update
+                  arch: x86_64
+                  project: home:enzokiel
+                  package: android-sdk
+                  starttime: '1289838671'
+                  workerid: 1a1f67b948b6:2
+                  hostarch: x86_64
+                down:
+                - workerid: armbuild03:1
+                  hostarch: aarch64
+                waiting:
+                - arch: i586
+                  jobs: '0'
+                - arch: x86_64
+                  jobs: '0'
+                blocked:
+                - arch: i586
+                  jobs: '0'
+                - arch: x86_64
+                  jobs: '0'
+                buildavg:
+                - arch: i586
+                  buildavg: '1200'
+                - arch: x86_64
+                  buildavg: '1200'
+                partition:
+                - daemon:
+                  - type: srcserver
+                    state: running
+                    starttime: '1617711138'
+                  - type: servicedispatch
+                    state: running
+                    starttime: '1617711144'
+                  - type: service
+                    state: running
+                    starttime: '1617711144'
+                  - type: clouduploadserver
+                    state: running
+                    starttime: '1617711145'
+                  - type: clouduploadworker
+                    state: running
+                    starttime: '1617711144'
+                  - type: scheduler
+                    arch: i586
+                    state: running
+                    starttime: '1617711145'
+                    queue:
+                      high: '0'
+                      med: '0'
+                      low: '11'
+                      next: '0'
+                  - type: scheduler
+                    arch: x86_64
+                    state: running
+                    starttime: '1617711145'
+                    queue:
+                      high: '0'
+                      med: '0'
+                      low: '11'
+                      next: '0'
+                  - type: repserver
+                    state: running
+                    starttime: '1617711143'
+                  - type: dispatcher
+                    state: running
+                    starttime: '1617711144'
+                  - type: publisher
+                    state: running
+                    starttime: '1617711145'
+                  - type: signer
+                    state: running
+                    starttime: '1617711146'
+                - name: back-main
+                  daemon:
+                  - type: scheduler
+                    arch: aarch64
+                    state: running
+                    starttime: '1617148925'
+                    queue:
+                      high: '0'
+                      med: '1'
+                      low: '4'
+                      next: '22'
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+      tags:
+      - Workers
+  "/worker/status":
+    get:
+      deprecated: true
+      summary: Lists status of workers, jobs, backend services and general statistics.
+      description: |
+        Lists status of workers, running jobs, waiting jobs, status of the backend services and general statistics.
+
+        This endpoint is exactly the same as `GET /worker/_status`, please use that one.
+      security:
+      - basic_authentication: []
+      responses:
+        '200':
+          description: OK
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  clients:
+                    type: integer
+                    xml:
+                      attribute: true
+                  idle:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        workerid:
+                          type: string
+                          xml:
+                            attribute: true
+                        hostarch:
+                          type: string
+                          xml:
+                            attribute: true
+                  building:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        repository:
+                          type: string
+                          xml:
+                            attribute: true
+                        arch:
+                          type: string
+                          xml:
+                            attribute: true
+                        project:
+                          type: string
+                          xml:
+                            attribute: true
+                        package:
+                          type: string
+                          xml:
+                            attribute: true
+                        starttime:
+                          type: string
+                          xml:
+                            attribute: true
+                        workerid:
+                          type: string
+                          xml:
+                            attribute: true
+                        hostarch:
+                          type: string
+                          xml:
+                            attribute: true
+                  down:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        workerid:
+                          type: string
+                          xml:
+                            attribute: true
+                        hostarch:
+                          type: string
+                          xml:
+                            attribute: true
+                  waiting:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        arch:
+                          type: string
+                          xml:
+                            attribute: true
+                        jobs:
+                          type: string
+                          xml:
+                            attribute: true
+                  blocked:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        arch:
+                          type: string
+                          xml:
+                            attribute: true
+                        jobs:
+                          type: string
+                          xml:
+                            attribute: true
+                  buildavg:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        arch:
+                          type: string
+                          xml:
+                            attribute: true
+                        buildavg:
+                          type: string
+                          xml:
+                            attribute: true
+                  partition:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        name:
+                          type: string
+                          xml:
+                            attribute: true
+                        daemon:
+                          type: array
+                          items:
+                            type: object
+                            properties:
+                              type:
+                                type: string
+                                xml:
+                                  attribute: true
+                              state:
+                                type: string
+                                xml:
+                                  attribute: true
+                              starttime:
+                                type: string
+                                xml:
+                                  attribute: true
+                              arch:
+                                type: string
+                                xml:
+                                  attribute: true
+                              queue:
+                                type: object
+                                properties:
+                                  high:
+                                    type: string
+                                    xml:
+                                      attribute: true
+                                  med:
+                                    type: string
+                                    xml:
+                                      attribute: true
+                                  low:
+                                    type: string
+                                    xml:
+                                      attribute: true
+                                  next:
+                                    type: string
+                                    xml:
+                                      attribute: true
+                xml:
+                  name: workerstatus
+              example:
+                clients: '2'
+                idle:
+                - workerid: 1a1f67b948b6:1
+                  hostarch: x86_64
+                building:
+                - repository: openSUSE_11.3_Update
+                  arch: x86_64
+                  project: home:enzokiel
+                  package: android-sdk
+                  starttime: '1289838671'
+                  workerid: 1a1f67b948b6:2
+                  hostarch: x86_64
+                down:
+                - workerid: armbuild03:1
+                  hostarch: aarch64
+                waiting:
+                - arch: i586
+                  jobs: '0'
+                - arch: x86_64
+                  jobs: '0'
+                blocked:
+                - arch: i586
+                  jobs: '0'
+                - arch: x86_64
+                  jobs: '0'
+                buildavg:
+                - arch: i586
+                  buildavg: '1200'
+                - arch: x86_64
+                  buildavg: '1200'
+                partition:
+                - daemon:
+                  - type: srcserver
+                    state: running
+                    starttime: '1617711138'
+                  - type: servicedispatch
+                    state: running
+                    starttime: '1617711144'
+                  - type: service
+                    state: running
+                    starttime: '1617711144'
+                  - type: clouduploadserver
+                    state: running
+                    starttime: '1617711145'
+                  - type: clouduploadworker
+                    state: running
+                    starttime: '1617711144'
+                  - type: scheduler
+                    arch: i586
+                    state: running
+                    starttime: '1617711145'
+                    queue:
+                      high: '0'
+                      med: '0'
+                      low: '11'
+                      next: '0'
+                  - type: scheduler
+                    arch: x86_64
+                    state: running
+                    starttime: '1617711145'
+                    queue:
+                      high: '0'
+                      med: '0'
+                      low: '11'
+                      next: '0'
+                  - type: repserver
+                    state: running
+                    starttime: '1617711143'
+                  - type: dispatcher
+                    state: running
+                    starttime: '1617711144'
+                  - type: publisher
+                    state: running
+                    starttime: '1617711145'
+                  - type: signer
+                    state: running
+                    starttime: '1617711146'
+                - name: back-main
+                  daemon:
+                  - type: scheduler
+                    arch: aarch64
+                    state: running
+                    starttime: '1617148925'
+                    queue:
+                      high: '0'
+                      med: '1'
+                      low: '4'
+                      next: '22'
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+      tags:
+      - Workers
+  "/worker/{architecture_name}:{worker_id}":
+    get:
+      summary: Lists capabilites of a worker.
+      description: |
+        Lists capabilites of a worker.
+
+        This can be useful when checking for constraints.
+
+        This operation is the same as `GET /worker/capability/{architecture_name}:{worker_id}`.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: path
+        name: architecture_name
+        schema:
+          type: string
+        required: true
+        description: Architecture name
+        example: x86_64
+      - in: path
+        name: worker_id
+        schema:
+          type: string
+        required: true
+        description: Worker id.
+        example: 1a1f67b948b6:1
+      responses:
+        '200':
+          description: OK
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  hostarch:
+                    type: string
+                    xml:
+                      attribute: true
+                  registerserver:
+                    type: string
+                    xml:
+                      attribute: true
+                  workerid:
+                    type: string
+                    xml:
+                      attribute: true
+                  hostlabel:
+                    type: string
+                  sandbox:
+                    type: string
+                  linux:
+                    type: object
+                    properties:
+                      version:
+                        type: string
+                      flavor:
+                        type: string
+                  hardware:
+                    type: object
+                    properties:
+                      cpu:
+                        type: object
+                        properties:
+                          flag:
+                            type: array
+                            items:
+                              type: string
+                      processors:
+                        type: string
+                      jobs:
+                        type: string
+                xml:
+                  name: worker
+              example:
+                hostarch: x86_64
+                registerserver: http://backend:5252
+                workerid: 1a1f67b948b6:1
+                hostlabel: OBS_WORKER_SECURITY_LEVEL_
+                sandbox: chroot
+                linux:
+                  version: 5.11.6-1
+                  flavor: default
+                hardware:
+                  cpu:
+                    flag:
+                    - fpu
+                    - vme
+                    - de
+                    - pse
+                    - tsc
+                    - msr
+                  processors: '8'
+                  jobs: '1'
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: Not Found.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: '404'
+                summary: 'remote error: unknown worker (http://backend:5252/worker/x86_64:1a1f67b948bf:1)'
+                details: '404 remote error: unknown worker (http://backend:5252/worker/x86_64:1a1f67b948bf:1)'
+      tags:
+      - Workers
+  "/worker?cmd=checkconstraints":
+    post:
+      summary: Lists workers which match a constraints filter.
+      description: |
+        Given a project, package, repository and architecture, list workers which can build with that restrictions, and also match a constraints filter.
+
+        This endpoint doesn't create or modify any data.
+
+        More information about constraints can be found in the
+        [user guide](https://openbuildservice.org/help/manuals/obs-user-guide/cha.obs.build_job_constraints.html).
+
+        This operation is the same as `POST /worker/command/run?cmd=checkconstraints`.
+      security:
+      - basic_authentication: []
+      parameters:
+      - in: query
+        name: project
+        schema:
+          type: string
+        required: true
+        example: home:user1
+        description: Project name.
+      - in: query
+        name: repository
+        schema:
+          type: string
+        required: true
+        description: Repository name.
+        example: openSUSE_Tumbleweed
+      - in: query
+        name: arch
+        schema:
+          type: string
+        required: true
+        description: Architecture name.
+        example: x86_64
+      - in: query
+        name: package
+        schema:
+          type: string
+        required: true
+        description: Package name.
+        example: test_package
+      requestBody:
+        description: Constraints XML filter
+        required: true
+        content:
+          application/xml; charset=utf-8:
+            schema:
+              type: object
+              properties:
+                hostlabel:
+                  type: string
+                sandbox:
+                  type: string
+                  example: chroot
+                linux:
+                  type: object
+                  properties:
+                    version:
+                      type: object
+                      properties:
+                        min:
+                          type: string
+                        max:
+                          type: string
+                    flavor:
+                      type: string
+                hardware:
+                  type: object
+                  properties:
+                    cpu:
+                      type: object
+                      properties:
+                        flag:
+                          type: array
+                          items:
+                            type: string
+                    processors:
+                      type: string
+                    disk:
+                      type: object
+                      properties:
+                        size:
+                          type: string
+                    memory:
+                      type: object
+                      properties:
+                        size:
+                          type: string
+                    physicalmemory:
+                      type: object
+                      properties:
+                        size:
+                          type: string
+              xml:
+                name: constraints
+            examples:
+              cpu_flags:
+                summary: Cpu flags
+                value:
+                  hardware:
+                    cpu:
+                      flag:
+                      - mmx
+                      - sse2
+              processors:
+                summary: Number of processors
+                value:
+                  hardware:
+                    processors: 2
+              mix:
+                summary: Linux version and linux flavor
+                value:
+                  linux:
+                    version:
+                      min: 3.0
+                      max: 4.0
+                    flavor: default
+      responses:
+        '200':
+          description: OK
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  count:
+                    type: integer
+                    xml:
+                      attribute: true
+                  name:
+                    type: string
+                    xml:
+                      attribute: true
+                  rev:
+                    type: string
+                    xml:
+                      attribute: true
+                  vrev:
+                    type: string
+                    xml:
+                      attribute: true
+                  srcmd5:
+                    type: string
+                    xml:
+                      attribute: true
+                  entry:
+                    type: array
+                    items:
+                      type: object
+                      properties:
+                        name:
+                          type: string
+                          xml:
+                            attribute: true
+                        md5:
+                          type: string
+                          xml:
+                            attribute: true
+                        size:
+                          type: string
+                          xml:
+                            attribute: true
+                        mtime:
+                          type: string
+                          xml:
+                            attribute: true
+                xml:
+                  name: directory
+              examples:
+                two_workers:
+                  summary: Two Workers Satisfy the Constraints
+                  value:
+                    entry:
+                    - name: x86_64:1a1f67b948b6:1
+                    - name: x86_64:1a1f67b948b6:2
+                no_workers:
+                  summary: No Workers Satisfy the Constraints
+                  value: 
+        '400':
+          description: Bad Request.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: missing_parameter
+                summary: Required Parameter arch missing
+        '401':
+          description: |
+            Unauthorized.
+
+            XML Schema used for body validation: [status.rng](../schema/status.rng)
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              examples:
+                anonymous_user:
+                  value:
+                    code: anonymous_user
+                    summary: Anonymous user is not allowed here - please login
+                  summary: Anonymous User
+                authentication_required:
+                  value:
+                    code: authentication_required
+                    summary: Unknown user 'Admin' or invalid password
+                  summary: Authentication Required
+        '404':
+          description: Not Found.
+          content:
+            application/xml; charset=utf-8:
+              schema:
+                type: object
+                properties:
+                  code:
+                    type: string
+                    xml:
+                      attribute: true
+                  origin:
+                    type: string
+                    xml:
+                      attribute: true
+                  summary:
+                    type: string
+                  details:
+                    type: string
+                  data:
+                    type: array
+                    items:
+                      type: string
+                xml:
+                  name: status
+              example:
+                code: 404
+                summary: repository 'home:Admin/openSUSE_Tumbleweed' has no architecture
+                  'x86_64d'
+      tags:
+      - Workers
+components:
+  securitySchemes:
+    basic_authentication:
+      type: http
+      scheme: basic
+    GitLab_key_authentication:
+      type: apiKey
+      in: header
+      name: X-GitLab-Token
+externalDocs:
+  url: https://openbuildservice.org/help/
+  description: Open Build Service - Documentation
diff --git a/bots-common/readme.go b/bots-common/readme.go
new file mode 100644
index 0000000..5c2bbf9
--- /dev/null
+++ b/bots-common/readme.go
@@ -0,0 +1,11 @@
+package common
+
+const ReadmeBoilerplate = `
+README
+======
+
+This empty project was created by AutoDevel bot.
+AutoDevel creates projects that can be built
+in Open Build Service.
+
+`
diff --git a/bots-common/request_handler.go b/bots-common/request_handler.go
new file mode 100644
index 0000000..aa6eea7
--- /dev/null
+++ b/bots-common/request_handler.go
@@ -0,0 +1,47 @@
+package common
+
+import "os"
+
+
+type Request struct {
+	Type string
+	Data interface{}
+
+	PrjGit string
+}
+
+type RequestHandler struct {
+	ObsToken, GiteaToken string
+
+	Error   error
+	GitCommiter, GitPath string
+	Branch  []string
+
+	Logger
+	Request
+}
+
+func (r *RequestHandler) WriteError() {
+	r.LogError("%s", "internal error sent")
+}
+
+
+func CreateRequestHandler(git_author, name string) *RequestHandler {
+	var h *RequestHandler = new(RequestHandler)
+
+	h.Logger = CreateStdoutLogger(os.Stdout, os.Stderr)
+
+	h.GitCommiter = git_author
+	h.GitPath, h.Error = os.MkdirTemp("", name)
+	if h.Error != nil {
+		h.Logger.LogError("Cannot create temp dir: %v", h.Error)
+		return h
+	}
+
+	if h.Error = os.Chmod(h.GitPath, 0700); h.Error != nil {
+		h.Logger.LogError("Cannot fix permissions of temp dir: %v", h.Error)
+		return h
+	}
+	return h
+}
+
diff --git a/bots-common/request_push.go b/bots-common/request_push.go
new file mode 100644
index 0000000..7080e3d
--- /dev/null
+++ b/bots-common/request_push.go
@@ -0,0 +1,52 @@
+package common
+
+import (
+	"encoding/json"
+	"io"
+	"strings"
+)
+
+type Commit struct {
+	Id      string
+	Message string
+}
+
+type PushRequest struct {
+	Total_Commits int
+	Head_Commit   Commit
+	Commits       []Commit
+	Pusher        User
+	Sender        User
+
+	Repository Repository
+}
+
+func (h *RequestHandler) ParsePushRequest(data io.Reader) *PushRequest {
+	if h.HasError() {
+		return nil
+	}
+
+	var action PushRequest
+	h.Error = json.NewDecoder(data).Decode(&action)
+
+	if h.HasError() {
+		h.LogError("Got error while parsing: %v", h.Error)
+		return nil
+	}
+
+	repoIdx := strings.LastIndex(action.Repository.Ssh_Url, "/")
+	if repoIdx == -1 || action.Repository.Ssh_Url[repoIdx+1:] != action.Repository.Name+".git" {
+		h.LogError("Unexpected URL for SSH repository: '%s'", action.Repository.Name)
+		return nil
+	}
+	h.PrjGit = action.Repository.Ssh_Url[:repoIdx+1] + DefaultGitPrj + ".git"
+
+	h.Log("Request push for repo: %s", action.Repository.Full_Name)
+	h.Data = action
+	if len(action.Commits) < 1 || len(action.Head_Commit.Id) != 64 {
+		h.LogError("Request has no action .... skipping")
+		return nil
+	}
+
+	return &action
+}
diff --git a/bots-common/request_push_test.go b/bots-common/request_push_test.go
new file mode 100644
index 0000000..53dc6c5
--- /dev/null
+++ b/bots-common/request_push_test.go
@@ -0,0 +1,57 @@
+package common
+
+import (
+	"strings"
+	"testing"
+)
+
+type TestLogger struct {
+	t *testing.T
+}
+
+func (s *TestLogger) Log(str string, fmt ...any) (int, error) {
+	s.t.Logf(str, fmt...)
+	return 10, nil
+}
+
+func (s *TestLogger) LogError(str string, fmt ...any) (int, error) {
+	s.t.Errorf(str, fmt...)
+	return 10, nil
+}
+
+func (s *TestLogger) LogPlainError(err error) (int, error) {
+	s.t.Error(err)
+	return 10, nil
+}
+
+func CreateTestLogger(t *testing.T) Logger {
+	var logger TestLogger
+
+	logger.t = t
+	return &logger
+}
+
+func TestPushRequestParsing(t *testing.T) {
+	t.Run("parsing repo creation message", func(t *testing.T) {
+		var h RequestHandler
+
+		h.Logger = CreateTestLogger(t)
+		json := h.ParsePushRequest(strings.NewReader(examplePushJSON))
+		if h.HasError() {
+			t.Fatalf("Can't parse struct: %s", h.Error.Error())
+		}
+
+		if json.Total_Commits < 1 || json.Total_Commits != len(json.Commits) {
+			t.Fatalf("push without commits? '%#v'", json)
+		}
+
+		if json.Repository.Full_Name != "autogits/_ObsPrj" ||
+			json.Repository.Parent != nil ||
+			len(json.Repository.Ssh_Url) < 10 ||
+			json.Repository.Default_Branch != "main" ||
+			json.Repository.Object_Format_Name != "sha256" {
+
+			t.Fatalf("invalid repository parse: %#v", json.Repository)
+		}
+	})
+}
diff --git a/bots-common/request_repo.go b/bots-common/request_repo.go
new file mode 100644
index 0000000..637cc47
--- /dev/null
+++ b/bots-common/request_repo.go
@@ -0,0 +1,74 @@
+package common
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"strings"
+)
+
+type Repository struct {
+	Id        uint
+	Name      string
+	Full_Name string
+	Fork      bool
+	Parent    *Repository
+	Owner     *User
+	Clone_Url string
+
+	Ssh_Url            string
+	Default_Branch     string
+	Object_Format_Name string
+}
+
+type Organization struct {
+	Id       uint
+	Username string
+}
+
+type User struct {
+	Id       uint
+	Username string
+}
+
+type RepositoryAction struct {
+	Action string
+
+	Sender       User
+	Organization Organization
+	Repository   Repository
+
+	PrjGit string
+}
+
+// TODO: sanity check values!!!!
+func (h *RequestHandler) ParseRepositoryRequest(dataReader io.Reader) *RepositoryAction {
+	if h.HasError() {
+		return nil
+	}
+
+	var data RepositoryAction
+	h.Error = json.NewDecoder(dataReader).Decode(&data)
+
+	if h.HasError() {
+		return nil
+	}
+
+	repoIdx := strings.LastIndex(data.Repository.Ssh_Url, "/")
+	if repoIdx == -1 || data.Repository.Ssh_Url[repoIdx+1:] != data.Repository.Name+".git" {
+		h.Error = fmt.Errorf("No data, skipping")
+		h.LogError("Unexpected URL for SSH repository: %s", data.Repository.Name)
+		return nil
+	}
+
+	data.PrjGit = data.Repository.Ssh_Url[:repoIdx+1] + DefaultGitPrj + ".git"
+
+	h.Log("Request '%s' for repo: %s", data.Action, data.Repository.Full_Name)
+	if len(data.Action) < 1 {
+		h.Error = fmt.Errorf("No data, skipping")
+		h.LogError("Request has no data.... skipping")
+	}
+
+	h.Data = data
+	return &data
+}
diff --git a/bots-common/request_repo_test.go b/bots-common/request_repo_test.go
new file mode 100644
index 0000000..b431b63
--- /dev/null
+++ b/bots-common/request_repo_test.go
@@ -0,0 +1,43 @@
+package common
+
+import (
+	"strings"
+	"testing"
+)
+
+type testLogger struct {
+	str string
+}
+
+func (s *testLogger) WriteString(str2 string) (int, error) {
+	s.str += str2
+	return len(s.str), nil
+}
+
+
+func TestRepositoryRequestParsing(t *testing.T) {
+	t.Run("parsing repo creation message", func(t *testing.T) {
+		var strStr, errStr testLogger
+		var h RequestHandler
+
+		h.Logger = CreateStdoutLogger(&strStr, &errStr)
+		json := h.ParseRepositoryRequest(strings.NewReader(repoCreateJSON))
+		if h.HasError() {
+			t.Fatalf("Can't parse struct: %s", h.Error)
+		}
+
+		if json.Action != "created" {
+			t.Fatalf("json.action is '%#v'", json)
+		}
+
+		if json.Repository.Full_Name != "autogits/nodejs22" ||
+			json.Repository.Parent == nil ||
+			json.Repository.Parent.Parent != nil ||
+			len(json.Repository.Ssh_Url) < 10 ||
+			json.Repository.Default_Branch != "factory" ||
+			json.Repository.Object_Format_Name != "sha256" {
+
+			t.Fatalf("invalid repository parse: %#v", json.Repository)
+		}
+	})
+}
diff --git a/obs-staging-bot/.gitignore b/obs-staging-bot/.gitignore
new file mode 100644
index 0000000..7e070f3
--- /dev/null
+++ b/obs-staging-bot/.gitignore
@@ -0,0 +1 @@
+obs-staging-bot
diff --git a/obs-staging-bot/Makefile b/obs-staging-bot/Makefile
new file mode 100644
index 0000000..a3e223d
--- /dev/null
+++ b/obs-staging-bot/Makefile
@@ -0,0 +1,14 @@
+all: build
+
+api.json:
+	curl -o api.json https://src.opensuse.org/swagger.v1.json
+
+generated/client/gitea_api_client.go: api.json
+	[ -d generated ] || mkdir generated
+	podman run --rm -v $$(pwd):/api ghcr.io/go-swagger/go-swagger generate client -f /api/api.json -t /api/generated
+
+api: generated/client/gitea_api_client.go
+
+build: api
+	go build
+
diff --git a/obs-staging-bot/devtest.sh b/obs-staging-bot/devtest.sh
new file mode 100755
index 0000000..ef14b73
--- /dev/null
+++ b/obs-staging-bot/devtest.sh
@@ -0,0 +1,8 @@
+#!/bin/sh
+
+while true; do
+    clear
+    go test
+    inotifywait -q -e modify -e create -e delete -r .
+done
+
diff --git a/obs-staging-bot/go.mod b/obs-staging-bot/go.mod
new file mode 100644
index 0000000..1c310a2
--- /dev/null
+++ b/obs-staging-bot/go.mod
@@ -0,0 +1,35 @@
+module src.opensuse.org/autogits/obs-staging-bot
+
+go 1.22.3
+
+replace src.opensuse.org/autogits/common => ../bots-common
+
+require src.opensuse.org/autogits/common v0.0.0-00010101000000-000000000000
+
+require (
+	github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect
+	github.com/go-logr/logr v1.4.1 // indirect
+	github.com/go-logr/stdr v1.2.2 // indirect
+	github.com/go-openapi/analysis v0.23.0 // indirect
+	github.com/go-openapi/errors v0.22.0 // indirect
+	github.com/go-openapi/jsonpointer v0.21.0 // indirect
+	github.com/go-openapi/jsonreference v0.21.0 // indirect
+	github.com/go-openapi/loads v0.22.0 // indirect
+	github.com/go-openapi/runtime v0.28.0 // indirect
+	github.com/go-openapi/spec v0.21.0 // indirect
+	github.com/go-openapi/strfmt v0.23.0 // indirect
+	github.com/go-openapi/swag v0.23.0 // indirect
+	github.com/go-openapi/validate v0.24.0 // indirect
+	github.com/google/uuid v1.6.0 // indirect
+	github.com/josharian/intern v1.0.0 // indirect
+	github.com/mailru/easyjson v0.7.7 // indirect
+	github.com/mitchellh/mapstructure v1.5.0 // indirect
+	github.com/oklog/ulid v1.3.1 // indirect
+	github.com/opentracing/opentracing-go v1.2.0 // indirect
+	go.mongodb.org/mongo-driver v1.14.0 // indirect
+	go.opentelemetry.io/otel v1.24.0 // indirect
+	go.opentelemetry.io/otel/metric v1.24.0 // indirect
+	go.opentelemetry.io/otel/trace v1.24.0 // indirect
+	golang.org/x/sync v0.7.0 // indirect
+	gopkg.in/yaml.v3 v3.0.1 // indirect
+)
diff --git a/obs-staging-bot/go.sum b/obs-staging-bot/go.sum
new file mode 100644
index 0000000..b1db529
--- /dev/null
+++ b/obs-staging-bot/go.sum
@@ -0,0 +1,75 @@
+github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3dyBCFEj5IhUbnKptjxatkF07cF2ak3yi77so=
+github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw=
+github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
+github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=
+github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
+github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
+github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
+github.com/go-openapi/analysis v0.23.0 h1:aGday7OWupfMs+LbmLZG4k0MYXIANxcuBTYUC03zFCU=
+github.com/go-openapi/analysis v0.23.0/go.mod h1:9mz9ZWaSlV8TvjQHLl2mUW2PbZtemkE8yA5v22ohupo=
+github.com/go-openapi/errors v0.22.0 h1:c4xY/OLxUBSTiepAg3j/MHuAv5mJhnf53LLMWFB+u/w=
+github.com/go-openapi/errors v0.22.0/go.mod h1:J3DmZScxCDufmIMsdOuDHxJbdOGC0xtUynjIx092vXE=
+github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ=
+github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY=
+github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ=
+github.com/go-openapi/jsonreference v0.21.0/go.mod h1:LmZmgsrTkVg9LG4EaHeY8cBDslNPMo06cago5JNLkm4=
+github.com/go-openapi/loads v0.22.0 h1:ECPGd4jX1U6NApCGG1We+uEozOAvXvJSF4nnwHZ8Aco=
+github.com/go-openapi/loads v0.22.0/go.mod h1:yLsaTCS92mnSAZX5WWoxszLj0u+Ojl+Zs5Stn1oF+rs=
+github.com/go-openapi/runtime v0.28.0 h1:gpPPmWSNGo214l6n8hzdXYhPuJcGtziTOgUpvsFWGIQ=
+github.com/go-openapi/runtime v0.28.0/go.mod h1:QN7OzcS+XuYmkQLw05akXk0jRH/eZ3kb18+1KwW9gyc=
+github.com/go-openapi/spec v0.21.0 h1:LTVzPc3p/RzRnkQqLRndbAzjY0d0BCL72A6j3CdL9ZY=
+github.com/go-openapi/spec v0.21.0/go.mod h1:78u6VdPw81XU44qEWGhtr982gJ5BWg2c0I5XwVMotYk=
+github.com/go-openapi/strfmt v0.23.0 h1:nlUS6BCqcnAk0pyhi9Y+kdDVZdZMHfEKQiS4HaMgO/c=
+github.com/go-openapi/strfmt v0.23.0/go.mod h1:NrtIpfKtWIygRkKVsxh7XQMDQW5HKQl6S5ik2elW+K4=
+github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE=
+github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ=
+github.com/go-openapi/validate v0.24.0 h1:LdfDKwNbpB6Vn40xhTdNZAnfLECL81w+VX3BumrGD58=
+github.com/go-openapi/validate v0.24.0/go.mod h1:iyeX1sEufmv3nPbBdX3ieNviWnOZaJ1+zquzJEf2BAQ=
+github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
+github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
+github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
+github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
+github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
+github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
+github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
+github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
+github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
+github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
+github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
+github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
+github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
+github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4=
+github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
+github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs=
+github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc=
+github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=
+github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=
+github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
+github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
+github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
+go.mongodb.org/mongo-driver v1.14.0 h1:P98w8egYRjYe3XDjxhYJagTokP/H6HzlsnojRgZRd80=
+go.mongodb.org/mongo-driver v1.14.0/go.mod h1:Vzb0Mk/pa7e6cWw85R4F/endUC3u0U9jGcNU603k65c=
+go.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo=
+go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo=
+go.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI=
+go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco=
+go.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw=
+go.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg=
+go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI=
+go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU=
+golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M=
+golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
+golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y=
+golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
+gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
+gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
+gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
diff --git a/obs-staging-bot/main.go b/obs-staging-bot/main.go
new file mode 100644
index 0000000..3000d3b
--- /dev/null
+++ b/obs-staging-bot/main.go
@@ -0,0 +1,52 @@
+package main
+
+import (
+	"errors"
+	"fmt"
+	"log"
+	"net/http"
+	"os"
+	"path/filepath"
+
+	"src.opensuse.org/autogits/common"
+)
+
+const (
+	GitAuthor = "GiteaBot - Obs Staging"
+)
+
+var GiteaToken string
+
+func parseObsSecretToken() (string, error) {
+	ObsToken := os.Getenv(ObsTokenEnv)
+	if len(ObsToken) < 10 {
+		return "", fmt.Errorf("Missing %s", ObsTokenEnv)
+	}
+
+	err := os.Setenv(ObsTokenEnv, "")
+	if err != nil {
+		return "", fmt.Errorf("Cannot reset %s: %v", GiteaTokenEnv, err)
+	}
+
+	return ObsToken, nil
+}
+
+func parseGiteaSecretToken() (string, error) {
+	GiteaToken := os.Getenv(GiteaTokenEnv)
+	if len(GiteaToken) < 10 {
+		return errors.New(GiteaTokenEnv + " not provided")
+	}
+
+	err := os.Setenv(GiteaTokenEnv, "")
+	if err != nil {
+		return fmt.Errorf("%s: %v", "Cannot reset "+GiteaTokenEnv, err)
+	}
+
+	return nil
+}
+
+func main() {
+	parseGiteaSecretToken()
+	parseObsSecretToken()
+//	createListenServer()
+}
diff --git a/obs-staging-bot/main_test.go b/obs-staging-bot/main_test.go
new file mode 100644
index 0000000..e26bdc1
--- /dev/null
+++ b/obs-staging-bot/main_test.go
@@ -0,0 +1,2 @@
+package main
+
diff --git a/pr-review/.gitignore b/pr-review/.gitignore
new file mode 100644
index 0000000..4bedfd9
--- /dev/null
+++ b/pr-review/.gitignore
@@ -0,0 +1 @@
+pr-review
diff --git a/pr-review/Makefile b/pr-review/Makefile
new file mode 100644
index 0000000..a3e223d
--- /dev/null
+++ b/pr-review/Makefile
@@ -0,0 +1,14 @@
+all: build
+
+api.json:
+	curl -o api.json https://src.opensuse.org/swagger.v1.json
+
+generated/client/gitea_api_client.go: api.json
+	[ -d generated ] || mkdir generated
+	podman run --rm -v $$(pwd):/api ghcr.io/go-swagger/go-swagger generate client -f /api/api.json -t /api/generated
+
+api: generated/client/gitea_api_client.go
+
+build: api
+	go build
+
diff --git a/pr-review/api.json b/pr-review/api.json
new file mode 100644
index 0000000..10c2f4b
--- /dev/null
+++ b/pr-review/api.json
@@ -0,0 +1,25728 @@
+{
+  "consumes": [
+    "application/json",
+    "text/plain"
+  ],
+  "produces": [
+    "application/json",
+    "text/html"
+  ],
+  "schemes": [
+    "https",
+    "http"
+  ],
+  "swagger": "2.0",
+  "info": {
+    "description": "This documentation describes the Gitea API.",
+    "title": "Gitea API",
+    "license": {
+      "name": "MIT",
+      "url": "http://opensource.org/licenses/MIT"
+    },
+    "version": "1.22.0"
+  },
+  "basePath": "/api/v1",
+  "paths": {
+    "/activitypub/user-id/{user-id}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "activitypub"
+        ],
+        "summary": "Returns the Person actor for a user",
+        "operationId": "activitypubPerson",
+        "parameters": [
+          {
+            "type": "integer",
+            "description": "user ID of the user",
+            "name": "user-id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/ActivityPub"
+          }
+        }
+      }
+    },
+    "/activitypub/user-id/{user-id}/inbox": {
+      "post": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "activitypub"
+        ],
+        "summary": "Send to the inbox",
+        "operationId": "activitypubPersonInbox",
+        "parameters": [
+          {
+            "type": "integer",
+            "description": "user ID of the user",
+            "name": "user-id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          }
+        }
+      }
+    },
+    "/admin/cron": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "admin"
+        ],
+        "summary": "List cron tasks",
+        "operationId": "adminCronList",
+        "parameters": [
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/CronList"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          }
+        }
+      }
+    },
+    "/admin/cron/{task}": {
+      "post": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "admin"
+        ],
+        "summary": "Run cron task",
+        "operationId": "adminCronRun",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "task to run",
+            "name": "task",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/admin/emails": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "admin"
+        ],
+        "summary": "List all emails",
+        "operationId": "adminGetAllEmails",
+        "parameters": [
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/EmailList"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          }
+        }
+      }
+    },
+    "/admin/emails/search": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "admin"
+        ],
+        "summary": "Search all emails",
+        "operationId": "adminSearchEmails",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "keyword",
+            "name": "q",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/EmailList"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          }
+        }
+      }
+    },
+    "/admin/hooks": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "admin"
+        ],
+        "summary": "List system's webhooks",
+        "operationId": "adminListHooks",
+        "parameters": [
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/HookList"
+          }
+        }
+      },
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "admin"
+        ],
+        "summary": "Create a hook",
+        "operationId": "adminCreateHook",
+        "parameters": [
+          {
+            "name": "body",
+            "in": "body",
+            "required": true,
+            "schema": {
+              "$ref": "#/definitions/CreateHookOption"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/Hook"
+          }
+        }
+      }
+    },
+    "/admin/hooks/{id}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "admin"
+        ],
+        "summary": "Get a hook",
+        "operationId": "adminGetHook",
+        "parameters": [
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the hook to get",
+            "name": "id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Hook"
+          }
+        }
+      },
+      "delete": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "admin"
+        ],
+        "summary": "Delete a hook",
+        "operationId": "adminDeleteHook",
+        "parameters": [
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the hook to delete",
+            "name": "id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          }
+        }
+      },
+      "patch": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "admin"
+        ],
+        "summary": "Update a hook",
+        "operationId": "adminEditHook",
+        "parameters": [
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the hook to update",
+            "name": "id",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/EditHookOption"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Hook"
+          }
+        }
+      }
+    },
+    "/admin/orgs": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "admin"
+        ],
+        "summary": "List all organizations",
+        "operationId": "adminGetAllOrgs",
+        "parameters": [
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/OrganizationList"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          }
+        }
+      }
+    },
+    "/admin/runners/registration-token": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "admin"
+        ],
+        "summary": "Get an global actions runner registration token",
+        "operationId": "adminGetRunnerRegistrationToken",
+        "responses": {
+          "200": {
+            "$ref": "#/responses/RegistrationToken"
+          }
+        }
+      }
+    },
+    "/admin/unadopted": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "admin"
+        ],
+        "summary": "List unadopted repositories",
+        "operationId": "adminUnadoptedList",
+        "parameters": [
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          },
+          {
+            "type": "string",
+            "description": "pattern of repositories to search for",
+            "name": "pattern",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/StringSlice"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          }
+        }
+      }
+    },
+    "/admin/unadopted/{owner}/{repo}": {
+      "post": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "admin"
+        ],
+        "summary": "Adopt unadopted files as a repository",
+        "operationId": "adminAdoptRepository",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "admin"
+        ],
+        "summary": "Delete unadopted files",
+        "operationId": "adminDeleteUnadoptedRepository",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          }
+        }
+      }
+    },
+    "/admin/users": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "admin"
+        ],
+        "summary": "Search users according filter conditions",
+        "operationId": "adminSearchUsers",
+        "parameters": [
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "ID of the user's login source to search for",
+            "name": "source_id",
+            "in": "query"
+          },
+          {
+            "type": "string",
+            "description": "user's login name to search for",
+            "name": "login_name",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/UserList"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          }
+        }
+      },
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "admin"
+        ],
+        "summary": "Create a user",
+        "operationId": "adminCreateUser",
+        "parameters": [
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/CreateUserOption"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/User"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      }
+    },
+    "/admin/users/{username}": {
+      "delete": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "admin"
+        ],
+        "summary": "Delete a user",
+        "operationId": "adminDeleteUser",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "username of user to delete",
+            "name": "username",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "boolean",
+            "description": "purge the user from the system completely",
+            "name": "purge",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      },
+      "patch": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "admin"
+        ],
+        "summary": "Edit an existing user",
+        "operationId": "adminEditUser",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "username of user to edit",
+            "name": "username",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/EditUserOption"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/User"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      }
+    },
+    "/admin/users/{username}/badges": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "admin"
+        ],
+        "summary": "List a user's badges",
+        "operationId": "adminListUserBadges",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "username of user",
+            "name": "username",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/BadgeList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "admin"
+        ],
+        "summary": "Add a badge to a user",
+        "operationId": "adminAddUserBadges",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "username of user",
+            "name": "username",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/UserBadgeOption"
+            }
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          }
+        }
+      },
+      "delete": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "admin"
+        ],
+        "summary": "Remove a badge from a user",
+        "operationId": "adminDeleteUserBadges",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "username of user",
+            "name": "username",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/UserBadgeOption"
+            }
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      }
+    },
+    "/admin/users/{username}/keys": {
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "admin"
+        ],
+        "summary": "Add a public key on behalf of a user",
+        "operationId": "adminCreatePublicKey",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "username of the user",
+            "name": "username",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "key",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/CreateKeyOption"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/PublicKey"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      }
+    },
+    "/admin/users/{username}/keys/{id}": {
+      "delete": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "admin"
+        ],
+        "summary": "Delete a user's public key",
+        "operationId": "adminDeleteUserPublicKey",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "username of user",
+            "name": "username",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the key to delete",
+            "name": "id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/admin/users/{username}/orgs": {
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "admin"
+        ],
+        "summary": "Create an organization",
+        "operationId": "adminCreateOrg",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "username of the user that will own the created organization",
+            "name": "username",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "organization",
+            "in": "body",
+            "required": true,
+            "schema": {
+              "$ref": "#/definitions/CreateOrgOption"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/Organization"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      }
+    },
+    "/admin/users/{username}/rename": {
+      "post": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "admin"
+        ],
+        "summary": "Rename a user",
+        "operationId": "adminRenameUser",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "existing username of user",
+            "name": "username",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "required": true,
+            "schema": {
+              "$ref": "#/definitions/RenameUserOption"
+            }
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      }
+    },
+    "/admin/users/{username}/repos": {
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "admin"
+        ],
+        "summary": "Create a repository on behalf of a user",
+        "operationId": "adminCreateRepo",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "username of the user. This user will own the created repository",
+            "name": "username",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "repository",
+            "in": "body",
+            "required": true,
+            "schema": {
+              "$ref": "#/definitions/CreateRepoOption"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/Repository"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "409": {
+            "$ref": "#/responses/error"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      }
+    },
+    "/gitignore/templates": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "miscellaneous"
+        ],
+        "summary": "Returns a list of all gitignore templates",
+        "operationId": "listGitignoresTemplates",
+        "responses": {
+          "200": {
+            "$ref": "#/responses/GitignoreTemplateList"
+          }
+        }
+      }
+    },
+    "/gitignore/templates/{name}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "miscellaneous"
+        ],
+        "summary": "Returns information about a gitignore template",
+        "operationId": "getGitignoreTemplateInfo",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the template",
+            "name": "name",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/GitignoreTemplateInfo"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/label/templates": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "miscellaneous"
+        ],
+        "summary": "Returns a list of all label templates",
+        "operationId": "listLabelTemplates",
+        "responses": {
+          "200": {
+            "$ref": "#/responses/LabelTemplateList"
+          }
+        }
+      }
+    },
+    "/label/templates/{name}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "miscellaneous"
+        ],
+        "summary": "Returns all labels in a template",
+        "operationId": "getLabelTemplateInfo",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the template",
+            "name": "name",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/LabelTemplateInfo"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/licenses": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "miscellaneous"
+        ],
+        "summary": "Returns a list of all license templates",
+        "operationId": "listLicenseTemplates",
+        "responses": {
+          "200": {
+            "$ref": "#/responses/LicenseTemplateList"
+          }
+        }
+      }
+    },
+    "/licenses/{name}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "miscellaneous"
+        ],
+        "summary": "Returns information about a license template",
+        "operationId": "getLicenseTemplateInfo",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the license",
+            "name": "name",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/LicenseTemplateInfo"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/markdown": {
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "text/html"
+        ],
+        "tags": [
+          "miscellaneous"
+        ],
+        "summary": "Render a markdown document as HTML",
+        "operationId": "renderMarkdown",
+        "parameters": [
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/MarkdownOption"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/MarkdownRender"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      }
+    },
+    "/markdown/raw": {
+      "post": {
+        "consumes": [
+          "text/plain"
+        ],
+        "produces": [
+          "text/html"
+        ],
+        "tags": [
+          "miscellaneous"
+        ],
+        "summary": "Render raw markdown as HTML",
+        "operationId": "renderMarkdownRaw",
+        "parameters": [
+          {
+            "description": "Request body to render",
+            "name": "body",
+            "in": "body",
+            "required": true,
+            "schema": {
+              "type": "string"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/MarkdownRender"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      }
+    },
+    "/markup": {
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "text/html"
+        ],
+        "tags": [
+          "miscellaneous"
+        ],
+        "summary": "Render a markup document as HTML",
+        "operationId": "renderMarkup",
+        "parameters": [
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/MarkupOption"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/MarkupRender"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      }
+    },
+    "/nodeinfo": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "miscellaneous"
+        ],
+        "summary": "Returns the nodeinfo of the Gitea application",
+        "operationId": "getNodeInfo",
+        "responses": {
+          "200": {
+            "$ref": "#/responses/NodeInfo"
+          }
+        }
+      }
+    },
+    "/notifications": {
+      "get": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "notification"
+        ],
+        "summary": "List users's notification threads",
+        "operationId": "notifyGetList",
+        "parameters": [
+          {
+            "type": "boolean",
+            "description": "If true, show notifications marked as read. Default value is false",
+            "name": "all",
+            "in": "query"
+          },
+          {
+            "type": "array",
+            "items": {
+              "type": "string"
+            },
+            "collectionFormat": "multi",
+            "description": "Show notifications with the provided status types. Options are: unread, read and/or pinned. Defaults to unread \u0026 pinned.",
+            "name": "status-types",
+            "in": "query"
+          },
+          {
+            "type": "array",
+            "items": {
+              "enum": [
+                "issue",
+                "pull",
+                "commit",
+                "repository"
+              ],
+              "type": "string"
+            },
+            "collectionFormat": "multi",
+            "description": "filter notifications by subject type",
+            "name": "subject-type",
+            "in": "query"
+          },
+          {
+            "type": "string",
+            "format": "date-time",
+            "description": "Only show notifications updated after the given time. This is a timestamp in RFC 3339 format",
+            "name": "since",
+            "in": "query"
+          },
+          {
+            "type": "string",
+            "format": "date-time",
+            "description": "Only show notifications updated before the given time. This is a timestamp in RFC 3339 format",
+            "name": "before",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/NotificationThreadList"
+          }
+        }
+      },
+      "put": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "notification"
+        ],
+        "summary": "Mark notification threads as read, pinned or unread",
+        "operationId": "notifyReadList",
+        "parameters": [
+          {
+            "type": "string",
+            "format": "date-time",
+            "description": "Describes the last point that notifications were checked. Anything updated since this time will not be updated.",
+            "name": "last_read_at",
+            "in": "query"
+          },
+          {
+            "type": "string",
+            "description": "If true, mark all notifications on this repo. Default value is false",
+            "name": "all",
+            "in": "query"
+          },
+          {
+            "type": "array",
+            "items": {
+              "type": "string"
+            },
+            "collectionFormat": "multi",
+            "description": "Mark notifications with the provided status types. Options are: unread, read and/or pinned. Defaults to unread.",
+            "name": "status-types",
+            "in": "query"
+          },
+          {
+            "type": "string",
+            "description": "Status to mark notifications as, Defaults to read.",
+            "name": "to-status",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "205": {
+            "$ref": "#/responses/NotificationThreadList"
+          }
+        }
+      }
+    },
+    "/notifications/new": {
+      "get": {
+        "tags": [
+          "notification"
+        ],
+        "summary": "Check if unread notifications exist",
+        "operationId": "notifyNewAvailable",
+        "responses": {
+          "200": {
+            "$ref": "#/responses/NotificationCount"
+          }
+        }
+      }
+    },
+    "/notifications/threads/{id}": {
+      "get": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "notification"
+        ],
+        "summary": "Get notification thread by ID",
+        "operationId": "notifyGetThread",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "id of notification thread",
+            "name": "id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/NotificationThread"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "patch": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "notification"
+        ],
+        "summary": "Mark notification thread as read by ID",
+        "operationId": "notifyReadThread",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "id of notification thread",
+            "name": "id",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "default": "read",
+            "description": "Status to mark notifications as",
+            "name": "to-status",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "205": {
+            "$ref": "#/responses/NotificationThread"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/org/{org}/repos": {
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "Create a repository in an organization",
+        "operationId": "createOrgRepoDeprecated",
+        "deprecated": true,
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of organization",
+            "name": "org",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/CreateRepoOption"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/Repository"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      }
+    },
+    "/orgs": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "Get list of organizations",
+        "operationId": "orgGetAll",
+        "parameters": [
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/OrganizationList"
+          }
+        }
+      },
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "Create an organization",
+        "operationId": "orgCreate",
+        "parameters": [
+          {
+            "name": "organization",
+            "in": "body",
+            "required": true,
+            "schema": {
+              "$ref": "#/definitions/CreateOrgOption"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/Organization"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      }
+    },
+    "/orgs/{org}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "Get an organization",
+        "operationId": "orgGet",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the organization to get",
+            "name": "org",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Organization"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "Delete an organization",
+        "operationId": "orgDelete",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "organization that is to be deleted",
+            "name": "org",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "patch": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "Edit an organization",
+        "operationId": "orgEdit",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the organization to edit",
+            "name": "org",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "required": true,
+            "schema": {
+              "$ref": "#/definitions/EditOrgOption"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Organization"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/orgs/{org}/actions/runners/registration-token": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "Get an organization's actions runner registration token",
+        "operationId": "orgGetRunnerRegistrationToken",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the organization",
+            "name": "org",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/RegistrationToken"
+          }
+        }
+      }
+    },
+    "/orgs/{org}/actions/secrets": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "List an organization's actions secrets",
+        "operationId": "orgListActionsSecrets",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the organization",
+            "name": "org",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/SecretList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/orgs/{org}/actions/secrets/{secretname}": {
+      "put": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "Create or Update a secret value in an organization",
+        "operationId": "updateOrgSecret",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of organization",
+            "name": "org",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the secret",
+            "name": "secretname",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/CreateOrUpdateSecretOption"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "description": "response when creating a secret"
+          },
+          "204": {
+            "description": "response when updating a secret"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "Delete a secret in an organization",
+        "operationId": "deleteOrgSecret",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of organization",
+            "name": "org",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the secret",
+            "name": "secretname",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "description": "delete one secret of the organization"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/orgs/{org}/actions/variables": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "Get an org-level variables list",
+        "operationId": "getOrgVariablesList",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the organization",
+            "name": "org",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/VariableList"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/orgs/{org}/actions/variables/{variablename}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "Get an org-level variable",
+        "operationId": "getOrgVariable",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the organization",
+            "name": "org",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the variable",
+            "name": "variablename",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/ActionVariable"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "put": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "Update an org-level variable",
+        "operationId": "updateOrgVariable",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the organization",
+            "name": "org",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the variable",
+            "name": "variablename",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/UpdateVariableOption"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "description": "response when updating an org-level variable"
+          },
+          "204": {
+            "description": "response when updating an org-level variable"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "Create an org-level variable",
+        "operationId": "createOrgVariable",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the organization",
+            "name": "org",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the variable",
+            "name": "variablename",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/CreateVariableOption"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "description": "response when creating an org-level variable"
+          },
+          "204": {
+            "description": "response when creating an org-level variable"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "Delete an org-level variable",
+        "operationId": "deleteOrgVariable",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the organization",
+            "name": "org",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the variable",
+            "name": "variablename",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/ActionVariable"
+          },
+          "201": {
+            "description": "response when deleting a variable"
+          },
+          "204": {
+            "description": "response when deleting a variable"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/orgs/{org}/activities/feeds": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "List an organization's activity feeds",
+        "operationId": "orgListActivityFeeds",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the org",
+            "name": "org",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "format": "date",
+            "description": "the date of the activities to be found",
+            "name": "date",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/ActivityFeedsList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/orgs/{org}/avatar": {
+      "post": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "Update Avatar",
+        "operationId": "orgUpdateAvatar",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the organization",
+            "name": "org",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/UpdateUserAvatarOption"
+            }
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "Delete Avatar",
+        "operationId": "orgDeleteAvatar",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the organization",
+            "name": "org",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/orgs/{org}/blocks": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "List users blocked by the organization",
+        "operationId": "organizationListBlocks",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the organization",
+            "name": "org",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/UserList"
+          }
+        }
+      }
+    },
+    "/orgs/{org}/blocks/{username}": {
+      "get": {
+        "tags": [
+          "organization"
+        ],
+        "summary": "Check if a user is blocked by the organization",
+        "operationId": "organizationCheckUserBlock",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the organization",
+            "name": "org",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "user to check",
+            "name": "username",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "put": {
+        "tags": [
+          "organization"
+        ],
+        "summary": "Block a user",
+        "operationId": "organizationBlockUser",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the organization",
+            "name": "org",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "user to block",
+            "name": "username",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "optional note for the block",
+            "name": "note",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      },
+      "delete": {
+        "tags": [
+          "organization"
+        ],
+        "summary": "Unblock a user",
+        "operationId": "organizationUnblockUser",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the organization",
+            "name": "org",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "user to unblock",
+            "name": "username",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      }
+    },
+    "/orgs/{org}/hooks": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "List an organization's webhooks",
+        "operationId": "orgListHooks",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the organization",
+            "name": "org",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/HookList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "Create a hook",
+        "operationId": "orgCreateHook",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the organization",
+            "name": "org",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "required": true,
+            "schema": {
+              "$ref": "#/definitions/CreateHookOption"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/Hook"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/orgs/{org}/hooks/{id}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "Get a hook",
+        "operationId": "orgGetHook",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the organization",
+            "name": "org",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the hook to get",
+            "name": "id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Hook"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "Delete a hook",
+        "operationId": "orgDeleteHook",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the organization",
+            "name": "org",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the hook to delete",
+            "name": "id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "patch": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "Update a hook",
+        "operationId": "orgEditHook",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the organization",
+            "name": "org",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the hook to update",
+            "name": "id",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/EditHookOption"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Hook"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/orgs/{org}/labels": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "List an organization's labels",
+        "operationId": "orgListLabels",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the organization",
+            "name": "org",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/LabelList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "Create a label for an organization",
+        "operationId": "orgCreateLabel",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the organization",
+            "name": "org",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/CreateLabelOption"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/Label"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      }
+    },
+    "/orgs/{org}/labels/{id}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "Get a single label",
+        "operationId": "orgGetLabel",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the organization",
+            "name": "org",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the label to get",
+            "name": "id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Label"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "tags": [
+          "organization"
+        ],
+        "summary": "Delete a label",
+        "operationId": "orgDeleteLabel",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the organization",
+            "name": "org",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the label to delete",
+            "name": "id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "patch": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "Update a label",
+        "operationId": "orgEditLabel",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the organization",
+            "name": "org",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the label to edit",
+            "name": "id",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/EditLabelOption"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Label"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      }
+    },
+    "/orgs/{org}/members": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "List an organization's members",
+        "operationId": "orgListMembers",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the organization",
+            "name": "org",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/UserList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/orgs/{org}/members/{username}": {
+      "get": {
+        "tags": [
+          "organization"
+        ],
+        "summary": "Check if a user is a member of an organization",
+        "operationId": "orgIsMember",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the organization",
+            "name": "org",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "username of the user",
+            "name": "username",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "description": "user is a member"
+          },
+          "303": {
+            "description": "redirection to /orgs/{org}/public_members/{username}"
+          },
+          "404": {
+            "description": "user is not a member"
+          }
+        }
+      },
+      "delete": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "Remove a member from an organization",
+        "operationId": "orgDeleteMember",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the organization",
+            "name": "org",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "username of the user",
+            "name": "username",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "description": "member removed"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/orgs/{org}/public_members": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "List an organization's public members",
+        "operationId": "orgListPublicMembers",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the organization",
+            "name": "org",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/UserList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/orgs/{org}/public_members/{username}": {
+      "get": {
+        "tags": [
+          "organization"
+        ],
+        "summary": "Check if a user is a public member of an organization",
+        "operationId": "orgIsPublicMember",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the organization",
+            "name": "org",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "username of the user",
+            "name": "username",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "description": "user is a public member"
+          },
+          "404": {
+            "description": "user is not a public member"
+          }
+        }
+      },
+      "put": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "Publicize a user's membership",
+        "operationId": "orgPublicizeMember",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the organization",
+            "name": "org",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "username of the user",
+            "name": "username",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "description": "membership publicized"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "Conceal a user's membership",
+        "operationId": "orgConcealMember",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the organization",
+            "name": "org",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "username of the user",
+            "name": "username",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/orgs/{org}/repos": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "List an organization's repos",
+        "operationId": "orgListRepos",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the organization",
+            "name": "org",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/RepositoryList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "Create a repository in an organization",
+        "operationId": "createOrgRepo",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of organization",
+            "name": "org",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/CreateRepoOption"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/Repository"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/orgs/{org}/teams": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "List an organization's teams",
+        "operationId": "orgListTeams",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the organization",
+            "name": "org",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/TeamList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "Create a team",
+        "operationId": "orgCreateTeam",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the organization",
+            "name": "org",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/CreateTeamOption"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/Team"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      }
+    },
+    "/orgs/{org}/teams/search": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "Search for teams within an organization",
+        "operationId": "teamSearch",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the organization",
+            "name": "org",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "keywords to search",
+            "name": "q",
+            "in": "query"
+          },
+          {
+            "type": "boolean",
+            "description": "include search within team description (defaults to true)",
+            "name": "include_desc",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "SearchResults of a successful search",
+            "schema": {
+              "type": "object",
+              "properties": {
+                "data": {
+                  "type": "array",
+                  "items": {
+                    "$ref": "#/definitions/Team"
+                  }
+                },
+                "ok": {
+                  "type": "boolean"
+                }
+              }
+            }
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/packages/{owner}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "package"
+        ],
+        "summary": "Gets all packages of an owner",
+        "operationId": "listPackages",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the packages",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          },
+          {
+            "enum": [
+              "alpine",
+              "cargo",
+              "chef",
+              "composer",
+              "conan",
+              "conda",
+              "container",
+              "cran",
+              "debian",
+              "generic",
+              "go",
+              "helm",
+              "maven",
+              "npm",
+              "nuget",
+              "pub",
+              "pypi",
+              "rpm",
+              "rubygems",
+              "swift",
+              "vagrant"
+            ],
+            "type": "string",
+            "description": "package type filter",
+            "name": "type",
+            "in": "query"
+          },
+          {
+            "type": "string",
+            "description": "name filter",
+            "name": "q",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/PackageList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/packages/{owner}/{type}/{name}/{version}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "package"
+        ],
+        "summary": "Gets a package",
+        "operationId": "getPackage",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the package",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "type of the package",
+            "name": "type",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the package",
+            "name": "name",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "version of the package",
+            "name": "version",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Package"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "tags": [
+          "package"
+        ],
+        "summary": "Delete a package",
+        "operationId": "deletePackage",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the package",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "type of the package",
+            "name": "type",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the package",
+            "name": "name",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "version of the package",
+            "name": "version",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/packages/{owner}/{type}/{name}/{version}/files": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "package"
+        ],
+        "summary": "Gets all files of a package",
+        "operationId": "listPackageFiles",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the package",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "type of the package",
+            "name": "type",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the package",
+            "name": "name",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "version of the package",
+            "name": "version",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/PackageFileList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/issues/search": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Search for issues across the repositories that the user has access to",
+        "operationId": "issueSearchIssues",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "whether issue is open or closed",
+            "name": "state",
+            "in": "query"
+          },
+          {
+            "type": "string",
+            "description": "comma separated list of labels. Fetch only issues that have any of this labels. Non existent labels are discarded",
+            "name": "labels",
+            "in": "query"
+          },
+          {
+            "type": "string",
+            "description": "comma separated list of milestone names. Fetch only issues that have any of this milestones. Non existent are discarded",
+            "name": "milestones",
+            "in": "query"
+          },
+          {
+            "type": "string",
+            "description": "search string",
+            "name": "q",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "repository to prioritize in the results",
+            "name": "priority_repo_id",
+            "in": "query"
+          },
+          {
+            "type": "string",
+            "description": "filter by type (issues / pulls) if set",
+            "name": "type",
+            "in": "query"
+          },
+          {
+            "type": "string",
+            "format": "date-time",
+            "description": "Only show notifications updated after the given time. This is a timestamp in RFC 3339 format",
+            "name": "since",
+            "in": "query"
+          },
+          {
+            "type": "string",
+            "format": "date-time",
+            "description": "Only show notifications updated before the given time. This is a timestamp in RFC 3339 format",
+            "name": "before",
+            "in": "query"
+          },
+          {
+            "type": "boolean",
+            "description": "filter (issues / pulls) assigned to you, default is false",
+            "name": "assigned",
+            "in": "query"
+          },
+          {
+            "type": "boolean",
+            "description": "filter (issues / pulls) created by you, default is false",
+            "name": "created",
+            "in": "query"
+          },
+          {
+            "type": "boolean",
+            "description": "filter (issues / pulls) mentioning you, default is false",
+            "name": "mentioned",
+            "in": "query"
+          },
+          {
+            "type": "boolean",
+            "description": "filter pulls requesting your review, default is false",
+            "name": "review_requested",
+            "in": "query"
+          },
+          {
+            "type": "boolean",
+            "description": "filter pulls reviewed by you, default is false",
+            "name": "reviewed",
+            "in": "query"
+          },
+          {
+            "type": "string",
+            "description": "filter by owner",
+            "name": "owner",
+            "in": "query"
+          },
+          {
+            "type": "string",
+            "description": "filter by team (requires organization owner parameter to be provided)",
+            "name": "team",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/IssueList"
+          }
+        }
+      }
+    },
+    "/repos/migrate": {
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Migrate a remote git repository",
+        "operationId": "repoMigrate",
+        "parameters": [
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/MigrateRepoOptions"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/Repository"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "409": {
+            "description": "The repository with the same name already exists."
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      }
+    },
+    "/repos/search": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Search for repositories",
+        "operationId": "repoSearch",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "keyword",
+            "name": "q",
+            "in": "query"
+          },
+          {
+            "type": "boolean",
+            "description": "Limit search to repositories with keyword as topic",
+            "name": "topic",
+            "in": "query"
+          },
+          {
+            "type": "boolean",
+            "description": "include search of keyword within repository description",
+            "name": "includeDesc",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "search only for repos that the user with the given id owns or contributes to",
+            "name": "uid",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "repo owner to prioritize in the results",
+            "name": "priority_owner_id",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "search only for repos that belong to the given team id",
+            "name": "team_id",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "search only for repos that the user with the given id has starred",
+            "name": "starredBy",
+            "in": "query"
+          },
+          {
+            "type": "boolean",
+            "description": "include private repositories this user has access to (defaults to true)",
+            "name": "private",
+            "in": "query"
+          },
+          {
+            "type": "boolean",
+            "description": "show only pubic, private or all repositories (defaults to all)",
+            "name": "is_private",
+            "in": "query"
+          },
+          {
+            "type": "boolean",
+            "description": "include template repositories this user has access to (defaults to true)",
+            "name": "template",
+            "in": "query"
+          },
+          {
+            "type": "boolean",
+            "description": "show only archived, non-archived or all repositories (defaults to all)",
+            "name": "archived",
+            "in": "query"
+          },
+          {
+            "type": "string",
+            "description": "type of repository to search for. Supported values are \"fork\", \"source\", \"mirror\" and \"collaborative\"",
+            "name": "mode",
+            "in": "query"
+          },
+          {
+            "type": "boolean",
+            "description": "if `uid` is given, search only for repos that the user owns",
+            "name": "exclusive",
+            "in": "query"
+          },
+          {
+            "type": "string",
+            "description": "sort repos by attribute. Supported values are \"alpha\", \"created\", \"updated\", \"size\", and \"id\". Default is \"alpha\"",
+            "name": "sort",
+            "in": "query"
+          },
+          {
+            "type": "string",
+            "description": "sort order, either \"asc\" (ascending) or \"desc\" (descending). Default is \"asc\", ignored if \"sort\" is not specified.",
+            "name": "order",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/SearchResults"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get a repository",
+        "operationId": "repoGet",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Repository"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Delete a repository",
+        "operationId": "repoDelete",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo to delete",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo to delete",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "patch": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Edit a repository's properties. Only fields that are set will be changed.",
+        "operationId": "repoEdit",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo to edit",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo to edit",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "description": "Properties of a repo that you can edit",
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/EditRepoOption"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Repository"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/actions/secrets": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "List an repo's actions secrets",
+        "operationId": "repoListActionsSecrets",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repository",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repository",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/SecretList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/actions/secrets/{secretname}": {
+      "put": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Create or Update a secret value in a repository",
+        "operationId": "updateRepoSecret",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repository",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repository",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the secret",
+            "name": "secretname",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/CreateOrUpdateSecretOption"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "description": "response when creating a secret"
+          },
+          "204": {
+            "description": "response when updating a secret"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Delete a secret in a repository",
+        "operationId": "deleteRepoSecret",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repository",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repository",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the secret",
+            "name": "secretname",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "description": "delete one secret of the organization"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/actions/variables": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get repo-level variables list",
+        "operationId": "getRepoVariablesList",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the owner",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repository",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/VariableList"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/actions/variables/{variablename}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get a repo-level variable",
+        "operationId": "getRepoVariable",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the owner",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repository",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the variable",
+            "name": "variablename",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/ActionVariable"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "put": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Update a repo-level variable",
+        "operationId": "updateRepoVariable",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the owner",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repository",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the variable",
+            "name": "variablename",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/UpdateVariableOption"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "description": "response when updating a repo-level variable"
+          },
+          "204": {
+            "description": "response when updating a repo-level variable"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "post": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Create a repo-level variable",
+        "operationId": "createRepoVariable",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the owner",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repository",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the variable",
+            "name": "variablename",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/CreateVariableOption"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "description": "response when creating a repo-level variable"
+          },
+          "204": {
+            "description": "response when creating a repo-level variable"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Delete a repo-level variable",
+        "operationId": "deleteRepoVariable",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the owner",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repository",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the variable",
+            "name": "variablename",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/ActionVariable"
+          },
+          "201": {
+            "description": "response when deleting a variable"
+          },
+          "204": {
+            "description": "response when deleting a variable"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/activities/feeds": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "List a repository's activity feeds",
+        "operationId": "repoListActivityFeeds",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "format": "date",
+            "description": "the date of the activities to be found",
+            "name": "date",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/ActivityFeedsList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/archive/{archive}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get an archive of a repository",
+        "operationId": "repoGetArchive",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "the git reference for download with attached archive format (e.g. master.zip)",
+            "name": "archive",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "success"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/assignees": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Return all users that have write access and can be assigned to issues",
+        "operationId": "repoGetAssignees",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/UserList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/avatar": {
+      "post": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Update avatar",
+        "operationId": "repoUpdateAvatar",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/UpdateRepoAvatarOption"
+            }
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Delete avatar",
+        "operationId": "repoDeleteAvatar",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/branch_protections": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "List branch protections for a repository",
+        "operationId": "repoListBranchProtection",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/BranchProtectionList"
+          }
+        }
+      },
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Create a branch protections for a repository",
+        "operationId": "repoCreateBranchProtection",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/CreateBranchProtectionOption"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/BranchProtection"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          },
+          "423": {
+            "$ref": "#/responses/repoArchivedError"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/branch_protections/{name}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get a specific branch protection for the repository",
+        "operationId": "repoGetBranchProtection",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of protected branch",
+            "name": "name",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/BranchProtection"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Delete a specific branch protection for the repository",
+        "operationId": "repoDeleteBranchProtection",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of protected branch",
+            "name": "name",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "patch": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Edit a branch protections for a repository. Only fields that are set will be changed",
+        "operationId": "repoEditBranchProtection",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of protected branch",
+            "name": "name",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/EditBranchProtectionOption"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/BranchProtection"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          },
+          "423": {
+            "$ref": "#/responses/repoArchivedError"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/branches": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "List a repository's branches",
+        "operationId": "repoListBranches",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/BranchList"
+          }
+        }
+      },
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Create a branch",
+        "operationId": "repoCreateBranch",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/CreateBranchRepoOption"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/Branch"
+          },
+          "403": {
+            "description": "The branch is archived or a mirror."
+          },
+          "404": {
+            "description": "The old branch does not exist."
+          },
+          "409": {
+            "description": "The branch with the same name already exists."
+          },
+          "423": {
+            "$ref": "#/responses/repoArchivedError"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/branches/{branch}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Retrieve a specific branch from a repository, including its effective branch protection",
+        "operationId": "repoGetBranch",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "branch to get",
+            "name": "branch",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Branch"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Delete a specific branch from a repository",
+        "operationId": "repoDeleteBranch",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "branch to delete",
+            "name": "branch",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "403": {
+            "$ref": "#/responses/error"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "423": {
+            "$ref": "#/responses/repoArchivedError"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/collaborators": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "List a repository's collaborators",
+        "operationId": "repoListCollaborators",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/UserList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/collaborators/{collaborator}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Check if a user is a collaborator of a repository",
+        "operationId": "repoCheckCollaborator",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "username of the collaborator",
+            "name": "collaborator",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      },
+      "put": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Add a collaborator to a repository",
+        "operationId": "repoAddCollaborator",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "username of the collaborator to add",
+            "name": "collaborator",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/AddCollaboratorOption"
+            }
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      },
+      "delete": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Delete a collaborator from a repository",
+        "operationId": "repoDeleteCollaborator",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "username of the collaborator to delete",
+            "name": "collaborator",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/collaborators/{collaborator}/permission": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get repository permissions for a user",
+        "operationId": "repoGetRepoPermissions",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "username of the collaborator",
+            "name": "collaborator",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/RepoCollaboratorPermission"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/commits": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get a list of all commits from a repository",
+        "operationId": "repoGetAllCommits",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "SHA or branch to start listing commits from (usually 'master')",
+            "name": "sha",
+            "in": "query"
+          },
+          {
+            "type": "string",
+            "description": "filepath of a file/dir",
+            "name": "path",
+            "in": "query"
+          },
+          {
+            "type": "boolean",
+            "description": "include diff stats for every commit (disable for speedup, default 'true')",
+            "name": "stat",
+            "in": "query"
+          },
+          {
+            "type": "boolean",
+            "description": "include verification for every commit (disable for speedup, default 'true')",
+            "name": "verification",
+            "in": "query"
+          },
+          {
+            "type": "boolean",
+            "description": "include a list of affected files for every commit (disable for speedup, default 'true')",
+            "name": "files",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results (ignored if used with 'path')",
+            "name": "limit",
+            "in": "query"
+          },
+          {
+            "type": "string",
+            "description": "commits that match the given specifier will not be listed.",
+            "name": "not",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/CommitList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "409": {
+            "$ref": "#/responses/EmptyRepository"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/commits/{ref}/status": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get a commit's combined status, by branch/tag/commit reference",
+        "operationId": "repoGetCombinedStatusByRef",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of branch/tag/commit",
+            "name": "ref",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/CombinedStatus"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/commits/{ref}/statuses": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get a commit's statuses, by branch/tag/commit reference",
+        "operationId": "repoListStatusesByRef",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of branch/tag/commit",
+            "name": "ref",
+            "in": "path",
+            "required": true
+          },
+          {
+            "enum": [
+              "oldest",
+              "recentupdate",
+              "leastupdate",
+              "leastindex",
+              "highestindex"
+            ],
+            "type": "string",
+            "description": "type of sort",
+            "name": "sort",
+            "in": "query"
+          },
+          {
+            "enum": [
+              "pending",
+              "success",
+              "error",
+              "failure",
+              "warning"
+            ],
+            "type": "string",
+            "description": "type of state",
+            "name": "state",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/CommitStatusList"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/commits/{sha}/pull": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get the pull request of the commit",
+        "operationId": "repoGetCommitPullRequest",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "SHA of the commit to get",
+            "name": "sha",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/PullRequest"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/compare/{basehead}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get commit comparison information",
+        "operationId": "repoCompareDiff",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "compare two branches or commits",
+            "name": "basehead",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Compare"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/contents": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Gets the metadata of all the entries of the root dir",
+        "operationId": "repoGetContentsList",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "The name of the commit/branch/tag. Default the repository’s default branch (usually master)",
+            "name": "ref",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/ContentsListResponse"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Modify multiple files in a repository",
+        "operationId": "repoChangeFiles",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "required": true,
+            "schema": {
+              "$ref": "#/definitions/ChangeFilesOptions"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/FilesResponse"
+          },
+          "403": {
+            "$ref": "#/responses/error"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "422": {
+            "$ref": "#/responses/error"
+          },
+          "423": {
+            "$ref": "#/responses/repoArchivedError"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/contents/{filepath}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Gets the metadata and contents (if a file) of an entry in a repository, or a list of entries if a dir",
+        "operationId": "repoGetContents",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "path of the dir, file, symlink or submodule in the repo",
+            "name": "filepath",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "The name of the commit/branch/tag. Default the repository’s default branch (usually master)",
+            "name": "ref",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/ContentsResponse"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "put": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Update a file in a repository",
+        "operationId": "repoUpdateFile",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "path of the file to update",
+            "name": "filepath",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "required": true,
+            "schema": {
+              "$ref": "#/definitions/UpdateFileOptions"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/FileResponse"
+          },
+          "403": {
+            "$ref": "#/responses/error"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "422": {
+            "$ref": "#/responses/error"
+          },
+          "423": {
+            "$ref": "#/responses/repoArchivedError"
+          }
+        }
+      },
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Create a file in a repository",
+        "operationId": "repoCreateFile",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "path of the file to create",
+            "name": "filepath",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "required": true,
+            "schema": {
+              "$ref": "#/definitions/CreateFileOptions"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/FileResponse"
+          },
+          "403": {
+            "$ref": "#/responses/error"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "422": {
+            "$ref": "#/responses/error"
+          },
+          "423": {
+            "$ref": "#/responses/repoArchivedError"
+          }
+        }
+      },
+      "delete": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Delete a file in a repository",
+        "operationId": "repoDeleteFile",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "path of the file to delete",
+            "name": "filepath",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "required": true,
+            "schema": {
+              "$ref": "#/definitions/DeleteFileOptions"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/FileDeleteResponse"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "403": {
+            "$ref": "#/responses/error"
+          },
+          "404": {
+            "$ref": "#/responses/error"
+          },
+          "423": {
+            "$ref": "#/responses/repoArchivedError"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/diffpatch": {
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Apply diff patch to repository",
+        "operationId": "repoApplyDiffPatch",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "required": true,
+            "schema": {
+              "$ref": "#/definitions/UpdateFileOptions"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/FileResponse"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "423": {
+            "$ref": "#/responses/repoArchivedError"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/editorconfig/{filepath}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get the EditorConfig definitions of a file in a repository",
+        "operationId": "repoGetEditorConfig",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "filepath of file to get",
+            "name": "filepath",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "The name of the commit/branch/tag. Default the repository’s default branch (usually master)",
+            "name": "ref",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "success"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/forks": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "List a repository's forks",
+        "operationId": "listForks",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/RepositoryList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "post": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Fork a repository",
+        "operationId": "createFork",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo to fork",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo to fork",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/CreateForkOption"
+            }
+          }
+        ],
+        "responses": {
+          "202": {
+            "$ref": "#/responses/Repository"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "409": {
+            "description": "The repository with the same name already exists."
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/git/blobs/{sha}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Gets the blob of a repository.",
+        "operationId": "GetBlob",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "sha of the commit",
+            "name": "sha",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/GitBlobResponse"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/git/commits/{sha}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get a single commit from a repository",
+        "operationId": "repoGetSingleCommit",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "a git ref or commit sha",
+            "name": "sha",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "boolean",
+            "description": "include diff stats for every commit (disable for speedup, default 'true')",
+            "name": "stat",
+            "in": "query"
+          },
+          {
+            "type": "boolean",
+            "description": "include verification for every commit (disable for speedup, default 'true')",
+            "name": "verification",
+            "in": "query"
+          },
+          {
+            "type": "boolean",
+            "description": "include a list of affected files for every commit (disable for speedup, default 'true')",
+            "name": "files",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Commit"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/git/commits/{sha}.{diffType}": {
+      "get": {
+        "produces": [
+          "text/plain"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get a commit's diff or patch",
+        "operationId": "repoDownloadCommitDiffOrPatch",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "SHA of the commit to get",
+            "name": "sha",
+            "in": "path",
+            "required": true
+          },
+          {
+            "enum": [
+              "diff",
+              "patch"
+            ],
+            "type": "string",
+            "description": "whether the output is diff or patch",
+            "name": "diffType",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/string"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/git/notes/{sha}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get a note corresponding to a single commit from a repository",
+        "operationId": "repoGetNote",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "a git ref or commit sha",
+            "name": "sha",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "boolean",
+            "description": "include verification for every commit (disable for speedup, default 'true')",
+            "name": "verification",
+            "in": "query"
+          },
+          {
+            "type": "boolean",
+            "description": "include a list of affected files for every commit (disable for speedup, default 'true')",
+            "name": "files",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Note"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/git/refs": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get specified ref or filtered repository's refs",
+        "operationId": "repoListAllGitRefs",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/ReferenceList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/git/refs/{ref}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get specified ref or filtered repository's refs",
+        "operationId": "repoListGitRefs",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "part or full name of the ref",
+            "name": "ref",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/ReferenceList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/git/tags/{sha}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Gets the tag object of an annotated tag (not lightweight tags)",
+        "operationId": "GetAnnotatedTag",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "sha of the tag. The Git tags API only supports annotated tag objects, not lightweight tags.",
+            "name": "sha",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/AnnotatedTag"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/git/trees/{sha}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Gets the tree of a repository.",
+        "operationId": "GetTree",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "sha of the commit",
+            "name": "sha",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "boolean",
+            "description": "show all directories and files",
+            "name": "recursive",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page number; the 'truncated' field in the response will be true if there are still more items after this page, false if the last page",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "number of items per page",
+            "name": "per_page",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/GitTreeResponse"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/hooks": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "List the hooks in a repository",
+        "operationId": "repoListHooks",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/HookList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Create a hook",
+        "operationId": "repoCreateHook",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/CreateHookOption"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/Hook"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/hooks/git": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "List the Git hooks in a repository",
+        "operationId": "repoListGitHooks",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/GitHookList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/hooks/git/{id}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get a Git hook",
+        "operationId": "repoGetGitHook",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "id of the hook to get",
+            "name": "id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/GitHook"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Delete a Git hook in a repository",
+        "operationId": "repoDeleteGitHook",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "id of the hook to get",
+            "name": "id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "patch": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Edit a Git hook in a repository",
+        "operationId": "repoEditGitHook",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "id of the hook to get",
+            "name": "id",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/EditGitHookOption"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/GitHook"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/hooks/{id}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get a hook",
+        "operationId": "repoGetHook",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the hook to get",
+            "name": "id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Hook"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Delete a hook in a repository",
+        "operationId": "repoDeleteHook",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the hook to delete",
+            "name": "id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "patch": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Edit a hook in a repository",
+        "operationId": "repoEditHook",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the hook",
+            "name": "id",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/EditHookOption"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Hook"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/hooks/{id}/tests": {
+      "post": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Test a push webhook",
+        "operationId": "repoTestHook",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the hook to test",
+            "name": "id",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "The name of the commit/branch/tag, indicates which commit will be loaded to the webhook payload.",
+            "name": "ref",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/issue_config": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Returns the issue config for a repo",
+        "operationId": "repoGetIssueConfig",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/RepoIssueConfig"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/issue_config/validate": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Returns the validation information for a issue config",
+        "operationId": "repoValidateIssueConfig",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/RepoIssueConfigValidation"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/issue_templates": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get available issue templates for a repository",
+        "operationId": "repoGetIssueTemplates",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/IssueTemplates"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/issues": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "List a repository's issues",
+        "operationId": "issueListIssues",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "enum": [
+              "closed",
+              "open",
+              "all"
+            ],
+            "type": "string",
+            "description": "whether issue is open or closed",
+            "name": "state",
+            "in": "query"
+          },
+          {
+            "type": "string",
+            "description": "comma separated list of labels. Fetch only issues that have any of this labels. Non existent labels are discarded",
+            "name": "labels",
+            "in": "query"
+          },
+          {
+            "type": "string",
+            "description": "search string",
+            "name": "q",
+            "in": "query"
+          },
+          {
+            "enum": [
+              "issues",
+              "pulls"
+            ],
+            "type": "string",
+            "description": "filter by type (issues / pulls) if set",
+            "name": "type",
+            "in": "query"
+          },
+          {
+            "type": "string",
+            "description": "comma separated list of milestone names or ids. It uses names and fall back to ids. Fetch only issues that have any of this milestones. Non existent milestones are discarded",
+            "name": "milestones",
+            "in": "query"
+          },
+          {
+            "type": "string",
+            "format": "date-time",
+            "description": "Only show items updated after the given time. This is a timestamp in RFC 3339 format",
+            "name": "since",
+            "in": "query"
+          },
+          {
+            "type": "string",
+            "format": "date-time",
+            "description": "Only show items updated before the given time. This is a timestamp in RFC 3339 format",
+            "name": "before",
+            "in": "query"
+          },
+          {
+            "type": "string",
+            "description": "Only show items which were created by the given user",
+            "name": "created_by",
+            "in": "query"
+          },
+          {
+            "type": "string",
+            "description": "Only show items for which the given user is assigned",
+            "name": "assigned_by",
+            "in": "query"
+          },
+          {
+            "type": "string",
+            "description": "Only show items in which the given user was mentioned",
+            "name": "mentioned_by",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/IssueList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Create an issue. If using deadline only the date will be taken into account, and time of day ignored.",
+        "operationId": "issueCreateIssue",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/CreateIssueOption"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/Issue"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "412": {
+            "$ref": "#/responses/error"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          },
+          "423": {
+            "$ref": "#/responses/repoArchivedError"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/issues/comments": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "List all comments in a repository",
+        "operationId": "issueGetRepoComments",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "format": "date-time",
+            "description": "if provided, only comments updated since the provided time are returned.",
+            "name": "since",
+            "in": "query"
+          },
+          {
+            "type": "string",
+            "format": "date-time",
+            "description": "if provided, only comments updated before the provided time are returned.",
+            "name": "before",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/CommentList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/issues/comments/{id}": {
+      "get": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Get a comment",
+        "operationId": "issueGetComment",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the comment",
+            "name": "id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Comment"
+          },
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "tags": [
+          "issue"
+        ],
+        "summary": "Delete a comment",
+        "operationId": "issueDeleteComment",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of comment to delete",
+            "name": "id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "patch": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Edit a comment",
+        "operationId": "issueEditComment",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the comment to edit",
+            "name": "id",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/EditIssueCommentOption"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Comment"
+          },
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "423": {
+            "$ref": "#/responses/repoArchivedError"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/issues/comments/{id}/assets": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "List comment's attachments",
+        "operationId": "issueListIssueCommentAttachments",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the comment",
+            "name": "id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/AttachmentList"
+          },
+          "404": {
+            "$ref": "#/responses/error"
+          }
+        }
+      },
+      "post": {
+        "consumes": [
+          "multipart/form-data"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Create a comment attachment",
+        "operationId": "issueCreateIssueCommentAttachment",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the comment",
+            "name": "id",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the attachment",
+            "name": "name",
+            "in": "query"
+          },
+          {
+            "type": "file",
+            "description": "attachment to upload",
+            "name": "attachment",
+            "in": "formData",
+            "required": true
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/Attachment"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/error"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          },
+          "423": {
+            "$ref": "#/responses/repoArchivedError"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/issues/comments/{id}/assets/{attachment_id}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Get a comment attachment",
+        "operationId": "issueGetIssueCommentAttachment",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the comment",
+            "name": "id",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the attachment to get",
+            "name": "attachment_id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Attachment"
+          },
+          "404": {
+            "$ref": "#/responses/error"
+          }
+        }
+      },
+      "delete": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Delete a comment attachment",
+        "operationId": "issueDeleteIssueCommentAttachment",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the comment",
+            "name": "id",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the attachment to delete",
+            "name": "attachment_id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "404": {
+            "$ref": "#/responses/error"
+          },
+          "423": {
+            "$ref": "#/responses/repoArchivedError"
+          }
+        }
+      },
+      "patch": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Edit a comment attachment",
+        "operationId": "issueEditIssueCommentAttachment",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the comment",
+            "name": "id",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the attachment to edit",
+            "name": "attachment_id",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/EditAttachmentOptions"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/Attachment"
+          },
+          "404": {
+            "$ref": "#/responses/error"
+          },
+          "423": {
+            "$ref": "#/responses/repoArchivedError"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/issues/comments/{id}/reactions": {
+      "get": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Get a list of reactions from a comment of an issue",
+        "operationId": "issueGetCommentReactions",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the comment to edit",
+            "name": "id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/ReactionList"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Add a reaction to a comment of an issue",
+        "operationId": "issuePostCommentReaction",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the comment to edit",
+            "name": "id",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "content",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/EditReactionOption"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Reaction"
+          },
+          "201": {
+            "$ref": "#/responses/Reaction"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Remove a reaction from a comment of an issue",
+        "operationId": "issueDeleteCommentReaction",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the comment to edit",
+            "name": "id",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "content",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/EditReactionOption"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/empty"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/issues/pinned": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "List a repo's pinned issues",
+        "operationId": "repoListPinnedIssues",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/IssueList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/issues/{index}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Get an issue",
+        "operationId": "issueGetIssue",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the issue to get",
+            "name": "index",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Issue"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "tags": [
+          "issue"
+        ],
+        "summary": "Delete an issue",
+        "operationId": "issueDelete",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of issue to delete",
+            "name": "index",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "patch": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Edit an issue. If using deadline only the date will be taken into account, and time of day ignored.",
+        "operationId": "issueEditIssue",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the issue to edit",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/EditIssueOption"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/Issue"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "412": {
+            "$ref": "#/responses/error"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/issues/{index}/assets": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "List issue's attachments",
+        "operationId": "issueListIssueAttachments",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the issue",
+            "name": "index",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/AttachmentList"
+          },
+          "404": {
+            "$ref": "#/responses/error"
+          }
+        }
+      },
+      "post": {
+        "consumes": [
+          "multipart/form-data"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Create an issue attachment",
+        "operationId": "issueCreateIssueAttachment",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the issue",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the attachment",
+            "name": "name",
+            "in": "query"
+          },
+          {
+            "type": "file",
+            "description": "attachment to upload",
+            "name": "attachment",
+            "in": "formData",
+            "required": true
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/Attachment"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "404": {
+            "$ref": "#/responses/error"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          },
+          "423": {
+            "$ref": "#/responses/repoArchivedError"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/issues/{index}/assets/{attachment_id}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Get an issue attachment",
+        "operationId": "issueGetIssueAttachment",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the issue",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the attachment to get",
+            "name": "attachment_id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Attachment"
+          },
+          "404": {
+            "$ref": "#/responses/error"
+          }
+        }
+      },
+      "delete": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Delete an issue attachment",
+        "operationId": "issueDeleteIssueAttachment",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the issue",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the attachment to delete",
+            "name": "attachment_id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "404": {
+            "$ref": "#/responses/error"
+          },
+          "423": {
+            "$ref": "#/responses/repoArchivedError"
+          }
+        }
+      },
+      "patch": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Edit an issue attachment",
+        "operationId": "issueEditIssueAttachment",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the issue",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the attachment to edit",
+            "name": "attachment_id",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/EditAttachmentOptions"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/Attachment"
+          },
+          "404": {
+            "$ref": "#/responses/error"
+          },
+          "423": {
+            "$ref": "#/responses/repoArchivedError"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/issues/{index}/blocks": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "List issues that are blocked by this issue",
+        "operationId": "issueListBlocks",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "index of the issue",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/IssueList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "post": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Block the issue given in the body by the issue in path",
+        "operationId": "issueCreateIssueBlocking",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "index of the issue",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/IssueMeta"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/Issue"
+          },
+          "404": {
+            "description": "the issue does not exist"
+          }
+        }
+      },
+      "delete": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Unblock the issue given in the body by the issue in path",
+        "operationId": "issueRemoveIssueBlocking",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "index of the issue",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/IssueMeta"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Issue"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/issues/{index}/comments": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "List all comments on an issue",
+        "operationId": "issueGetComments",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the issue",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "format": "date-time",
+            "description": "if provided, only comments updated since the specified time are returned.",
+            "name": "since",
+            "in": "query"
+          },
+          {
+            "type": "string",
+            "format": "date-time",
+            "description": "if provided, only comments updated before the provided time are returned.",
+            "name": "before",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/CommentList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Add a comment to an issue",
+        "operationId": "issueCreateComment",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the issue",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/CreateIssueCommentOption"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/Comment"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "423": {
+            "$ref": "#/responses/repoArchivedError"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/issues/{index}/comments/{id}": {
+      "delete": {
+        "tags": [
+          "issue"
+        ],
+        "summary": "Delete a comment",
+        "operationId": "issueDeleteCommentDeprecated",
+        "deprecated": true,
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "this parameter is ignored",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of comment to delete",
+            "name": "id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "patch": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Edit a comment",
+        "operationId": "issueEditCommentDeprecated",
+        "deprecated": true,
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "this parameter is ignored",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the comment to edit",
+            "name": "id",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/EditIssueCommentOption"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Comment"
+          },
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/issues/{index}/deadline": {
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Set an issue deadline. If set to null, the deadline is deleted. If using deadline only the date will be taken into account, and time of day ignored.",
+        "operationId": "issueEditIssueDeadline",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the issue to create or update a deadline on",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/EditDeadlineOption"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/IssueDeadline"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/issues/{index}/dependencies": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "List an issue's dependencies, i.e all issues that block this issue.",
+        "operationId": "issueListIssueDependencies",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "index of the issue",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/IssueList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "post": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Make the issue in the url depend on the issue in the form.",
+        "operationId": "issueCreateIssueDependencies",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "index of the issue",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/IssueMeta"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/Issue"
+          },
+          "404": {
+            "description": "the issue does not exist"
+          },
+          "423": {
+            "$ref": "#/responses/repoArchivedError"
+          }
+        }
+      },
+      "delete": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Remove an issue dependency",
+        "operationId": "issueRemoveIssueDependencies",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "index of the issue",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/IssueMeta"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Issue"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "423": {
+            "$ref": "#/responses/repoArchivedError"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/issues/{index}/labels": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Get an issue's labels",
+        "operationId": "issueGetLabels",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the issue",
+            "name": "index",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/LabelList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "put": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Replace an issue's labels",
+        "operationId": "issueReplaceLabels",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the issue",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/IssueLabelsOption"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/LabelList"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Add a label to an issue",
+        "operationId": "issueAddLabel",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the issue",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/IssueLabelsOption"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/LabelList"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Remove all labels from an issue",
+        "operationId": "issueClearLabels",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the issue",
+            "name": "index",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/issues/{index}/labels/{id}": {
+      "delete": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Remove a label from an issue",
+        "operationId": "issueRemoveLabel",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the issue",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the label to remove",
+            "name": "id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/issues/{index}/pin": {
+      "post": {
+        "tags": [
+          "issue"
+        ],
+        "summary": "Pin an Issue",
+        "operationId": "pinIssue",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of issue to pin",
+            "name": "index",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "tags": [
+          "issue"
+        ],
+        "summary": "Unpin an Issue",
+        "operationId": "unpinIssue",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of issue to unpin",
+            "name": "index",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/issues/{index}/pin/{position}": {
+      "patch": {
+        "tags": [
+          "issue"
+        ],
+        "summary": "Moves the Pin to the given Position",
+        "operationId": "moveIssuePin",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of issue",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "the new position",
+            "name": "position",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/issues/{index}/reactions": {
+      "get": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Get a list reactions of an issue",
+        "operationId": "issueGetIssueReactions",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the issue",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/ReactionList"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Add a reaction to an issue",
+        "operationId": "issuePostIssueReaction",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the issue",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "content",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/EditReactionOption"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Reaction"
+          },
+          "201": {
+            "$ref": "#/responses/Reaction"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Remove a reaction from an issue",
+        "operationId": "issueDeleteIssueReaction",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the issue",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "content",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/EditReactionOption"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/empty"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/issues/{index}/stopwatch/delete": {
+      "delete": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Delete an issue's existing stopwatch.",
+        "operationId": "issueDeleteStopWatch",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the issue to stop the stopwatch on",
+            "name": "index",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "403": {
+            "description": "Not repo writer, user does not have rights to toggle stopwatch"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "409": {
+            "description": "Cannot cancel a non existent stopwatch"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/issues/{index}/stopwatch/start": {
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Start stopwatch on an issue.",
+        "operationId": "issueStartStopWatch",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the issue to create the stopwatch on",
+            "name": "index",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/empty"
+          },
+          "403": {
+            "description": "Not repo writer, user does not have rights to toggle stopwatch"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "409": {
+            "description": "Cannot start a stopwatch again if it already exists"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/issues/{index}/stopwatch/stop": {
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Stop an issue's existing stopwatch.",
+        "operationId": "issueStopStopWatch",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the issue to stop the stopwatch on",
+            "name": "index",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/empty"
+          },
+          "403": {
+            "description": "Not repo writer, user does not have rights to toggle stopwatch"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "409": {
+            "description": "Cannot stop a non existent stopwatch"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/issues/{index}/subscriptions": {
+      "get": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Get users who subscribed on an issue.",
+        "operationId": "issueSubscriptions",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the issue",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/UserList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/issues/{index}/subscriptions/check": {
+      "get": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Check if user is subscribed to an issue",
+        "operationId": "issueCheckSubscription",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the issue",
+            "name": "index",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/WatchInfo"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/issues/{index}/subscriptions/{user}": {
+      "put": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Subscribe user to issue",
+        "operationId": "issueAddSubscription",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the issue",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "user to subscribe",
+            "name": "user",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Already subscribed"
+          },
+          "201": {
+            "description": "Successfully Subscribed"
+          },
+          "304": {
+            "description": "User can only subscribe itself if he is no admin"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Unsubscribe user from issue",
+        "operationId": "issueDeleteSubscription",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the issue",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "user witch unsubscribe",
+            "name": "user",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Already unsubscribed"
+          },
+          "201": {
+            "description": "Successfully Unsubscribed"
+          },
+          "304": {
+            "description": "User can only subscribe itself if he is no admin"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/issues/{index}/timeline": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "List all comments and events on an issue",
+        "operationId": "issueGetCommentsAndTimeline",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the issue",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "format": "date-time",
+            "description": "if provided, only comments updated since the specified time are returned.",
+            "name": "since",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          },
+          {
+            "type": "string",
+            "format": "date-time",
+            "description": "if provided, only comments updated before the provided time are returned.",
+            "name": "before",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/TimelineList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/issues/{index}/times": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "List an issue's tracked times",
+        "operationId": "issueTrackedTimes",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the issue",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "optional filter by user (available for issue managers)",
+            "name": "user",
+            "in": "query"
+          },
+          {
+            "type": "string",
+            "format": "date-time",
+            "description": "Only show times updated after the given time. This is a timestamp in RFC 3339 format",
+            "name": "since",
+            "in": "query"
+          },
+          {
+            "type": "string",
+            "format": "date-time",
+            "description": "Only show times updated before the given time. This is a timestamp in RFC 3339 format",
+            "name": "before",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/TrackedTimeList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Add tracked time to a issue",
+        "operationId": "issueAddTime",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the issue",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/AddTimeOption"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/TrackedTime"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Reset a tracked time of an issue",
+        "operationId": "issueResetTime",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the issue to add tracked time to",
+            "name": "index",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/issues/{index}/times/{id}": {
+      "delete": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Delete specific tracked time",
+        "operationId": "issueDeleteTime",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the issue",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of time to delete",
+            "name": "id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/keys": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "List a repository's keys",
+        "operationId": "repoListKeys",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "the key_id to search for",
+            "name": "key_id",
+            "in": "query"
+          },
+          {
+            "type": "string",
+            "description": "fingerprint of the key",
+            "name": "fingerprint",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/DeployKeyList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Add a key to a repository",
+        "operationId": "repoCreateKey",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/CreateKeyOption"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/DeployKey"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/keys/{id}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get a repository's key by id",
+        "operationId": "repoGetKey",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the key to get",
+            "name": "id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/DeployKey"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "tags": [
+          "repository"
+        ],
+        "summary": "Delete a key from a repository",
+        "operationId": "repoDeleteKey",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the key to delete",
+            "name": "id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/labels": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Get all of a repository's labels",
+        "operationId": "issueListLabels",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/LabelList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Create a label",
+        "operationId": "issueCreateLabel",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/CreateLabelOption"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/Label"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/labels/{id}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Get a single label",
+        "operationId": "issueGetLabel",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the label to get",
+            "name": "id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Label"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "tags": [
+          "issue"
+        ],
+        "summary": "Delete a label",
+        "operationId": "issueDeleteLabel",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the label to delete",
+            "name": "id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "patch": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Update a label",
+        "operationId": "issueEditLabel",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the label to edit",
+            "name": "id",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/EditLabelOption"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Label"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/languages": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get languages and number of bytes of code written",
+        "operationId": "repoGetLanguages",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/LanguageStatistics"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/media/{filepath}": {
+      "get": {
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get a file or it's LFS object from a repository",
+        "operationId": "repoGetRawFileOrLFS",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "filepath of the file to get",
+            "name": "filepath",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "The name of the commit/branch/tag. Default the repository’s default branch (usually master)",
+            "name": "ref",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Returns raw file content."
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/milestones": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Get all of a repository's opened milestones",
+        "operationId": "issueGetMilestonesList",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "Milestone state, Recognized values are open, closed and all. Defaults to \"open\"",
+            "name": "state",
+            "in": "query"
+          },
+          {
+            "type": "string",
+            "description": "filter by milestone name",
+            "name": "name",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/MilestoneList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Create a milestone",
+        "operationId": "issueCreateMilestone",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/CreateMilestoneOption"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/Milestone"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/milestones/{id}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Get a milestone",
+        "operationId": "issueGetMilestone",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "the milestone to get, identified by ID and if not available by name",
+            "name": "id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Milestone"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "tags": [
+          "issue"
+        ],
+        "summary": "Delete a milestone",
+        "operationId": "issueDeleteMilestone",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "the milestone to delete, identified by ID and if not available by name",
+            "name": "id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "patch": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "issue"
+        ],
+        "summary": "Update a milestone",
+        "operationId": "issueEditMilestone",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "the milestone to edit, identified by ID and if not available by name",
+            "name": "id",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/EditMilestoneOption"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Milestone"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/mirror-sync": {
+      "post": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Sync a mirrored repository",
+        "operationId": "repoMirrorSync",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo to sync",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo to sync",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/empty"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/new_pin_allowed": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Returns if new Issue Pins are allowed",
+        "operationId": "repoNewPinAllowed",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/RepoNewIssuePinsAllowed"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/notifications": {
+      "get": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "notification"
+        ],
+        "summary": "List users's notification threads on a specific repo",
+        "operationId": "notifyGetRepoList",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "boolean",
+            "description": "If true, show notifications marked as read. Default value is false",
+            "name": "all",
+            "in": "query"
+          },
+          {
+            "type": "array",
+            "items": {
+              "type": "string"
+            },
+            "collectionFormat": "multi",
+            "description": "Show notifications with the provided status types. Options are: unread, read and/or pinned. Defaults to unread \u0026 pinned",
+            "name": "status-types",
+            "in": "query"
+          },
+          {
+            "type": "array",
+            "items": {
+              "enum": [
+                "issue",
+                "pull",
+                "commit",
+                "repository"
+              ],
+              "type": "string"
+            },
+            "collectionFormat": "multi",
+            "description": "filter notifications by subject type",
+            "name": "subject-type",
+            "in": "query"
+          },
+          {
+            "type": "string",
+            "format": "date-time",
+            "description": "Only show notifications updated after the given time. This is a timestamp in RFC 3339 format",
+            "name": "since",
+            "in": "query"
+          },
+          {
+            "type": "string",
+            "format": "date-time",
+            "description": "Only show notifications updated before the given time. This is a timestamp in RFC 3339 format",
+            "name": "before",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/NotificationThreadList"
+          }
+        }
+      },
+      "put": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "notification"
+        ],
+        "summary": "Mark notification threads as read, pinned or unread on a specific repo",
+        "operationId": "notifyReadRepoList",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "If true, mark all notifications on this repo. Default value is false",
+            "name": "all",
+            "in": "query"
+          },
+          {
+            "type": "array",
+            "items": {
+              "type": "string"
+            },
+            "collectionFormat": "multi",
+            "description": "Mark notifications with the provided status types. Options are: unread, read and/or pinned. Defaults to unread.",
+            "name": "status-types",
+            "in": "query"
+          },
+          {
+            "type": "string",
+            "description": "Status to mark notifications as. Defaults to read.",
+            "name": "to-status",
+            "in": "query"
+          },
+          {
+            "type": "string",
+            "format": "date-time",
+            "description": "Describes the last point that notifications were checked. Anything updated since this time will not be updated.",
+            "name": "last_read_at",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "205": {
+            "$ref": "#/responses/NotificationThreadList"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/pulls": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "List a repo's pull requests",
+        "operationId": "repoListPullRequests",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "enum": [
+              "closed",
+              "open",
+              "all"
+            ],
+            "type": "string",
+            "description": "State of pull request: open or closed (optional)",
+            "name": "state",
+            "in": "query"
+          },
+          {
+            "enum": [
+              "oldest",
+              "recentupdate",
+              "leastupdate",
+              "mostcomment",
+              "leastcomment",
+              "priority"
+            ],
+            "type": "string",
+            "description": "Type of sort",
+            "name": "sort",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "ID of the milestone",
+            "name": "milestone",
+            "in": "query"
+          },
+          {
+            "type": "array",
+            "items": {
+              "type": "integer",
+              "format": "int64"
+            },
+            "collectionFormat": "multi",
+            "description": "Label IDs",
+            "name": "labels",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/PullRequestList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Create a pull request",
+        "operationId": "repoCreatePullRequest",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/CreatePullRequestOption"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/PullRequest"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "409": {
+            "$ref": "#/responses/error"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          },
+          "423": {
+            "$ref": "#/responses/repoArchivedError"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/pulls/pinned": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "List a repo's pinned pull requests",
+        "operationId": "repoListPinnedPullRequests",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/PullRequestList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/pulls/{base}/{head}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get a pull request by base and head",
+        "operationId": "repoGetPullRequestByBaseHead",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "base of the pull request to get",
+            "name": "base",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "head of the pull request to get",
+            "name": "head",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/PullRequest"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/pulls/{index}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get a pull request",
+        "operationId": "repoGetPullRequest",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the pull request to get",
+            "name": "index",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/PullRequest"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "patch": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Update a pull request. If using deadline only the date will be taken into account, and time of day ignored.",
+        "operationId": "repoEditPullRequest",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the pull request to edit",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/EditPullRequestOption"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/PullRequest"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "409": {
+            "$ref": "#/responses/error"
+          },
+          "412": {
+            "$ref": "#/responses/error"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/pulls/{index}.{diffType}": {
+      "get": {
+        "produces": [
+          "text/plain"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get a pull request diff or patch",
+        "operationId": "repoDownloadPullDiffOrPatch",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the pull request to get",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "enum": [
+              "diff",
+              "patch"
+            ],
+            "type": "string",
+            "description": "whether the output is diff or patch",
+            "name": "diffType",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "boolean",
+            "description": "whether to include binary file changes. if true, the diff is applicable with `git apply`",
+            "name": "binary",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/string"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/pulls/{index}/commits": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get commits for a pull request",
+        "operationId": "repoGetPullRequestCommits",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the pull request to get",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          },
+          {
+            "type": "boolean",
+            "description": "include verification for every commit (disable for speedup, default 'true')",
+            "name": "verification",
+            "in": "query"
+          },
+          {
+            "type": "boolean",
+            "description": "include a list of affected files for every commit (disable for speedup, default 'true')",
+            "name": "files",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/CommitList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/pulls/{index}/files": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get changed files for a pull request",
+        "operationId": "repoGetPullRequestFiles",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the pull request to get",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "skip to given file",
+            "name": "skip-to",
+            "in": "query"
+          },
+          {
+            "enum": [
+              "ignore-all",
+              "ignore-change",
+              "ignore-eol",
+              "show-all"
+            ],
+            "type": "string",
+            "description": "whitespace behavior",
+            "name": "whitespace",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/ChangedFileList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/pulls/{index}/merge": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Check if a pull request has been merged",
+        "operationId": "repoPullRequestIsMerged",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the pull request",
+            "name": "index",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "description": "pull request has been merged"
+          },
+          "404": {
+            "description": "pull request has not been merged"
+          }
+        }
+      },
+      "post": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Merge a pull request",
+        "operationId": "repoMergePullRequest",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the pull request to merge",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/MergePullRequestOption"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/empty"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "405": {
+            "$ref": "#/responses/empty"
+          },
+          "409": {
+            "$ref": "#/responses/error"
+          },
+          "423": {
+            "$ref": "#/responses/repoArchivedError"
+          }
+        }
+      },
+      "delete": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Cancel the scheduled auto merge for the given pull request",
+        "operationId": "repoCancelScheduledAutoMerge",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the pull request to merge",
+            "name": "index",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "423": {
+            "$ref": "#/responses/repoArchivedError"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/pulls/{index}/requested_reviewers": {
+      "post": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "create review requests for a pull request",
+        "operationId": "repoCreatePullReviewRequests",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the pull request",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "required": true,
+            "schema": {
+              "$ref": "#/definitions/PullReviewRequestOptions"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/PullReviewList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      },
+      "delete": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "cancel review requests for a pull request",
+        "operationId": "repoDeletePullReviewRequests",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the pull request",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "required": true,
+            "schema": {
+              "$ref": "#/definitions/PullReviewRequestOptions"
+            }
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/pulls/{index}/reviews": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "List all reviews for a pull request",
+        "operationId": "repoListPullReviews",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the pull request",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/PullReviewList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "post": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Create a review to an pull request",
+        "operationId": "repoCreatePullReview",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the pull request",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "required": true,
+            "schema": {
+              "$ref": "#/definitions/CreatePullReviewOptions"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/PullReview"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/pulls/{index}/reviews/{id}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get a specific review for a pull request",
+        "operationId": "repoGetPullReview",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the pull request",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the review",
+            "name": "id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/PullReview"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "post": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Submit a pending review to an pull request",
+        "operationId": "repoSubmitPullReview",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the pull request",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the review",
+            "name": "id",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "required": true,
+            "schema": {
+              "$ref": "#/definitions/SubmitPullReviewOptions"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/PullReview"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      },
+      "delete": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Delete a specific review from a pull request",
+        "operationId": "repoDeletePullReview",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the pull request",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the review",
+            "name": "id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/pulls/{index}/reviews/{id}/comments": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get a specific review for a pull request",
+        "operationId": "repoGetPullReviewComments",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the pull request",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the review",
+            "name": "id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/PullReviewCommentList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/pulls/{index}/reviews/{id}/dismissals": {
+      "post": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Dismiss a review for a pull request",
+        "operationId": "repoDismissPullReview",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the pull request",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the review",
+            "name": "id",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "required": true,
+            "schema": {
+              "$ref": "#/definitions/DismissPullReviewOptions"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/PullReview"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/pulls/{index}/reviews/{id}/undismissals": {
+      "post": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Cancel to dismiss a review for a pull request",
+        "operationId": "repoUnDismissPullReview",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the pull request",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the review",
+            "name": "id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/PullReview"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/pulls/{index}/update": {
+      "post": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Merge PR's baseBranch into headBranch",
+        "operationId": "repoUpdatePullRequest",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "index of the pull request to get",
+            "name": "index",
+            "in": "path",
+            "required": true
+          },
+          {
+            "enum": [
+              "merge",
+              "rebase"
+            ],
+            "type": "string",
+            "description": "how to update pull request",
+            "name": "style",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/empty"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "409": {
+            "$ref": "#/responses/error"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/push_mirrors": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get all push mirrors of the repository",
+        "operationId": "repoListPushMirrors",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/PushMirrorList"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "add a push mirror to the repository",
+        "operationId": "repoAddPushMirror",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/CreatePushMirrorOption"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/PushMirror"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/push_mirrors-sync": {
+      "post": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Sync all push mirrored repository",
+        "operationId": "repoPushMirrorSync",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo to sync",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo to sync",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/empty"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/push_mirrors/{name}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get push mirror of the repository by remoteName",
+        "operationId": "repoGetPushMirrorByRemoteName",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "remote name of push mirror",
+            "name": "name",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/PushMirror"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "deletes a push mirror from a repository by remoteName",
+        "operationId": "repoDeletePushMirror",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "remote name of the pushMirror",
+            "name": "name",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/raw/{filepath}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get a file from a repository",
+        "operationId": "repoGetRawFile",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "filepath of the file to get",
+            "name": "filepath",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "The name of the commit/branch/tag. Default the repository’s default branch (usually master)",
+            "name": "ref",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Returns raw file content."
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/releases": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "List a repo's releases",
+        "operationId": "repoListReleases",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "boolean",
+            "description": "filter (exclude / include) drafts, if you dont have repo write access none will show",
+            "name": "draft",
+            "in": "query"
+          },
+          {
+            "type": "boolean",
+            "description": "filter (exclude / include) pre-releases",
+            "name": "pre-release",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/ReleaseList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Create a release",
+        "operationId": "repoCreateRelease",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/CreateReleaseOption"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/Release"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "409": {
+            "$ref": "#/responses/error"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/releases/latest": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Gets the most recent non-prerelease, non-draft release of a repository, sorted by created_at",
+        "operationId": "repoGetLatestRelease",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Release"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/releases/tags/{tag}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get a release by tag name",
+        "operationId": "repoGetReleaseByTag",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "tag name of the release to get",
+            "name": "tag",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Release"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "tags": [
+          "repository"
+        ],
+        "summary": "Delete a release by tag name",
+        "operationId": "repoDeleteReleaseByTag",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "tag name of the release to delete",
+            "name": "tag",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/releases/{id}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get a release",
+        "operationId": "repoGetRelease",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the release to get",
+            "name": "id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Release"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "tags": [
+          "repository"
+        ],
+        "summary": "Delete a release",
+        "operationId": "repoDeleteRelease",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the release to delete",
+            "name": "id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      },
+      "patch": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Update a release",
+        "operationId": "repoEditRelease",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the release to edit",
+            "name": "id",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/EditReleaseOption"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Release"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/releases/{id}/assets": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "List release's attachments",
+        "operationId": "repoListReleaseAttachments",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the release",
+            "name": "id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/AttachmentList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "post": {
+        "consumes": [
+          "multipart/form-data",
+          "application/octet-stream"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Create a release attachment",
+        "operationId": "repoCreateReleaseAttachment",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the release",
+            "name": "id",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the attachment",
+            "name": "name",
+            "in": "query"
+          },
+          {
+            "type": "file",
+            "description": "attachment to upload",
+            "name": "attachment",
+            "in": "formData"
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/Attachment"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/releases/{id}/assets/{attachment_id}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get a release attachment",
+        "operationId": "repoGetReleaseAttachment",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the release",
+            "name": "id",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the attachment to get",
+            "name": "attachment_id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Attachment"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Delete a release attachment",
+        "operationId": "repoDeleteReleaseAttachment",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the release",
+            "name": "id",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the attachment to delete",
+            "name": "attachment_id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "patch": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Edit a release attachment",
+        "operationId": "repoEditReleaseAttachment",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the release",
+            "name": "id",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the attachment to edit",
+            "name": "attachment_id",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/EditAttachmentOptions"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/Attachment"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/reviewers": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Return all users that can be requested to review in this repo",
+        "operationId": "repoGetReviewers",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/UserList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/runners/registration-token": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get a repository's actions runner registration token",
+        "operationId": "repoGetRunnerRegistrationToken",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/RegistrationToken"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/signing-key.gpg": {
+      "get": {
+        "produces": [
+          "text/plain"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get signing-key.gpg for given repository",
+        "operationId": "repoSigningKey",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "GPG armored public key",
+            "schema": {
+              "type": "string"
+            }
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/stargazers": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "List a repo's stargazers",
+        "operationId": "repoListStargazers",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/UserList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/statuses/{sha}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get a commit's statuses",
+        "operationId": "repoListStatuses",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "sha of the commit",
+            "name": "sha",
+            "in": "path",
+            "required": true
+          },
+          {
+            "enum": [
+              "oldest",
+              "recentupdate",
+              "leastupdate",
+              "leastindex",
+              "highestindex"
+            ],
+            "type": "string",
+            "description": "type of sort",
+            "name": "sort",
+            "in": "query"
+          },
+          {
+            "enum": [
+              "pending",
+              "success",
+              "error",
+              "failure",
+              "warning"
+            ],
+            "type": "string",
+            "description": "type of state",
+            "name": "state",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/CommitStatusList"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "post": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Create a commit status",
+        "operationId": "repoCreateStatus",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "sha of the commit",
+            "name": "sha",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/CreateStatusOption"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/CommitStatus"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/subscribers": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "List a repo's watchers",
+        "operationId": "repoListSubscribers",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/UserList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/subscription": {
+      "get": {
+        "tags": [
+          "repository"
+        ],
+        "summary": "Check if the current user is watching a repo",
+        "operationId": "userCurrentCheckSubscription",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/WatchInfo"
+          },
+          "404": {
+            "description": "User is not watching this repo or repo do not exist"
+          }
+        }
+      },
+      "put": {
+        "tags": [
+          "repository"
+        ],
+        "summary": "Watch a repo",
+        "operationId": "userCurrentPutSubscription",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/WatchInfo"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "tags": [
+          "repository"
+        ],
+        "summary": "Unwatch a repo",
+        "operationId": "userCurrentDeleteSubscription",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/tags": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "List a repository's tags",
+        "operationId": "repoListTags",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results, default maximum page size is 50",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/TagList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "post": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Create a new git tag in a repository",
+        "operationId": "repoCreateTag",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/CreateTagOption"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Tag"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "405": {
+            "$ref": "#/responses/empty"
+          },
+          "409": {
+            "$ref": "#/responses/conflict"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          },
+          "423": {
+            "$ref": "#/responses/repoArchivedError"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/tags/{tag}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get the tag of a repository by tag name",
+        "operationId": "repoGetTag",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of tag",
+            "name": "tag",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Tag"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Delete a repository's tag by name",
+        "operationId": "repoDeleteTag",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of tag to delete",
+            "name": "tag",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "405": {
+            "$ref": "#/responses/empty"
+          },
+          "409": {
+            "$ref": "#/responses/conflict"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          },
+          "423": {
+            "$ref": "#/responses/repoArchivedError"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/teams": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "List a repository's teams",
+        "operationId": "repoListTeams",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/TeamList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/teams/{team}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Check if a team is assigned to a repository",
+        "operationId": "repoCheckTeam",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "team name",
+            "name": "team",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Team"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "405": {
+            "$ref": "#/responses/error"
+          }
+        }
+      },
+      "put": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Add a team to a repository",
+        "operationId": "repoAddTeam",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "team name",
+            "name": "team",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "405": {
+            "$ref": "#/responses/error"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      },
+      "delete": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Delete a team from a repository",
+        "operationId": "repoDeleteTeam",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "team name",
+            "name": "team",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "405": {
+            "$ref": "#/responses/error"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/times": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "List a repo's tracked times",
+        "operationId": "repoTrackedTimes",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "optional filter by user (available for issue managers)",
+            "name": "user",
+            "in": "query"
+          },
+          {
+            "type": "string",
+            "format": "date-time",
+            "description": "Only show times updated after the given time. This is a timestamp in RFC 3339 format",
+            "name": "since",
+            "in": "query"
+          },
+          {
+            "type": "string",
+            "format": "date-time",
+            "description": "Only show times updated before the given time. This is a timestamp in RFC 3339 format",
+            "name": "before",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/TrackedTimeList"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/times/{user}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "List a user's tracked times in a repo",
+        "operationId": "userTrackedTimes",
+        "deprecated": true,
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "username of user",
+            "name": "user",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/TrackedTimeList"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/topics": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get list of topics that a repository has",
+        "operationId": "repoListTopics",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/TopicNames"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "put": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Replace list of topics for a repository",
+        "operationId": "repoUpdateTopics",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/RepoTopicOptions"
+            }
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "422": {
+            "$ref": "#/responses/invalidTopicsError"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/topics/{topic}": {
+      "put": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Add a topic to a repository",
+        "operationId": "repoAddTopic",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the topic to add",
+            "name": "topic",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "422": {
+            "$ref": "#/responses/invalidTopicsError"
+          }
+        }
+      },
+      "delete": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Delete a topic from a repository",
+        "operationId": "repoDeleteTopic",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the topic to delete",
+            "name": "topic",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "422": {
+            "$ref": "#/responses/invalidTopicsError"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/transfer": {
+      "post": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Transfer a repo ownership",
+        "operationId": "repoTransfer",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo to transfer",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo to transfer",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "description": "Transfer Options",
+            "name": "body",
+            "in": "body",
+            "required": true,
+            "schema": {
+              "$ref": "#/definitions/TransferRepoOption"
+            }
+          }
+        ],
+        "responses": {
+          "202": {
+            "$ref": "#/responses/Repository"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/transfer/accept": {
+      "post": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Accept a repo transfer",
+        "operationId": "acceptRepoTransfer",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo to transfer",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo to transfer",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "202": {
+            "$ref": "#/responses/Repository"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/transfer/reject": {
+      "post": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Reject a repo transfer",
+        "operationId": "rejectRepoTransfer",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo to transfer",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo to transfer",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Repository"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/wiki/new": {
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Create a wiki page",
+        "operationId": "repoCreateWikiPage",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/CreateWikiPageOptions"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/WikiPage"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "423": {
+            "$ref": "#/responses/repoArchivedError"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/wiki/page/{pageName}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get a wiki page",
+        "operationId": "repoGetWikiPage",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the page",
+            "name": "pageName",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/WikiPage"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "tags": [
+          "repository"
+        ],
+        "summary": "Delete a wiki page",
+        "operationId": "repoDeleteWikiPage",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the page",
+            "name": "pageName",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "423": {
+            "$ref": "#/responses/repoArchivedError"
+          }
+        }
+      },
+      "patch": {
+        "consumes": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Edit a wiki page",
+        "operationId": "repoEditWikiPage",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the page",
+            "name": "pageName",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/CreateWikiPageOptions"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/WikiPage"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "423": {
+            "$ref": "#/responses/repoArchivedError"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/wiki/pages": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get all wiki pages",
+        "operationId": "repoGetWikiPages",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/WikiPageList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{owner}/{repo}/wiki/revisions/{pageName}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get revisions of a wiki page",
+        "operationId": "repoGetWikiPageRevisions",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the page",
+            "name": "pageName",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/WikiCommitList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/repos/{template_owner}/{template_repo}/generate": {
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Create a repository using a template",
+        "operationId": "generateRepo",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the template repository owner",
+            "name": "template_owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the template repository",
+            "name": "template_repo",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/GenerateRepoOption"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/Repository"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "409": {
+            "description": "The repository with the same name already exists."
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      }
+    },
+    "/repositories/{id}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "Get a repository by id",
+        "operationId": "repoGetByID",
+        "parameters": [
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the repo to get",
+            "name": "id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Repository"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/settings/api": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "settings"
+        ],
+        "summary": "Get instance's global settings for api",
+        "operationId": "getGeneralAPISettings",
+        "responses": {
+          "200": {
+            "$ref": "#/responses/GeneralAPISettings"
+          }
+        }
+      }
+    },
+    "/settings/attachment": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "settings"
+        ],
+        "summary": "Get instance's global settings for Attachment",
+        "operationId": "getGeneralAttachmentSettings",
+        "responses": {
+          "200": {
+            "$ref": "#/responses/GeneralAttachmentSettings"
+          }
+        }
+      }
+    },
+    "/settings/repository": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "settings"
+        ],
+        "summary": "Get instance's global settings for repositories",
+        "operationId": "getGeneralRepositorySettings",
+        "responses": {
+          "200": {
+            "$ref": "#/responses/GeneralRepoSettings"
+          }
+        }
+      }
+    },
+    "/settings/ui": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "settings"
+        ],
+        "summary": "Get instance's global settings for ui",
+        "operationId": "getGeneralUISettings",
+        "responses": {
+          "200": {
+            "$ref": "#/responses/GeneralUISettings"
+          }
+        }
+      }
+    },
+    "/signing-key.gpg": {
+      "get": {
+        "produces": [
+          "text/plain"
+        ],
+        "tags": [
+          "miscellaneous"
+        ],
+        "summary": "Get default signing-key.gpg",
+        "operationId": "getSigningKey",
+        "responses": {
+          "200": {
+            "description": "GPG armored public key",
+            "schema": {
+              "type": "string"
+            }
+          }
+        }
+      }
+    },
+    "/teams/{id}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "Get a team",
+        "operationId": "orgGetTeam",
+        "parameters": [
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the team to get",
+            "name": "id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Team"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "tags": [
+          "organization"
+        ],
+        "summary": "Delete a team",
+        "operationId": "orgDeleteTeam",
+        "parameters": [
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the team to delete",
+            "name": "id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "description": "team deleted"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "patch": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "Edit a team",
+        "operationId": "orgEditTeam",
+        "parameters": [
+          {
+            "type": "integer",
+            "description": "id of the team to edit",
+            "name": "id",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/EditTeamOption"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Team"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/teams/{id}/activities/feeds": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "List a team's activity feeds",
+        "operationId": "orgListTeamActivityFeeds",
+        "parameters": [
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the team",
+            "name": "id",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "format": "date",
+            "description": "the date of the activities to be found",
+            "name": "date",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/ActivityFeedsList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/teams/{id}/members": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "List a team's members",
+        "operationId": "orgListTeamMembers",
+        "parameters": [
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the team",
+            "name": "id",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/UserList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/teams/{id}/members/{username}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "List a particular member of team",
+        "operationId": "orgListTeamMember",
+        "parameters": [
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the team",
+            "name": "id",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "username of the member to list",
+            "name": "username",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/User"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "put": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "Add a team member",
+        "operationId": "orgAddTeamMember",
+        "parameters": [
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the team",
+            "name": "id",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "username of the user to add",
+            "name": "username",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "Remove a team member",
+        "operationId": "orgRemoveTeamMember",
+        "parameters": [
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the team",
+            "name": "id",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "username of the user to remove",
+            "name": "username",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/teams/{id}/repos": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "List a team's repos",
+        "operationId": "orgListTeamRepos",
+        "parameters": [
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the team",
+            "name": "id",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/RepositoryList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/teams/{id}/repos/{org}/{repo}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "List a particular repo of team",
+        "operationId": "orgListTeamRepo",
+        "parameters": [
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the team",
+            "name": "id",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "organization that owns the repo to list",
+            "name": "org",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo to list",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Repository"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "put": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "Add a repository to a team",
+        "operationId": "orgAddTeamRepository",
+        "parameters": [
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the team",
+            "name": "id",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "organization that owns the repo to add",
+            "name": "org",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo to add",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "description": "This does not delete the repository, it only removes the repository from the team.",
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "Remove a repository from a team",
+        "operationId": "orgRemoveTeamRepository",
+        "parameters": [
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the team",
+            "name": "id",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "organization that owns the repo to remove",
+            "name": "org",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo to remove",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/topics/search": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository"
+        ],
+        "summary": "search topics via keyword",
+        "operationId": "topicSearch",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "keywords to search",
+            "name": "q",
+            "in": "query",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/TopicListResponse"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/user": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "Get the authenticated user",
+        "operationId": "userGetCurrent",
+        "responses": {
+          "200": {
+            "$ref": "#/responses/User"
+          }
+        }
+      }
+    },
+    "/user/actions/runners/registration-token": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "Get an user's actions runner registration token",
+        "operationId": "userGetRunnerRegistrationToken",
+        "responses": {
+          "200": {
+            "$ref": "#/responses/RegistrationToken"
+          }
+        }
+      }
+    },
+    "/user/actions/secrets/{secretname}": {
+      "put": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "Create or Update a secret value in a user scope",
+        "operationId": "updateUserSecret",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the secret",
+            "name": "secretname",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/CreateOrUpdateSecretOption"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "description": "response when creating a secret"
+          },
+          "204": {
+            "description": "response when updating a secret"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "Delete a secret in a user scope",
+        "operationId": "deleteUserSecret",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the secret",
+            "name": "secretname",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "description": "delete one secret of the user"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/user/actions/variables": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "Get the user-level list of variables which is created by current doer",
+        "operationId": "getUserVariablesList",
+        "parameters": [
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/VariableList"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/user/actions/variables/{variablename}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "Get a user-level variable which is created by current doer",
+        "operationId": "getUserVariable",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the variable",
+            "name": "variablename",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/ActionVariable"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "put": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "Update a user-level variable which is created by current doer",
+        "operationId": "updateUserVariable",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the variable",
+            "name": "variablename",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/UpdateVariableOption"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "description": "response when updating a variable"
+          },
+          "204": {
+            "description": "response when updating a variable"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "Create a user-level variable",
+        "operationId": "createUserVariable",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the variable",
+            "name": "variablename",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/CreateVariableOption"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "description": "response when creating a variable"
+          },
+          "204": {
+            "description": "response when creating a variable"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "Delete a user-level variable which is created by current doer",
+        "operationId": "deleteUserVariable",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "name of the variable",
+            "name": "variablename",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "201": {
+            "description": "response when deleting a variable"
+          },
+          "204": {
+            "description": "response when deleting a variable"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/user/applications/oauth2": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "List the authenticated user's oauth2 applications",
+        "operationId": "userGetOauth2Application",
+        "parameters": [
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/OAuth2ApplicationList"
+          }
+        }
+      },
+      "post": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "creates a new OAuth2 application",
+        "operationId": "userCreateOAuth2Application",
+        "parameters": [
+          {
+            "name": "body",
+            "in": "body",
+            "required": true,
+            "schema": {
+              "$ref": "#/definitions/CreateOAuth2ApplicationOptions"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/OAuth2Application"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          }
+        }
+      }
+    },
+    "/user/applications/oauth2/{id}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "get an OAuth2 Application",
+        "operationId": "userGetOAuth2Application",
+        "parameters": [
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "Application ID to be found",
+            "name": "id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/OAuth2Application"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "delete an OAuth2 Application",
+        "operationId": "userDeleteOAuth2Application",
+        "parameters": [
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "token to be deleted",
+            "name": "id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "patch": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "update an OAuth2 Application, this includes regenerating the client secret",
+        "operationId": "userUpdateOAuth2Application",
+        "parameters": [
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "application to be updated",
+            "name": "id",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "required": true,
+            "schema": {
+              "$ref": "#/definitions/CreateOAuth2ApplicationOptions"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/OAuth2Application"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/user/avatar": {
+      "post": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "Update Avatar",
+        "operationId": "userUpdateAvatar",
+        "parameters": [
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/UpdateUserAvatarOption"
+            }
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          }
+        }
+      },
+      "delete": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "Delete Avatar",
+        "operationId": "userDeleteAvatar",
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          }
+        }
+      }
+    },
+    "/user/blocks": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "List users blocked by the authenticated user",
+        "operationId": "userListBlocks",
+        "parameters": [
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/UserList"
+          }
+        }
+      }
+    },
+    "/user/blocks/{username}": {
+      "get": {
+        "tags": [
+          "user"
+        ],
+        "summary": "Check if a user is blocked by the authenticated user",
+        "operationId": "userCheckUserBlock",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "user to check",
+            "name": "username",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "put": {
+        "tags": [
+          "user"
+        ],
+        "summary": "Block a user",
+        "operationId": "userBlockUser",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "user to block",
+            "name": "username",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "optional note for the block",
+            "name": "note",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      },
+      "delete": {
+        "tags": [
+          "user"
+        ],
+        "summary": "Unblock a user",
+        "operationId": "userUnblockUser",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "user to unblock",
+            "name": "username",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      }
+    },
+    "/user/emails": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "List the authenticated user's email addresses",
+        "operationId": "userListEmails",
+        "responses": {
+          "200": {
+            "$ref": "#/responses/EmailList"
+          }
+        }
+      },
+      "post": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "Add email addresses",
+        "operationId": "userAddEmail",
+        "parameters": [
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/CreateEmailOption"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/EmailList"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      },
+      "delete": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "Delete email addresses",
+        "operationId": "userDeleteEmail",
+        "parameters": [
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/DeleteEmailOption"
+            }
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/user/followers": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "List the authenticated user's followers",
+        "operationId": "userCurrentListFollowers",
+        "parameters": [
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/UserList"
+          }
+        }
+      }
+    },
+    "/user/following": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "List the users that the authenticated user is following",
+        "operationId": "userCurrentListFollowing",
+        "parameters": [
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/UserList"
+          }
+        }
+      }
+    },
+    "/user/following/{username}": {
+      "get": {
+        "tags": [
+          "user"
+        ],
+        "summary": "Check whether a user is followed by the authenticated user",
+        "operationId": "userCurrentCheckFollowing",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "username of followed user",
+            "name": "username",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "put": {
+        "tags": [
+          "user"
+        ],
+        "summary": "Follow a user",
+        "operationId": "userCurrentPutFollow",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "username of user to follow",
+            "name": "username",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "tags": [
+          "user"
+        ],
+        "summary": "Unfollow a user",
+        "operationId": "userCurrentDeleteFollow",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "username of user to unfollow",
+            "name": "username",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/user/gpg_key_token": {
+      "get": {
+        "produces": [
+          "text/plain"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "Get a Token to verify",
+        "operationId": "getVerificationToken",
+        "responses": {
+          "200": {
+            "$ref": "#/responses/string"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/user/gpg_key_verify": {
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "Verify a GPG key",
+        "operationId": "userVerifyGPGKey",
+        "responses": {
+          "201": {
+            "$ref": "#/responses/GPGKey"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      }
+    },
+    "/user/gpg_keys": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "List the authenticated user's GPG keys",
+        "operationId": "userCurrentListGPGKeys",
+        "parameters": [
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/GPGKeyList"
+          }
+        }
+      },
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "Create a GPG key",
+        "operationId": "userCurrentPostGPGKey",
+        "parameters": [
+          {
+            "name": "Form",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/CreateGPGKeyOption"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/GPGKey"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      }
+    },
+    "/user/gpg_keys/{id}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "Get a GPG key",
+        "operationId": "userCurrentGetGPGKey",
+        "parameters": [
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of key to get",
+            "name": "id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/GPGKey"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "Remove a GPG key",
+        "operationId": "userCurrentDeleteGPGKey",
+        "parameters": [
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of key to delete",
+            "name": "id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/user/hooks": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "List the authenticated user's webhooks",
+        "operationId": "userListHooks",
+        "parameters": [
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/HookList"
+          }
+        }
+      },
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "Create a hook",
+        "operationId": "userCreateHook",
+        "parameters": [
+          {
+            "name": "body",
+            "in": "body",
+            "required": true,
+            "schema": {
+              "$ref": "#/definitions/CreateHookOption"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/Hook"
+          }
+        }
+      }
+    },
+    "/user/hooks/{id}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "Get a hook",
+        "operationId": "userGetHook",
+        "parameters": [
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the hook to get",
+            "name": "id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Hook"
+          }
+        }
+      },
+      "delete": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "Delete a hook",
+        "operationId": "userDeleteHook",
+        "parameters": [
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the hook to delete",
+            "name": "id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          }
+        }
+      },
+      "patch": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "Update a hook",
+        "operationId": "userEditHook",
+        "parameters": [
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the hook to update",
+            "name": "id",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/EditHookOption"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/Hook"
+          }
+        }
+      }
+    },
+    "/user/keys": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "List the authenticated user's public keys",
+        "operationId": "userCurrentListKeys",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "fingerprint of the key",
+            "name": "fingerprint",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/PublicKeyList"
+          }
+        }
+      },
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "Create a public key",
+        "operationId": "userCurrentPostKey",
+        "parameters": [
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/CreateKeyOption"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/PublicKey"
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      }
+    },
+    "/user/keys/{id}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "Get a public key",
+        "operationId": "userCurrentGetKey",
+        "parameters": [
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of key to get",
+            "name": "id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/PublicKey"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "Delete a public key",
+        "operationId": "userCurrentDeleteKey",
+        "parameters": [
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of key to delete",
+            "name": "id",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/user/orgs": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "List the current user's organizations",
+        "operationId": "orgListCurrentUserOrgs",
+        "parameters": [
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/OrganizationList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/user/repos": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "List the repos that the authenticated user owns",
+        "operationId": "userCurrentListRepos",
+        "parameters": [
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/RepositoryList"
+          }
+        }
+      },
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "repository",
+          "user"
+        ],
+        "summary": "Create a repository",
+        "operationId": "createCurrentUserRepo",
+        "parameters": [
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/CreateRepoOption"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/Repository"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "409": {
+            "description": "The repository with the same name already exists."
+          },
+          "422": {
+            "$ref": "#/responses/validationError"
+          }
+        }
+      }
+    },
+    "/user/settings": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "Get user settings",
+        "operationId": "getUserSettings",
+        "responses": {
+          "200": {
+            "$ref": "#/responses/UserSettings"
+          }
+        }
+      },
+      "patch": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "Update user settings",
+        "operationId": "updateUserSettings",
+        "parameters": [
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/UserSettingsOptions"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/UserSettings"
+          }
+        }
+      }
+    },
+    "/user/starred": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "The repos that the authenticated user has starred",
+        "operationId": "userCurrentListStarred",
+        "parameters": [
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/RepositoryList"
+          }
+        }
+      }
+    },
+    "/user/starred/{owner}/{repo}": {
+      "get": {
+        "tags": [
+          "user"
+        ],
+        "summary": "Whether the authenticated is starring the repo",
+        "operationId": "userCurrentCheckStarring",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "put": {
+        "tags": [
+          "user"
+        ],
+        "summary": "Star the given repo",
+        "operationId": "userCurrentPutStar",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo to star",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo to star",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      },
+      "delete": {
+        "tags": [
+          "user"
+        ],
+        "summary": "Unstar the given repo",
+        "operationId": "userCurrentDeleteStar",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "owner of the repo to unstar",
+            "name": "owner",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the repo to unstar",
+            "name": "repo",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/user/stopwatches": {
+      "get": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "Get list of all existing stopwatches",
+        "operationId": "userGetStopWatches",
+        "parameters": [
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/StopWatchList"
+          }
+        }
+      }
+    },
+    "/user/subscriptions": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "List repositories watched by the authenticated user",
+        "operationId": "userCurrentListSubscriptions",
+        "parameters": [
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/RepositoryList"
+          }
+        }
+      }
+    },
+    "/user/teams": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "List all the teams a user belongs to",
+        "operationId": "userListTeams",
+        "parameters": [
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/TeamList"
+          }
+        }
+      }
+    },
+    "/user/times": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "List the current user's tracked times",
+        "operationId": "userCurrentTrackedTimes",
+        "parameters": [
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          },
+          {
+            "type": "string",
+            "format": "date-time",
+            "description": "Only show times updated after the given time. This is a timestamp in RFC 3339 format",
+            "name": "since",
+            "in": "query"
+          },
+          {
+            "type": "string",
+            "format": "date-time",
+            "description": "Only show times updated before the given time. This is a timestamp in RFC 3339 format",
+            "name": "before",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/TrackedTimeList"
+          }
+        }
+      }
+    },
+    "/users/search": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "Search for users",
+        "operationId": "userSearch",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "keyword",
+            "name": "q",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "ID of the user to search for",
+            "name": "uid",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "SearchResults of a successful search",
+            "schema": {
+              "type": "object",
+              "properties": {
+                "data": {
+                  "type": "array",
+                  "items": {
+                    "$ref": "#/definitions/User"
+                  }
+                },
+                "ok": {
+                  "type": "boolean"
+                }
+              }
+            }
+          }
+        }
+      }
+    },
+    "/users/{username}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "Get a user",
+        "operationId": "userGet",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "username of user to get",
+            "name": "username",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/User"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/users/{username}/activities/feeds": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "List a user's activity feeds",
+        "operationId": "userListActivityFeeds",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "username of user",
+            "name": "username",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "boolean",
+            "description": "if true, only show actions performed by the requested user",
+            "name": "only-performed-by",
+            "in": "query"
+          },
+          {
+            "type": "string",
+            "format": "date",
+            "description": "the date of the activities to be found",
+            "name": "date",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/ActivityFeedsList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/users/{username}/followers": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "List the given user's followers",
+        "operationId": "userListFollowers",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "username of user",
+            "name": "username",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/UserList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/users/{username}/following": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "List the users that the given user is following",
+        "operationId": "userListFollowing",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "username of user",
+            "name": "username",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/UserList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/users/{username}/following/{target}": {
+      "get": {
+        "tags": [
+          "user"
+        ],
+        "summary": "Check if one user is following another user",
+        "operationId": "userCheckFollowing",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "username of following user",
+            "name": "username",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "username of followed user",
+            "name": "target",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/users/{username}/gpg_keys": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "List the given user's GPG keys",
+        "operationId": "userListGPGKeys",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "username of user",
+            "name": "username",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/GPGKeyList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/users/{username}/heatmap": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "Get a user's heatmap",
+        "operationId": "userGetHeatmapData",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "username of user to get",
+            "name": "username",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/UserHeatmapData"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/users/{username}/keys": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "List the given user's public keys",
+        "operationId": "userListKeys",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "username of user",
+            "name": "username",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "fingerprint of the key",
+            "name": "fingerprint",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/PublicKeyList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/users/{username}/orgs": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "List a user's organizations",
+        "operationId": "orgListUserOrgs",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "username of user",
+            "name": "username",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/OrganizationList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/users/{username}/orgs/{org}/permissions": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "Get user permissions in organization",
+        "operationId": "orgGetUserPermissions",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "username of user",
+            "name": "username",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "name of the organization",
+            "name": "org",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/OrganizationPermissions"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/users/{username}/repos": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "List the repos owned by the given user",
+        "operationId": "userListRepos",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "username of user",
+            "name": "username",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/RepositoryList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/users/{username}/starred": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "The repos that the given user has starred",
+        "operationId": "userListStarred",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "username of user",
+            "name": "username",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/RepositoryList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/users/{username}/subscriptions": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "List the repositories watched by a user",
+        "operationId": "userListSubscriptions",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "username of the user",
+            "name": "username",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/RepositoryList"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          }
+        }
+      }
+    },
+    "/users/{username}/tokens": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "List the authenticated user's access tokens",
+        "operationId": "userGetTokens",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "username of user",
+            "name": "username",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "integer",
+            "description": "page number of results to return (1-based)",
+            "name": "page",
+            "in": "query"
+          },
+          {
+            "type": "integer",
+            "description": "page size of results",
+            "name": "limit",
+            "in": "query"
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/AccessTokenList"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          }
+        }
+      },
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "Create an access token",
+        "operationId": "userCreateToken",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "username of user",
+            "name": "username",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "schema": {
+              "$ref": "#/definitions/CreateAccessTokenOption"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "$ref": "#/responses/AccessToken"
+          },
+          "400": {
+            "$ref": "#/responses/error"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          }
+        }
+      }
+    },
+    "/users/{username}/tokens/{token}": {
+      "delete": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "delete an access token",
+        "operationId": "userDeleteAccessToken",
+        "parameters": [
+          {
+            "type": "string",
+            "description": "username of user",
+            "name": "username",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "token to be deleted, identified by ID and if not available by name",
+            "name": "token",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "204": {
+            "$ref": "#/responses/empty"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          },
+          "404": {
+            "$ref": "#/responses/notFound"
+          },
+          "422": {
+            "$ref": "#/responses/error"
+          }
+        }
+      }
+    },
+    "/version": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "miscellaneous"
+        ],
+        "summary": "Returns the version of the Gitea application",
+        "operationId": "getVersion",
+        "responses": {
+          "200": {
+            "$ref": "#/responses/ServerVersion"
+          }
+        }
+      }
+    }
+  },
+  "definitions": {
+    "APIError": {
+      "description": "APIError is an api error with a message",
+      "type": "object",
+      "properties": {
+        "message": {
+          "type": "string",
+          "x-go-name": "Message"
+        },
+        "url": {
+          "type": "string",
+          "x-go-name": "URL"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "AccessToken": {
+      "type": "object",
+      "title": "AccessToken represents an API access token.",
+      "properties": {
+        "id": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "ID"
+        },
+        "name": {
+          "type": "string",
+          "x-go-name": "Name"
+        },
+        "scopes": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "Scopes"
+        },
+        "sha1": {
+          "type": "string",
+          "x-go-name": "Token"
+        },
+        "token_last_eight": {
+          "type": "string",
+          "x-go-name": "TokenLastEight"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "ActionVariable": {
+      "description": "ActionVariable return value of the query API",
+      "type": "object",
+      "properties": {
+        "data": {
+          "description": "the value of the variable",
+          "type": "string",
+          "x-go-name": "Data"
+        },
+        "name": {
+          "description": "the name of the variable",
+          "type": "string",
+          "x-go-name": "Name"
+        },
+        "owner_id": {
+          "description": "the owner to which the variable belongs",
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "OwnerID"
+        },
+        "repo_id": {
+          "description": "the repository to which the variable belongs",
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "RepoID"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "Activity": {
+      "type": "object",
+      "properties": {
+        "act_user": {
+          "$ref": "#/definitions/User"
+        },
+        "act_user_id": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "ActUserID"
+        },
+        "comment": {
+          "$ref": "#/definitions/Comment"
+        },
+        "comment_id": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "CommentID"
+        },
+        "content": {
+          "type": "string",
+          "x-go-name": "Content"
+        },
+        "created": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Created"
+        },
+        "id": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "ID"
+        },
+        "is_private": {
+          "type": "boolean",
+          "x-go-name": "IsPrivate"
+        },
+        "op_type": {
+          "type": "string",
+          "x-go-name": "OpType"
+        },
+        "ref_name": {
+          "type": "string",
+          "x-go-name": "RefName"
+        },
+        "repo": {
+          "$ref": "#/definitions/Repository"
+        },
+        "repo_id": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "RepoID"
+        },
+        "user_id": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "UserID"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "ActivityPub": {
+      "description": "ActivityPub type",
+      "type": "object",
+      "properties": {
+        "@context": {
+          "type": "string",
+          "x-go-name": "Context"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "AddCollaboratorOption": {
+      "description": "AddCollaboratorOption options when adding a user as a collaborator of a repository",
+      "type": "object",
+      "properties": {
+        "permission": {
+          "type": "string",
+          "x-go-name": "Permission"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "AddTimeOption": {
+      "description": "AddTimeOption options for adding time to an issue",
+      "type": "object",
+      "required": [
+        "time"
+      ],
+      "properties": {
+        "created": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Created"
+        },
+        "time": {
+          "description": "time in seconds",
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "Time"
+        },
+        "user_name": {
+          "description": "User who spent the time (optional)",
+          "type": "string",
+          "x-go-name": "User"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "AnnotatedTag": {
+      "description": "AnnotatedTag represents an annotated tag",
+      "type": "object",
+      "properties": {
+        "message": {
+          "type": "string",
+          "x-go-name": "Message"
+        },
+        "object": {
+          "$ref": "#/definitions/AnnotatedTagObject"
+        },
+        "sha": {
+          "type": "string",
+          "x-go-name": "SHA"
+        },
+        "tag": {
+          "type": "string",
+          "x-go-name": "Tag"
+        },
+        "tagger": {
+          "$ref": "#/definitions/CommitUser"
+        },
+        "url": {
+          "type": "string",
+          "x-go-name": "URL"
+        },
+        "verification": {
+          "$ref": "#/definitions/PayloadCommitVerification"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "AnnotatedTagObject": {
+      "description": "AnnotatedTagObject contains meta information of the tag object",
+      "type": "object",
+      "properties": {
+        "sha": {
+          "type": "string",
+          "x-go-name": "SHA"
+        },
+        "type": {
+          "type": "string",
+          "x-go-name": "Type"
+        },
+        "url": {
+          "type": "string",
+          "x-go-name": "URL"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "Attachment": {
+      "description": "Attachment a generic attachment",
+      "type": "object",
+      "properties": {
+        "browser_download_url": {
+          "type": "string",
+          "x-go-name": "DownloadURL"
+        },
+        "created_at": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Created"
+        },
+        "download_count": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "DownloadCount"
+        },
+        "id": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "ID"
+        },
+        "name": {
+          "type": "string",
+          "x-go-name": "Name"
+        },
+        "size": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "Size"
+        },
+        "uuid": {
+          "type": "string",
+          "x-go-name": "UUID"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "Badge": {
+      "description": "Badge represents a user badge",
+      "type": "object",
+      "properties": {
+        "description": {
+          "type": "string",
+          "x-go-name": "Description"
+        },
+        "id": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "ID"
+        },
+        "image_url": {
+          "type": "string",
+          "x-go-name": "ImageURL"
+        },
+        "slug": {
+          "type": "string",
+          "x-go-name": "Slug"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "Branch": {
+      "description": "Branch represents a repository branch",
+      "type": "object",
+      "properties": {
+        "commit": {
+          "$ref": "#/definitions/PayloadCommit"
+        },
+        "effective_branch_protection_name": {
+          "type": "string",
+          "x-go-name": "EffectiveBranchProtectionName"
+        },
+        "enable_status_check": {
+          "type": "boolean",
+          "x-go-name": "EnableStatusCheck"
+        },
+        "name": {
+          "type": "string",
+          "x-go-name": "Name"
+        },
+        "protected": {
+          "type": "boolean",
+          "x-go-name": "Protected"
+        },
+        "required_approvals": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "RequiredApprovals"
+        },
+        "status_check_contexts": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "StatusCheckContexts"
+        },
+        "user_can_merge": {
+          "type": "boolean",
+          "x-go-name": "UserCanMerge"
+        },
+        "user_can_push": {
+          "type": "boolean",
+          "x-go-name": "UserCanPush"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "BranchProtection": {
+      "description": "BranchProtection represents a branch protection for a repository",
+      "type": "object",
+      "properties": {
+        "approvals_whitelist_teams": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "ApprovalsWhitelistTeams"
+        },
+        "approvals_whitelist_username": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "ApprovalsWhitelistUsernames"
+        },
+        "block_on_official_review_requests": {
+          "type": "boolean",
+          "x-go-name": "BlockOnOfficialReviewRequests"
+        },
+        "block_on_outdated_branch": {
+          "type": "boolean",
+          "x-go-name": "BlockOnOutdatedBranch"
+        },
+        "block_on_rejected_reviews": {
+          "type": "boolean",
+          "x-go-name": "BlockOnRejectedReviews"
+        },
+        "branch_name": {
+          "description": "Deprecated: true",
+          "type": "string",
+          "x-go-name": "BranchName"
+        },
+        "created_at": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Created"
+        },
+        "dismiss_stale_approvals": {
+          "type": "boolean",
+          "x-go-name": "DismissStaleApprovals"
+        },
+        "enable_approvals_whitelist": {
+          "type": "boolean",
+          "x-go-name": "EnableApprovalsWhitelist"
+        },
+        "enable_merge_whitelist": {
+          "type": "boolean",
+          "x-go-name": "EnableMergeWhitelist"
+        },
+        "enable_push": {
+          "type": "boolean",
+          "x-go-name": "EnablePush"
+        },
+        "enable_push_whitelist": {
+          "type": "boolean",
+          "x-go-name": "EnablePushWhitelist"
+        },
+        "enable_status_check": {
+          "type": "boolean",
+          "x-go-name": "EnableStatusCheck"
+        },
+        "ignore_stale_approvals": {
+          "type": "boolean",
+          "x-go-name": "IgnoreStaleApprovals"
+        },
+        "merge_whitelist_teams": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "MergeWhitelistTeams"
+        },
+        "merge_whitelist_usernames": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "MergeWhitelistUsernames"
+        },
+        "protected_file_patterns": {
+          "type": "string",
+          "x-go-name": "ProtectedFilePatterns"
+        },
+        "push_whitelist_deploy_keys": {
+          "type": "boolean",
+          "x-go-name": "PushWhitelistDeployKeys"
+        },
+        "push_whitelist_teams": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "PushWhitelistTeams"
+        },
+        "push_whitelist_usernames": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "PushWhitelistUsernames"
+        },
+        "require_signed_commits": {
+          "type": "boolean",
+          "x-go-name": "RequireSignedCommits"
+        },
+        "required_approvals": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "RequiredApprovals"
+        },
+        "rule_name": {
+          "type": "string",
+          "x-go-name": "RuleName"
+        },
+        "status_check_contexts": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "StatusCheckContexts"
+        },
+        "unprotected_file_patterns": {
+          "type": "string",
+          "x-go-name": "UnprotectedFilePatterns"
+        },
+        "updated_at": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Updated"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "ChangeFileOperation": {
+      "description": "ChangeFileOperation for creating, updating or deleting a file",
+      "type": "object",
+      "required": [
+        "operation",
+        "path"
+      ],
+      "properties": {
+        "content": {
+          "description": "new or updated file content, must be base64 encoded",
+          "type": "string",
+          "x-go-name": "ContentBase64"
+        },
+        "from_path": {
+          "description": "old path of the file to move",
+          "type": "string",
+          "x-go-name": "FromPath"
+        },
+        "operation": {
+          "description": "indicates what to do with the file",
+          "type": "string",
+          "enum": [
+            "create",
+            "update",
+            "delete"
+          ],
+          "x-go-name": "Operation"
+        },
+        "path": {
+          "description": "path to the existing or new file",
+          "type": "string",
+          "x-go-name": "Path"
+        },
+        "sha": {
+          "description": "sha is the SHA for the file that already exists, required for update or delete",
+          "type": "string",
+          "x-go-name": "SHA"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "ChangeFilesOptions": {
+      "description": "ChangeFilesOptions options for creating, updating or deleting multiple files\nNote: `author` and `committer` are optional (if only one is given, it will be used for the other, otherwise the authenticated user will be used)",
+      "type": "object",
+      "required": [
+        "files"
+      ],
+      "properties": {
+        "author": {
+          "$ref": "#/definitions/Identity"
+        },
+        "branch": {
+          "description": "branch (optional) to base this file from. if not given, the default branch is used",
+          "type": "string",
+          "x-go-name": "BranchName"
+        },
+        "committer": {
+          "$ref": "#/definitions/Identity"
+        },
+        "dates": {
+          "$ref": "#/definitions/CommitDateOptions"
+        },
+        "files": {
+          "description": "list of file operations",
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/ChangeFileOperation"
+          },
+          "x-go-name": "Files"
+        },
+        "message": {
+          "description": "message (optional) for the commit of this file. if not supplied, a default message will be used",
+          "type": "string",
+          "x-go-name": "Message"
+        },
+        "new_branch": {
+          "description": "new_branch (optional) will make a new branch from `branch` before creating the file",
+          "type": "string",
+          "x-go-name": "NewBranchName"
+        },
+        "signoff": {
+          "description": "Add a Signed-off-by trailer by the committer at the end of the commit log message.",
+          "type": "boolean",
+          "x-go-name": "Signoff"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "ChangedFile": {
+      "description": "ChangedFile store information about files affected by the pull request",
+      "type": "object",
+      "properties": {
+        "additions": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "Additions"
+        },
+        "changes": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "Changes"
+        },
+        "contents_url": {
+          "type": "string",
+          "x-go-name": "ContentsURL"
+        },
+        "deletions": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "Deletions"
+        },
+        "filename": {
+          "type": "string",
+          "x-go-name": "Filename"
+        },
+        "html_url": {
+          "type": "string",
+          "x-go-name": "HTMLURL"
+        },
+        "previous_filename": {
+          "type": "string",
+          "x-go-name": "PreviousFilename"
+        },
+        "raw_url": {
+          "type": "string",
+          "x-go-name": "RawURL"
+        },
+        "status": {
+          "type": "string",
+          "x-go-name": "Status"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "CombinedStatus": {
+      "description": "CombinedStatus holds the combined state of several statuses for a single commit",
+      "type": "object",
+      "properties": {
+        "commit_url": {
+          "type": "string",
+          "x-go-name": "CommitURL"
+        },
+        "repository": {
+          "$ref": "#/definitions/Repository"
+        },
+        "sha": {
+          "type": "string",
+          "x-go-name": "SHA"
+        },
+        "state": {
+          "$ref": "#/definitions/CommitStatusState"
+        },
+        "statuses": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/CommitStatus"
+          },
+          "x-go-name": "Statuses"
+        },
+        "total_count": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "TotalCount"
+        },
+        "url": {
+          "type": "string",
+          "x-go-name": "URL"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "Comment": {
+      "description": "Comment represents a comment on a commit or issue",
+      "type": "object",
+      "properties": {
+        "assets": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/Attachment"
+          },
+          "x-go-name": "Attachments"
+        },
+        "body": {
+          "type": "string",
+          "x-go-name": "Body"
+        },
+        "created_at": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Created"
+        },
+        "html_url": {
+          "type": "string",
+          "x-go-name": "HTMLURL"
+        },
+        "id": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "ID"
+        },
+        "issue_url": {
+          "type": "string",
+          "x-go-name": "IssueURL"
+        },
+        "original_author": {
+          "type": "string",
+          "x-go-name": "OriginalAuthor"
+        },
+        "original_author_id": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "OriginalAuthorID"
+        },
+        "pull_request_url": {
+          "type": "string",
+          "x-go-name": "PRURL"
+        },
+        "updated_at": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Updated"
+        },
+        "user": {
+          "$ref": "#/definitions/User"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "Commit": {
+      "type": "object",
+      "title": "Commit contains information generated from a Git commit.",
+      "properties": {
+        "author": {
+          "$ref": "#/definitions/User"
+        },
+        "commit": {
+          "$ref": "#/definitions/RepoCommit"
+        },
+        "committer": {
+          "$ref": "#/definitions/User"
+        },
+        "created": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Created"
+        },
+        "files": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/CommitAffectedFiles"
+          },
+          "x-go-name": "Files"
+        },
+        "html_url": {
+          "type": "string",
+          "x-go-name": "HTMLURL"
+        },
+        "parents": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/CommitMeta"
+          },
+          "x-go-name": "Parents"
+        },
+        "sha": {
+          "type": "string",
+          "x-go-name": "SHA"
+        },
+        "stats": {
+          "$ref": "#/definitions/CommitStats"
+        },
+        "url": {
+          "type": "string",
+          "x-go-name": "URL"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "CommitAffectedFiles": {
+      "description": "CommitAffectedFiles store information about files affected by the commit",
+      "type": "object",
+      "properties": {
+        "filename": {
+          "type": "string",
+          "x-go-name": "Filename"
+        },
+        "status": {
+          "type": "string",
+          "x-go-name": "Status"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "CommitDateOptions": {
+      "description": "CommitDateOptions store dates for GIT_AUTHOR_DATE and GIT_COMMITTER_DATE",
+      "type": "object",
+      "properties": {
+        "author": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Author"
+        },
+        "committer": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Committer"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "CommitMeta": {
+      "type": "object",
+      "title": "CommitMeta contains meta information of a commit in terms of API.",
+      "properties": {
+        "created": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Created"
+        },
+        "sha": {
+          "type": "string",
+          "x-go-name": "SHA"
+        },
+        "url": {
+          "type": "string",
+          "x-go-name": "URL"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "CommitStats": {
+      "description": "CommitStats is statistics for a RepoCommit",
+      "type": "object",
+      "properties": {
+        "additions": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "Additions"
+        },
+        "deletions": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "Deletions"
+        },
+        "total": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "Total"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "CommitStatus": {
+      "description": "CommitStatus holds a single status of a single Commit",
+      "type": "object",
+      "properties": {
+        "context": {
+          "type": "string",
+          "x-go-name": "Context"
+        },
+        "created_at": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Created"
+        },
+        "creator": {
+          "$ref": "#/definitions/User"
+        },
+        "description": {
+          "type": "string",
+          "x-go-name": "Description"
+        },
+        "id": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "ID"
+        },
+        "status": {
+          "$ref": "#/definitions/CommitStatusState"
+        },
+        "target_url": {
+          "type": "string",
+          "x-go-name": "TargetURL"
+        },
+        "updated_at": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Updated"
+        },
+        "url": {
+          "type": "string",
+          "x-go-name": "URL"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "CommitStatusState": {
+      "description": "CommitStatusState holds the state of a CommitStatus\nIt can be \"pending\", \"success\", \"error\" and \"failure\"",
+      "type": "string",
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "CommitUser": {
+      "type": "object",
+      "title": "CommitUser contains information of a user in the context of a commit.",
+      "properties": {
+        "date": {
+          "type": "string",
+          "x-go-name": "Date"
+        },
+        "email": {
+          "type": "string",
+          "format": "email",
+          "x-go-name": "Email"
+        },
+        "name": {
+          "type": "string",
+          "x-go-name": "Name"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "Compare": {
+      "type": "object",
+      "title": "Compare represents a comparison between two commits.",
+      "properties": {
+        "commits": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/Commit"
+          },
+          "x-go-name": "Commits"
+        },
+        "total_commits": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "TotalCommits"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "ContentsResponse": {
+      "description": "ContentsResponse contains information about a repo's entry's (dir, file, symlink, submodule) metadata and content",
+      "type": "object",
+      "properties": {
+        "_links": {
+          "$ref": "#/definitions/FileLinksResponse"
+        },
+        "content": {
+          "description": "`content` is populated when `type` is `file`, otherwise null",
+          "type": "string",
+          "x-go-name": "Content"
+        },
+        "download_url": {
+          "type": "string",
+          "x-go-name": "DownloadURL"
+        },
+        "encoding": {
+          "description": "`encoding` is populated when `type` is `file`, otherwise null",
+          "type": "string",
+          "x-go-name": "Encoding"
+        },
+        "git_url": {
+          "type": "string",
+          "x-go-name": "GitURL"
+        },
+        "html_url": {
+          "type": "string",
+          "x-go-name": "HTMLURL"
+        },
+        "last_commit_sha": {
+          "type": "string",
+          "x-go-name": "LastCommitSHA"
+        },
+        "name": {
+          "type": "string",
+          "x-go-name": "Name"
+        },
+        "path": {
+          "type": "string",
+          "x-go-name": "Path"
+        },
+        "sha": {
+          "type": "string",
+          "x-go-name": "SHA"
+        },
+        "size": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "Size"
+        },
+        "submodule_git_url": {
+          "description": "`submodule_git_url` is populated when `type` is `submodule`, otherwise null",
+          "type": "string",
+          "x-go-name": "SubmoduleGitURL"
+        },
+        "target": {
+          "description": "`target` is populated when `type` is `symlink`, otherwise null",
+          "type": "string",
+          "x-go-name": "Target"
+        },
+        "type": {
+          "description": "`type` will be `file`, `dir`, `symlink`, or `submodule`",
+          "type": "string",
+          "x-go-name": "Type"
+        },
+        "url": {
+          "type": "string",
+          "x-go-name": "URL"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "CreateAccessTokenOption": {
+      "description": "CreateAccessTokenOption options when create access token",
+      "type": "object",
+      "required": [
+        "name"
+      ],
+      "properties": {
+        "name": {
+          "type": "string",
+          "x-go-name": "Name"
+        },
+        "scopes": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "Scopes"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "CreateBranchProtectionOption": {
+      "description": "CreateBranchProtectionOption options for creating a branch protection",
+      "type": "object",
+      "properties": {
+        "approvals_whitelist_teams": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "ApprovalsWhitelistTeams"
+        },
+        "approvals_whitelist_username": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "ApprovalsWhitelistUsernames"
+        },
+        "block_on_official_review_requests": {
+          "type": "boolean",
+          "x-go-name": "BlockOnOfficialReviewRequests"
+        },
+        "block_on_outdated_branch": {
+          "type": "boolean",
+          "x-go-name": "BlockOnOutdatedBranch"
+        },
+        "block_on_rejected_reviews": {
+          "type": "boolean",
+          "x-go-name": "BlockOnRejectedReviews"
+        },
+        "branch_name": {
+          "description": "Deprecated: true",
+          "type": "string",
+          "x-go-name": "BranchName"
+        },
+        "dismiss_stale_approvals": {
+          "type": "boolean",
+          "x-go-name": "DismissStaleApprovals"
+        },
+        "enable_approvals_whitelist": {
+          "type": "boolean",
+          "x-go-name": "EnableApprovalsWhitelist"
+        },
+        "enable_merge_whitelist": {
+          "type": "boolean",
+          "x-go-name": "EnableMergeWhitelist"
+        },
+        "enable_push": {
+          "type": "boolean",
+          "x-go-name": "EnablePush"
+        },
+        "enable_push_whitelist": {
+          "type": "boolean",
+          "x-go-name": "EnablePushWhitelist"
+        },
+        "enable_status_check": {
+          "type": "boolean",
+          "x-go-name": "EnableStatusCheck"
+        },
+        "ignore_stale_approvals": {
+          "type": "boolean",
+          "x-go-name": "IgnoreStaleApprovals"
+        },
+        "merge_whitelist_teams": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "MergeWhitelistTeams"
+        },
+        "merge_whitelist_usernames": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "MergeWhitelistUsernames"
+        },
+        "protected_file_patterns": {
+          "type": "string",
+          "x-go-name": "ProtectedFilePatterns"
+        },
+        "push_whitelist_deploy_keys": {
+          "type": "boolean",
+          "x-go-name": "PushWhitelistDeployKeys"
+        },
+        "push_whitelist_teams": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "PushWhitelistTeams"
+        },
+        "push_whitelist_usernames": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "PushWhitelistUsernames"
+        },
+        "require_signed_commits": {
+          "type": "boolean",
+          "x-go-name": "RequireSignedCommits"
+        },
+        "required_approvals": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "RequiredApprovals"
+        },
+        "rule_name": {
+          "type": "string",
+          "x-go-name": "RuleName"
+        },
+        "status_check_contexts": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "StatusCheckContexts"
+        },
+        "unprotected_file_patterns": {
+          "type": "string",
+          "x-go-name": "UnprotectedFilePatterns"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "CreateBranchRepoOption": {
+      "description": "CreateBranchRepoOption options when creating a branch in a repository",
+      "type": "object",
+      "required": [
+        "new_branch_name"
+      ],
+      "properties": {
+        "new_branch_name": {
+          "description": "Name of the branch to create",
+          "type": "string",
+          "uniqueItems": true,
+          "x-go-name": "BranchName"
+        },
+        "old_branch_name": {
+          "description": "Deprecated: true\nName of the old branch to create from",
+          "type": "string",
+          "uniqueItems": true,
+          "x-go-name": "OldBranchName"
+        },
+        "old_ref_name": {
+          "description": "Name of the old branch/tag/commit to create from",
+          "type": "string",
+          "uniqueItems": true,
+          "x-go-name": "OldRefName"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "CreateEmailOption": {
+      "description": "CreateEmailOption options when creating email addresses",
+      "type": "object",
+      "properties": {
+        "emails": {
+          "description": "email addresses to add",
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "Emails"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "CreateFileOptions": {
+      "description": "CreateFileOptions options for creating files\nNote: `author` and `committer` are optional (if only one is given, it will be used for the other, otherwise the authenticated user will be used)",
+      "type": "object",
+      "required": [
+        "content"
+      ],
+      "properties": {
+        "author": {
+          "$ref": "#/definitions/Identity"
+        },
+        "branch": {
+          "description": "branch (optional) to base this file from. if not given, the default branch is used",
+          "type": "string",
+          "x-go-name": "BranchName"
+        },
+        "committer": {
+          "$ref": "#/definitions/Identity"
+        },
+        "content": {
+          "description": "content must be base64 encoded",
+          "type": "string",
+          "x-go-name": "ContentBase64"
+        },
+        "dates": {
+          "$ref": "#/definitions/CommitDateOptions"
+        },
+        "message": {
+          "description": "message (optional) for the commit of this file. if not supplied, a default message will be used",
+          "type": "string",
+          "x-go-name": "Message"
+        },
+        "new_branch": {
+          "description": "new_branch (optional) will make a new branch from `branch` before creating the file",
+          "type": "string",
+          "x-go-name": "NewBranchName"
+        },
+        "signoff": {
+          "description": "Add a Signed-off-by trailer by the committer at the end of the commit log message.",
+          "type": "boolean",
+          "x-go-name": "Signoff"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "CreateForkOption": {
+      "description": "CreateForkOption options for creating a fork",
+      "type": "object",
+      "properties": {
+        "name": {
+          "description": "name of the forked repository",
+          "type": "string",
+          "x-go-name": "Name"
+        },
+        "organization": {
+          "description": "organization name, if forking into an organization",
+          "type": "string",
+          "x-go-name": "Organization"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "CreateGPGKeyOption": {
+      "description": "CreateGPGKeyOption options create user GPG key",
+      "type": "object",
+      "required": [
+        "armored_public_key"
+      ],
+      "properties": {
+        "armored_public_key": {
+          "description": "An armored GPG key to add",
+          "type": "string",
+          "uniqueItems": true,
+          "x-go-name": "ArmoredKey"
+        },
+        "armored_signature": {
+          "type": "string",
+          "x-go-name": "Signature"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "CreateHookOption": {
+      "description": "CreateHookOption options when create a hook",
+      "type": "object",
+      "required": [
+        "type",
+        "config"
+      ],
+      "properties": {
+        "active": {
+          "type": "boolean",
+          "default": false,
+          "x-go-name": "Active"
+        },
+        "authorization_header": {
+          "type": "string",
+          "x-go-name": "AuthorizationHeader"
+        },
+        "branch_filter": {
+          "type": "string",
+          "x-go-name": "BranchFilter"
+        },
+        "config": {
+          "$ref": "#/definitions/CreateHookOptionConfig"
+        },
+        "events": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "Events"
+        },
+        "type": {
+          "type": "string",
+          "enum": [
+            "dingtalk",
+            "discord",
+            "gitea",
+            "gogs",
+            "msteams",
+            "slack",
+            "telegram",
+            "feishu",
+            "wechatwork",
+            "packagist"
+          ],
+          "x-go-name": "Type"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "CreateHookOptionConfig": {
+      "description": "CreateHookOptionConfig has all config options in it\nrequired are \"content_type\" and \"url\" Required",
+      "type": "object",
+      "additionalProperties": {
+        "type": "string"
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "CreateIssueCommentOption": {
+      "description": "CreateIssueCommentOption options for creating a comment on an issue",
+      "type": "object",
+      "required": [
+        "body"
+      ],
+      "properties": {
+        "body": {
+          "type": "string",
+          "x-go-name": "Body"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "CreateIssueOption": {
+      "description": "CreateIssueOption options to create one issue",
+      "type": "object",
+      "required": [
+        "title"
+      ],
+      "properties": {
+        "assignee": {
+          "description": "deprecated",
+          "type": "string",
+          "x-go-name": "Assignee"
+        },
+        "assignees": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "Assignees"
+        },
+        "body": {
+          "type": "string",
+          "x-go-name": "Body"
+        },
+        "closed": {
+          "type": "boolean",
+          "x-go-name": "Closed"
+        },
+        "due_date": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Deadline"
+        },
+        "labels": {
+          "description": "list of label ids",
+          "type": "array",
+          "items": {
+            "type": "integer",
+            "format": "int64"
+          },
+          "x-go-name": "Labels"
+        },
+        "milestone": {
+          "description": "milestone id",
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "Milestone"
+        },
+        "ref": {
+          "type": "string",
+          "x-go-name": "Ref"
+        },
+        "title": {
+          "type": "string",
+          "x-go-name": "Title"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "CreateKeyOption": {
+      "description": "CreateKeyOption options when creating a key",
+      "type": "object",
+      "required": [
+        "title",
+        "key"
+      ],
+      "properties": {
+        "key": {
+          "description": "An armored SSH key to add",
+          "type": "string",
+          "uniqueItems": true,
+          "x-go-name": "Key"
+        },
+        "read_only": {
+          "description": "Describe if the key has only read access or read/write",
+          "type": "boolean",
+          "x-go-name": "ReadOnly"
+        },
+        "title": {
+          "description": "Title of the key to add",
+          "type": "string",
+          "uniqueItems": true,
+          "x-go-name": "Title"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "CreateLabelOption": {
+      "description": "CreateLabelOption options for creating a label",
+      "type": "object",
+      "required": [
+        "name",
+        "color"
+      ],
+      "properties": {
+        "color": {
+          "type": "string",
+          "x-go-name": "Color",
+          "example": "#00aabb"
+        },
+        "description": {
+          "type": "string",
+          "x-go-name": "Description"
+        },
+        "exclusive": {
+          "type": "boolean",
+          "x-go-name": "Exclusive",
+          "example": false
+        },
+        "is_archived": {
+          "type": "boolean",
+          "x-go-name": "IsArchived",
+          "example": false
+        },
+        "name": {
+          "type": "string",
+          "x-go-name": "Name"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "CreateMilestoneOption": {
+      "description": "CreateMilestoneOption options for creating a milestone",
+      "type": "object",
+      "properties": {
+        "description": {
+          "type": "string",
+          "x-go-name": "Description"
+        },
+        "due_on": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Deadline"
+        },
+        "state": {
+          "type": "string",
+          "enum": [
+            "open",
+            "closed"
+          ],
+          "x-go-name": "State"
+        },
+        "title": {
+          "type": "string",
+          "x-go-name": "Title"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "CreateOAuth2ApplicationOptions": {
+      "description": "CreateOAuth2ApplicationOptions holds options to create an oauth2 application",
+      "type": "object",
+      "properties": {
+        "confidential_client": {
+          "type": "boolean",
+          "x-go-name": "ConfidentialClient"
+        },
+        "name": {
+          "type": "string",
+          "x-go-name": "Name"
+        },
+        "redirect_uris": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "RedirectURIs"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "CreateOrUpdateSecretOption": {
+      "description": "CreateOrUpdateSecretOption options when creating or updating secret",
+      "type": "object",
+      "required": [
+        "data"
+      ],
+      "properties": {
+        "data": {
+          "description": "Data of the secret to update",
+          "type": "string",
+          "x-go-name": "Data"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "CreateOrgOption": {
+      "description": "CreateOrgOption options for creating an organization",
+      "type": "object",
+      "required": [
+        "username"
+      ],
+      "properties": {
+        "description": {
+          "type": "string",
+          "x-go-name": "Description"
+        },
+        "email": {
+          "type": "string",
+          "x-go-name": "Email"
+        },
+        "full_name": {
+          "type": "string",
+          "x-go-name": "FullName"
+        },
+        "location": {
+          "type": "string",
+          "x-go-name": "Location"
+        },
+        "repo_admin_change_team_access": {
+          "type": "boolean",
+          "x-go-name": "RepoAdminChangeTeamAccess"
+        },
+        "username": {
+          "type": "string",
+          "x-go-name": "UserName"
+        },
+        "visibility": {
+          "description": "possible values are `public` (default), `limited` or `private`",
+          "type": "string",
+          "enum": [
+            "public",
+            "limited",
+            "private"
+          ],
+          "x-go-name": "Visibility"
+        },
+        "website": {
+          "type": "string",
+          "x-go-name": "Website"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "CreatePullRequestOption": {
+      "description": "CreatePullRequestOption options when creating a pull request",
+      "type": "object",
+      "properties": {
+        "assignee": {
+          "type": "string",
+          "x-go-name": "Assignee"
+        },
+        "assignees": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "Assignees"
+        },
+        "base": {
+          "type": "string",
+          "x-go-name": "Base"
+        },
+        "body": {
+          "type": "string",
+          "x-go-name": "Body"
+        },
+        "due_date": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Deadline"
+        },
+        "head": {
+          "type": "string",
+          "x-go-name": "Head"
+        },
+        "labels": {
+          "type": "array",
+          "items": {
+            "type": "integer",
+            "format": "int64"
+          },
+          "x-go-name": "Labels"
+        },
+        "milestone": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "Milestone"
+        },
+        "title": {
+          "type": "string",
+          "x-go-name": "Title"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "CreatePullReviewComment": {
+      "description": "CreatePullReviewComment represent a review comment for creation api",
+      "type": "object",
+      "properties": {
+        "body": {
+          "type": "string",
+          "x-go-name": "Body"
+        },
+        "new_position": {
+          "description": "if comment to new file line or 0",
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "NewLineNum"
+        },
+        "old_position": {
+          "description": "if comment to old file line or 0",
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "OldLineNum"
+        },
+        "path": {
+          "description": "the tree path",
+          "type": "string",
+          "x-go-name": "Path"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "CreatePullReviewOptions": {
+      "description": "CreatePullReviewOptions are options to create a pull review",
+      "type": "object",
+      "properties": {
+        "body": {
+          "type": "string",
+          "x-go-name": "Body"
+        },
+        "comments": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/CreatePullReviewComment"
+          },
+          "x-go-name": "Comments"
+        },
+        "commit_id": {
+          "type": "string",
+          "x-go-name": "CommitID"
+        },
+        "event": {
+          "$ref": "#/definitions/ReviewStateType"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "CreatePushMirrorOption": {
+      "type": "object",
+      "title": "CreatePushMirrorOption represents need information to create a push mirror of a repository.",
+      "properties": {
+        "interval": {
+          "type": "string",
+          "x-go-name": "Interval"
+        },
+        "remote_address": {
+          "type": "string",
+          "x-go-name": "RemoteAddress"
+        },
+        "remote_password": {
+          "type": "string",
+          "x-go-name": "RemotePassword"
+        },
+        "remote_username": {
+          "type": "string",
+          "x-go-name": "RemoteUsername"
+        },
+        "sync_on_commit": {
+          "type": "boolean",
+          "x-go-name": "SyncOnCommit"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "CreateReleaseOption": {
+      "description": "CreateReleaseOption options when creating a release",
+      "type": "object",
+      "required": [
+        "tag_name"
+      ],
+      "properties": {
+        "body": {
+          "type": "string",
+          "x-go-name": "Note"
+        },
+        "draft": {
+          "type": "boolean",
+          "x-go-name": "IsDraft"
+        },
+        "name": {
+          "type": "string",
+          "x-go-name": "Title"
+        },
+        "prerelease": {
+          "type": "boolean",
+          "x-go-name": "IsPrerelease"
+        },
+        "tag_name": {
+          "type": "string",
+          "x-go-name": "TagName"
+        },
+        "target_commitish": {
+          "type": "string",
+          "x-go-name": "Target"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "CreateRepoOption": {
+      "description": "CreateRepoOption options when creating repository",
+      "type": "object",
+      "required": [
+        "name"
+      ],
+      "properties": {
+        "auto_init": {
+          "description": "Whether the repository should be auto-initialized?",
+          "type": "boolean",
+          "x-go-name": "AutoInit"
+        },
+        "default_branch": {
+          "description": "DefaultBranch of the repository (used when initializes and in template)",
+          "type": "string",
+          "x-go-name": "DefaultBranch"
+        },
+        "description": {
+          "description": "Description of the repository to create",
+          "type": "string",
+          "x-go-name": "Description"
+        },
+        "gitignores": {
+          "description": "Gitignores to use",
+          "type": "string",
+          "x-go-name": "Gitignores"
+        },
+        "issue_labels": {
+          "description": "Label-Set to use",
+          "type": "string",
+          "x-go-name": "IssueLabels"
+        },
+        "license": {
+          "description": "License to use",
+          "type": "string",
+          "x-go-name": "License"
+        },
+        "name": {
+          "description": "Name of the repository to create",
+          "type": "string",
+          "uniqueItems": true,
+          "x-go-name": "Name"
+        },
+        "object_format_name": {
+          "description": "ObjectFormatName of the underlying git repository",
+          "type": "string",
+          "enum": [
+            "sha1",
+            "sha256"
+          ],
+          "x-go-name": "ObjectFormatName"
+        },
+        "private": {
+          "description": "Whether the repository is private",
+          "type": "boolean",
+          "x-go-name": "Private"
+        },
+        "readme": {
+          "description": "Readme of the repository to create",
+          "type": "string",
+          "x-go-name": "Readme"
+        },
+        "template": {
+          "description": "Whether the repository is template",
+          "type": "boolean",
+          "x-go-name": "Template"
+        },
+        "trust_model": {
+          "description": "TrustModel of the repository",
+          "type": "string",
+          "enum": [
+            "default",
+            "collaborator",
+            "committer",
+            "collaboratorcommitter"
+          ],
+          "x-go-name": "TrustModel"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "CreateStatusOption": {
+      "description": "CreateStatusOption holds the information needed to create a new CommitStatus for a Commit",
+      "type": "object",
+      "properties": {
+        "context": {
+          "type": "string",
+          "x-go-name": "Context"
+        },
+        "description": {
+          "type": "string",
+          "x-go-name": "Description"
+        },
+        "state": {
+          "$ref": "#/definitions/CommitStatusState"
+        },
+        "target_url": {
+          "type": "string",
+          "x-go-name": "TargetURL"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "CreateTagOption": {
+      "description": "CreateTagOption options when creating a tag",
+      "type": "object",
+      "required": [
+        "tag_name"
+      ],
+      "properties": {
+        "message": {
+          "type": "string",
+          "x-go-name": "Message"
+        },
+        "tag_name": {
+          "type": "string",
+          "x-go-name": "TagName"
+        },
+        "target": {
+          "type": "string",
+          "x-go-name": "Target"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "CreateTeamOption": {
+      "description": "CreateTeamOption options for creating a team",
+      "type": "object",
+      "required": [
+        "name"
+      ],
+      "properties": {
+        "can_create_org_repo": {
+          "type": "boolean",
+          "x-go-name": "CanCreateOrgRepo"
+        },
+        "description": {
+          "type": "string",
+          "x-go-name": "Description"
+        },
+        "includes_all_repositories": {
+          "type": "boolean",
+          "x-go-name": "IncludesAllRepositories"
+        },
+        "name": {
+          "type": "string",
+          "x-go-name": "Name"
+        },
+        "permission": {
+          "type": "string",
+          "enum": [
+            "read",
+            "write",
+            "admin"
+          ],
+          "x-go-name": "Permission"
+        },
+        "units": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "Units",
+          "example": [
+            "repo.actions",
+            "repo.code",
+            "repo.issues",
+            "repo.ext_issues",
+            "repo.wiki",
+            "repo.ext_wiki",
+            "repo.pulls",
+            "repo.releases",
+            "repo.projects",
+            "repo.ext_wiki"
+          ]
+        },
+        "units_map": {
+          "type": "object",
+          "additionalProperties": {
+            "type": "string"
+          },
+          "x-go-name": "UnitsMap",
+          "example": "{\"repo.actions\",\"repo.packages\",\"repo.code\":\"read\",\"repo.issues\":\"write\",\"repo.ext_issues\":\"none\",\"repo.wiki\":\"admin\",\"repo.pulls\":\"owner\",\"repo.releases\":\"none\",\"repo.projects\":\"none\",\"repo.ext_wiki\":\"none\"}"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "CreateUserOption": {
+      "description": "CreateUserOption create user options",
+      "type": "object",
+      "required": [
+        "username",
+        "email"
+      ],
+      "properties": {
+        "created_at": {
+          "description": "For explicitly setting the user creation timestamp. Useful when users are\nmigrated from other systems. When omitted, the user's creation timestamp\nwill be set to \"now\".",
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Created"
+        },
+        "email": {
+          "type": "string",
+          "format": "email",
+          "x-go-name": "Email"
+        },
+        "full_name": {
+          "type": "string",
+          "x-go-name": "FullName"
+        },
+        "login_name": {
+          "type": "string",
+          "x-go-name": "LoginName"
+        },
+        "must_change_password": {
+          "type": "boolean",
+          "x-go-name": "MustChangePassword"
+        },
+        "password": {
+          "type": "string",
+          "x-go-name": "Password"
+        },
+        "restricted": {
+          "type": "boolean",
+          "x-go-name": "Restricted"
+        },
+        "send_notify": {
+          "type": "boolean",
+          "x-go-name": "SendNotify"
+        },
+        "source_id": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "SourceID"
+        },
+        "username": {
+          "type": "string",
+          "x-go-name": "Username"
+        },
+        "visibility": {
+          "type": "string",
+          "x-go-name": "Visibility"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "CreateVariableOption": {
+      "description": "CreateVariableOption the option when creating variable",
+      "type": "object",
+      "required": [
+        "value"
+      ],
+      "properties": {
+        "value": {
+          "description": "Value of the variable to create",
+          "type": "string",
+          "x-go-name": "Value"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "CreateWikiPageOptions": {
+      "description": "CreateWikiPageOptions form for creating wiki",
+      "type": "object",
+      "properties": {
+        "content_base64": {
+          "description": "content must be base64 encoded",
+          "type": "string",
+          "x-go-name": "ContentBase64"
+        },
+        "message": {
+          "description": "optional commit message summarizing the change",
+          "type": "string",
+          "x-go-name": "Message"
+        },
+        "title": {
+          "description": "page title. leave empty to keep unchanged",
+          "type": "string",
+          "x-go-name": "Title"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "Cron": {
+      "description": "Cron represents a Cron task",
+      "type": "object",
+      "properties": {
+        "exec_times": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "ExecTimes"
+        },
+        "name": {
+          "type": "string",
+          "x-go-name": "Name"
+        },
+        "next": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Next"
+        },
+        "prev": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Prev"
+        },
+        "schedule": {
+          "type": "string",
+          "x-go-name": "Schedule"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "DeleteEmailOption": {
+      "description": "DeleteEmailOption options when deleting email addresses",
+      "type": "object",
+      "properties": {
+        "emails": {
+          "description": "email addresses to delete",
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "Emails"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "DeleteFileOptions": {
+      "description": "DeleteFileOptions options for deleting files (used for other File structs below)\nNote: `author` and `committer` are optional (if only one is given, it will be used for the other, otherwise the authenticated user will be used)",
+      "type": "object",
+      "required": [
+        "sha"
+      ],
+      "properties": {
+        "author": {
+          "$ref": "#/definitions/Identity"
+        },
+        "branch": {
+          "description": "branch (optional) to base this file from. if not given, the default branch is used",
+          "type": "string",
+          "x-go-name": "BranchName"
+        },
+        "committer": {
+          "$ref": "#/definitions/Identity"
+        },
+        "dates": {
+          "$ref": "#/definitions/CommitDateOptions"
+        },
+        "message": {
+          "description": "message (optional) for the commit of this file. if not supplied, a default message will be used",
+          "type": "string",
+          "x-go-name": "Message"
+        },
+        "new_branch": {
+          "description": "new_branch (optional) will make a new branch from `branch` before creating the file",
+          "type": "string",
+          "x-go-name": "NewBranchName"
+        },
+        "sha": {
+          "description": "sha is the SHA for the file that already exists",
+          "type": "string",
+          "x-go-name": "SHA"
+        },
+        "signoff": {
+          "description": "Add a Signed-off-by trailer by the committer at the end of the commit log message.",
+          "type": "boolean",
+          "x-go-name": "Signoff"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "DeployKey": {
+      "description": "DeployKey a deploy key",
+      "type": "object",
+      "properties": {
+        "created_at": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Created"
+        },
+        "fingerprint": {
+          "type": "string",
+          "x-go-name": "Fingerprint"
+        },
+        "id": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "ID"
+        },
+        "key": {
+          "type": "string",
+          "x-go-name": "Key"
+        },
+        "key_id": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "KeyID"
+        },
+        "read_only": {
+          "type": "boolean",
+          "x-go-name": "ReadOnly"
+        },
+        "repository": {
+          "$ref": "#/definitions/Repository"
+        },
+        "title": {
+          "type": "string",
+          "x-go-name": "Title"
+        },
+        "url": {
+          "type": "string",
+          "x-go-name": "URL"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "DismissPullReviewOptions": {
+      "description": "DismissPullReviewOptions are options to dismiss a pull review",
+      "type": "object",
+      "properties": {
+        "message": {
+          "type": "string",
+          "x-go-name": "Message"
+        },
+        "priors": {
+          "type": "boolean",
+          "x-go-name": "Priors"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "EditAttachmentOptions": {
+      "description": "EditAttachmentOptions options for editing attachments",
+      "type": "object",
+      "properties": {
+        "name": {
+          "type": "string",
+          "x-go-name": "Name"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "EditBranchProtectionOption": {
+      "description": "EditBranchProtectionOption options for editing a branch protection",
+      "type": "object",
+      "properties": {
+        "approvals_whitelist_teams": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "ApprovalsWhitelistTeams"
+        },
+        "approvals_whitelist_username": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "ApprovalsWhitelistUsernames"
+        },
+        "block_on_official_review_requests": {
+          "type": "boolean",
+          "x-go-name": "BlockOnOfficialReviewRequests"
+        },
+        "block_on_outdated_branch": {
+          "type": "boolean",
+          "x-go-name": "BlockOnOutdatedBranch"
+        },
+        "block_on_rejected_reviews": {
+          "type": "boolean",
+          "x-go-name": "BlockOnRejectedReviews"
+        },
+        "dismiss_stale_approvals": {
+          "type": "boolean",
+          "x-go-name": "DismissStaleApprovals"
+        },
+        "enable_approvals_whitelist": {
+          "type": "boolean",
+          "x-go-name": "EnableApprovalsWhitelist"
+        },
+        "enable_merge_whitelist": {
+          "type": "boolean",
+          "x-go-name": "EnableMergeWhitelist"
+        },
+        "enable_push": {
+          "type": "boolean",
+          "x-go-name": "EnablePush"
+        },
+        "enable_push_whitelist": {
+          "type": "boolean",
+          "x-go-name": "EnablePushWhitelist"
+        },
+        "enable_status_check": {
+          "type": "boolean",
+          "x-go-name": "EnableStatusCheck"
+        },
+        "ignore_stale_approvals": {
+          "type": "boolean",
+          "x-go-name": "IgnoreStaleApprovals"
+        },
+        "merge_whitelist_teams": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "MergeWhitelistTeams"
+        },
+        "merge_whitelist_usernames": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "MergeWhitelistUsernames"
+        },
+        "protected_file_patterns": {
+          "type": "string",
+          "x-go-name": "ProtectedFilePatterns"
+        },
+        "push_whitelist_deploy_keys": {
+          "type": "boolean",
+          "x-go-name": "PushWhitelistDeployKeys"
+        },
+        "push_whitelist_teams": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "PushWhitelistTeams"
+        },
+        "push_whitelist_usernames": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "PushWhitelistUsernames"
+        },
+        "require_signed_commits": {
+          "type": "boolean",
+          "x-go-name": "RequireSignedCommits"
+        },
+        "required_approvals": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "RequiredApprovals"
+        },
+        "status_check_contexts": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "StatusCheckContexts"
+        },
+        "unprotected_file_patterns": {
+          "type": "string",
+          "x-go-name": "UnprotectedFilePatterns"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "EditDeadlineOption": {
+      "description": "EditDeadlineOption options for creating a deadline",
+      "type": "object",
+      "required": [
+        "due_date"
+      ],
+      "properties": {
+        "due_date": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Deadline"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "EditGitHookOption": {
+      "description": "EditGitHookOption options when modifying one Git hook",
+      "type": "object",
+      "properties": {
+        "content": {
+          "type": "string",
+          "x-go-name": "Content"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "EditHookOption": {
+      "description": "EditHookOption options when modify one hook",
+      "type": "object",
+      "properties": {
+        "active": {
+          "type": "boolean",
+          "x-go-name": "Active"
+        },
+        "authorization_header": {
+          "type": "string",
+          "x-go-name": "AuthorizationHeader"
+        },
+        "branch_filter": {
+          "type": "string",
+          "x-go-name": "BranchFilter"
+        },
+        "config": {
+          "type": "object",
+          "additionalProperties": {
+            "type": "string"
+          },
+          "x-go-name": "Config"
+        },
+        "events": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "Events"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "EditIssueCommentOption": {
+      "description": "EditIssueCommentOption options for editing a comment",
+      "type": "object",
+      "required": [
+        "body"
+      ],
+      "properties": {
+        "body": {
+          "type": "string",
+          "x-go-name": "Body"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "EditIssueOption": {
+      "description": "EditIssueOption options for editing an issue",
+      "type": "object",
+      "properties": {
+        "assignee": {
+          "description": "deprecated",
+          "type": "string",
+          "x-go-name": "Assignee"
+        },
+        "assignees": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "Assignees"
+        },
+        "body": {
+          "type": "string",
+          "x-go-name": "Body"
+        },
+        "due_date": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Deadline"
+        },
+        "milestone": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "Milestone"
+        },
+        "ref": {
+          "type": "string",
+          "x-go-name": "Ref"
+        },
+        "state": {
+          "type": "string",
+          "x-go-name": "State"
+        },
+        "title": {
+          "type": "string",
+          "x-go-name": "Title"
+        },
+        "unset_due_date": {
+          "type": "boolean",
+          "x-go-name": "RemoveDeadline"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "EditLabelOption": {
+      "description": "EditLabelOption options for editing a label",
+      "type": "object",
+      "properties": {
+        "color": {
+          "type": "string",
+          "x-go-name": "Color",
+          "example": "#00aabb"
+        },
+        "description": {
+          "type": "string",
+          "x-go-name": "Description"
+        },
+        "exclusive": {
+          "type": "boolean",
+          "x-go-name": "Exclusive",
+          "example": false
+        },
+        "is_archived": {
+          "type": "boolean",
+          "x-go-name": "IsArchived",
+          "example": false
+        },
+        "name": {
+          "type": "string",
+          "x-go-name": "Name"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "EditMilestoneOption": {
+      "description": "EditMilestoneOption options for editing a milestone",
+      "type": "object",
+      "properties": {
+        "description": {
+          "type": "string",
+          "x-go-name": "Description"
+        },
+        "due_on": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Deadline"
+        },
+        "state": {
+          "type": "string",
+          "x-go-name": "State"
+        },
+        "title": {
+          "type": "string",
+          "x-go-name": "Title"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "EditOrgOption": {
+      "description": "EditOrgOption options for editing an organization",
+      "type": "object",
+      "properties": {
+        "description": {
+          "type": "string",
+          "x-go-name": "Description"
+        },
+        "email": {
+          "type": "string",
+          "x-go-name": "Email"
+        },
+        "full_name": {
+          "type": "string",
+          "x-go-name": "FullName"
+        },
+        "location": {
+          "type": "string",
+          "x-go-name": "Location"
+        },
+        "repo_admin_change_team_access": {
+          "type": "boolean",
+          "x-go-name": "RepoAdminChangeTeamAccess"
+        },
+        "visibility": {
+          "description": "possible values are `public`, `limited` or `private`",
+          "type": "string",
+          "enum": [
+            "public",
+            "limited",
+            "private"
+          ],
+          "x-go-name": "Visibility"
+        },
+        "website": {
+          "type": "string",
+          "x-go-name": "Website"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "EditPullRequestOption": {
+      "description": "EditPullRequestOption options when modify pull request",
+      "type": "object",
+      "properties": {
+        "allow_maintainer_edit": {
+          "type": "boolean",
+          "x-go-name": "AllowMaintainerEdit"
+        },
+        "assignee": {
+          "type": "string",
+          "x-go-name": "Assignee"
+        },
+        "assignees": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "Assignees"
+        },
+        "base": {
+          "type": "string",
+          "x-go-name": "Base"
+        },
+        "body": {
+          "type": "string",
+          "x-go-name": "Body"
+        },
+        "due_date": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Deadline"
+        },
+        "labels": {
+          "type": "array",
+          "items": {
+            "type": "integer",
+            "format": "int64"
+          },
+          "x-go-name": "Labels"
+        },
+        "milestone": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "Milestone"
+        },
+        "state": {
+          "type": "string",
+          "x-go-name": "State"
+        },
+        "title": {
+          "type": "string",
+          "x-go-name": "Title"
+        },
+        "unset_due_date": {
+          "type": "boolean",
+          "x-go-name": "RemoveDeadline"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "EditReactionOption": {
+      "description": "EditReactionOption contain the reaction type",
+      "type": "object",
+      "properties": {
+        "content": {
+          "type": "string",
+          "x-go-name": "Reaction"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "EditReleaseOption": {
+      "description": "EditReleaseOption options when editing a release",
+      "type": "object",
+      "properties": {
+        "body": {
+          "type": "string",
+          "x-go-name": "Note"
+        },
+        "draft": {
+          "type": "boolean",
+          "x-go-name": "IsDraft"
+        },
+        "name": {
+          "type": "string",
+          "x-go-name": "Title"
+        },
+        "prerelease": {
+          "type": "boolean",
+          "x-go-name": "IsPrerelease"
+        },
+        "tag_name": {
+          "type": "string",
+          "x-go-name": "TagName"
+        },
+        "target_commitish": {
+          "type": "string",
+          "x-go-name": "Target"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "EditRepoOption": {
+      "description": "EditRepoOption options when editing a repository's properties",
+      "type": "object",
+      "properties": {
+        "allow_fast_forward_only_merge": {
+          "description": "either `true` to allow fast-forward-only merging pull requests, or `false` to prevent fast-forward-only merging.",
+          "type": "boolean",
+          "x-go-name": "AllowFastForwardOnly"
+        },
+        "allow_manual_merge": {
+          "description": "either `true` to allow mark pr as merged manually, or `false` to prevent it.",
+          "type": "boolean",
+          "x-go-name": "AllowManualMerge"
+        },
+        "allow_merge_commits": {
+          "description": "either `true` to allow merging pull requests with a merge commit, or `false` to prevent merging pull requests with merge commits.",
+          "type": "boolean",
+          "x-go-name": "AllowMerge"
+        },
+        "allow_rebase": {
+          "description": "either `true` to allow rebase-merging pull requests, or `false` to prevent rebase-merging.",
+          "type": "boolean",
+          "x-go-name": "AllowRebase"
+        },
+        "allow_rebase_explicit": {
+          "description": "either `true` to allow rebase with explicit merge commits (--no-ff), or `false` to prevent rebase with explicit merge commits.",
+          "type": "boolean",
+          "x-go-name": "AllowRebaseMerge"
+        },
+        "allow_rebase_update": {
+          "description": "either `true` to allow updating pull request branch by rebase, or `false` to prevent it.",
+          "type": "boolean",
+          "x-go-name": "AllowRebaseUpdate"
+        },
+        "allow_squash_merge": {
+          "description": "either `true` to allow squash-merging pull requests, or `false` to prevent squash-merging.",
+          "type": "boolean",
+          "x-go-name": "AllowSquash"
+        },
+        "archived": {
+          "description": "set to `true` to archive this repository.",
+          "type": "boolean",
+          "x-go-name": "Archived"
+        },
+        "autodetect_manual_merge": {
+          "description": "either `true` to enable AutodetectManualMerge, or `false` to prevent it. Note: In some special cases, misjudgments can occur.",
+          "type": "boolean",
+          "x-go-name": "AutodetectManualMerge"
+        },
+        "default_allow_maintainer_edit": {
+          "description": "set to `true` to allow edits from maintainers by default",
+          "type": "boolean",
+          "x-go-name": "DefaultAllowMaintainerEdit"
+        },
+        "default_branch": {
+          "description": "sets the default branch for this repository.",
+          "type": "string",
+          "x-go-name": "DefaultBranch"
+        },
+        "default_delete_branch_after_merge": {
+          "description": "set to `true` to delete pr branch after merge by default",
+          "type": "boolean",
+          "x-go-name": "DefaultDeleteBranchAfterMerge"
+        },
+        "default_merge_style": {
+          "description": "set to a merge style to be used by this repository: \"merge\", \"rebase\", \"rebase-merge\", \"squash\", or \"fast-forward-only\".",
+          "type": "string",
+          "x-go-name": "DefaultMergeStyle"
+        },
+        "description": {
+          "description": "a short description of the repository.",
+          "type": "string",
+          "x-go-name": "Description"
+        },
+        "enable_prune": {
+          "description": "enable prune - remove obsolete remote-tracking references when mirroring",
+          "type": "boolean",
+          "x-go-name": "EnablePrune"
+        },
+        "external_tracker": {
+          "$ref": "#/definitions/ExternalTracker"
+        },
+        "external_wiki": {
+          "$ref": "#/definitions/ExternalWiki"
+        },
+        "has_actions": {
+          "description": "either `true` to enable actions unit, or `false` to disable them.",
+          "type": "boolean",
+          "x-go-name": "HasActions"
+        },
+        "has_issues": {
+          "description": "either `true` to enable issues for this repository or `false` to disable them.",
+          "type": "boolean",
+          "x-go-name": "HasIssues"
+        },
+        "has_packages": {
+          "description": "either `true` to enable packages unit, or `false` to disable them.",
+          "type": "boolean",
+          "x-go-name": "HasPackages"
+        },
+        "has_projects": {
+          "description": "either `true` to enable project unit, or `false` to disable them.",
+          "type": "boolean",
+          "x-go-name": "HasProjects"
+        },
+        "has_pull_requests": {
+          "description": "either `true` to allow pull requests, or `false` to prevent pull request.",
+          "type": "boolean",
+          "x-go-name": "HasPullRequests"
+        },
+        "has_releases": {
+          "description": "either `true` to enable releases unit, or `false` to disable them.",
+          "type": "boolean",
+          "x-go-name": "HasReleases"
+        },
+        "has_wiki": {
+          "description": "either `true` to enable the wiki for this repository or `false` to disable it.",
+          "type": "boolean",
+          "x-go-name": "HasWiki"
+        },
+        "ignore_whitespace_conflicts": {
+          "description": "either `true` to ignore whitespace for conflicts, or `false` to not ignore whitespace.",
+          "type": "boolean",
+          "x-go-name": "IgnoreWhitespaceConflicts"
+        },
+        "internal_tracker": {
+          "$ref": "#/definitions/InternalTracker"
+        },
+        "mirror_interval": {
+          "description": "set to a string like `8h30m0s` to set the mirror interval time",
+          "type": "string",
+          "x-go-name": "MirrorInterval"
+        },
+        "name": {
+          "description": "name of the repository",
+          "type": "string",
+          "uniqueItems": true,
+          "x-go-name": "Name"
+        },
+        "private": {
+          "description": "either `true` to make the repository private or `false` to make it public.\nNote: you will get a 422 error if the organization restricts changing repository visibility to organization\nowners and a non-owner tries to change the value of private.",
+          "type": "boolean",
+          "x-go-name": "Private"
+        },
+        "projects_mode": {
+          "description": "`repo` to only allow repo-level projects, `owner` to only allow owner projects, `all` to allow both.",
+          "type": "string",
+          "x-go-name": "ProjectsMode"
+        },
+        "template": {
+          "description": "either `true` to make this repository a template or `false` to make it a normal repository",
+          "type": "boolean",
+          "x-go-name": "Template"
+        },
+        "website": {
+          "description": "a URL with more information about the repository.",
+          "type": "string",
+          "x-go-name": "Website"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "EditTeamOption": {
+      "description": "EditTeamOption options for editing a team",
+      "type": "object",
+      "required": [
+        "name"
+      ],
+      "properties": {
+        "can_create_org_repo": {
+          "type": "boolean",
+          "x-go-name": "CanCreateOrgRepo"
+        },
+        "description": {
+          "type": "string",
+          "x-go-name": "Description"
+        },
+        "includes_all_repositories": {
+          "type": "boolean",
+          "x-go-name": "IncludesAllRepositories"
+        },
+        "name": {
+          "type": "string",
+          "x-go-name": "Name"
+        },
+        "permission": {
+          "type": "string",
+          "enum": [
+            "read",
+            "write",
+            "admin"
+          ],
+          "x-go-name": "Permission"
+        },
+        "units": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "Units",
+          "example": [
+            "repo.code",
+            "repo.issues",
+            "repo.ext_issues",
+            "repo.wiki",
+            "repo.pulls",
+            "repo.releases",
+            "repo.projects",
+            "repo.ext_wiki"
+          ]
+        },
+        "units_map": {
+          "type": "object",
+          "additionalProperties": {
+            "type": "string"
+          },
+          "x-go-name": "UnitsMap",
+          "example": {
+            "repo.code": "read",
+            "repo.ext_issues": "none",
+            "repo.ext_wiki": "none",
+            "repo.issues": "write",
+            "repo.projects": "none",
+            "repo.pulls": "owner",
+            "repo.releases": "none",
+            "repo.wiki": "admin"
+          }
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "EditUserOption": {
+      "description": "EditUserOption edit user options",
+      "type": "object",
+      "required": [
+        "source_id",
+        "login_name"
+      ],
+      "properties": {
+        "active": {
+          "type": "boolean",
+          "x-go-name": "Active"
+        },
+        "admin": {
+          "type": "boolean",
+          "x-go-name": "Admin"
+        },
+        "allow_create_organization": {
+          "type": "boolean",
+          "x-go-name": "AllowCreateOrganization"
+        },
+        "allow_git_hook": {
+          "type": "boolean",
+          "x-go-name": "AllowGitHook"
+        },
+        "allow_import_local": {
+          "type": "boolean",
+          "x-go-name": "AllowImportLocal"
+        },
+        "description": {
+          "type": "string",
+          "x-go-name": "Description"
+        },
+        "email": {
+          "type": "string",
+          "format": "email",
+          "x-go-name": "Email"
+        },
+        "full_name": {
+          "type": "string",
+          "x-go-name": "FullName"
+        },
+        "location": {
+          "type": "string",
+          "x-go-name": "Location"
+        },
+        "login_name": {
+          "type": "string",
+          "x-go-name": "LoginName"
+        },
+        "max_repo_creation": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "MaxRepoCreation"
+        },
+        "must_change_password": {
+          "type": "boolean",
+          "x-go-name": "MustChangePassword"
+        },
+        "password": {
+          "type": "string",
+          "x-go-name": "Password"
+        },
+        "prohibit_login": {
+          "type": "boolean",
+          "x-go-name": "ProhibitLogin"
+        },
+        "restricted": {
+          "type": "boolean",
+          "x-go-name": "Restricted"
+        },
+        "source_id": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "SourceID"
+        },
+        "visibility": {
+          "type": "string",
+          "x-go-name": "Visibility"
+        },
+        "website": {
+          "type": "string",
+          "x-go-name": "Website"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "Email": {
+      "description": "Email an email address belonging to a user",
+      "type": "object",
+      "properties": {
+        "email": {
+          "type": "string",
+          "format": "email",
+          "x-go-name": "Email"
+        },
+        "primary": {
+          "type": "boolean",
+          "x-go-name": "Primary"
+        },
+        "user_id": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "UserID"
+        },
+        "username": {
+          "type": "string",
+          "x-go-name": "UserName"
+        },
+        "verified": {
+          "type": "boolean",
+          "x-go-name": "Verified"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "ExternalTracker": {
+      "description": "ExternalTracker represents settings for external tracker",
+      "type": "object",
+      "properties": {
+        "external_tracker_format": {
+          "description": "External Issue Tracker URL Format. Use the placeholders {user}, {repo} and {index} for the username, repository name and issue index.",
+          "type": "string",
+          "x-go-name": "ExternalTrackerFormat"
+        },
+        "external_tracker_regexp_pattern": {
+          "description": "External Issue Tracker issue regular expression",
+          "type": "string",
+          "x-go-name": "ExternalTrackerRegexpPattern"
+        },
+        "external_tracker_style": {
+          "description": "External Issue Tracker Number Format, either `numeric`, `alphanumeric`, or `regexp`",
+          "type": "string",
+          "x-go-name": "ExternalTrackerStyle"
+        },
+        "external_tracker_url": {
+          "description": "URL of external issue tracker.",
+          "type": "string",
+          "x-go-name": "ExternalTrackerURL"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "ExternalWiki": {
+      "description": "ExternalWiki represents setting for external wiki",
+      "type": "object",
+      "properties": {
+        "external_wiki_url": {
+          "description": "URL of external wiki.",
+          "type": "string",
+          "x-go-name": "ExternalWikiURL"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "FileCommitResponse": {
+      "type": "object",
+      "title": "FileCommitResponse contains information generated from a Git commit for a repo's file.",
+      "properties": {
+        "author": {
+          "$ref": "#/definitions/CommitUser"
+        },
+        "committer": {
+          "$ref": "#/definitions/CommitUser"
+        },
+        "created": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Created"
+        },
+        "html_url": {
+          "type": "string",
+          "x-go-name": "HTMLURL"
+        },
+        "message": {
+          "type": "string",
+          "x-go-name": "Message"
+        },
+        "parents": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/CommitMeta"
+          },
+          "x-go-name": "Parents"
+        },
+        "sha": {
+          "type": "string",
+          "x-go-name": "SHA"
+        },
+        "tree": {
+          "$ref": "#/definitions/CommitMeta"
+        },
+        "url": {
+          "type": "string",
+          "x-go-name": "URL"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "FileDeleteResponse": {
+      "description": "FileDeleteResponse contains information about a repo's file that was deleted",
+      "type": "object",
+      "properties": {
+        "commit": {
+          "$ref": "#/definitions/FileCommitResponse"
+        },
+        "content": {
+          "x-go-name": "Content"
+        },
+        "verification": {
+          "$ref": "#/definitions/PayloadCommitVerification"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "FileLinksResponse": {
+      "description": "FileLinksResponse contains the links for a repo's file",
+      "type": "object",
+      "properties": {
+        "git": {
+          "type": "string",
+          "x-go-name": "GitURL"
+        },
+        "html": {
+          "type": "string",
+          "x-go-name": "HTMLURL"
+        },
+        "self": {
+          "type": "string",
+          "x-go-name": "Self"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "FileResponse": {
+      "description": "FileResponse contains information about a repo's file",
+      "type": "object",
+      "properties": {
+        "commit": {
+          "$ref": "#/definitions/FileCommitResponse"
+        },
+        "content": {
+          "$ref": "#/definitions/ContentsResponse"
+        },
+        "verification": {
+          "$ref": "#/definitions/PayloadCommitVerification"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "FilesResponse": {
+      "description": "FilesResponse contains information about multiple files from a repo",
+      "type": "object",
+      "properties": {
+        "commit": {
+          "$ref": "#/definitions/FileCommitResponse"
+        },
+        "files": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/ContentsResponse"
+          },
+          "x-go-name": "Files"
+        },
+        "verification": {
+          "$ref": "#/definitions/PayloadCommitVerification"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "GPGKey": {
+      "description": "GPGKey a user GPG key to sign commit and tag in repository",
+      "type": "object",
+      "properties": {
+        "can_certify": {
+          "type": "boolean",
+          "x-go-name": "CanCertify"
+        },
+        "can_encrypt_comms": {
+          "type": "boolean",
+          "x-go-name": "CanEncryptComms"
+        },
+        "can_encrypt_storage": {
+          "type": "boolean",
+          "x-go-name": "CanEncryptStorage"
+        },
+        "can_sign": {
+          "type": "boolean",
+          "x-go-name": "CanSign"
+        },
+        "created_at": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Created"
+        },
+        "emails": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/GPGKeyEmail"
+          },
+          "x-go-name": "Emails"
+        },
+        "expires_at": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Expires"
+        },
+        "id": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "ID"
+        },
+        "key_id": {
+          "type": "string",
+          "x-go-name": "KeyID"
+        },
+        "primary_key_id": {
+          "type": "string",
+          "x-go-name": "PrimaryKeyID"
+        },
+        "public_key": {
+          "type": "string",
+          "x-go-name": "PublicKey"
+        },
+        "subkeys": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/GPGKey"
+          },
+          "x-go-name": "SubsKey"
+        },
+        "verified": {
+          "type": "boolean",
+          "x-go-name": "Verified"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "GPGKeyEmail": {
+      "description": "GPGKeyEmail an email attached to a GPGKey",
+      "type": "object",
+      "properties": {
+        "email": {
+          "type": "string",
+          "x-go-name": "Email"
+        },
+        "verified": {
+          "type": "boolean",
+          "x-go-name": "Verified"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "GeneralAPISettings": {
+      "description": "GeneralAPISettings contains global api settings exposed by it",
+      "type": "object",
+      "properties": {
+        "default_git_trees_per_page": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "DefaultGitTreesPerPage"
+        },
+        "default_max_blob_size": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "DefaultMaxBlobSize"
+        },
+        "default_paging_num": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "DefaultPagingNum"
+        },
+        "max_response_items": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "MaxResponseItems"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "GeneralAttachmentSettings": {
+      "description": "GeneralAttachmentSettings contains global Attachment settings exposed by API",
+      "type": "object",
+      "properties": {
+        "allowed_types": {
+          "type": "string",
+          "x-go-name": "AllowedTypes"
+        },
+        "enabled": {
+          "type": "boolean",
+          "x-go-name": "Enabled"
+        },
+        "max_files": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "MaxFiles"
+        },
+        "max_size": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "MaxSize"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "GeneralRepoSettings": {
+      "description": "GeneralRepoSettings contains global repository settings exposed by API",
+      "type": "object",
+      "properties": {
+        "http_git_disabled": {
+          "type": "boolean",
+          "x-go-name": "HTTPGitDisabled"
+        },
+        "lfs_disabled": {
+          "type": "boolean",
+          "x-go-name": "LFSDisabled"
+        },
+        "migrations_disabled": {
+          "type": "boolean",
+          "x-go-name": "MigrationsDisabled"
+        },
+        "mirrors_disabled": {
+          "type": "boolean",
+          "x-go-name": "MirrorsDisabled"
+        },
+        "stars_disabled": {
+          "type": "boolean",
+          "x-go-name": "StarsDisabled"
+        },
+        "time_tracking_disabled": {
+          "type": "boolean",
+          "x-go-name": "TimeTrackingDisabled"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "GeneralUISettings": {
+      "description": "GeneralUISettings contains global ui settings exposed by API",
+      "type": "object",
+      "properties": {
+        "allowed_reactions": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "AllowedReactions"
+        },
+        "custom_emojis": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "CustomEmojis"
+        },
+        "default_theme": {
+          "type": "string",
+          "x-go-name": "DefaultTheme"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "GenerateRepoOption": {
+      "description": "GenerateRepoOption options when creating repository using a template",
+      "type": "object",
+      "required": [
+        "owner",
+        "name"
+      ],
+      "properties": {
+        "avatar": {
+          "description": "include avatar of the template repo",
+          "type": "boolean",
+          "x-go-name": "Avatar"
+        },
+        "default_branch": {
+          "description": "Default branch of the new repository",
+          "type": "string",
+          "x-go-name": "DefaultBranch"
+        },
+        "description": {
+          "description": "Description of the repository to create",
+          "type": "string",
+          "x-go-name": "Description"
+        },
+        "git_content": {
+          "description": "include git content of default branch in template repo",
+          "type": "boolean",
+          "x-go-name": "GitContent"
+        },
+        "git_hooks": {
+          "description": "include git hooks in template repo",
+          "type": "boolean",
+          "x-go-name": "GitHooks"
+        },
+        "labels": {
+          "description": "include labels in template repo",
+          "type": "boolean",
+          "x-go-name": "Labels"
+        },
+        "name": {
+          "description": "Name of the repository to create",
+          "type": "string",
+          "uniqueItems": true,
+          "x-go-name": "Name"
+        },
+        "owner": {
+          "description": "The organization or person who will own the new repository",
+          "type": "string",
+          "x-go-name": "Owner"
+        },
+        "private": {
+          "description": "Whether the repository is private",
+          "type": "boolean",
+          "x-go-name": "Private"
+        },
+        "protected_branch": {
+          "description": "include protected branches in template repo",
+          "type": "boolean",
+          "x-go-name": "ProtectedBranch"
+        },
+        "topics": {
+          "description": "include topics in template repo",
+          "type": "boolean",
+          "x-go-name": "Topics"
+        },
+        "webhooks": {
+          "description": "include webhooks in template repo",
+          "type": "boolean",
+          "x-go-name": "Webhooks"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "GitBlobResponse": {
+      "description": "GitBlobResponse represents a git blob",
+      "type": "object",
+      "properties": {
+        "content": {
+          "type": "string",
+          "x-go-name": "Content"
+        },
+        "encoding": {
+          "type": "string",
+          "x-go-name": "Encoding"
+        },
+        "sha": {
+          "type": "string",
+          "x-go-name": "SHA"
+        },
+        "size": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "Size"
+        },
+        "url": {
+          "type": "string",
+          "x-go-name": "URL"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "GitEntry": {
+      "description": "GitEntry represents a git tree",
+      "type": "object",
+      "properties": {
+        "mode": {
+          "type": "string",
+          "x-go-name": "Mode"
+        },
+        "path": {
+          "type": "string",
+          "x-go-name": "Path"
+        },
+        "sha": {
+          "type": "string",
+          "x-go-name": "SHA"
+        },
+        "size": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "Size"
+        },
+        "type": {
+          "type": "string",
+          "x-go-name": "Type"
+        },
+        "url": {
+          "type": "string",
+          "x-go-name": "URL"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "GitHook": {
+      "description": "GitHook represents a Git repository hook",
+      "type": "object",
+      "properties": {
+        "content": {
+          "type": "string",
+          "x-go-name": "Content"
+        },
+        "is_active": {
+          "type": "boolean",
+          "x-go-name": "IsActive"
+        },
+        "name": {
+          "type": "string",
+          "x-go-name": "Name"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "GitObject": {
+      "type": "object",
+      "title": "GitObject represents a Git object.",
+      "properties": {
+        "sha": {
+          "type": "string",
+          "x-go-name": "SHA"
+        },
+        "type": {
+          "type": "string",
+          "x-go-name": "Type"
+        },
+        "url": {
+          "type": "string",
+          "x-go-name": "URL"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "GitTreeResponse": {
+      "description": "GitTreeResponse returns a git tree",
+      "type": "object",
+      "properties": {
+        "page": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "Page"
+        },
+        "sha": {
+          "type": "string",
+          "x-go-name": "SHA"
+        },
+        "total_count": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "TotalCount"
+        },
+        "tree": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/GitEntry"
+          },
+          "x-go-name": "Entries"
+        },
+        "truncated": {
+          "type": "boolean",
+          "x-go-name": "Truncated"
+        },
+        "url": {
+          "type": "string",
+          "x-go-name": "URL"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "GitignoreTemplateInfo": {
+      "description": "GitignoreTemplateInfo name and text of a gitignore template",
+      "type": "object",
+      "properties": {
+        "name": {
+          "type": "string",
+          "x-go-name": "Name"
+        },
+        "source": {
+          "type": "string",
+          "x-go-name": "Source"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "Hook": {
+      "description": "Hook a hook is a web hook when one repository changed",
+      "type": "object",
+      "properties": {
+        "active": {
+          "type": "boolean",
+          "x-go-name": "Active"
+        },
+        "authorization_header": {
+          "type": "string",
+          "x-go-name": "AuthorizationHeader"
+        },
+        "branch_filter": {
+          "type": "string",
+          "x-go-name": "BranchFilter"
+        },
+        "config": {
+          "type": "object",
+          "additionalProperties": {
+            "type": "string"
+          },
+          "x-go-name": "Config"
+        },
+        "created_at": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Created"
+        },
+        "events": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "Events"
+        },
+        "id": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "ID"
+        },
+        "type": {
+          "type": "string",
+          "x-go-name": "Type"
+        },
+        "updated_at": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Updated"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "Identity": {
+      "description": "Identity for a person's identity like an author or committer",
+      "type": "object",
+      "properties": {
+        "email": {
+          "type": "string",
+          "format": "email",
+          "x-go-name": "Email"
+        },
+        "name": {
+          "type": "string",
+          "x-go-name": "Name"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "InternalTracker": {
+      "description": "InternalTracker represents settings for internal tracker",
+      "type": "object",
+      "properties": {
+        "allow_only_contributors_to_track_time": {
+          "description": "Let only contributors track time (Built-in issue tracker)",
+          "type": "boolean",
+          "x-go-name": "AllowOnlyContributorsToTrackTime"
+        },
+        "enable_issue_dependencies": {
+          "description": "Enable dependencies for issues and pull requests (Built-in issue tracker)",
+          "type": "boolean",
+          "x-go-name": "EnableIssueDependencies"
+        },
+        "enable_time_tracker": {
+          "description": "Enable time tracking (Built-in issue tracker)",
+          "type": "boolean",
+          "x-go-name": "EnableTimeTracker"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "Issue": {
+      "description": "Issue represents an issue in a repository",
+      "type": "object",
+      "properties": {
+        "assets": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/Attachment"
+          },
+          "x-go-name": "Attachments"
+        },
+        "assignee": {
+          "$ref": "#/definitions/User"
+        },
+        "assignees": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/User"
+          },
+          "x-go-name": "Assignees"
+        },
+        "body": {
+          "type": "string",
+          "x-go-name": "Body"
+        },
+        "closed_at": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Closed"
+        },
+        "comments": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "Comments"
+        },
+        "created_at": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Created"
+        },
+        "due_date": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Deadline"
+        },
+        "html_url": {
+          "type": "string",
+          "x-go-name": "HTMLURL"
+        },
+        "id": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "ID"
+        },
+        "is_locked": {
+          "type": "boolean",
+          "x-go-name": "IsLocked"
+        },
+        "labels": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/Label"
+          },
+          "x-go-name": "Labels"
+        },
+        "milestone": {
+          "$ref": "#/definitions/Milestone"
+        },
+        "number": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "Index"
+        },
+        "original_author": {
+          "type": "string",
+          "x-go-name": "OriginalAuthor"
+        },
+        "original_author_id": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "OriginalAuthorID"
+        },
+        "pin_order": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "PinOrder"
+        },
+        "pull_request": {
+          "$ref": "#/definitions/PullRequestMeta"
+        },
+        "ref": {
+          "type": "string",
+          "x-go-name": "Ref"
+        },
+        "repository": {
+          "$ref": "#/definitions/RepositoryMeta"
+        },
+        "state": {
+          "$ref": "#/definitions/StateType"
+        },
+        "title": {
+          "type": "string",
+          "x-go-name": "Title"
+        },
+        "updated_at": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Updated"
+        },
+        "url": {
+          "type": "string",
+          "x-go-name": "URL"
+        },
+        "user": {
+          "$ref": "#/definitions/User"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "IssueConfig": {
+      "type": "object",
+      "properties": {
+        "blank_issues_enabled": {
+          "type": "boolean",
+          "x-go-name": "BlankIssuesEnabled"
+        },
+        "contact_links": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/IssueConfigContactLink"
+          },
+          "x-go-name": "ContactLinks"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "IssueConfigContactLink": {
+      "type": "object",
+      "properties": {
+        "about": {
+          "type": "string",
+          "x-go-name": "About"
+        },
+        "name": {
+          "type": "string",
+          "x-go-name": "Name"
+        },
+        "url": {
+          "type": "string",
+          "x-go-name": "URL"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "IssueConfigValidation": {
+      "type": "object",
+      "properties": {
+        "message": {
+          "type": "string",
+          "x-go-name": "Message"
+        },
+        "valid": {
+          "type": "boolean",
+          "x-go-name": "Valid"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "IssueDeadline": {
+      "description": "IssueDeadline represents an issue deadline",
+      "type": "object",
+      "properties": {
+        "due_date": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Deadline"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "IssueFormField": {
+      "description": "IssueFormField represents a form field",
+      "type": "object",
+      "properties": {
+        "attributes": {
+          "type": "object",
+          "additionalProperties": {},
+          "x-go-name": "Attributes"
+        },
+        "id": {
+          "type": "string",
+          "x-go-name": "ID"
+        },
+        "type": {
+          "$ref": "#/definitions/IssueFormFieldType"
+        },
+        "validations": {
+          "type": "object",
+          "additionalProperties": {},
+          "x-go-name": "Validations"
+        },
+        "visible": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/IssueFormFieldVisible"
+          },
+          "x-go-name": "Visible"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "IssueFormFieldType": {
+      "type": "string",
+      "title": "IssueFormFieldType defines issue form field type, can be \"markdown\", \"textarea\", \"input\", \"dropdown\" or \"checkboxes\"",
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "IssueFormFieldVisible": {
+      "description": "IssueFormFieldVisible defines issue form field visible",
+      "type": "string",
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "IssueLabelsOption": {
+      "description": "IssueLabelsOption a collection of labels",
+      "type": "object",
+      "properties": {
+        "labels": {
+          "description": "Labels can be a list of integers representing label IDs\nor a list of strings representing label names",
+          "type": "array",
+          "items": {},
+          "x-go-name": "Labels"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "IssueMeta": {
+      "description": "IssueMeta basic issue information",
+      "type": "object",
+      "properties": {
+        "index": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "Index"
+        },
+        "owner": {
+          "type": "string",
+          "x-go-name": "Owner"
+        },
+        "repo": {
+          "type": "string",
+          "x-go-name": "Name"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "IssueTemplate": {
+      "description": "IssueTemplate represents an issue template for a repository",
+      "type": "object",
+      "properties": {
+        "about": {
+          "type": "string",
+          "x-go-name": "About"
+        },
+        "body": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/IssueFormField"
+          },
+          "x-go-name": "Fields"
+        },
+        "content": {
+          "type": "string",
+          "x-go-name": "Content"
+        },
+        "file_name": {
+          "type": "string",
+          "x-go-name": "FileName"
+        },
+        "labels": {
+          "$ref": "#/definitions/IssueTemplateLabels"
+        },
+        "name": {
+          "type": "string",
+          "x-go-name": "Name"
+        },
+        "ref": {
+          "type": "string",
+          "x-go-name": "Ref"
+        },
+        "title": {
+          "type": "string",
+          "x-go-name": "Title"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "IssueTemplateLabels": {
+      "type": "array",
+      "items": {
+        "type": "string"
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "Label": {
+      "description": "Label a label to an issue or a pr",
+      "type": "object",
+      "properties": {
+        "color": {
+          "type": "string",
+          "x-go-name": "Color",
+          "example": "00aabb"
+        },
+        "description": {
+          "type": "string",
+          "x-go-name": "Description"
+        },
+        "exclusive": {
+          "type": "boolean",
+          "x-go-name": "Exclusive",
+          "example": false
+        },
+        "id": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "ID"
+        },
+        "is_archived": {
+          "type": "boolean",
+          "x-go-name": "IsArchived",
+          "example": false
+        },
+        "name": {
+          "type": "string",
+          "x-go-name": "Name"
+        },
+        "url": {
+          "type": "string",
+          "x-go-name": "URL"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "LabelTemplate": {
+      "description": "LabelTemplate info of a Label template",
+      "type": "object",
+      "properties": {
+        "color": {
+          "type": "string",
+          "x-go-name": "Color",
+          "example": "00aabb"
+        },
+        "description": {
+          "type": "string",
+          "x-go-name": "Description"
+        },
+        "exclusive": {
+          "type": "boolean",
+          "x-go-name": "Exclusive",
+          "example": false
+        },
+        "name": {
+          "type": "string",
+          "x-go-name": "Name"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "LicenseTemplateInfo": {
+      "description": "LicensesInfo contains information about a License",
+      "type": "object",
+      "properties": {
+        "body": {
+          "type": "string",
+          "x-go-name": "Body"
+        },
+        "implementation": {
+          "type": "string",
+          "x-go-name": "Implementation"
+        },
+        "key": {
+          "type": "string",
+          "x-go-name": "Key"
+        },
+        "name": {
+          "type": "string",
+          "x-go-name": "Name"
+        },
+        "url": {
+          "type": "string",
+          "x-go-name": "URL"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "LicensesTemplateListEntry": {
+      "description": "LicensesListEntry is used for the API",
+      "type": "object",
+      "properties": {
+        "key": {
+          "type": "string",
+          "x-go-name": "Key"
+        },
+        "name": {
+          "type": "string",
+          "x-go-name": "Name"
+        },
+        "url": {
+          "type": "string",
+          "x-go-name": "URL"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "MarkdownOption": {
+      "description": "MarkdownOption markdown options",
+      "type": "object",
+      "properties": {
+        "Context": {
+          "description": "Context to render\n\nin: body",
+          "type": "string"
+        },
+        "Mode": {
+          "description": "Mode to render (comment, gfm, markdown)\n\nin: body",
+          "type": "string"
+        },
+        "Text": {
+          "description": "Text markdown to render\n\nin: body",
+          "type": "string"
+        },
+        "Wiki": {
+          "description": "Is it a wiki page ?\n\nin: body",
+          "type": "boolean"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "MarkupOption": {
+      "description": "MarkupOption markup options",
+      "type": "object",
+      "properties": {
+        "Context": {
+          "description": "Context to render\n\nin: body",
+          "type": "string"
+        },
+        "FilePath": {
+          "description": "File path for detecting extension in file mode\n\nin: body",
+          "type": "string"
+        },
+        "Mode": {
+          "description": "Mode to render (comment, gfm, markdown, file)\n\nin: body",
+          "type": "string"
+        },
+        "Text": {
+          "description": "Text markup to render\n\nin: body",
+          "type": "string"
+        },
+        "Wiki": {
+          "description": "Is it a wiki page ?\n\nin: body",
+          "type": "boolean"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "MergePullRequestOption": {
+      "description": "MergePullRequestForm form for merging Pull Request",
+      "type": "object",
+      "required": [
+        "Do"
+      ],
+      "properties": {
+        "Do": {
+          "type": "string",
+          "enum": [
+            "merge",
+            "rebase",
+            "rebase-merge",
+            "squash",
+            "fast-forward-only",
+            "manually-merged"
+          ]
+        },
+        "MergeCommitID": {
+          "type": "string"
+        },
+        "MergeMessageField": {
+          "type": "string"
+        },
+        "MergeTitleField": {
+          "type": "string"
+        },
+        "delete_branch_after_merge": {
+          "type": "boolean",
+          "x-go-name": "DeleteBranchAfterMerge"
+        },
+        "force_merge": {
+          "type": "boolean",
+          "x-go-name": "ForceMerge"
+        },
+        "head_commit_id": {
+          "type": "string",
+          "x-go-name": "HeadCommitID"
+        },
+        "merge_when_checks_succeed": {
+          "type": "boolean",
+          "x-go-name": "MergeWhenChecksSucceed"
+        }
+      },
+      "x-go-name": "MergePullRequestForm",
+      "x-go-package": "code.gitea.io/gitea/services/forms"
+    },
+    "MigrateRepoOptions": {
+      "description": "MigrateRepoOptions options for migrating repository's\nthis is used to interact with api v1",
+      "type": "object",
+      "required": [
+        "clone_addr",
+        "repo_name"
+      ],
+      "properties": {
+        "auth_password": {
+          "type": "string",
+          "x-go-name": "AuthPassword"
+        },
+        "auth_token": {
+          "type": "string",
+          "x-go-name": "AuthToken"
+        },
+        "auth_username": {
+          "type": "string",
+          "x-go-name": "AuthUsername"
+        },
+        "clone_addr": {
+          "type": "string",
+          "x-go-name": "CloneAddr"
+        },
+        "description": {
+          "type": "string",
+          "x-go-name": "Description"
+        },
+        "issues": {
+          "type": "boolean",
+          "x-go-name": "Issues"
+        },
+        "labels": {
+          "type": "boolean",
+          "x-go-name": "Labels"
+        },
+        "lfs": {
+          "type": "boolean",
+          "x-go-name": "LFS"
+        },
+        "lfs_endpoint": {
+          "type": "string",
+          "x-go-name": "LFSEndpoint"
+        },
+        "milestones": {
+          "type": "boolean",
+          "x-go-name": "Milestones"
+        },
+        "mirror": {
+          "type": "boolean",
+          "x-go-name": "Mirror"
+        },
+        "mirror_interval": {
+          "type": "string",
+          "x-go-name": "MirrorInterval"
+        },
+        "private": {
+          "type": "boolean",
+          "x-go-name": "Private"
+        },
+        "pull_requests": {
+          "type": "boolean",
+          "x-go-name": "PullRequests"
+        },
+        "releases": {
+          "type": "boolean",
+          "x-go-name": "Releases"
+        },
+        "repo_name": {
+          "type": "string",
+          "x-go-name": "RepoName"
+        },
+        "repo_owner": {
+          "description": "Name of User or Organisation who will own Repo after migration",
+          "type": "string",
+          "x-go-name": "RepoOwner"
+        },
+        "service": {
+          "type": "string",
+          "enum": [
+            "git",
+            "github",
+            "gitea",
+            "gitlab",
+            "gogs",
+            "onedev",
+            "gitbucket",
+            "codebase"
+          ],
+          "x-go-name": "Service"
+        },
+        "uid": {
+          "description": "deprecated (only for backwards compatibility)",
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "RepoOwnerID"
+        },
+        "wiki": {
+          "type": "boolean",
+          "x-go-name": "Wiki"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "Milestone": {
+      "description": "Milestone milestone is a collection of issues on one repository",
+      "type": "object",
+      "properties": {
+        "closed_at": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Closed"
+        },
+        "closed_issues": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "ClosedIssues"
+        },
+        "created_at": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Created"
+        },
+        "description": {
+          "type": "string",
+          "x-go-name": "Description"
+        },
+        "due_on": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Deadline"
+        },
+        "id": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "ID"
+        },
+        "open_issues": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "OpenIssues"
+        },
+        "state": {
+          "$ref": "#/definitions/StateType"
+        },
+        "title": {
+          "type": "string",
+          "x-go-name": "Title"
+        },
+        "updated_at": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Updated"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "NewIssuePinsAllowed": {
+      "description": "NewIssuePinsAllowed represents an API response that says if new Issue Pins are allowed",
+      "type": "object",
+      "properties": {
+        "issues": {
+          "type": "boolean",
+          "x-go-name": "Issues"
+        },
+        "pull_requests": {
+          "type": "boolean",
+          "x-go-name": "PullRequests"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "NodeInfo": {
+      "description": "NodeInfo contains standardized way of exposing metadata about a server running one of the distributed social networks",
+      "type": "object",
+      "properties": {
+        "metadata": {
+          "type": "object",
+          "x-go-name": "Metadata"
+        },
+        "openRegistrations": {
+          "type": "boolean",
+          "x-go-name": "OpenRegistrations"
+        },
+        "protocols": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "Protocols"
+        },
+        "services": {
+          "$ref": "#/definitions/NodeInfoServices"
+        },
+        "software": {
+          "$ref": "#/definitions/NodeInfoSoftware"
+        },
+        "usage": {
+          "$ref": "#/definitions/NodeInfoUsage"
+        },
+        "version": {
+          "type": "string",
+          "x-go-name": "Version"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "NodeInfoServices": {
+      "description": "NodeInfoServices contains the third party sites this server can connect to via their application API",
+      "type": "object",
+      "properties": {
+        "inbound": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "Inbound"
+        },
+        "outbound": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "Outbound"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "NodeInfoSoftware": {
+      "description": "NodeInfoSoftware contains Metadata about server software in use",
+      "type": "object",
+      "properties": {
+        "homepage": {
+          "type": "string",
+          "x-go-name": "Homepage"
+        },
+        "name": {
+          "type": "string",
+          "x-go-name": "Name"
+        },
+        "repository": {
+          "type": "string",
+          "x-go-name": "Repository"
+        },
+        "version": {
+          "type": "string",
+          "x-go-name": "Version"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "NodeInfoUsage": {
+      "description": "NodeInfoUsage contains usage statistics for this server",
+      "type": "object",
+      "properties": {
+        "localComments": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "LocalComments"
+        },
+        "localPosts": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "LocalPosts"
+        },
+        "users": {
+          "$ref": "#/definitions/NodeInfoUsageUsers"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "NodeInfoUsageUsers": {
+      "description": "NodeInfoUsageUsers contains statistics about the users of this server",
+      "type": "object",
+      "properties": {
+        "activeHalfyear": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "ActiveHalfyear"
+        },
+        "activeMonth": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "ActiveMonth"
+        },
+        "total": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "Total"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "Note": {
+      "description": "Note contains information related to a git note",
+      "type": "object",
+      "properties": {
+        "commit": {
+          "$ref": "#/definitions/Commit"
+        },
+        "message": {
+          "type": "string",
+          "x-go-name": "Message"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "NotificationCount": {
+      "description": "NotificationCount number of unread notifications",
+      "type": "object",
+      "properties": {
+        "new": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "New"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "NotificationSubject": {
+      "description": "NotificationSubject contains the notification subject (Issue/Pull/Commit)",
+      "type": "object",
+      "properties": {
+        "html_url": {
+          "type": "string",
+          "x-go-name": "HTMLURL"
+        },
+        "latest_comment_html_url": {
+          "type": "string",
+          "x-go-name": "LatestCommentHTMLURL"
+        },
+        "latest_comment_url": {
+          "type": "string",
+          "x-go-name": "LatestCommentURL"
+        },
+        "state": {
+          "$ref": "#/definitions/StateType"
+        },
+        "title": {
+          "type": "string",
+          "x-go-name": "Title"
+        },
+        "type": {
+          "$ref": "#/definitions/NotifySubjectType"
+        },
+        "url": {
+          "type": "string",
+          "x-go-name": "URL"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "NotificationThread": {
+      "description": "NotificationThread expose Notification on API",
+      "type": "object",
+      "properties": {
+        "id": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "ID"
+        },
+        "pinned": {
+          "type": "boolean",
+          "x-go-name": "Pinned"
+        },
+        "repository": {
+          "$ref": "#/definitions/Repository"
+        },
+        "subject": {
+          "$ref": "#/definitions/NotificationSubject"
+        },
+        "unread": {
+          "type": "boolean",
+          "x-go-name": "Unread"
+        },
+        "updated_at": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "UpdatedAt"
+        },
+        "url": {
+          "type": "string",
+          "x-go-name": "URL"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "NotifySubjectType": {
+      "description": "NotifySubjectType represent type of notification subject",
+      "type": "string",
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "OAuth2Application": {
+      "type": "object",
+      "title": "OAuth2Application represents an OAuth2 application.",
+      "properties": {
+        "client_id": {
+          "type": "string",
+          "x-go-name": "ClientID"
+        },
+        "client_secret": {
+          "type": "string",
+          "x-go-name": "ClientSecret"
+        },
+        "confidential_client": {
+          "type": "boolean",
+          "x-go-name": "ConfidentialClient"
+        },
+        "created": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Created"
+        },
+        "id": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "ID"
+        },
+        "name": {
+          "type": "string",
+          "x-go-name": "Name"
+        },
+        "redirect_uris": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "RedirectURIs"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "Organization": {
+      "description": "Organization represents an organization",
+      "type": "object",
+      "properties": {
+        "avatar_url": {
+          "type": "string",
+          "x-go-name": "AvatarURL"
+        },
+        "description": {
+          "type": "string",
+          "x-go-name": "Description"
+        },
+        "email": {
+          "type": "string",
+          "x-go-name": "Email"
+        },
+        "full_name": {
+          "type": "string",
+          "x-go-name": "FullName"
+        },
+        "id": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "ID"
+        },
+        "location": {
+          "type": "string",
+          "x-go-name": "Location"
+        },
+        "name": {
+          "type": "string",
+          "x-go-name": "Name"
+        },
+        "repo_admin_change_team_access": {
+          "type": "boolean",
+          "x-go-name": "RepoAdminChangeTeamAccess"
+        },
+        "username": {
+          "description": "deprecated",
+          "type": "string",
+          "x-go-name": "UserName"
+        },
+        "visibility": {
+          "type": "string",
+          "x-go-name": "Visibility"
+        },
+        "website": {
+          "type": "string",
+          "x-go-name": "Website"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "OrganizationPermissions": {
+      "description": "OrganizationPermissions list different users permissions on an organization",
+      "type": "object",
+      "properties": {
+        "can_create_repository": {
+          "type": "boolean",
+          "x-go-name": "CanCreateRepository"
+        },
+        "can_read": {
+          "type": "boolean",
+          "x-go-name": "CanRead"
+        },
+        "can_write": {
+          "type": "boolean",
+          "x-go-name": "CanWrite"
+        },
+        "is_admin": {
+          "type": "boolean",
+          "x-go-name": "IsAdmin"
+        },
+        "is_owner": {
+          "type": "boolean",
+          "x-go-name": "IsOwner"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "PRBranchInfo": {
+      "description": "PRBranchInfo information about a branch",
+      "type": "object",
+      "properties": {
+        "label": {
+          "type": "string",
+          "x-go-name": "Name"
+        },
+        "ref": {
+          "type": "string",
+          "x-go-name": "Ref"
+        },
+        "repo": {
+          "$ref": "#/definitions/Repository"
+        },
+        "repo_id": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "RepoID"
+        },
+        "sha": {
+          "type": "string",
+          "x-go-name": "Sha"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "Package": {
+      "description": "Package represents a package",
+      "type": "object",
+      "properties": {
+        "created_at": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "CreatedAt"
+        },
+        "creator": {
+          "$ref": "#/definitions/User"
+        },
+        "html_url": {
+          "type": "string",
+          "x-go-name": "HTMLURL"
+        },
+        "id": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "ID"
+        },
+        "name": {
+          "type": "string",
+          "x-go-name": "Name"
+        },
+        "owner": {
+          "$ref": "#/definitions/User"
+        },
+        "repository": {
+          "$ref": "#/definitions/Repository"
+        },
+        "type": {
+          "type": "string",
+          "x-go-name": "Type"
+        },
+        "version": {
+          "type": "string",
+          "x-go-name": "Version"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "PackageFile": {
+      "description": "PackageFile represents a package file",
+      "type": "object",
+      "properties": {
+        "Size": {
+          "type": "integer",
+          "format": "int64"
+        },
+        "id": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "ID"
+        },
+        "md5": {
+          "type": "string",
+          "x-go-name": "HashMD5"
+        },
+        "name": {
+          "type": "string",
+          "x-go-name": "Name"
+        },
+        "sha1": {
+          "type": "string",
+          "x-go-name": "HashSHA1"
+        },
+        "sha256": {
+          "type": "string",
+          "x-go-name": "HashSHA256"
+        },
+        "sha512": {
+          "type": "string",
+          "x-go-name": "HashSHA512"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "PayloadCommit": {
+      "description": "PayloadCommit represents a commit",
+      "type": "object",
+      "properties": {
+        "added": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "Added"
+        },
+        "author": {
+          "$ref": "#/definitions/PayloadUser"
+        },
+        "committer": {
+          "$ref": "#/definitions/PayloadUser"
+        },
+        "id": {
+          "description": "sha1 hash of the commit",
+          "type": "string",
+          "x-go-name": "ID"
+        },
+        "message": {
+          "type": "string",
+          "x-go-name": "Message"
+        },
+        "modified": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "Modified"
+        },
+        "removed": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "Removed"
+        },
+        "timestamp": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Timestamp"
+        },
+        "url": {
+          "type": "string",
+          "x-go-name": "URL"
+        },
+        "verification": {
+          "$ref": "#/definitions/PayloadCommitVerification"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "PayloadCommitVerification": {
+      "description": "PayloadCommitVerification represents the GPG verification of a commit",
+      "type": "object",
+      "properties": {
+        "payload": {
+          "type": "string",
+          "x-go-name": "Payload"
+        },
+        "reason": {
+          "type": "string",
+          "x-go-name": "Reason"
+        },
+        "signature": {
+          "type": "string",
+          "x-go-name": "Signature"
+        },
+        "signer": {
+          "$ref": "#/definitions/PayloadUser"
+        },
+        "verified": {
+          "type": "boolean",
+          "x-go-name": "Verified"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "PayloadUser": {
+      "description": "PayloadUser represents the author or committer of a commit",
+      "type": "object",
+      "properties": {
+        "email": {
+          "type": "string",
+          "format": "email",
+          "x-go-name": "Email"
+        },
+        "name": {
+          "description": "Full name of the commit author",
+          "type": "string",
+          "x-go-name": "Name"
+        },
+        "username": {
+          "type": "string",
+          "x-go-name": "UserName"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "Permission": {
+      "description": "Permission represents a set of permissions",
+      "type": "object",
+      "properties": {
+        "admin": {
+          "type": "boolean",
+          "x-go-name": "Admin"
+        },
+        "pull": {
+          "type": "boolean",
+          "x-go-name": "Pull"
+        },
+        "push": {
+          "type": "boolean",
+          "x-go-name": "Push"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "PublicKey": {
+      "description": "PublicKey publickey is a user key to push code to repository",
+      "type": "object",
+      "properties": {
+        "created_at": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Created"
+        },
+        "fingerprint": {
+          "type": "string",
+          "x-go-name": "Fingerprint"
+        },
+        "id": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "ID"
+        },
+        "key": {
+          "type": "string",
+          "x-go-name": "Key"
+        },
+        "key_type": {
+          "type": "string",
+          "x-go-name": "KeyType"
+        },
+        "read_only": {
+          "type": "boolean",
+          "x-go-name": "ReadOnly"
+        },
+        "title": {
+          "type": "string",
+          "x-go-name": "Title"
+        },
+        "url": {
+          "type": "string",
+          "x-go-name": "URL"
+        },
+        "user": {
+          "$ref": "#/definitions/User"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "PullRequest": {
+      "description": "PullRequest represents a pull request",
+      "type": "object",
+      "properties": {
+        "additions": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "Additions"
+        },
+        "allow_maintainer_edit": {
+          "type": "boolean",
+          "x-go-name": "AllowMaintainerEdit"
+        },
+        "assignee": {
+          "$ref": "#/definitions/User"
+        },
+        "assignees": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/User"
+          },
+          "x-go-name": "Assignees"
+        },
+        "base": {
+          "$ref": "#/definitions/PRBranchInfo"
+        },
+        "body": {
+          "type": "string",
+          "x-go-name": "Body"
+        },
+        "changed_files": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "ChangedFiles"
+        },
+        "closed_at": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Closed"
+        },
+        "comments": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "Comments"
+        },
+        "created_at": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Created"
+        },
+        "deletions": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "Deletions"
+        },
+        "diff_url": {
+          "type": "string",
+          "x-go-name": "DiffURL"
+        },
+        "draft": {
+          "type": "boolean",
+          "x-go-name": "Draft"
+        },
+        "due_date": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Deadline"
+        },
+        "head": {
+          "$ref": "#/definitions/PRBranchInfo"
+        },
+        "html_url": {
+          "type": "string",
+          "x-go-name": "HTMLURL"
+        },
+        "id": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "ID"
+        },
+        "is_locked": {
+          "type": "boolean",
+          "x-go-name": "IsLocked"
+        },
+        "labels": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/Label"
+          },
+          "x-go-name": "Labels"
+        },
+        "merge_base": {
+          "type": "string",
+          "x-go-name": "MergeBase"
+        },
+        "merge_commit_sha": {
+          "type": "string",
+          "x-go-name": "MergedCommitID"
+        },
+        "mergeable": {
+          "type": "boolean",
+          "x-go-name": "Mergeable"
+        },
+        "merged": {
+          "type": "boolean",
+          "x-go-name": "HasMerged"
+        },
+        "merged_at": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Merged"
+        },
+        "merged_by": {
+          "$ref": "#/definitions/User"
+        },
+        "milestone": {
+          "$ref": "#/definitions/Milestone"
+        },
+        "number": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "Index"
+        },
+        "patch_url": {
+          "type": "string",
+          "x-go-name": "PatchURL"
+        },
+        "pin_order": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "PinOrder"
+        },
+        "requested_reviewers": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/User"
+          },
+          "x-go-name": "RequestedReviewers"
+        },
+        "review_comments": {
+          "description": "number of review comments made on the diff of a PR review (not including comments on commits or issues in a PR)",
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "ReviewComments"
+        },
+        "state": {
+          "$ref": "#/definitions/StateType"
+        },
+        "title": {
+          "type": "string",
+          "x-go-name": "Title"
+        },
+        "updated_at": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Updated"
+        },
+        "url": {
+          "type": "string",
+          "x-go-name": "URL"
+        },
+        "user": {
+          "$ref": "#/definitions/User"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "PullRequestMeta": {
+      "description": "PullRequestMeta PR info if an issue is a PR",
+      "type": "object",
+      "properties": {
+        "draft": {
+          "type": "boolean",
+          "x-go-name": "IsWorkInProgress"
+        },
+        "html_url": {
+          "type": "string",
+          "x-go-name": "HTMLURL"
+        },
+        "merged": {
+          "type": "boolean",
+          "x-go-name": "HasMerged"
+        },
+        "merged_at": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Merged"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "PullReview": {
+      "description": "PullReview represents a pull request review",
+      "type": "object",
+      "properties": {
+        "body": {
+          "type": "string",
+          "x-go-name": "Body"
+        },
+        "comments_count": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "CodeCommentsCount"
+        },
+        "commit_id": {
+          "type": "string",
+          "x-go-name": "CommitID"
+        },
+        "dismissed": {
+          "type": "boolean",
+          "x-go-name": "Dismissed"
+        },
+        "html_url": {
+          "type": "string",
+          "x-go-name": "HTMLURL"
+        },
+        "id": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "ID"
+        },
+        "official": {
+          "type": "boolean",
+          "x-go-name": "Official"
+        },
+        "pull_request_url": {
+          "type": "string",
+          "x-go-name": "HTMLPullURL"
+        },
+        "stale": {
+          "type": "boolean",
+          "x-go-name": "Stale"
+        },
+        "state": {
+          "$ref": "#/definitions/ReviewStateType"
+        },
+        "submitted_at": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Submitted"
+        },
+        "team": {
+          "$ref": "#/definitions/Team"
+        },
+        "updated_at": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Updated"
+        },
+        "user": {
+          "$ref": "#/definitions/User"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "PullReviewComment": {
+      "description": "PullReviewComment represents a comment on a pull request review",
+      "type": "object",
+      "properties": {
+        "body": {
+          "type": "string",
+          "x-go-name": "Body"
+        },
+        "commit_id": {
+          "type": "string",
+          "x-go-name": "CommitID"
+        },
+        "created_at": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Created"
+        },
+        "diff_hunk": {
+          "type": "string",
+          "x-go-name": "DiffHunk"
+        },
+        "html_url": {
+          "type": "string",
+          "x-go-name": "HTMLURL"
+        },
+        "id": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "ID"
+        },
+        "original_commit_id": {
+          "type": "string",
+          "x-go-name": "OrigCommitID"
+        },
+        "original_position": {
+          "type": "integer",
+          "format": "uint64",
+          "x-go-name": "OldLineNum"
+        },
+        "path": {
+          "type": "string",
+          "x-go-name": "Path"
+        },
+        "position": {
+          "type": "integer",
+          "format": "uint64",
+          "x-go-name": "LineNum"
+        },
+        "pull_request_review_id": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "ReviewID"
+        },
+        "pull_request_url": {
+          "type": "string",
+          "x-go-name": "HTMLPullURL"
+        },
+        "resolver": {
+          "$ref": "#/definitions/User"
+        },
+        "updated_at": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Updated"
+        },
+        "user": {
+          "$ref": "#/definitions/User"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "PullReviewRequestOptions": {
+      "description": "PullReviewRequestOptions are options to add or remove pull review requests",
+      "type": "object",
+      "properties": {
+        "reviewers": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "Reviewers"
+        },
+        "team_reviewers": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "TeamReviewers"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "PushMirror": {
+      "description": "PushMirror represents information of a push mirror",
+      "type": "object",
+      "properties": {
+        "created": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "CreatedUnix"
+        },
+        "interval": {
+          "type": "string",
+          "x-go-name": "Interval"
+        },
+        "last_error": {
+          "type": "string",
+          "x-go-name": "LastError"
+        },
+        "last_update": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "LastUpdateUnix"
+        },
+        "remote_address": {
+          "type": "string",
+          "x-go-name": "RemoteAddress"
+        },
+        "remote_name": {
+          "type": "string",
+          "x-go-name": "RemoteName"
+        },
+        "repo_name": {
+          "type": "string",
+          "x-go-name": "RepoName"
+        },
+        "sync_on_commit": {
+          "type": "boolean",
+          "x-go-name": "SyncOnCommit"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "Reaction": {
+      "description": "Reaction contain one reaction",
+      "type": "object",
+      "properties": {
+        "content": {
+          "type": "string",
+          "x-go-name": "Reaction"
+        },
+        "created_at": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Created"
+        },
+        "user": {
+          "$ref": "#/definitions/User"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "Reference": {
+      "type": "object",
+      "title": "Reference represents a Git reference.",
+      "properties": {
+        "object": {
+          "$ref": "#/definitions/GitObject"
+        },
+        "ref": {
+          "type": "string",
+          "x-go-name": "Ref"
+        },
+        "url": {
+          "type": "string",
+          "x-go-name": "URL"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "Release": {
+      "description": "Release represents a repository release",
+      "type": "object",
+      "properties": {
+        "assets": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/Attachment"
+          },
+          "x-go-name": "Attachments"
+        },
+        "author": {
+          "$ref": "#/definitions/User"
+        },
+        "body": {
+          "type": "string",
+          "x-go-name": "Note"
+        },
+        "created_at": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "CreatedAt"
+        },
+        "draft": {
+          "type": "boolean",
+          "x-go-name": "IsDraft"
+        },
+        "html_url": {
+          "type": "string",
+          "x-go-name": "HTMLURL"
+        },
+        "id": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "ID"
+        },
+        "name": {
+          "type": "string",
+          "x-go-name": "Title"
+        },
+        "prerelease": {
+          "type": "boolean",
+          "x-go-name": "IsPrerelease"
+        },
+        "published_at": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "PublishedAt"
+        },
+        "tag_name": {
+          "type": "string",
+          "x-go-name": "TagName"
+        },
+        "tarball_url": {
+          "type": "string",
+          "x-go-name": "TarURL"
+        },
+        "target_commitish": {
+          "type": "string",
+          "x-go-name": "Target"
+        },
+        "upload_url": {
+          "type": "string",
+          "x-go-name": "UploadURL"
+        },
+        "url": {
+          "type": "string",
+          "x-go-name": "URL"
+        },
+        "zipball_url": {
+          "type": "string",
+          "x-go-name": "ZipURL"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "RenameUserOption": {
+      "description": "RenameUserOption options when renaming a user",
+      "type": "object",
+      "required": [
+        "new_username"
+      ],
+      "properties": {
+        "new_username": {
+          "description": "New username for this user. This name cannot be in use yet by any other user.",
+          "type": "string",
+          "uniqueItems": true,
+          "x-go-name": "NewName"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "RepoCollaboratorPermission": {
+      "description": "RepoCollaboratorPermission to get repository permission for a collaborator",
+      "type": "object",
+      "properties": {
+        "permission": {
+          "type": "string",
+          "x-go-name": "Permission"
+        },
+        "role_name": {
+          "type": "string",
+          "x-go-name": "RoleName"
+        },
+        "user": {
+          "$ref": "#/definitions/User"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "RepoCommit": {
+      "type": "object",
+      "title": "RepoCommit contains information of a commit in the context of a repository.",
+      "properties": {
+        "author": {
+          "$ref": "#/definitions/CommitUser"
+        },
+        "committer": {
+          "$ref": "#/definitions/CommitUser"
+        },
+        "message": {
+          "type": "string",
+          "x-go-name": "Message"
+        },
+        "tree": {
+          "$ref": "#/definitions/CommitMeta"
+        },
+        "url": {
+          "type": "string",
+          "x-go-name": "URL"
+        },
+        "verification": {
+          "$ref": "#/definitions/PayloadCommitVerification"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "RepoTopicOptions": {
+      "description": "RepoTopicOptions a collection of repo topic names",
+      "type": "object",
+      "properties": {
+        "topics": {
+          "description": "list of topic names",
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "Topics"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "RepoTransfer": {
+      "description": "RepoTransfer represents a pending repo transfer",
+      "type": "object",
+      "properties": {
+        "doer": {
+          "$ref": "#/definitions/User"
+        },
+        "recipient": {
+          "$ref": "#/definitions/User"
+        },
+        "teams": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/Team"
+          },
+          "x-go-name": "Teams"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "Repository": {
+      "description": "Repository represents a repository",
+      "type": "object",
+      "properties": {
+        "allow_fast_forward_only_merge": {
+          "type": "boolean",
+          "x-go-name": "AllowFastForwardOnly"
+        },
+        "allow_merge_commits": {
+          "type": "boolean",
+          "x-go-name": "AllowMerge"
+        },
+        "allow_rebase": {
+          "type": "boolean",
+          "x-go-name": "AllowRebase"
+        },
+        "allow_rebase_explicit": {
+          "type": "boolean",
+          "x-go-name": "AllowRebaseMerge"
+        },
+        "allow_rebase_update": {
+          "type": "boolean",
+          "x-go-name": "AllowRebaseUpdate"
+        },
+        "allow_squash_merge": {
+          "type": "boolean",
+          "x-go-name": "AllowSquash"
+        },
+        "archived": {
+          "type": "boolean",
+          "x-go-name": "Archived"
+        },
+        "archived_at": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "ArchivedAt"
+        },
+        "avatar_url": {
+          "type": "string",
+          "x-go-name": "AvatarURL"
+        },
+        "clone_url": {
+          "type": "string",
+          "x-go-name": "CloneURL"
+        },
+        "created_at": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Created"
+        },
+        "default_allow_maintainer_edit": {
+          "type": "boolean",
+          "x-go-name": "DefaultAllowMaintainerEdit"
+        },
+        "default_branch": {
+          "type": "string",
+          "x-go-name": "DefaultBranch"
+        },
+        "default_delete_branch_after_merge": {
+          "type": "boolean",
+          "x-go-name": "DefaultDeleteBranchAfterMerge"
+        },
+        "default_merge_style": {
+          "type": "string",
+          "x-go-name": "DefaultMergeStyle"
+        },
+        "description": {
+          "type": "string",
+          "x-go-name": "Description"
+        },
+        "empty": {
+          "type": "boolean",
+          "x-go-name": "Empty"
+        },
+        "external_tracker": {
+          "$ref": "#/definitions/ExternalTracker"
+        },
+        "external_wiki": {
+          "$ref": "#/definitions/ExternalWiki"
+        },
+        "fork": {
+          "type": "boolean",
+          "x-go-name": "Fork"
+        },
+        "forks_count": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "Forks"
+        },
+        "full_name": {
+          "type": "string",
+          "x-go-name": "FullName"
+        },
+        "has_actions": {
+          "type": "boolean",
+          "x-go-name": "HasActions"
+        },
+        "has_issues": {
+          "type": "boolean",
+          "x-go-name": "HasIssues"
+        },
+        "has_packages": {
+          "type": "boolean",
+          "x-go-name": "HasPackages"
+        },
+        "has_projects": {
+          "type": "boolean",
+          "x-go-name": "HasProjects"
+        },
+        "has_pull_requests": {
+          "type": "boolean",
+          "x-go-name": "HasPullRequests"
+        },
+        "has_releases": {
+          "type": "boolean",
+          "x-go-name": "HasReleases"
+        },
+        "has_wiki": {
+          "type": "boolean",
+          "x-go-name": "HasWiki"
+        },
+        "html_url": {
+          "type": "string",
+          "x-go-name": "HTMLURL"
+        },
+        "id": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "ID"
+        },
+        "ignore_whitespace_conflicts": {
+          "type": "boolean",
+          "x-go-name": "IgnoreWhitespaceConflicts"
+        },
+        "internal": {
+          "type": "boolean",
+          "x-go-name": "Internal"
+        },
+        "internal_tracker": {
+          "$ref": "#/definitions/InternalTracker"
+        },
+        "language": {
+          "type": "string",
+          "x-go-name": "Language"
+        },
+        "languages_url": {
+          "type": "string",
+          "x-go-name": "LanguagesURL"
+        },
+        "link": {
+          "type": "string",
+          "x-go-name": "Link"
+        },
+        "mirror": {
+          "type": "boolean",
+          "x-go-name": "Mirror"
+        },
+        "mirror_interval": {
+          "type": "string",
+          "x-go-name": "MirrorInterval"
+        },
+        "mirror_updated": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "MirrorUpdated"
+        },
+        "name": {
+          "type": "string",
+          "x-go-name": "Name"
+        },
+        "object_format_name": {
+          "description": "ObjectFormatName of the underlying git repository",
+          "type": "string",
+          "enum": [
+            "sha1",
+            "sha256"
+          ],
+          "x-go-name": "ObjectFormatName"
+        },
+        "open_issues_count": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "OpenIssues"
+        },
+        "open_pr_counter": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "OpenPulls"
+        },
+        "original_url": {
+          "type": "string",
+          "x-go-name": "OriginalURL"
+        },
+        "owner": {
+          "$ref": "#/definitions/User"
+        },
+        "parent": {
+          "$ref": "#/definitions/Repository"
+        },
+        "permissions": {
+          "$ref": "#/definitions/Permission"
+        },
+        "private": {
+          "type": "boolean",
+          "x-go-name": "Private"
+        },
+        "projects_mode": {
+          "type": "string",
+          "x-go-name": "ProjectsMode"
+        },
+        "release_counter": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "Releases"
+        },
+        "repo_transfer": {
+          "$ref": "#/definitions/RepoTransfer"
+        },
+        "size": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "Size"
+        },
+        "ssh_url": {
+          "type": "string",
+          "x-go-name": "SSHURL"
+        },
+        "stars_count": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "Stars"
+        },
+        "template": {
+          "type": "boolean",
+          "x-go-name": "Template"
+        },
+        "updated_at": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Updated"
+        },
+        "url": {
+          "type": "string",
+          "x-go-name": "URL"
+        },
+        "watchers_count": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "Watchers"
+        },
+        "website": {
+          "type": "string",
+          "x-go-name": "Website"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "RepositoryMeta": {
+      "description": "RepositoryMeta basic repository information",
+      "type": "object",
+      "properties": {
+        "full_name": {
+          "type": "string",
+          "x-go-name": "FullName"
+        },
+        "id": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "ID"
+        },
+        "name": {
+          "type": "string",
+          "x-go-name": "Name"
+        },
+        "owner": {
+          "type": "string",
+          "x-go-name": "Owner"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "ReviewStateType": {
+      "description": "ReviewStateType review state type",
+      "type": "string",
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "SearchResults": {
+      "description": "SearchResults results of a successful search",
+      "type": "object",
+      "properties": {
+        "data": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/Repository"
+          },
+          "x-go-name": "Data"
+        },
+        "ok": {
+          "type": "boolean",
+          "x-go-name": "OK"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "Secret": {
+      "description": "Secret represents a secret",
+      "type": "object",
+      "properties": {
+        "created_at": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Created"
+        },
+        "name": {
+          "description": "the secret's name",
+          "type": "string",
+          "x-go-name": "Name"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "ServerVersion": {
+      "description": "ServerVersion wraps the version of the server",
+      "type": "object",
+      "properties": {
+        "version": {
+          "type": "string",
+          "x-go-name": "Version"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "StateType": {
+      "description": "StateType issue state type",
+      "type": "string",
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "StopWatch": {
+      "description": "StopWatch represent a running stopwatch",
+      "type": "object",
+      "properties": {
+        "created": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Created"
+        },
+        "duration": {
+          "type": "string",
+          "x-go-name": "Duration"
+        },
+        "issue_index": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "IssueIndex"
+        },
+        "issue_title": {
+          "type": "string",
+          "x-go-name": "IssueTitle"
+        },
+        "repo_name": {
+          "type": "string",
+          "x-go-name": "RepoName"
+        },
+        "repo_owner_name": {
+          "type": "string",
+          "x-go-name": "RepoOwnerName"
+        },
+        "seconds": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "Seconds"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "SubmitPullReviewOptions": {
+      "description": "SubmitPullReviewOptions are options to submit a pending pull review",
+      "type": "object",
+      "properties": {
+        "body": {
+          "type": "string",
+          "x-go-name": "Body"
+        },
+        "event": {
+          "$ref": "#/definitions/ReviewStateType"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "Tag": {
+      "description": "Tag represents a repository tag",
+      "type": "object",
+      "properties": {
+        "commit": {
+          "$ref": "#/definitions/CommitMeta"
+        },
+        "id": {
+          "type": "string",
+          "x-go-name": "ID"
+        },
+        "message": {
+          "type": "string",
+          "x-go-name": "Message"
+        },
+        "name": {
+          "type": "string",
+          "x-go-name": "Name"
+        },
+        "tarball_url": {
+          "type": "string",
+          "x-go-name": "TarballURL"
+        },
+        "zipball_url": {
+          "type": "string",
+          "x-go-name": "ZipballURL"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "Team": {
+      "description": "Team represents a team in an organization",
+      "type": "object",
+      "properties": {
+        "can_create_org_repo": {
+          "type": "boolean",
+          "x-go-name": "CanCreateOrgRepo"
+        },
+        "description": {
+          "type": "string",
+          "x-go-name": "Description"
+        },
+        "id": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "ID"
+        },
+        "includes_all_repositories": {
+          "type": "boolean",
+          "x-go-name": "IncludesAllRepositories"
+        },
+        "name": {
+          "type": "string",
+          "x-go-name": "Name"
+        },
+        "organization": {
+          "$ref": "#/definitions/Organization"
+        },
+        "permission": {
+          "type": "string",
+          "enum": [
+            "none",
+            "read",
+            "write",
+            "admin",
+            "owner"
+          ],
+          "x-go-name": "Permission"
+        },
+        "units": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "Units",
+          "example": [
+            "repo.code",
+            "repo.issues",
+            "repo.ext_issues",
+            "repo.wiki",
+            "repo.pulls",
+            "repo.releases",
+            "repo.projects",
+            "repo.ext_wiki"
+          ]
+        },
+        "units_map": {
+          "type": "object",
+          "additionalProperties": {
+            "type": "string"
+          },
+          "x-go-name": "UnitsMap",
+          "example": {
+            "repo.code": "read",
+            "repo.ext_issues": "none",
+            "repo.ext_wiki": "none",
+            "repo.issues": "write",
+            "repo.projects": "none",
+            "repo.pulls": "owner",
+            "repo.releases": "none",
+            "repo.wiki": "admin"
+          }
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "TimeStamp": {
+      "description": "TimeStamp defines a timestamp",
+      "type": "integer",
+      "format": "int64",
+      "x-go-package": "code.gitea.io/gitea/modules/timeutil"
+    },
+    "TimelineComment": {
+      "description": "TimelineComment represents a timeline comment (comment of any type) on a commit or issue",
+      "type": "object",
+      "properties": {
+        "assignee": {
+          "$ref": "#/definitions/User"
+        },
+        "assignee_team": {
+          "$ref": "#/definitions/Team"
+        },
+        "body": {
+          "type": "string",
+          "x-go-name": "Body"
+        },
+        "created_at": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Created"
+        },
+        "dependent_issue": {
+          "$ref": "#/definitions/Issue"
+        },
+        "html_url": {
+          "type": "string",
+          "x-go-name": "HTMLURL"
+        },
+        "id": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "ID"
+        },
+        "issue_url": {
+          "type": "string",
+          "x-go-name": "IssueURL"
+        },
+        "label": {
+          "$ref": "#/definitions/Label"
+        },
+        "milestone": {
+          "$ref": "#/definitions/Milestone"
+        },
+        "new_ref": {
+          "type": "string",
+          "x-go-name": "NewRef"
+        },
+        "new_title": {
+          "type": "string",
+          "x-go-name": "NewTitle"
+        },
+        "old_milestone": {
+          "$ref": "#/definitions/Milestone"
+        },
+        "old_project_id": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "OldProjectID"
+        },
+        "old_ref": {
+          "type": "string",
+          "x-go-name": "OldRef"
+        },
+        "old_title": {
+          "type": "string",
+          "x-go-name": "OldTitle"
+        },
+        "project_id": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "ProjectID"
+        },
+        "pull_request_url": {
+          "type": "string",
+          "x-go-name": "PRURL"
+        },
+        "ref_action": {
+          "type": "string",
+          "x-go-name": "RefAction"
+        },
+        "ref_comment": {
+          "$ref": "#/definitions/Comment"
+        },
+        "ref_commit_sha": {
+          "description": "commit SHA where issue/PR was referenced",
+          "type": "string",
+          "x-go-name": "RefCommitSHA"
+        },
+        "ref_issue": {
+          "$ref": "#/definitions/Issue"
+        },
+        "removed_assignee": {
+          "description": "whether the assignees were removed or added",
+          "type": "boolean",
+          "x-go-name": "RemovedAssignee"
+        },
+        "resolve_doer": {
+          "$ref": "#/definitions/User"
+        },
+        "review_id": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "ReviewID"
+        },
+        "tracked_time": {
+          "$ref": "#/definitions/TrackedTime"
+        },
+        "type": {
+          "type": "string",
+          "x-go-name": "Type"
+        },
+        "updated_at": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Updated"
+        },
+        "user": {
+          "$ref": "#/definitions/User"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "TopicName": {
+      "description": "TopicName a list of repo topic names",
+      "type": "object",
+      "properties": {
+        "topics": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "TopicNames"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "TopicResponse": {
+      "description": "TopicResponse for returning topics",
+      "type": "object",
+      "properties": {
+        "created": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Created"
+        },
+        "id": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "ID"
+        },
+        "repo_count": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "RepoCount"
+        },
+        "topic_name": {
+          "type": "string",
+          "x-go-name": "Name"
+        },
+        "updated": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Updated"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "TrackedTime": {
+      "description": "TrackedTime worked time for an issue / pr",
+      "type": "object",
+      "properties": {
+        "created": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Created"
+        },
+        "id": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "ID"
+        },
+        "issue": {
+          "$ref": "#/definitions/Issue"
+        },
+        "issue_id": {
+          "description": "deprecated (only for backwards compatibility)",
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "IssueID"
+        },
+        "time": {
+          "description": "Time in seconds",
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "Time"
+        },
+        "user_id": {
+          "description": "deprecated (only for backwards compatibility)",
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "UserID"
+        },
+        "user_name": {
+          "type": "string",
+          "x-go-name": "UserName"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "TransferRepoOption": {
+      "description": "TransferRepoOption options when transfer a repository's ownership",
+      "type": "object",
+      "required": [
+        "new_owner"
+      ],
+      "properties": {
+        "new_owner": {
+          "type": "string",
+          "x-go-name": "NewOwner"
+        },
+        "team_ids": {
+          "description": "ID of the team or teams to add to the repository. Teams can only be added to organization-owned repositories.",
+          "type": "array",
+          "items": {
+            "type": "integer",
+            "format": "int64"
+          },
+          "x-go-name": "TeamIDs"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "UpdateFileOptions": {
+      "description": "UpdateFileOptions options for updating files\nNote: `author` and `committer` are optional (if only one is given, it will be used for the other, otherwise the authenticated user will be used)",
+      "type": "object",
+      "required": [
+        "sha",
+        "content"
+      ],
+      "properties": {
+        "author": {
+          "$ref": "#/definitions/Identity"
+        },
+        "branch": {
+          "description": "branch (optional) to base this file from. if not given, the default branch is used",
+          "type": "string",
+          "x-go-name": "BranchName"
+        },
+        "committer": {
+          "$ref": "#/definitions/Identity"
+        },
+        "content": {
+          "description": "content must be base64 encoded",
+          "type": "string",
+          "x-go-name": "ContentBase64"
+        },
+        "dates": {
+          "$ref": "#/definitions/CommitDateOptions"
+        },
+        "from_path": {
+          "description": "from_path (optional) is the path of the original file which will be moved/renamed to the path in the URL",
+          "type": "string",
+          "x-go-name": "FromPath"
+        },
+        "message": {
+          "description": "message (optional) for the commit of this file. if not supplied, a default message will be used",
+          "type": "string",
+          "x-go-name": "Message"
+        },
+        "new_branch": {
+          "description": "new_branch (optional) will make a new branch from `branch` before creating the file",
+          "type": "string",
+          "x-go-name": "NewBranchName"
+        },
+        "sha": {
+          "description": "sha is the SHA for the file that already exists",
+          "type": "string",
+          "x-go-name": "SHA"
+        },
+        "signoff": {
+          "description": "Add a Signed-off-by trailer by the committer at the end of the commit log message.",
+          "type": "boolean",
+          "x-go-name": "Signoff"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "UpdateRepoAvatarOption": {
+      "description": "UpdateRepoAvatarUserOption options when updating the repo avatar",
+      "type": "object",
+      "properties": {
+        "image": {
+          "description": "image must be base64 encoded",
+          "type": "string",
+          "x-go-name": "Image"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "UpdateUserAvatarOption": {
+      "description": "UpdateUserAvatarUserOption options when updating the user avatar",
+      "type": "object",
+      "properties": {
+        "image": {
+          "description": "image must be base64 encoded",
+          "type": "string",
+          "x-go-name": "Image"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "UpdateVariableOption": {
+      "description": "UpdateVariableOption the option when updating variable",
+      "type": "object",
+      "required": [
+        "value"
+      ],
+      "properties": {
+        "name": {
+          "description": "New name for the variable. If the field is empty, the variable name won't be updated.",
+          "type": "string",
+          "x-go-name": "Name"
+        },
+        "value": {
+          "description": "Value of the variable to update",
+          "type": "string",
+          "x-go-name": "Value"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "User": {
+      "description": "User represents a user",
+      "type": "object",
+      "properties": {
+        "active": {
+          "description": "Is user active",
+          "type": "boolean",
+          "x-go-name": "IsActive"
+        },
+        "avatar_url": {
+          "description": "URL to the user's avatar",
+          "type": "string",
+          "x-go-name": "AvatarURL"
+        },
+        "created": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "Created"
+        },
+        "description": {
+          "description": "the user's description",
+          "type": "string",
+          "x-go-name": "Description"
+        },
+        "email": {
+          "type": "string",
+          "format": "email",
+          "x-go-name": "Email"
+        },
+        "followers_count": {
+          "description": "user counts",
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "Followers"
+        },
+        "following_count": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "Following"
+        },
+        "full_name": {
+          "description": "the user's full name",
+          "type": "string",
+          "x-go-name": "FullName"
+        },
+        "html_url": {
+          "description": "URL to the user's gitea page",
+          "type": "string",
+          "x-go-name": "HTMLURL"
+        },
+        "id": {
+          "description": "the user's id",
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "ID"
+        },
+        "is_admin": {
+          "description": "Is the user an administrator",
+          "type": "boolean",
+          "x-go-name": "IsAdmin"
+        },
+        "language": {
+          "description": "User locale",
+          "type": "string",
+          "x-go-name": "Language"
+        },
+        "last_login": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "LastLogin"
+        },
+        "location": {
+          "description": "the user's location",
+          "type": "string",
+          "x-go-name": "Location"
+        },
+        "login": {
+          "description": "the user's username",
+          "type": "string",
+          "x-go-name": "UserName"
+        },
+        "login_name": {
+          "description": "the user's authentication sign-in name.",
+          "type": "string",
+          "default": "empty",
+          "x-go-name": "LoginName"
+        },
+        "prohibit_login": {
+          "description": "Is user login prohibited",
+          "type": "boolean",
+          "x-go-name": "ProhibitLogin"
+        },
+        "restricted": {
+          "description": "Is user restricted",
+          "type": "boolean",
+          "x-go-name": "Restricted"
+        },
+        "source_id": {
+          "description": "The ID of the user's Authentication Source",
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "SourceID"
+        },
+        "starred_repos_count": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "StarredRepos"
+        },
+        "visibility": {
+          "description": "User visibility level option: public, limited, private",
+          "type": "string",
+          "x-go-name": "Visibility"
+        },
+        "website": {
+          "description": "the user's website",
+          "type": "string",
+          "x-go-name": "Website"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "UserBadgeOption": {
+      "description": "UserBadgeOption options for link between users and badges",
+      "type": "object",
+      "properties": {
+        "badge_slugs": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "x-go-name": "BadgeSlugs",
+          "example": [
+            "badge1",
+            "badge2"
+          ]
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "UserHeatmapData": {
+      "description": "UserHeatmapData represents the data needed to create a heatmap",
+      "type": "object",
+      "properties": {
+        "contributions": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "Contributions"
+        },
+        "timestamp": {
+          "$ref": "#/definitions/TimeStamp"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/models/activities"
+    },
+    "UserSettings": {
+      "description": "UserSettings represents user settings",
+      "type": "object",
+      "properties": {
+        "description": {
+          "type": "string",
+          "x-go-name": "Description"
+        },
+        "diff_view_style": {
+          "type": "string",
+          "x-go-name": "DiffViewStyle"
+        },
+        "full_name": {
+          "type": "string",
+          "x-go-name": "FullName"
+        },
+        "hide_activity": {
+          "type": "boolean",
+          "x-go-name": "HideActivity"
+        },
+        "hide_email": {
+          "description": "Privacy",
+          "type": "boolean",
+          "x-go-name": "HideEmail"
+        },
+        "language": {
+          "type": "string",
+          "x-go-name": "Language"
+        },
+        "location": {
+          "type": "string",
+          "x-go-name": "Location"
+        },
+        "theme": {
+          "type": "string",
+          "x-go-name": "Theme"
+        },
+        "website": {
+          "type": "string",
+          "x-go-name": "Website"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "UserSettingsOptions": {
+      "description": "UserSettingsOptions represents options to change user settings",
+      "type": "object",
+      "properties": {
+        "description": {
+          "type": "string",
+          "x-go-name": "Description"
+        },
+        "diff_view_style": {
+          "type": "string",
+          "x-go-name": "DiffViewStyle"
+        },
+        "full_name": {
+          "type": "string",
+          "x-go-name": "FullName"
+        },
+        "hide_activity": {
+          "type": "boolean",
+          "x-go-name": "HideActivity"
+        },
+        "hide_email": {
+          "description": "Privacy",
+          "type": "boolean",
+          "x-go-name": "HideEmail"
+        },
+        "language": {
+          "type": "string",
+          "x-go-name": "Language"
+        },
+        "location": {
+          "type": "string",
+          "x-go-name": "Location"
+        },
+        "theme": {
+          "type": "string",
+          "x-go-name": "Theme"
+        },
+        "website": {
+          "type": "string",
+          "x-go-name": "Website"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "WatchInfo": {
+      "description": "WatchInfo represents an API watch status of one repository",
+      "type": "object",
+      "properties": {
+        "created_at": {
+          "type": "string",
+          "format": "date-time",
+          "x-go-name": "CreatedAt"
+        },
+        "ignored": {
+          "type": "boolean",
+          "x-go-name": "Ignored"
+        },
+        "reason": {
+          "x-go-name": "Reason"
+        },
+        "repository_url": {
+          "type": "string",
+          "x-go-name": "RepositoryURL"
+        },
+        "subscribed": {
+          "type": "boolean",
+          "x-go-name": "Subscribed"
+        },
+        "url": {
+          "type": "string",
+          "x-go-name": "URL"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "WikiCommit": {
+      "description": "WikiCommit page commit/revision",
+      "type": "object",
+      "properties": {
+        "author": {
+          "$ref": "#/definitions/CommitUser"
+        },
+        "commiter": {
+          "$ref": "#/definitions/CommitUser"
+        },
+        "message": {
+          "type": "string",
+          "x-go-name": "Message"
+        },
+        "sha": {
+          "type": "string",
+          "x-go-name": "ID"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "WikiCommitList": {
+      "description": "WikiCommitList commit/revision list",
+      "type": "object",
+      "properties": {
+        "commits": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/WikiCommit"
+          },
+          "x-go-name": "WikiCommits"
+        },
+        "count": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "Count"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "WikiPage": {
+      "description": "WikiPage a wiki page",
+      "type": "object",
+      "properties": {
+        "commit_count": {
+          "type": "integer",
+          "format": "int64",
+          "x-go-name": "CommitCount"
+        },
+        "content_base64": {
+          "description": "Page content, base64 encoded",
+          "type": "string",
+          "x-go-name": "ContentBase64"
+        },
+        "footer": {
+          "type": "string",
+          "x-go-name": "Footer"
+        },
+        "html_url": {
+          "type": "string",
+          "x-go-name": "HTMLURL"
+        },
+        "last_commit": {
+          "$ref": "#/definitions/WikiCommit"
+        },
+        "sidebar": {
+          "type": "string",
+          "x-go-name": "Sidebar"
+        },
+        "sub_url": {
+          "type": "string",
+          "x-go-name": "SubURL"
+        },
+        "title": {
+          "type": "string",
+          "x-go-name": "Title"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    },
+    "WikiPageMetaData": {
+      "description": "WikiPageMetaData wiki page meta information",
+      "type": "object",
+      "properties": {
+        "html_url": {
+          "type": "string",
+          "x-go-name": "HTMLURL"
+        },
+        "last_commit": {
+          "$ref": "#/definitions/WikiCommit"
+        },
+        "sub_url": {
+          "type": "string",
+          "x-go-name": "SubURL"
+        },
+        "title": {
+          "type": "string",
+          "x-go-name": "Title"
+        }
+      },
+      "x-go-package": "code.gitea.io/gitea/modules/structs"
+    }
+  },
+  "responses": {
+    "AccessToken": {
+      "description": "AccessToken represents an API access token.",
+      "schema": {
+        "$ref": "#/definitions/AccessToken"
+      }
+    },
+    "AccessTokenList": {
+      "description": "AccessTokenList represents a list of API access token.",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/AccessToken"
+        }
+      }
+    },
+    "ActionVariable": {
+      "description": "ActionVariable",
+      "schema": {
+        "$ref": "#/definitions/ActionVariable"
+      }
+    },
+    "ActivityFeedsList": {
+      "description": "ActivityFeedsList",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/Activity"
+        }
+      }
+    },
+    "ActivityPub": {
+      "description": "ActivityPub",
+      "schema": {
+        "$ref": "#/definitions/ActivityPub"
+      }
+    },
+    "AnnotatedTag": {
+      "description": "AnnotatedTag",
+      "schema": {
+        "$ref": "#/definitions/AnnotatedTag"
+      }
+    },
+    "Attachment": {
+      "description": "Attachment",
+      "schema": {
+        "$ref": "#/definitions/Attachment"
+      }
+    },
+    "AttachmentList": {
+      "description": "AttachmentList",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/Attachment"
+        }
+      }
+    },
+    "BadgeList": {
+      "description": "BadgeList",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/Badge"
+        }
+      }
+    },
+    "Branch": {
+      "description": "Branch",
+      "schema": {
+        "$ref": "#/definitions/Branch"
+      }
+    },
+    "BranchList": {
+      "description": "BranchList",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/Branch"
+        }
+      }
+    },
+    "BranchProtection": {
+      "description": "BranchProtection",
+      "schema": {
+        "$ref": "#/definitions/BranchProtection"
+      }
+    },
+    "BranchProtectionList": {
+      "description": "BranchProtectionList",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/BranchProtection"
+        }
+      }
+    },
+    "ChangedFileList": {
+      "description": "ChangedFileList",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/ChangedFile"
+        }
+      },
+      "headers": {
+        "X-HasMore": {
+          "type": "boolean",
+          "description": "True if there is another page"
+        },
+        "X-Page": {
+          "type": "integer",
+          "format": "int64",
+          "description": "The current page"
+        },
+        "X-PageCount": {
+          "type": "integer",
+          "format": "int64",
+          "description": "Total number of pages"
+        },
+        "X-PerPage": {
+          "type": "integer",
+          "format": "int64",
+          "description": "Commits per page"
+        },
+        "X-Total": {
+          "type": "integer",
+          "format": "int64",
+          "description": "Total commit count"
+        }
+      }
+    },
+    "CombinedStatus": {
+      "description": "CombinedStatus",
+      "schema": {
+        "$ref": "#/definitions/CombinedStatus"
+      }
+    },
+    "Comment": {
+      "description": "Comment",
+      "schema": {
+        "$ref": "#/definitions/Comment"
+      }
+    },
+    "CommentList": {
+      "description": "CommentList",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/Comment"
+        }
+      }
+    },
+    "Commit": {
+      "description": "Commit",
+      "schema": {
+        "$ref": "#/definitions/Commit"
+      }
+    },
+    "CommitList": {
+      "description": "CommitList",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/Commit"
+        }
+      },
+      "headers": {
+        "X-HasMore": {
+          "type": "boolean",
+          "description": "True if there is another page"
+        },
+        "X-Page": {
+          "type": "integer",
+          "format": "int64",
+          "description": "The current page"
+        },
+        "X-PageCount": {
+          "type": "integer",
+          "format": "int64",
+          "description": "Total number of pages"
+        },
+        "X-PerPage": {
+          "type": "integer",
+          "format": "int64",
+          "description": "Commits per page"
+        },
+        "X-Total": {
+          "type": "integer",
+          "format": "int64",
+          "description": "Total commit count"
+        }
+      }
+    },
+    "CommitStatus": {
+      "description": "CommitStatus",
+      "schema": {
+        "$ref": "#/definitions/CommitStatus"
+      }
+    },
+    "CommitStatusList": {
+      "description": "CommitStatusList",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/CommitStatus"
+        }
+      }
+    },
+    "Compare": {
+      "description": "",
+      "schema": {
+        "$ref": "#/definitions/Compare"
+      }
+    },
+    "ContentsListResponse": {
+      "description": "ContentsListResponse",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/ContentsResponse"
+        }
+      }
+    },
+    "ContentsResponse": {
+      "description": "ContentsResponse",
+      "schema": {
+        "$ref": "#/definitions/ContentsResponse"
+      }
+    },
+    "CronList": {
+      "description": "CronList",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/Cron"
+        }
+      }
+    },
+    "DeployKey": {
+      "description": "DeployKey",
+      "schema": {
+        "$ref": "#/definitions/DeployKey"
+      }
+    },
+    "DeployKeyList": {
+      "description": "DeployKeyList",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/DeployKey"
+        }
+      }
+    },
+    "EmailList": {
+      "description": "EmailList",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/Email"
+        }
+      }
+    },
+    "EmptyRepository": {
+      "description": "EmptyRepository",
+      "schema": {
+        "$ref": "#/definitions/APIError"
+      }
+    },
+    "FileDeleteResponse": {
+      "description": "FileDeleteResponse",
+      "schema": {
+        "$ref": "#/definitions/FileDeleteResponse"
+      }
+    },
+    "FileResponse": {
+      "description": "FileResponse",
+      "schema": {
+        "$ref": "#/definitions/FileResponse"
+      }
+    },
+    "FilesResponse": {
+      "description": "FilesResponse",
+      "schema": {
+        "$ref": "#/definitions/FilesResponse"
+      }
+    },
+    "GPGKey": {
+      "description": "GPGKey",
+      "schema": {
+        "$ref": "#/definitions/GPGKey"
+      }
+    },
+    "GPGKeyList": {
+      "description": "GPGKeyList",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/GPGKey"
+        }
+      }
+    },
+    "GeneralAPISettings": {
+      "description": "GeneralAPISettings",
+      "schema": {
+        "$ref": "#/definitions/GeneralAPISettings"
+      }
+    },
+    "GeneralAttachmentSettings": {
+      "description": "GeneralAttachmentSettings",
+      "schema": {
+        "$ref": "#/definitions/GeneralAttachmentSettings"
+      }
+    },
+    "GeneralRepoSettings": {
+      "description": "GeneralRepoSettings",
+      "schema": {
+        "$ref": "#/definitions/GeneralRepoSettings"
+      }
+    },
+    "GeneralUISettings": {
+      "description": "GeneralUISettings",
+      "schema": {
+        "$ref": "#/definitions/GeneralUISettings"
+      }
+    },
+    "GitBlobResponse": {
+      "description": "GitBlobResponse",
+      "schema": {
+        "$ref": "#/definitions/GitBlobResponse"
+      }
+    },
+    "GitHook": {
+      "description": "GitHook",
+      "schema": {
+        "$ref": "#/definitions/GitHook"
+      }
+    },
+    "GitHookList": {
+      "description": "GitHookList",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/GitHook"
+        }
+      }
+    },
+    "GitTreeResponse": {
+      "description": "GitTreeResponse",
+      "schema": {
+        "$ref": "#/definitions/GitTreeResponse"
+      }
+    },
+    "GitignoreTemplateInfo": {
+      "description": "GitignoreTemplateInfo",
+      "schema": {
+        "$ref": "#/definitions/GitignoreTemplateInfo"
+      }
+    },
+    "GitignoreTemplateList": {
+      "description": "GitignoreTemplateList",
+      "schema": {
+        "type": "array",
+        "items": {
+          "type": "string"
+        }
+      }
+    },
+    "Hook": {
+      "description": "Hook",
+      "schema": {
+        "$ref": "#/definitions/Hook"
+      }
+    },
+    "HookList": {
+      "description": "HookList",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/Hook"
+        }
+      }
+    },
+    "Issue": {
+      "description": "Issue",
+      "schema": {
+        "$ref": "#/definitions/Issue"
+      }
+    },
+    "IssueDeadline": {
+      "description": "IssueDeadline",
+      "schema": {
+        "$ref": "#/definitions/IssueDeadline"
+      }
+    },
+    "IssueList": {
+      "description": "IssueList",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/Issue"
+        }
+      }
+    },
+    "IssueTemplates": {
+      "description": "IssueTemplates",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/IssueTemplate"
+        }
+      }
+    },
+    "Label": {
+      "description": "Label",
+      "schema": {
+        "$ref": "#/definitions/Label"
+      }
+    },
+    "LabelList": {
+      "description": "LabelList",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/Label"
+        }
+      }
+    },
+    "LabelTemplateInfo": {
+      "description": "LabelTemplateInfo",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/LabelTemplate"
+        }
+      }
+    },
+    "LabelTemplateList": {
+      "description": "LabelTemplateList",
+      "schema": {
+        "type": "array",
+        "items": {
+          "type": "string"
+        }
+      }
+    },
+    "LanguageStatistics": {
+      "description": "LanguageStatistics",
+      "schema": {
+        "type": "object",
+        "additionalProperties": {
+          "type": "integer",
+          "format": "int64"
+        }
+      }
+    },
+    "LicenseTemplateInfo": {
+      "description": "LicenseTemplateInfo",
+      "schema": {
+        "$ref": "#/definitions/LicenseTemplateInfo"
+      }
+    },
+    "LicenseTemplateList": {
+      "description": "LicenseTemplateList",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/LicensesTemplateListEntry"
+        }
+      }
+    },
+    "MarkdownRender": {
+      "description": "MarkdownRender is a rendered markdown document",
+      "schema": {
+        "type": "string"
+      }
+    },
+    "MarkupRender": {
+      "description": "MarkupRender is a rendered markup document",
+      "schema": {
+        "type": "string"
+      }
+    },
+    "Milestone": {
+      "description": "Milestone",
+      "schema": {
+        "$ref": "#/definitions/Milestone"
+      }
+    },
+    "MilestoneList": {
+      "description": "MilestoneList",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/Milestone"
+        }
+      }
+    },
+    "NodeInfo": {
+      "description": "NodeInfo",
+      "schema": {
+        "$ref": "#/definitions/NodeInfo"
+      }
+    },
+    "Note": {
+      "description": "Note",
+      "schema": {
+        "$ref": "#/definitions/Note"
+      }
+    },
+    "NotificationCount": {
+      "description": "Number of unread notifications",
+      "schema": {
+        "$ref": "#/definitions/NotificationCount"
+      }
+    },
+    "NotificationThread": {
+      "description": "NotificationThread",
+      "schema": {
+        "$ref": "#/definitions/NotificationThread"
+      }
+    },
+    "NotificationThreadList": {
+      "description": "NotificationThreadList",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/NotificationThread"
+        }
+      }
+    },
+    "OAuth2Application": {
+      "description": "OAuth2Application",
+      "schema": {
+        "$ref": "#/definitions/OAuth2Application"
+      }
+    },
+    "OAuth2ApplicationList": {
+      "description": "OAuth2ApplicationList represents a list of OAuth2 applications.",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/OAuth2Application"
+        }
+      }
+    },
+    "Organization": {
+      "description": "Organization",
+      "schema": {
+        "$ref": "#/definitions/Organization"
+      }
+    },
+    "OrganizationList": {
+      "description": "OrganizationList",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/Organization"
+        }
+      }
+    },
+    "OrganizationPermissions": {
+      "description": "OrganizationPermissions",
+      "schema": {
+        "$ref": "#/definitions/OrganizationPermissions"
+      }
+    },
+    "Package": {
+      "description": "Package",
+      "schema": {
+        "$ref": "#/definitions/Package"
+      }
+    },
+    "PackageFileList": {
+      "description": "PackageFileList",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/PackageFile"
+        }
+      }
+    },
+    "PackageList": {
+      "description": "PackageList",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/Package"
+        }
+      }
+    },
+    "PublicKey": {
+      "description": "PublicKey",
+      "schema": {
+        "$ref": "#/definitions/PublicKey"
+      }
+    },
+    "PublicKeyList": {
+      "description": "PublicKeyList",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/PublicKey"
+        }
+      }
+    },
+    "PullRequest": {
+      "description": "PullRequest",
+      "schema": {
+        "$ref": "#/definitions/PullRequest"
+      }
+    },
+    "PullRequestList": {
+      "description": "PullRequestList",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/PullRequest"
+        }
+      }
+    },
+    "PullReview": {
+      "description": "PullReview",
+      "schema": {
+        "$ref": "#/definitions/PullReview"
+      }
+    },
+    "PullReviewComment": {
+      "description": "PullComment",
+      "schema": {
+        "$ref": "#/definitions/PullReviewComment"
+      }
+    },
+    "PullReviewCommentList": {
+      "description": "PullCommentList",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/PullReviewComment"
+        }
+      }
+    },
+    "PullReviewList": {
+      "description": "PullReviewList",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/PullReview"
+        }
+      }
+    },
+    "PushMirror": {
+      "description": "PushMirror",
+      "schema": {
+        "$ref": "#/definitions/PushMirror"
+      }
+    },
+    "PushMirrorList": {
+      "description": "PushMirrorList",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/PushMirror"
+        }
+      }
+    },
+    "Reaction": {
+      "description": "Reaction",
+      "schema": {
+        "$ref": "#/definitions/Reaction"
+      }
+    },
+    "ReactionList": {
+      "description": "ReactionList",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/Reaction"
+        }
+      }
+    },
+    "Reference": {
+      "description": "Reference",
+      "schema": {
+        "$ref": "#/definitions/Reference"
+      }
+    },
+    "ReferenceList": {
+      "description": "ReferenceList",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/Reference"
+        }
+      }
+    },
+    "RegistrationToken": {
+      "description": "RegistrationToken is response related to registration token",
+      "headers": {
+        "token": {
+          "type": "string"
+        }
+      }
+    },
+    "Release": {
+      "description": "Release",
+      "schema": {
+        "$ref": "#/definitions/Release"
+      }
+    },
+    "ReleaseList": {
+      "description": "ReleaseList",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/Release"
+        }
+      }
+    },
+    "RepoCollaboratorPermission": {
+      "description": "RepoCollaboratorPermission",
+      "schema": {
+        "$ref": "#/definitions/RepoCollaboratorPermission"
+      }
+    },
+    "RepoIssueConfig": {
+      "description": "RepoIssueConfig",
+      "schema": {
+        "$ref": "#/definitions/IssueConfig"
+      }
+    },
+    "RepoIssueConfigValidation": {
+      "description": "RepoIssueConfigValidation",
+      "schema": {
+        "$ref": "#/definitions/IssueConfigValidation"
+      }
+    },
+    "RepoNewIssuePinsAllowed": {
+      "description": "RepoNewIssuePinsAllowed",
+      "schema": {
+        "$ref": "#/definitions/NewIssuePinsAllowed"
+      }
+    },
+    "Repository": {
+      "description": "Repository",
+      "schema": {
+        "$ref": "#/definitions/Repository"
+      }
+    },
+    "RepositoryList": {
+      "description": "RepositoryList",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/Repository"
+        }
+      }
+    },
+    "SearchResults": {
+      "description": "SearchResults",
+      "schema": {
+        "$ref": "#/definitions/SearchResults"
+      }
+    },
+    "Secret": {
+      "description": "Secret",
+      "schema": {
+        "$ref": "#/definitions/Secret"
+      }
+    },
+    "SecretList": {
+      "description": "SecretList",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/Secret"
+        }
+      }
+    },
+    "ServerVersion": {
+      "description": "ServerVersion",
+      "schema": {
+        "$ref": "#/definitions/ServerVersion"
+      }
+    },
+    "StopWatch": {
+      "description": "StopWatch",
+      "schema": {
+        "$ref": "#/definitions/StopWatch"
+      }
+    },
+    "StopWatchList": {
+      "description": "StopWatchList",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/StopWatch"
+        }
+      }
+    },
+    "StringSlice": {
+      "description": "StringSlice",
+      "schema": {
+        "type": "array",
+        "items": {
+          "type": "string"
+        }
+      }
+    },
+    "Tag": {
+      "description": "Tag",
+      "schema": {
+        "$ref": "#/definitions/Tag"
+      }
+    },
+    "TagList": {
+      "description": "TagList",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/Tag"
+        }
+      }
+    },
+    "Team": {
+      "description": "Team",
+      "schema": {
+        "$ref": "#/definitions/Team"
+      }
+    },
+    "TeamList": {
+      "description": "TeamList",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/Team"
+        }
+      }
+    },
+    "TimelineList": {
+      "description": "TimelineList",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/TimelineComment"
+        }
+      }
+    },
+    "TopicListResponse": {
+      "description": "TopicListResponse",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/TopicResponse"
+        }
+      }
+    },
+    "TopicNames": {
+      "description": "TopicNames",
+      "schema": {
+        "$ref": "#/definitions/TopicName"
+      }
+    },
+    "TrackedTime": {
+      "description": "TrackedTime",
+      "schema": {
+        "$ref": "#/definitions/TrackedTime"
+      }
+    },
+    "TrackedTimeList": {
+      "description": "TrackedTimeList",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/TrackedTime"
+        }
+      }
+    },
+    "User": {
+      "description": "User",
+      "schema": {
+        "$ref": "#/definitions/User"
+      }
+    },
+    "UserHeatmapData": {
+      "description": "UserHeatmapData",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/UserHeatmapData"
+        }
+      }
+    },
+    "UserList": {
+      "description": "UserList",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/User"
+        }
+      }
+    },
+    "UserSettings": {
+      "description": "UserSettings",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/UserSettings"
+        }
+      }
+    },
+    "VariableList": {
+      "description": "VariableList",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/ActionVariable"
+        }
+      }
+    },
+    "WatchInfo": {
+      "description": "WatchInfo",
+      "schema": {
+        "$ref": "#/definitions/WatchInfo"
+      }
+    },
+    "WikiCommitList": {
+      "description": "WikiCommitList",
+      "schema": {
+        "$ref": "#/definitions/WikiCommitList"
+      }
+    },
+    "WikiPage": {
+      "description": "WikiPage",
+      "schema": {
+        "$ref": "#/definitions/WikiPage"
+      }
+    },
+    "WikiPageList": {
+      "description": "WikiPageList",
+      "schema": {
+        "type": "array",
+        "items": {
+          "$ref": "#/definitions/WikiPageMetaData"
+        }
+      }
+    },
+    "conflict": {
+      "description": "APIConflict is a conflict empty response"
+    },
+    "empty": {
+      "description": "APIEmpty is an empty response"
+    },
+    "error": {
+      "description": "APIError is error format response",
+      "headers": {
+        "message": {
+          "type": "string"
+        },
+        "url": {
+          "type": "string"
+        }
+      }
+    },
+    "forbidden": {
+      "description": "APIForbiddenError is a forbidden error response",
+      "headers": {
+        "message": {
+          "type": "string"
+        },
+        "url": {
+          "type": "string"
+        }
+      }
+    },
+    "invalidTopicsError": {
+      "description": "APIInvalidTopicsError is error format response to invalid topics",
+      "headers": {
+        "invalidTopics": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "message": {
+          "type": "string"
+        }
+      }
+    },
+    "notFound": {
+      "description": "APINotFound is a not found empty response"
+    },
+    "parameterBodies": {
+      "description": "parameterBodies",
+      "schema": {
+        "$ref": "#/definitions/UpdateVariableOption"
+      }
+    },
+    "redirect": {
+      "description": "APIRedirect is a redirect response"
+    },
+    "repoArchivedError": {
+      "description": "APIRepoArchivedError is an error that is raised when an archived repo should be modified",
+      "headers": {
+        "message": {
+          "type": "string"
+        },
+        "url": {
+          "type": "string"
+        }
+      }
+    },
+    "string": {
+      "description": "APIString is a string response",
+      "schema": {
+        "type": "string"
+      }
+    },
+    "validationError": {
+      "description": "APIValidationError is error format response related to input validation",
+      "headers": {
+        "message": {
+          "type": "string"
+        },
+        "url": {
+          "type": "string"
+        }
+      }
+    }
+  },
+  "securityDefinitions": {
+    "AccessToken": {
+      "description": "This authentication option is deprecated for removal in Gitea 1.23. Please use AuthorizationHeaderToken instead.",
+      "type": "apiKey",
+      "name": "access_token",
+      "in": "query"
+    },
+    "AuthorizationHeaderToken": {
+      "description": "API tokens must be prepended with \"token\" followed by a space.",
+      "type": "apiKey",
+      "name": "Authorization",
+      "in": "header"
+    },
+    "BasicAuth": {
+      "type": "basic"
+    },
+    "SudoHeader": {
+      "description": "Sudo API request as the user provided as the key. Admin privileges are required.",
+      "type": "apiKey",
+      "name": "Sudo",
+      "in": "header"
+    },
+    "SudoParam": {
+      "description": "Sudo API request as the user provided as the key. Admin privileges are required.",
+      "type": "apiKey",
+      "name": "sudo",
+      "in": "query"
+    },
+    "TOTPHeader": {
+      "description": "Must be used in combination with BasicAuth if two-factor authentication is enabled.",
+      "type": "apiKey",
+      "name": "X-GITEA-OTP",
+      "in": "header"
+    },
+    "Token": {
+      "description": "This authentication option is deprecated for removal in Gitea 1.23. Please use AuthorizationHeaderToken instead.",
+      "type": "apiKey",
+      "name": "token",
+      "in": "query"
+    }
+  },
+  "security": [
+    {
+      "BasicAuth": []
+    },
+    {
+      "Token": []
+    },
+    {
+      "AccessToken": []
+    },
+    {
+      "AuthorizationHeaderToken": []
+    },
+    {
+      "SudoParam": []
+    },
+    {
+      "SudoHeader": []
+    },
+    {
+      "TOTPHeader": []
+    }
+  ]
+}
diff --git a/pr-review/devtest.sh b/pr-review/devtest.sh
new file mode 100755
index 0000000..ef14b73
--- /dev/null
+++ b/pr-review/devtest.sh
@@ -0,0 +1,8 @@
+#!/bin/sh
+
+while true; do
+    clear
+    go test
+    inotifywait -q -e modify -e create -e delete -r .
+done
+
diff --git a/pr-review/go.mod b/pr-review/go.mod
new file mode 100644
index 0000000..89a4595
--- /dev/null
+++ b/pr-review/go.mod
@@ -0,0 +1,35 @@
+module src.opensuse.org/pr-review
+
+go 1.22.3
+
+replace src.opensuse.org/autogits/common => ../bots-common
+
+require src.opensuse.org/autogits/common v0.0.0-00010101000000-000000000000
+
+require (
+	github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect
+	github.com/go-logr/logr v1.4.1 // indirect
+	github.com/go-logr/stdr v1.2.2 // indirect
+	github.com/go-openapi/analysis v0.23.0 // indirect
+	github.com/go-openapi/errors v0.22.0 // indirect
+	github.com/go-openapi/jsonpointer v0.21.0 // indirect
+	github.com/go-openapi/jsonreference v0.21.0 // indirect
+	github.com/go-openapi/loads v0.22.0 // indirect
+	github.com/go-openapi/runtime v0.28.0 // indirect
+	github.com/go-openapi/spec v0.21.0 // indirect
+	github.com/go-openapi/strfmt v0.23.0 // indirect
+	github.com/go-openapi/swag v0.23.0 // indirect
+	github.com/go-openapi/validate v0.24.0 // indirect
+	github.com/google/uuid v1.6.0 // indirect
+	github.com/josharian/intern v1.0.0 // indirect
+	github.com/mailru/easyjson v0.7.7 // indirect
+	github.com/mitchellh/mapstructure v1.5.0 // indirect
+	github.com/oklog/ulid v1.3.1 // indirect
+	github.com/opentracing/opentracing-go v1.2.0 // indirect
+	go.mongodb.org/mongo-driver v1.14.0 // indirect
+	go.opentelemetry.io/otel v1.24.0 // indirect
+	go.opentelemetry.io/otel/metric v1.24.0 // indirect
+	go.opentelemetry.io/otel/trace v1.24.0 // indirect
+	golang.org/x/sync v0.7.0 // indirect
+	gopkg.in/yaml.v3 v3.0.1 // indirect
+)
diff --git a/pr-review/go.sum b/pr-review/go.sum
new file mode 100644
index 0000000..b1db529
--- /dev/null
+++ b/pr-review/go.sum
@@ -0,0 +1,75 @@
+github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3dyBCFEj5IhUbnKptjxatkF07cF2ak3yi77so=
+github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw=
+github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
+github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=
+github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
+github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
+github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
+github.com/go-openapi/analysis v0.23.0 h1:aGday7OWupfMs+LbmLZG4k0MYXIANxcuBTYUC03zFCU=
+github.com/go-openapi/analysis v0.23.0/go.mod h1:9mz9ZWaSlV8TvjQHLl2mUW2PbZtemkE8yA5v22ohupo=
+github.com/go-openapi/errors v0.22.0 h1:c4xY/OLxUBSTiepAg3j/MHuAv5mJhnf53LLMWFB+u/w=
+github.com/go-openapi/errors v0.22.0/go.mod h1:J3DmZScxCDufmIMsdOuDHxJbdOGC0xtUynjIx092vXE=
+github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ=
+github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY=
+github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ=
+github.com/go-openapi/jsonreference v0.21.0/go.mod h1:LmZmgsrTkVg9LG4EaHeY8cBDslNPMo06cago5JNLkm4=
+github.com/go-openapi/loads v0.22.0 h1:ECPGd4jX1U6NApCGG1We+uEozOAvXvJSF4nnwHZ8Aco=
+github.com/go-openapi/loads v0.22.0/go.mod h1:yLsaTCS92mnSAZX5WWoxszLj0u+Ojl+Zs5Stn1oF+rs=
+github.com/go-openapi/runtime v0.28.0 h1:gpPPmWSNGo214l6n8hzdXYhPuJcGtziTOgUpvsFWGIQ=
+github.com/go-openapi/runtime v0.28.0/go.mod h1:QN7OzcS+XuYmkQLw05akXk0jRH/eZ3kb18+1KwW9gyc=
+github.com/go-openapi/spec v0.21.0 h1:LTVzPc3p/RzRnkQqLRndbAzjY0d0BCL72A6j3CdL9ZY=
+github.com/go-openapi/spec v0.21.0/go.mod h1:78u6VdPw81XU44qEWGhtr982gJ5BWg2c0I5XwVMotYk=
+github.com/go-openapi/strfmt v0.23.0 h1:nlUS6BCqcnAk0pyhi9Y+kdDVZdZMHfEKQiS4HaMgO/c=
+github.com/go-openapi/strfmt v0.23.0/go.mod h1:NrtIpfKtWIygRkKVsxh7XQMDQW5HKQl6S5ik2elW+K4=
+github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE=
+github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ=
+github.com/go-openapi/validate v0.24.0 h1:LdfDKwNbpB6Vn40xhTdNZAnfLECL81w+VX3BumrGD58=
+github.com/go-openapi/validate v0.24.0/go.mod h1:iyeX1sEufmv3nPbBdX3ieNviWnOZaJ1+zquzJEf2BAQ=
+github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
+github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
+github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
+github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
+github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
+github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
+github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
+github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
+github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
+github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
+github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
+github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
+github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
+github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4=
+github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
+github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs=
+github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc=
+github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=
+github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=
+github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
+github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
+github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
+go.mongodb.org/mongo-driver v1.14.0 h1:P98w8egYRjYe3XDjxhYJagTokP/H6HzlsnojRgZRd80=
+go.mongodb.org/mongo-driver v1.14.0/go.mod h1:Vzb0Mk/pa7e6cWw85R4F/endUC3u0U9jGcNU603k65c=
+go.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo=
+go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo=
+go.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI=
+go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco=
+go.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw=
+go.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg=
+go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI=
+go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU=
+golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M=
+golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
+golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y=
+golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
+gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
+gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
+gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
diff --git a/pr-review/listen.go b/pr-review/listen.go
new file mode 100644
index 0000000..b9d3932
--- /dev/null
+++ b/pr-review/listen.go
@@ -0,0 +1,3 @@
+package main;
+
+
diff --git a/pr-review/main.go b/pr-review/main.go
new file mode 100644
index 0000000..83e9829
--- /dev/null
+++ b/pr-review/main.go
@@ -0,0 +1,95 @@
+package main
+
+import (
+	"errors"
+	"fmt"
+	"log"
+	"net/http"
+	"os"
+	"path/filepath"
+
+	"src.opensuse.org/autogits/common"
+)
+
+const (
+	ListenPort = 8001
+	ListenAddr = "[::1]"
+
+	GitAuthor = "GiteaBot - AutoStaging"
+)
+
+func createListenServer() {
+	http.HandleFunc("/pr-review", func(res http.ResponseWriter, req *http.Request) {
+		h := createRequestHandler("pr-review")
+		// defer h.Close()
+
+		if len(req.Header.Get("Content-Type")) == 0 ||
+			req.Header["Content-Type"][0] != "application/json" ||
+			req.Method != "POST" {
+
+			h.writeError()
+			res.WriteHeader(http.StatusInternalServerError)
+			return
+		}
+
+		hdr := req.Header[GiteaRequestHeader]
+		if len(hdr) != 1 {
+			h.LogError("Unsupported number of %s headers: %d: %#v\n", GiteaRequestHeader, len(hdr), hdr)
+			h.writeError()
+			res.WriteHeader(http.StatusInternalServerError)
+			return
+		}
+		reqType := hdr[0]
+
+		switch reqType {
+		case "pull_request":
+			h.parsePullRequest(req.Body)
+			h.processPullRequestAction()
+		default:
+			h.LogError("Unsupported request type: %s", reqType)
+			res.WriteHeader(http.StatusInternalServerError)
+		}
+
+		if h.HasError() {
+			h.writeError()
+			res.WriteHeader(http.StatusInternalServerError)
+			return
+		}
+		res.Header().Add("Content-Type", "application/json")
+		res.WriteHeader(http.StatusOK)
+	})
+
+	log.Fatal(http.ListenAndServe(ListenAddr+":"+fmt.Sprint(ListenPort), nil))
+}
+
+func parseObsSecretToken() error {
+	return nil
+}
+
+func parseGiteaSecretToken() error {
+	GiteaToken = os.Getenv(GiteaTokenEnv)
+	if len(GiteaToken) < 10 {
+		return errors.New(GiteaTokenEnv + " not provided")
+	}
+
+	err := os.Setenv(GiteaTokenEnv, "")
+	if err != nil {
+		return fmt.Errorf("%s: %v", "Cannot reset "+GiteaTokenEnv, err)
+	}
+
+	return nil
+}
+
+func main() {
+	if err := parseGiteaSecretToken(); err != nil {
+		fmt.Print(err)
+		return
+	}
+
+	if err := parseObsSecretToken(); err != nil {
+		fmt.Print(err)
+		return
+	}
+
+	createListenServer()
+}
diff --git a/pr-review/main_test.go b/pr-review/main_test.go
new file mode 100644
index 0000000..e26bdc1
--- /dev/null
+++ b/pr-review/main_test.go
@@ -0,0 +1,2 @@
+package main
+
diff --git a/pr-review/readme.go b/pr-review/readme.go
new file mode 100644
index 0000000..da11d25
--- /dev/null
+++ b/pr-review/readme.go
@@ -0,0 +1,11 @@
+package main
+
+const ReadmeBoilerplate = `
+README
+======
+
+This empty project was created by AutoDevel bot.
+AutoDevel creates projects that can be built
+in Open Build Service.
+
+`
diff --git a/pr-review/request_pr.go b/pr-review/request_pr.go
new file mode 100644
index 0000000..4daa3e4
--- /dev/null
+++ b/pr-review/request_pr.go
@@ -0,0 +1,91 @@
+package main
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+)
+
+type Head struct {
+	Ref  string
+	Repo Repository
+	Sha  string
+}
+
+type PullRequest struct {
+	Id     int
+	Url    string
+	Number int
+	State  string
+
+	Base   Head
+	Labels []string
+	Head
+
+	Repository
+	User
+}
+
+type PullRequestAction struct {
+	Action string
+	Number int
+
+	PullRequest
+	Repository
+	Sender User
+}
+
+func (h *RequestHandler) parsePullRequest(data io.ReadCloser) *PullRequestAction {
+	if h.HasError() {
+		return nil
+	}
+
+	var action PullRequestAction
+	h.Error = json.NewDecoder(data).Decode(&action)
+
+	if h.HasError() {
+		h.LogError("Got error while parsing: %v", h.Error)
+		return nil
+	}
+
+	repoIdx := strings.LastIndex(action.Repository.Ssh_Url, "/")
+	if repoIdx == -1 || action.Repository.Ssh_Url[repoIdx+1:] != action.Repository.Name+".git" {
+		h.LogError("Unexpected URL for SSH repository: '%s'", action.Repository.Name)
+		return nil
+	}
+	h.PrjGit = action.Repository.Ssh_Url[:repoIdx+1] + DefaultGitPrj + ".git"
+	h.data = &action
+
+	// sanity checks on request
+
+	return &action
+}
+
+func (h *RequestHandler) processCreatePullRequestAction() {
+	action := h.Request.data.(PullRequestAction)
+
+	action.PullRequest
+}
+
+func (h *RequestHandler) processUpdatePullRequestAction() {
+	// 1. update gitprj
+	// 2. re-request reviews, if needed
+}
+
+func (h *RequestHandler) processPullRequestAction() {
+	if h.HasError() {
+		return
+	}
+
+	action := h.Request.data.(PullRequestAction)
+	switch action.Action {
+	case "opened":
+		h.processCreatePullRequestAction()
+	default:
+		h.Error = fmt.Errorf("Invalid PR action type: %s", action.Action)
+		h.LogError("%#v", h.Error)
+		return
+	}
+}
diff --git a/prjgit-updater/.gitignore b/prjgit-updater/.gitignore
new file mode 100644
index 0000000..70c6021
--- /dev/null
+++ b/prjgit-updater/.gitignore
@@ -0,0 +1 @@
+prjgit-updater
diff --git a/prjgit-updater/Makefile b/prjgit-updater/Makefile
new file mode 100644
index 0000000..a3e223d
--- /dev/null
+++ b/prjgit-updater/Makefile
@@ -0,0 +1,14 @@
+all: build
+
+api.json:
+	curl -o api.json https://src.opensuse.org/swagger.v1.json
+
+generated/client/gitea_api_client.go: api.json
+	[ -d generated ] || mkdir generated
+	podman run --rm -v $$(pwd):/api ghcr.io/go-swagger/go-swagger generate client -f /api/api.json -t /api/generated
+
+api: generated/client/gitea_api_client.go
+
+build: api
+	go build
+
diff --git a/prjgit-updater/devtest.sh b/prjgit-updater/devtest.sh
new file mode 100755
index 0000000..ef14b73
--- /dev/null
+++ b/prjgit-updater/devtest.sh
@@ -0,0 +1,8 @@
+#!/bin/sh
+
+while true; do
+    clear
+    go test
+    inotifywait -q -e modify -e create -e delete -r .
+done
+
diff --git a/prjgit-updater/go.mod b/prjgit-updater/go.mod
new file mode 100644
index 0000000..6c8ffef
--- /dev/null
+++ b/prjgit-updater/go.mod
@@ -0,0 +1,35 @@
+module src.opensuse.org/autogits/prjgit-updater
+
+go 1.22.3
+
+replace src.opensuse.org/autogits/common => ../bots-common
+
+require src.opensuse.org/autogits/common v0.0.0-00010101000000-000000000000
+
+require (
+	github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect
+	github.com/go-logr/logr v1.4.1 // indirect
+	github.com/go-logr/stdr v1.2.2 // indirect
+	github.com/go-openapi/analysis v0.23.0 // indirect
+	github.com/go-openapi/errors v0.22.0 // indirect
+	github.com/go-openapi/jsonpointer v0.21.0 // indirect
+	github.com/go-openapi/jsonreference v0.21.0 // indirect
+	github.com/go-openapi/loads v0.22.0 // indirect
+	github.com/go-openapi/runtime v0.28.0 // indirect
+	github.com/go-openapi/spec v0.21.0 // indirect
+	github.com/go-openapi/strfmt v0.23.0 // indirect
+	github.com/go-openapi/swag v0.23.0 // indirect
+	github.com/go-openapi/validate v0.24.0 // indirect
+	github.com/google/uuid v1.6.0 // indirect
+	github.com/josharian/intern v1.0.0 // indirect
+	github.com/mailru/easyjson v0.7.7 // indirect
+	github.com/mitchellh/mapstructure v1.5.0 // indirect
+	github.com/oklog/ulid v1.3.1 // indirect
+	github.com/opentracing/opentracing-go v1.2.0 // indirect
+	go.mongodb.org/mongo-driver v1.14.0 // indirect
+	go.opentelemetry.io/otel v1.24.0 // indirect
+	go.opentelemetry.io/otel/metric v1.24.0 // indirect
+	go.opentelemetry.io/otel/trace v1.24.0 // indirect
+	golang.org/x/sync v0.7.0 // indirect
+	gopkg.in/yaml.v3 v3.0.1 // indirect
+)
diff --git a/prjgit-updater/go.sum b/prjgit-updater/go.sum
new file mode 100644
index 0000000..b1db529
--- /dev/null
+++ b/prjgit-updater/go.sum
@@ -0,0 +1,75 @@
+github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3dyBCFEj5IhUbnKptjxatkF07cF2ak3yi77so=
+github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw=
+github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
+github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=
+github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
+github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
+github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
+github.com/go-openapi/analysis v0.23.0 h1:aGday7OWupfMs+LbmLZG4k0MYXIANxcuBTYUC03zFCU=
+github.com/go-openapi/analysis v0.23.0/go.mod h1:9mz9ZWaSlV8TvjQHLl2mUW2PbZtemkE8yA5v22ohupo=
+github.com/go-openapi/errors v0.22.0 h1:c4xY/OLxUBSTiepAg3j/MHuAv5mJhnf53LLMWFB+u/w=
+github.com/go-openapi/errors v0.22.0/go.mod h1:J3DmZScxCDufmIMsdOuDHxJbdOGC0xtUynjIx092vXE=
+github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ=
+github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY=
+github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ=
+github.com/go-openapi/jsonreference v0.21.0/go.mod h1:LmZmgsrTkVg9LG4EaHeY8cBDslNPMo06cago5JNLkm4=
+github.com/go-openapi/loads v0.22.0 h1:ECPGd4jX1U6NApCGG1We+uEozOAvXvJSF4nnwHZ8Aco=
+github.com/go-openapi/loads v0.22.0/go.mod h1:yLsaTCS92mnSAZX5WWoxszLj0u+Ojl+Zs5Stn1oF+rs=
+github.com/go-openapi/runtime v0.28.0 h1:gpPPmWSNGo214l6n8hzdXYhPuJcGtziTOgUpvsFWGIQ=
+github.com/go-openapi/runtime v0.28.0/go.mod h1:QN7OzcS+XuYmkQLw05akXk0jRH/eZ3kb18+1KwW9gyc=
+github.com/go-openapi/spec v0.21.0 h1:LTVzPc3p/RzRnkQqLRndbAzjY0d0BCL72A6j3CdL9ZY=
+github.com/go-openapi/spec v0.21.0/go.mod h1:78u6VdPw81XU44qEWGhtr982gJ5BWg2c0I5XwVMotYk=
+github.com/go-openapi/strfmt v0.23.0 h1:nlUS6BCqcnAk0pyhi9Y+kdDVZdZMHfEKQiS4HaMgO/c=
+github.com/go-openapi/strfmt v0.23.0/go.mod h1:NrtIpfKtWIygRkKVsxh7XQMDQW5HKQl6S5ik2elW+K4=
+github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE=
+github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ=
+github.com/go-openapi/validate v0.24.0 h1:LdfDKwNbpB6Vn40xhTdNZAnfLECL81w+VX3BumrGD58=
+github.com/go-openapi/validate v0.24.0/go.mod h1:iyeX1sEufmv3nPbBdX3ieNviWnOZaJ1+zquzJEf2BAQ=
+github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
+github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
+github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
+github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
+github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
+github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
+github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
+github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
+github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
+github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
+github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
+github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
+github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
+github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4=
+github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
+github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs=
+github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc=
+github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=
+github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=
+github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
+github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
+github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
+go.mongodb.org/mongo-driver v1.14.0 h1:P98w8egYRjYe3XDjxhYJagTokP/H6HzlsnojRgZRd80=
+go.mongodb.org/mongo-driver v1.14.0/go.mod h1:Vzb0Mk/pa7e6cWw85R4F/endUC3u0U9jGcNU603k65c=
+go.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo=
+go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo=
+go.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI=
+go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco=
+go.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw=
+go.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg=
+go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI=
+go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU=
+golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M=
+golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
+golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y=
+golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
+gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
+gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
+gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
diff --git a/prjgit-updater/main.go b/prjgit-updater/main.go
new file mode 100644
index 0000000..efce24c
--- /dev/null
+++ b/prjgit-updater/main.go
@@ -0,0 +1,164 @@
+package main
+
+import (
+	"errors"
+	"fmt"
+	"log"
+	"net/http"
+	"os"
+	"path/filepath"
+
+	"src.opensuse.org/autogits/common"
+)
+
+const (
+	GitAuthor = "GiteaBot - AutoDevel"
+	BotName = "prjgit-updater"
+)
+
+var GiteaToken string
+
+type ClonedRepository struct {
+}
+
+type RequestHandler struct {
+	r *common.RequestHandler
+}
+
+func (rw *RequestHandler) processRepositoryAction() {
+	h := rw.r
+	if h.HasError() {
+		return
+	}
+	action := h.Request.Data.(common.RepositoryAction)
+
+	if action.Repository.Name == "_ObsPrj" {
+		h.Log("repository event %s for _ObsPrj. Ignoring", action.Action)
+		return
+	}
+
+	h.CreateRepositoryIfNotExist(action.Organization, common.DefaultGitPrj)
+	if stat, err := os.Stat(filepath.Join(h.GitPath, common.DefaultGitPrj)); err != nil || !stat.IsDir() {
+		if errors.Is(err, os.ErrNotExist) {
+			h.GitExec("", "clone", "--depth", "1", action.PrjGit, common.DefaultGitPrj)
+		}
+	}
+
+	switch action.Action {
+	case "created":
+		h.GitExec(common.DefaultGitPrj, "submodule", "--quiet", "add", "--depth", "1", action.Repository.Clone_Url)
+		h.GitExec(common.DefaultGitPrj, "commit", "-m", "Automatic package inclusion")
+		h.GitExec(common.DefaultGitPrj, "push")
+	case "deleted":
+		if stat, err := os.Stat(filepath.Join(h.GitPath, common.DefaultGitPrj, action.Repository.Name)); err != nil || !stat.IsDir() {
+			h.Log("delete event for %s -- not in project. Ignoring", action.Repository.Name)
+			return
+		}
+		h.GitExec(common.DefaultGitPrj, "rm", action.Repository.Name)
+		h.GitExec(common.DefaultGitPrj, "commit", "-m", "Automatic package removal")
+		h.GitExec(common.DefaultGitPrj, "push")
+	default:
+		h.LogError("%s: %s", "Unknown action type", action.Action)
+	}
+}
+
+func (rw *RequestHandler) processPushAction() {
+	h := rw.r
+	if h.HasError() {
+		return
+	}
+
+	action := h.Request.Data.(common.PushRequest)
+
+	if action.Repository.Name == "_ObsPrj" {
+		h.Log("push to _ObsPrj -- ignoring")
+		return
+	}
+
+	h.GitExec("", "clone", "--depth", "1", h.PrjGit, common.DefaultGitPrj)
+	if stat, err := os.Stat(filepath.Join(h.GitPath, common.DefaultGitPrj, action.Repository.Name)); err != nil || !stat.IsDir() {
+		h.Error = fmt.Errorf("Pushed to package that is not part of the project. Ignoring.")
+		h.LogError("%v: %v", h.Error, err)
+		return
+	}
+	h.GitExec(common.DefaultGitPrj, "submodule", "update", "--init", "--depth", "1", "--checkout", action.Repository.Name)
+	id, _ := h.GitBranchHead(filepath.Join(common.DefaultGitPrj, action.Repository.Name), action.Repository.Default_Branch)
+	for _, commitId := range action.Commits {
+		if commitId.Id == id {
+			h.GitExec(filepath.Join(common.DefaultGitPrj, action.Repository.Name), "fetch", "--depth", "1", "origin", id)
+			h.GitExec(filepath.Join(common.DefaultGitPrj, action.Repository.Name), "checkout", id)
+			h.GitExec(common.DefaultGitPrj, "commit", "-a", "-m", "Automatic update via push")
+			h.GitExec(common.DefaultGitPrj, "push")
+			return
+		}
+	}
+
+	h.Log("push of refs not on the main branch. ignoring.")
+}
+
+func createListenServer() {
+	http.HandleFunc("/" + BotName, func(res http.ResponseWriter, req *http.Request) {
+		var h RequestHandler;
+		h.r = common.CreateRequestHandler(GitAuthor, BotName)
+		// defer h.Close()
+
+		if len(req.Header.Get("Content-Type")) == 0 ||
+			req.Header["Content-Type"][0] != "application/json" ||
+			req.Method != "POST" {
+
+			h.r.WriteError()
+			res.WriteHeader(http.StatusInternalServerError)
+			return
+		}
+
+		hdr := req.Header[common.GiteaRequestHeader]
+		if len(hdr) != 1 {
+			h.r.LogError("Unsupported number of %s headers: %d: %#v\n", common.GiteaRequestHeader, len(hdr), hdr)
+			h.r.WriteError()
+			res.WriteHeader(http.StatusInternalServerError)
+			return
+		}
+		reqType := hdr[0]
+
+		switch reqType {
+		case "repository":
+			h.r.ParseRepositoryRequest(req.Body)
+			h.processRepositoryAction()
+		case "push":
+			h.r.ParsePushRequest(req.Body)
+			h.processPushAction()
+		default:
+			h.r.LogError("Unsupported request type: %s", reqType)
+			res.WriteHeader(http.StatusInternalServerError)
+		}
+
+		if h.r.HasError() {
+			h.r.WriteError()
+			res.WriteHeader(http.StatusInternalServerError)
+			return
+		}
+		res.Header().Add("Content-Type", "application/json")
+		res.WriteHeader(http.StatusOK)
+	})
+
+	log.Fatal(http.ListenAndServe("[::1]:8000", nil))
+}
+
+func parseGiteaSecretToken() error {
+	GiteaToken = os.Getenv(common.GiteaTokenEnv)
+	if len(GiteaToken) < 10 {
+		return errors.New(common.GiteaTokenEnv + " not provided")
+	}
+
+	err := os.Setenv(common.GiteaTokenEnv, "")
+	if err != nil {
+		return fmt.Errorf("%s: %v", "Cannot reset "+common.GiteaTokenEnv, err)
+	}
+
+	return nil
+}
+
+func main() {
+	parseGiteaSecretToken()
+	createListenServer()
+}
diff --git a/prjgit-updater/main_test.go b/prjgit-updater/main_test.go
new file mode 100644
index 0000000..e26bdc1
--- /dev/null
+++ b/prjgit-updater/main_test.go
@@ -0,0 +1,2 @@
+package main
+